-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
new documentation website #124
Conversation
Warning Rate limit exceeded@Nek-12 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 21 minutes and 51 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughThis pull request introduces a comprehensive restructuring of the documentation system for the FlowMVI project. The changes involve migrating from a previous documentation setup to a new Docusaurus-based documentation framework. The modifications span multiple files across the repository, including workflow configurations, gitignore files, README updates, and a complete overhaul of the documentation structure and tooling. Changes
Sequence DiagramsequenceDiagram
participant CI as GitHub Actions
participant Node as Node.js Setup
participant Yarn as Dependency Management
participant Docusaurus as Docusaurus Build
participant Deploy as Documentation Deployment
CI->>Node: Set up Node.js v23
Node->>Yarn: Install dependencies
Yarn->>Docusaurus: Build documentation
Docusaurus->>Deploy: Generate static site
Possibly related PRs
Suggested Labels
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
🧹 Nitpick comments (30)
.github/workflows/ci.yml (1)
66-68
: Validating website build.
Building the documentation with Yarn ensures all doc components are tested early, which is great. Consider adding a small smoke test on the build artifacts if you suspect potential regressions in the future..github/workflows/docs.yml (1)
62-63
: Website build step.
Running the Yarn build for Docusaurus ensures the static documentation is ready. Consider running a pre-build test (like linting or link checking) to catch issues before finalizing the build artifacts.docs/src/css/custom.css (2)
20-27
: Consider adjusting the dark mode primary color for better accessibilityThe current primary color in dark mode (#00d46a) has a very high saturation which might cause eye strain. Consider using a slightly muted green for better readability while maintaining the brand identity.
[data-theme='dark'] { - --ifm-color-primary: #00d46a; + --ifm-color-primary: #1abc9c; /* adjust other shades accordingly */ }
30-31
: Document the reason for commented-out DocSearch variablesThe commented variables seem important but lack explanation. Either remove them if unnecessary or document why they're preserved for future reference.
[data-theme='light'] .DocSearch { - /* --docsearch-primary-color: var(--ifm-color-primary); */ - /* --docsearch-text-color: var(--ifm-font-color-base); */ + /* These variables are handled by Docusaurus theme: + * --docsearch-primary-color: var(--ifm-color-primary); + * --docsearch-text-color: var(--ifm-font-color-base); + */docs/docs/integrations/android.md (3)
1-4
: Add a brief introduction sectionThe documentation jumps directly into implementation details. Consider adding a brief introduction section explaining what FlowMVI offers for Android developers and when to use each approach.
55-62
: Enhance the info block with concrete examplesThe info block about KMP compatibility could be more helpful with concrete examples of what features would be lost and how to handle them in a KMP-friendly way.
:::info The upside of this approach is that it's easier to implement and use some platform-specific features like `savedState` (you can still use them for KMP though) The downside is that you lose KMP compatibility. If you have plans to make your ViewModels multiplatform, it is advised to use the delegated approach instead, which is only slightly more verbose. + +For example: +- Platform-specific features that work: SavedStateHandle, ViewModel scoping +- Features that need adaptation for KMP: Lifecycle handling, Navigation +- Alternative approaches for KMP: Use the delegated pattern shown below :::
105-112
: Add code example demonstrating type erasure issueThe warning about type erasure would be clearer with a concrete example of what fails and how to fix it.
:::warning[On type-safety] Qualifiers are needed because you'll have many `StoreViewModels` that differ only by type of the container. Due to type erasure, you must inject the VM by specifying a fully-qualified type e.g. `StoreViewModel<CounterState, CounterIntent, CounterAction>`, or it will be replaced with `Store<*, *, *>` and the DI framework will fail, likely in runtime. + +Example of what fails: +```kotlin +// ❌ Will fail at runtime due to type erasure +val viewModel: StoreViewModel<*, *, *> = get() + +// ✅ Correct way with explicit types +val viewModel: StoreViewModel<CounterState, CounterIntent, CounterAction> = get() +``` :::🧰 Tools
🪛 LanguageTool
[uncategorized] ~108-~108: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ... you must inject the VM by specifying a fully-qualified type e.g. `StoreViewModel<CounterState,...(HYPHENATED_LY_ADVERB_ADJECTIVE)
docs/docs/integrations/essenty.md (3)
Line range hint
8-14
: Enhance dependency declaration sectionThe dependency section could be clearer about which features each artifact provides and when to use them.
# Includes retained stores and coroutine scopes flowmvi-essenty = { module = "pro.respawn.flowmvi:essenty", version.ref = "flowmvi" } # Includes lifecycle support for store subscription flowmvi-essenty-compose = { module = "pro.respawn.flowmvi:essenty-compose", version.ref = "flowmvi" } + +Choose the dependencies based on your needs: +- Use `flowmvi-essenty` for basic Decompose integration with store retention +- Add `flowmvi-essenty-compose` if you're using Jetpack Compose UI
Line range hint
65-76
: Improve warning block with code examplesThe warning about closure capture would be more effective with concrete examples of what to avoid and how to properly structure the code.
:::warning [Caveat:] If you do not use the factory DSL and instead build a store that is retained, it will capture everything you pass into the `builder` closure... + +Example of what to avoid: +```kotlin +// ❌ This will retain the entire repository instance +class BadComponent(private val repository: Repository) { + val store = retainedStore { /* uses repository directly */ } +} + +// ✅ Use factory to avoid capturing external references +class GoodComponent(context: ComponentContext) { + val store = context.retainedStore(factory = { inject<Repository>() }) +} +``` :::🧰 Tools
🪛 LanguageTool
[style] ~69-~69: To make your writing concise, consider an alternative.
Context: ...his is the same caveat that you have to be aware of when using [Retained Components](https:...(AWARE_OF)
128-133
: Expand the tip with specific setup stepsThe tip about lifecycle setup could be more helpful with specific steps or common pitfalls to avoid.
:::tip The requirements for setting up lifecycle correctly are the same as in the [Decompose docs](https://arkivanov.github.io/Decompose/component/lifecycle/). + +Key points to remember: +1. Ensure ComponentContext is properly initialized +2. Don't forget to call Lifecycle.resume() in your root component +3. Handle backstack navigation correctly to prevent memory leaks :::docs/docs/integrations/compose.md (3)
60-66
: Enhance the warning message with specific details and alternativesThe warning about MVVM+ style with Compose could be more helpful by:
- Explaining how
LambdaIntent
causes context leaks- Quantifying the performance impact
- Providing recommended alternative patterns
:::warning -Compose does not play well with MVVM+ style because of the instability of the `LambdaIntent` and `ViewModel` classes. -It is discouraged to use Lambda intents with Compose as that will not only leak the context of the store but -also degrade performance, also forcing you to pass tons of function references as parameters. +Compose has compatibility issues with MVVM+ style due to: +1. Context leaks: `LambdaIntent` captures and retains the store's context beyond its intended lifecycle +2. Performance impact: Unstable `ViewModel` classes trigger unnecessary recompositions +3. Code complexity: Requires passing numerous function references as parameters + +**Alternative Pattern:** +Consider using a pure UI state pattern with `IntentReceiver` as demonstrated in the "Create Pure UI Composables" section below. :::🧰 Tools
🪛 LanguageTool
[style] ~63-~63: Opting for a less wordy alternative here can improve the clarity of your writing.
Context: ...ambda intents with Compose as that will not only leak the context of the store but also degrade performance, also forcing you to pass t...(NOT_ONLY_ALSO)
[style] ~64-~64: You’ve already used the word ‘also’ once in your sentence, so using it again may be redundant.
Context: ...the store but also degrade performance, also forcing you to pass tons of function references...(REDUNDANT_FILLER)
104-105
: Improve clarity of the smart-casting explanationThe sentence has grammatical issues and could be clearer about the benefits of pure UI composables.
-It will also enable smart-casting by the compiler make UI tests super easy. +It will also enable smart-casting by the compiler, making UI tests easier to write and maintain.
Line range hint
122-132
: Enhance the Intent subclassing exampleThe example would be more valuable with a complete implementation showing:
- How this pattern prevents incorrect state handling
- Example of state-specific intents
- Usage in a real component
sealed interface CounterIntent: MVIIntent { sealed interface DisplayingCounterIntent: MVIIntent sealed interface ErrorIntent : MVIIntent sealed interface LoadingIntent : MVIIntent + + // Example state-specific intents + data class IncrementCounter(val amount: Int) : DisplayingCounterIntent + data class ShowError(val message: String) : ErrorIntent + object StartLoading : LoadingIntent } -// then, use -IntentReceiver<DisplayingCounterIntent>.DisplayingCounterContent() +// Usage in a component +@Composable +private fun IntentReceiver<CounterIntent.DisplayingCounterIntent>.DisplayingCounterContent( + counter: Int +) { + Button(onClick = { intent(IncrementCounter(1)) }) { + Text("Counter: $counter") + } +}🧰 Tools
🪛 LanguageTool
[style] ~121-~121: This phrase is redundant. Consider using “outside”.
Context: ...``` Now this function cannot be called outside of the required store's area of responsibi...(OUTSIDE_OF)
docs/docs/plugins/debugging.md (1)
9-9
: Fix macOS capitalizationAccording to Apple's branding guidelines, "MacOS" should be "macOS".
-FlowMVI comes with a remote debugging setup with a dedicated Jetbrains IDEs / Android Studio plugin and a desktop app for Windows, Linux, and MacOS. +FlowMVI comes with a remote debugging setup with a dedicated Jetbrains IDEs / Android Studio plugin and a desktop app for Windows, Linux, and macOS.🧰 Tools
🪛 LanguageTool
[grammar] ~9-~9: The operating system from Apple is written “macOS”.
Context: ...d a desktop app for Windows, Linux, and MacOS. <iframe width="384px" height="319px" ...(MAC_OS)
docs/docs/plugins/savedstate.md (2)
74-84
: Enhance the Periodic behavior documentationThe Periodic behavior section could be more helpful with additional context and examples.
### `Periodic` Save the state periodically after the specified `delay` regardless of whether the state was updated. -This is useful when you are updating the state with `updateStateImmediate`, e.g. text fields. +This is useful in scenarios such as: +- Form autosave features +- Text editors with periodic backups +- Real-time collaboration where state sync is critical + +Example configuration: +```kotlin +saveState( + behaviors = listOf( + SaveBehavior.Periodic( + delay = 30.seconds, + scope = coroutineScope // Provide a scope that matches your component's lifecycle + ) + ) +) +``` + +:::tip +Choose appropriate delays based on: +- User interaction frequency +- Data importance +- Performance requirements +::: :::info By default, `OnChange` and `OnUnsubscribe` are used - on each change, with a sensible delay, and when all subscribers leave. You can customize this via the `behaviors` parameter of the plugin. :::
Line range hint
154-162
: Add implementation examples for handling app updatesThe app updates section would be more helpful with concrete implementation examples.
The best way to solve this would be to clear the saved state (for example, by deleting the directory) on each app update. You can do this by registering a broadcast receiver or checking if the app was updated upon startup. -Implementation of this logic is out of scope of the library. + +Example implementation: +```kotlin +class AppUpdateHandler( + private val context: Context, + private val prefs: SharedPreferences +) { + fun checkForUpdate() { + val currentVersion = context.packageManager + .getPackageInfo(context.packageName, 0) + .longVersionCode + val savedVersion = prefs.getLong("last_version", -1) + + if (savedVersion != currentVersion) { + // Clear saved state + context.cacheDir.resolve("saved_state").deleteRecursively() + // Update saved version + prefs.edit().putLong("last_version", currentVersion).apply() + } + } +} +``` + +:::tip +Consider using semantic versioning to determine if state clearing is necessary based on breaking changes. +:::docs/docs/plugins/decorators.md (3)
8-14
: Enhance the experimental feature warningConsider adding more emphasis to the experimental nature of decorators by:
- Adding a clear version number when this feature was introduced
- Explicitly stating the potential risks of using experimental features in production
:::warning[Experimental Feature] -Decorators are currently experimental because their DSL is limited by Kotlin features and they -are less safe/performant to use. There will be a breaking change with them within a few updates. -They are also not tested enough as of 3.1 Beta releases. +⚠️ EXPERIMENTAL FEATURE (Since v3.1 Beta) + +Decorators are currently experimental and NOT recommended for production use because: +- Their DSL is limited by Kotlin features +- They are less safe/performant compared to regular plugins +- Breaking changes are expected within the next few updates +- Test coverage is limited + +Use at your own risk in production environments.🧰 Tools
🪛 LanguageTool
[uncategorized] ~10-~10: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ... their DSL is limited by Kotlin features and they are less safe/performant to use. T...(COMMA_COMPOUND_SENTENCE)
56-62
: Clarify the chain parameter warningThe current info block about the chain parameter could be more explicit about the implications and best practices.
:::info -The `chain` parameter is temporary and will become a receiver with a future Kotlin release. Right now, -calling the chain is awkward because you have to always wrap it in a `run` block to bring the `PipelineContext` into -the scope. +The `chain` parameter is temporary and will be replaced with a receiver in a future Kotlin release. + +Current limitations: +- Must wrap chain calls in a `run` block to access PipelineContext +- Syntax is more verbose than ideal + +Example: +```kotlin +chain.run { onIntent(intent) } // Current syntax +// Future syntax (planned): +chain.onIntent(intent) +```🧰 Tools
🪛 LanguageTool
[style] ~58-~58: For conciseness, consider replacing this expression with an adverb.
Context: ... receiver with a future Kotlin release. Right now, calling the chain is awkward because y...(AT_THE_MOMENT)
195-199
: Remove non-essential info blockThe info block about word count, while humorous, doesn't provide valuable information to users. Consider removing it to maintain professional and focused documentation.
docs/docs/misc/FAQ.md (2)
5-6
: Add Kotlin/JDK version compatibility informationConsider adding explicit version compatibility information to help users understand requirements better.
-The library's minimum JVM target is set to 11 (sadly still not the default in Gradle). +The library's minimum JVM target is set to 11 (as of version X.Y.Z). + +Compatibility: +- Kotlin: 1.8.0 or higher recommended +- JDK: 11 or higher required +- Gradle: 7.0 or higher recommended
1-4
: Fix markdown structure issuesThe document has several markdown structural issues that should be addressed:
- Heading levels should increment by one level at a time
- Code blocks should specify language
-# FAQ +# FAQ + +## JVM Configuration -### "Cannot inline bytecode" error +### "Cannot inline bytecode" error🧰 Tools
🪛 Markdownlint (0.37.0)
3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time(MD001, heading-increment)
docs/docs/plugins/custom.md (1)
97-102
: Add explicit failure scenarios to plugin installation warningThe warning about plugin installation could benefit from more explicit failure scenarios and error messages.
:::warning -If you attempt to install the same plugin multiple times, or different plugins -with the same name, **an exception will be thrown**. +If you attempt to install the same plugin multiple times, or different plugins +with the same name, an `IllegalArgumentException` will be thrown with one of these messages: + +- "Plugin 'name' is already installed" +- "Another plugin with name 'name' is already installed" + +These errors are thrown during store initialization to prevent runtime conflicts.docs/docs/plugins/prebuilt.md (3)
15-15
: Add alt text to the image for accessibility.The image showing the plugin chain workflow should include alt text for better accessibility.
-![](/chart.png) +![Plugin Chain Workflow Diagram](/chart.png)🧰 Tools
🪛 Markdownlint (0.37.0)
15-15: null
Images should have alternate text (alt text)(MD045, no-alt-text)
557-563
: Enhance the Deinit plugin documentation.The documentation for the Deinit plugin could be more descriptive. Consider adding:
- Common use cases
- Example scenarios
- Interaction with other plugins
564-577
: Improve Reset State plugin documentation.The Reset State plugin documentation could benefit from:
- Explanation of when to use this plugin vs manual state management
- Warning about potential side effects of resetting state
- Example showing interaction with other plugins
docs/docs/quickstart.md (3)
367-387
: Fix heading hierarchy for consistency.The "Automatically:" and "Manually" sections should use consistent heading levels. Consider using h3 (###) for both sections to maintain proper document hierarchy.
🧰 Tools
🪛 Markdownlint (0.37.0)
367-367: Expected: h3; Actual: h4
Heading levels should only increment by one level at a time(MD001, heading-increment)
367-367: Punctuation: ':'
Trailing punctuation in heading(MD026, no-trailing-punctuation)
169-173
: Enhance the Contract section with examples.The Contract section could benefit from:
- Example of what makes a class "immutable and comparable"
- Code example showing incorrect vs correct implementation
- Link to Kotlin documentation about data classes and equals/hashCode
🧰 Tools
🪛 LanguageTool
[style] ~172-~172: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...te` object provided by the library. - If your store does not have side effects, ...(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[misspelling] ~172-~172: Did you mean “side effect” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... effects, useNothing
in place of the side-effect type.Click if you ...
(AFFECT_EFFECT)
20-20
: Use consistent terminology for side effects.The documentation uses both "side-effects" and "side effects". Standardize the terminology throughout the documentation for consistency.
-side-effects +side effectsAlso applies to: 184-186
🧰 Tools
🪛 LanguageTool
[misspelling] ~20-~20: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... render their State and consume side-effects, called Actions. - States, Intent...(AFFECT_EFFECT)
docs/docs/README.md (1)
3-3
: Fix heading hierarchy.The heading level should be h2 (##) to maintain proper document hierarchy after the h1 title.
-### Stub readme file, do not edit! +## Stub readme file, do not edit!🧰 Tools
🪛 Markdownlint (0.37.0)
3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time(MD001, heading-increment)
README.md (1)
Line range hint
359-374
: Update copyright year rangeThe copyright year extends to 2025, which is beyond the current year. Consider updating it to the current year or removing the end year.
Apply this change:
- Copyright 2022-2025 Respawn Team and contributors + Copyright 2022-2024 Respawn Team and contributors🧰 Tools
🪛 Markdownlint (0.37.0)
1-1: null
Images should have alternate text (alt text)(MD045, no-alt-text)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (36)
docs/images/debugger.gif
is excluded by!**/*.gif
docs/images/icon_512.png
is excluded by!**/*.png
docs/package-lock.json
is excluded by!**/package-lock.json
docs/static/apple-touch-icon.png
is excluded by!**/*.png
docs/static/banner.png
is excluded by!**/*.png
docs/static/chart.png
is excluded by!**/*.png
docs/static/debugger_setup_1.png
is excluded by!**/*.png
docs/static/favicon.ico
is excluded by!**/*.ico
docs/static/icon-192-maskable.png
is excluded by!**/*.png
docs/static/icon-192.png
is excluded by!**/*.png
docs/static/icon-512-maskable.png
is excluded by!**/*.png
docs/static/icon-512.png
is excluded by!**/*.png
docs/static/icon.svg
is excluded by!**/*.svg
docs/static/icon_banner.png
is excluded by!**/*.png
docs/static/icon_nobg.svg
is excluded by!**/*.svg
docs/static/ios/AppIcon-20@2x.png
is excluded by!**/*.png
docs/static/ios/AppIcon-20@2x~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon-20@3x.png
is excluded by!**/*.png
docs/static/ios/AppIcon-20~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon-29.png
is excluded by!**/*.png
docs/static/ios/AppIcon-29@2x.png
is excluded by!**/*.png
docs/static/ios/AppIcon-29@2x~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon-29@3x.png
is excluded by!**/*.png
docs/static/ios/AppIcon-29~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon-40@2x.png
is excluded by!**/*.png
docs/static/ios/AppIcon-40@2x~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon-40@3x.png
is excluded by!**/*.png
docs/static/ios/AppIcon-40~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon-60@2x~car.png
is excluded by!**/*.png
docs/static/ios/AppIcon-60@3x~car.png
is excluded by!**/*.png
docs/static/ios/AppIcon-83.5@2x~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon@2x.png
is excluded by!**/*.png
docs/static/ios/AppIcon@2x~ipad.png
is excluded by!**/*.png
docs/static/ios/AppIcon@3x.png
is excluded by!**/*.png
docs/static/ios/AppIcon~ios-marketing.png
is excluded by!**/*.png
docs/static/ios/AppIcon~ipad.png
is excluded by!**/*.png
📒 Files selected for processing (33)
.github/workflows/ci.yml
(2 hunks).github/workflows/docs.yml
(1 hunks).gitignore
(1 hunks)README.md
(1 hunks)buildSrc/src/main/kotlin/dokkaDocumentation.gradle.kts
(1 hunks)docs/.gitignore
(1 hunks)docs/README.md
(0 hunks)docs/_navbar.md
(0 hunks)docs/docs/README.md
(1 hunks)docs/docs/integrations/_category_.json
(1 hunks)docs/docs/integrations/android.md
(4 hunks)docs/docs/integrations/compose.md
(6 hunks)docs/docs/integrations/essenty.md
(5 hunks)docs/docs/misc/CONTRIBUTING.md
(1 hunks)docs/docs/misc/FAQ.md
(3 hunks)docs/docs/misc/_category_.json
(1 hunks)docs/docs/plugins/_category_.json
(1 hunks)docs/docs/plugins/custom.md
(7 hunks)docs/docs/plugins/debugging.md
(10 hunks)docs/docs/plugins/decorators.md
(3 hunks)docs/docs/plugins/prebuilt.md
(10 hunks)docs/docs/plugins/savedstate.md
(5 hunks)docs/docs/quickstart.md
(1 hunks)docs/docusaurus.config.ts
(1 hunks)docs/index.html
(0 hunks)docs/package.json
(1 hunks)docs/quickstart.md
(0 hunks)docs/sidebars.ts
(1 hunks)docs/src/css/custom.css
(1 hunks)docs/static/manifest.json
(1 hunks)docs/static/robots.txt
(1 hunks)docs/sw.js
(0 hunks)docs/tsconfig.json
(1 hunks)
💤 Files with no reviewable changes (5)
- docs/README.md
- docs/_navbar.md
- docs/index.html
- docs/quickstart.md
- docs/sw.js
✅ Files skipped from review due to trivial changes (10)
- docs/static/robots.txt
- buildSrc/src/main/kotlin/dokkaDocumentation.gradle.kts
- docs/sidebars.ts
- docs/docs/misc/CONTRIBUTING.md
- docs/static/manifest.json
- docs/docs/integrations/category.json
- docs/tsconfig.json
- docs/.gitignore
- docs/package.json
- docs/docs/plugins/category.json
🧰 Additional context used
🪛 LanguageTool
docs/docs/plugins/debugging.md
[grammar] ~9-~9: The operating system from Apple is written “macOS”.
Context: ...d a desktop app for Windows, Linux, and MacOS. <iframe width="384px" height="319px" ...
(MAC_OS)
[uncategorized] ~81-~81: Consider inserting a comma before ‘unfortunately’.
Context: ...t to "notepad-style coding" for that set unfortunately. ::: ### 1.3 Set up store configurati...
(FINAL_ADVERB_COMMA)
docs/docs/integrations/android.md
[uncategorized] ~108-~108: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ... you must inject the VM by specifying a fully-qualified type e.g. `StoreViewModel<CounterState,...
(HYPHENATED_LY_ADVERB_ADJECTIVE)
docs/docs/plugins/prebuilt.md
[uncategorized] ~19-~19: Loose punctuation mark.
Context: ...:::danger[The order of plugins matters! ] Changing the order of plugins may comp...
(UNLIKELY_OPENING_PUNCTUATION)
[style] ~21-~21: Consider using a different adverb to strengthen your wording.
Context: ...s! ] Changing the order of plugins may completely change how your store works. Plugins ca...
(COMPLETELY_ENTIRELY)
[typographical] ~115-~115: Consider adding a comma after ‘Literally’ for more clarity.
Context: ...earn how to set up the environment. * Literally any plugin - just call install { }
...
(RB_LY_COMMA)
[style] ~342-~342: This phrase is redundant. Consider using “outside”.
Context: ...ou must not try to access the value outside of the store's lifecycle, or the attempt...
(OUTSIDE_OF)
[uncategorized] ~461-~461: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...n after they leave, the state will reset and you can call await()
again. * Speci...
(COMMA_COMPOUND_SENTENCE)
docs/docs/plugins/savedstate.md
[uncategorized] ~20-~20: Loose punctuation mark.
Context: ...e artifact depends on: - kotlinx-io
, and as a consequence, on okio
- `ko...
(UNLIKELY_OPENING_PUNCTUATION)
[style] ~35-~35: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...f a particular subtype. - JsonSaver
for saving the state as a JSON. - `FileSa...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[style] ~36-~36: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ng the state as a JSON. - FileSaver
for saving the state to a file. See `Defaul...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
docs/docs/plugins/decorators.md
[uncategorized] ~10-~10: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ... their DSL is limited by Kotlin features and they are less safe/performant to use. T...
(COMMA_COMPOUND_SENTENCE)
[style] ~58-~58: For conciseness, consider replacing this expression with an adverb.
Context: ... receiver with a future Kotlin release. Right now, calling the chain is awkward because y...
(AT_THE_MOMENT)
docs/docs/integrations/compose.md
[style] ~63-~63: Opting for a less wordy alternative here can improve the clarity of your writing.
Context: ...ambda intents with Compose as that will not only leak the context of the store but also degrade performance, also forcing you to pass t...
(NOT_ONLY_ALSO)
[style] ~64-~64: You’ve already used the word ‘also’ once in your sentence, so using it again may be redundant.
Context: ...the store but also degrade performance, also forcing you to pass tons of function references...
(REDUNDANT_FILLER)
docs/docs/quickstart.md
[uncategorized] ~11-~11: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...learn everything you need to get started and we'll build a feature with UI in 10 min...
(COMMA_COMPOUND_SENTENCE)
[style] ~14-~14: Often, this adverbial phrase is redundant. Consider using an alternative.
Context: ...tep 0: Understand the primary concepts First of all, here's how the library works: - **S...
(FIRST_OF_ALL)
[misspelling] ~20-~20: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... render their State and consume side-effects, called Actions. - States, Intent...
(AFFECT_EFFECT)
[style] ~172-~172: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...te` object provided by the library. - If your store does not have side effects, ...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[misspelling] ~172-~172: Did you mean “side effect” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... effects, use Nothing
in place of the side-effect type.
Click if you ...
(AFFECT_EFFECT)
[style] ~180-~180: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...n the page be empty? Can it be loading? Can errors happen? - this will define yo...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[misspelling] ~184-~184: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... - these are Actions. Keep in mind that side-effects are not the best way to manage your ...
(AFFECT_EFFECT)
[misspelling] ~186-~186: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... logic stateful first, and resort to side-effects only if a third-party API you're workin...
(AFFECT_EFFECT)
[style] ~200-~200: As a shorter alternative for ‘able to’, consider using “can”.
Context: ...er using state instead of events if you are able to always know the outcome. [Read ...
(BE_ABLE_TO)
[style] ~242-~242: The phrase ‘a lot of’ might be wordy and overused. Consider using an alternative.
Context: ...the debuggable
parameter - it enables a lot of additional features like logging and va...
(A_LOT_OF)
[style] ~260-~260: Consider removing “of” to be more concise
Context: ...n of the properties
Here are all of the configurable settings with defaults ass...
Context: ...n the page be empty? Can it be loading? Can errors happen? - this will define yo...
Context: ... - these are Actions. Keep in mind that side-effects are not the best way to manage your ...
Context: ... logic stateful first, and resort to side-effects only if a third-party API you're workin...
Context: ...er using state instead of events if you are able to always know the outcome. [Read ...
Context: ...the
debuggable
parameter - it enables a lot of additional features like logging and va...Context: ...n of the properties
(ALL_OF_THE)
[style] ~347-~347: Try using a synonym here to strengthen your writing.
Context: ...an "environment" the Store runs in, and gives you access to everything you need: - `up...
(GIVE_PROVIDE)
[misspelling] ~351-~351: Did you mean “side effect” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... not change it. - action()
- send a side-effect to subscribers - intent()
- re-send...
(AFFECT_EFFECT)
[style] ~365-~365: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...can use rememberCoroutineScope()
. - On iOS, provide a scope manually or throug...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
🪛 Markdownlint (0.37.0)
docs/docs/plugins/prebuilt.md
15-15: null
Images should have alternate text (alt text)
(MD045, no-alt-text)
docs/docs/quickstart.md
367-367: Expected: h3; Actual: h4
Heading levels should only increment by one level at a time
(MD001, heading-increment)
18-18: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
190-190: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
195-195: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
199-199: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
200-200: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
202-202: Expected: 4; Actual: 8
Unordered list indentation
(MD007, ul-indent)
203-203: Expected: 4; Actual: 8
Unordered list indentation
(MD007, ul-indent)
204-204: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
205-205: Expected: 4; Actual: 8
Unordered list indentation
(MD007, ul-indent)
286-286: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
287-287: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
289-289: Expected: 4; Actual: 8
Unordered list indentation
(MD007, ul-indent)
291-291: Expected: 4; Actual: 8
Unordered list indentation
(MD007, ul-indent)
293-293: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
294-294: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
297-297: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
301-301: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
302-302: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
303-303: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
304-304: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
305-305: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
307-307: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
311-311: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
314-314: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
321-321: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
322-322: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
102-102: Punctuation: ':'
Trailing punctuation in heading
(MD026, no-trailing-punctuation)
111-111: Punctuation: ':'
Trailing punctuation in heading
(MD026, no-trailing-punctuation)
367-367: Punctuation: ':'
Trailing punctuation in heading
(MD026, no-trailing-punctuation)
docs/docs/misc/FAQ.md
3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time
(MD001, heading-increment)
8-8: null
Fenced code blocks should have a language specified
(MD040, fenced-code-language)
64-64: Expected: 2; Actual: 4
Unordered list indentation
(MD007, ul-indent)
README.md
1-1: null
Images should have alternate text (alt text)
(MD045, no-alt-text)
docs/docs/README.md
3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time
(MD001, heading-increment)
🔇 Additional comments (19)
docs/docs/misc/_category_.json (1)
1-6
: LGTM! Valid Docusaurus category configuration.
The JSON configuration follows Docusaurus conventions with appropriate properties for category organization.
docs/docusaurus.config.ts (7)
1-3
: Ensure minimal imports for performance.
You are importing from prism-react-renderer
and @docusaurus/types
right at the top. This is generally fine, but if you notice build performance issues, consider lazy-loading or splitting certain imports to optimize.
7-20
: Good initial config defaults.
The fundamental setup (title, tagline, base URLs, etc.) looks solid for a typical Docusaurus project. The strict settings (e.g., onBrokenLinks: 'throw'
) are beneficial to catch broken references early.
43-44
: Confirm analytics tracking ID security.
You have a Google Analytics tracking ID (G-NRB9ZFKNGN
) checked into version control. In most cases, this is acceptable, but it’s worth verifying whether any additional usage data or environment-specific configurations need to remain private.
70-96
: Navbar configuration looks comprehensive.
Including a link to your GitHub repository is an excellent way to foster contributions. Ensure that the label: undefined
for the GitHub link is intentional, since it might display an empty text or rely solely on the icon.
98-125
: Syntax highlighting configuration is well-structured.
You've included a robust list of additional languages (e.g., java
, kotlin
, bash
) and defined magicComments
for highlighting. This should facilitate a high-quality developer documentation experience.
127-159
: Offline functionality provided by the PWA plugin is beneficial.
The pwaHead
configuration covers icons, manifest, and theme color. Ensure you have the correct files (e.g., /img/icon.svg
, /img/apple-touch-icon.png
) in place to avoid broken references at runtime.
162-162
: Export statement finalizes the config.
No issues found here. Good usage of TypeScript’s explicit type annotation.
.github/workflows/ci.yml (3)
31-36
: Node setup is adequate but consider version stability.
Node.js version 23
is specified. If you want a more stable baseline, you may pin to a current LTS. Otherwise, ensure your teams and integrations are ready for this relatively new version.
63-65
: Installing docs dependencies.
This step correctly installs Yarn dependencies under docs
. If new dependencies are introduced, remember to update the dependency lockfile to avoid build-time inconsistencies.
69-71
: Gradle build step sequencing.
The build step follows after the docs build, which guarantees that the compiled docs don’t break your overall build pipeline. This arrangement is well-structured.
.github/workflows/docs.yml (4)
51-55
: Node setup is consistent with other workflows.
Using actions/setup-node@v4
with Yarn caching speeds up the process. Revisit the Node.js version if you want an LTS release or have a pinned version policy.
56-58
: Installing dependencies under frozen lockfile.
Great practice to ensure reproducibility of builds. If you ever need to update dependencies, ensure the lockfile is properly regenerated and committed.
60-61
: README copy command.
Copying the top-level README.md
into ./docs/docs/README.md
might be important for uniform docs integration. Confirm that the subdirectory reference is correct to avoid confusion.
69-72
: Updated paths for javadocs, sample app, and pages artifact.
The new structure under ./docs/build/
is organized and consistent with the rest of the changes. Just verify all references in your doc pages remain correct (e.g., linking to Javadocs or the sample app).
Also applies to: 78-78, 86-86
.gitignore (1)
169-169
: New javadocs ignore path.
You’re ignoring docs/javadocs/**
. Make sure any relevant docs outputs from Gradle or other tools are still properly tracked if needed.
README.md (3)
Line range hint 52-89
: LGTM! Well-structured feature descriptions
The feature list is comprehensive, well-organized, and effectively communicates the library's value propositions.
🧰 Tools
🪛 Markdownlint (0.37.0)
1-1: null
Images should have alternate text (alt text)
(MD045, no-alt-text)
Line range hint 91-279
: LGTM! Clear and comprehensive code examples
The code examples effectively demonstrate the library's key features and are well-documented.
🧰 Tools
🪛 Markdownlint (0.37.0)
1-1: null
Images should have alternate text (alt text)
(MD045, no-alt-text)
Line range hint 19-22
: Verify documentation links with new website structure
Since this PR introduces a new documentation website, let's verify these documentation links are updated and working:
- Documentation link:
https://opensource.respawn.pro/FlowMVI/#/
- KDoc link:
https://opensource.respawn.pro/FlowMVI/javadocs/index.html
- Sample App link:
https://opensource.respawn.pro/FlowMVI/sample/
✅ Verification successful
Documentation links are working correctly
All documentation links in the README.md are accessible and working as expected:
- Main documentation: https://opensource.respawn.pro/FlowMVI/#/
- KDoc documentation: https://opensource.respawn.pro/FlowMVI/javadocs/index.html
- Sample App: https://opensource.respawn.pro/FlowMVI/sample/
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if documentation links are accessible
for url in \
"https://opensource.respawn.pro/FlowMVI/#/" \
"https://opensource.respawn.pro/FlowMVI/javadocs/index.html" \
"https://opensource.respawn.pro/FlowMVI/sample/"; do
if curl --output /dev/null --silent --head --fail "$url"; then
echo "✅ URL is accessible: $url"
else
echo "❌ URL is not accessible: $url"
fi
done
Length of output: 1244
🧰 Tools
🪛 Markdownlint (0.37.0)
1-1: null
Images should have alternate text (alt text)
(MD045, no-alt-text)
Summary by CodeRabbit
New Features
Bug Fixes
Documentation
Chores
package.json
,docusaurus.config.ts
, andtsconfig.json
..gitignore
files to better manage ignored files and directories.