Skip to content
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

docs-seo #126

Merged
merged 11 commits into from
Dec 31, 2024
Merged

docs-seo #126

merged 11 commits into from
Dec 31, 2024

Conversation

Nek-12
Copy link
Member

@Nek-12 Nek-12 commented Dec 30, 2024

Summary by CodeRabbit

  • Documentation

    • Updated README.md with new badges and video demonstration
    • Enhanced documentation configuration and styling
    • Improved sidebar navigation and content organization
    • Added new documentation sections on state management and plugins
  • Chores

    • Updated .gitignore and .cursorignore to exclude unnecessary files
    • Modified GitHub Actions workflow for documentation deployment
  • Style

    • Added new font configurations
    • Refined CSS typography and styling

Copy link
Contributor

coderabbitai bot commented Dec 30, 2024

📝 Walkthrough

Walkthrough

This pull request introduces comprehensive updates to the FlowMVI project's documentation and configuration files. The changes span multiple areas, including the README, documentation site configuration, CSS styling, and workflow scripts. The primary focus is on enhancing documentation visibility, improving typography, updating file management strategies, and refining the project's documentation structure and presentation.

Changes

File Change Summary
README.md Updated banner image to WEBP, added new badges, replaced image with video demonstration
docs/docusaurus.config.ts Disabled breadcrumbs and contextual search, added font preconnection and preloading
scripts/update_readme.sh Modified to create a new README in docs directory with YAML front matter
.github/workflows/docs.yml Updated to use script for README update instead of simple file copy
docs/src/css/custom.css Added new font-faces, updated CSS variables for typography
.cursorignore Added patterns to ignore during indexing
.gitignore Extensive additions for excluding build artifacts, IDE configs, and sensitive files
Various documentation files Updated sidebar positions, labels, and content organization

Possibly related PRs

Suggested labels

autorelease

Poem

🐰 Hop, hop, through docs so bright,
Badges gleaming, fonts just right!
README dancing, workflows sing,
FlowMVI's changes take their wing!
Documentation blooms with glee! 🌈


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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
scripts/update_readme.sh (2)

1-1: Add a shebang or shell directive

Shellcheck suggests that explicitly declaring the shell improves portability and avoids ambiguous behavior.

+#!/usr/bin/env bash
 rm ./docs/docs/README.md
🧰 Tools
🪛 Shellcheck (0.10.0)

[error] 1-1: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.

(SC2148)


1-13: Consider fallback if README file is absent

rm ./docs/docs/README.md might fail if the file doesn’t exist. You could add the -f flag to avoid errors, and also add checks or notices to indicate to developers that no README existed prior to creating a new one.

-rm ./docs/docs/README.md
+rm -f ./docs/docs/README.md
🧰 Tools
🪛 Shellcheck (0.10.0)

[error] 1-1: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.

(SC2148)

README.md (1)

10-10: Add alt text for the banner image

Providing alternate text in Markdown improves accessibility and SEO.

-![](https://opensource.respawn.pro/FlowMVI/banner.webp)
+![FlowMVI banner](https://opensource.respawn.pro/FlowMVI/banner.webp)
🧰 Tools
🪛 Markdownlint (0.37.0)

10-10: null
Images should have alternate text (alt text)

(MD045, no-alt-text)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 80407ba and 17930d3.

📒 Files selected for processing (3)
  • README.md (2 hunks)
  • docs/docusaurus.config.ts (1 hunks)
  • scripts/update_readme.sh (1 hunks)
🧰 Additional context used
🪛 Markdownlint (0.37.0)
README.md

10-10: null
Images should have alternate text (alt text)

(MD045, no-alt-text)

🪛 Shellcheck (0.10.0)
scripts/update_readme.sh

[error] 1-1: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.

(SC2148)

🔇 Additional comments (1)
docs/docusaurus.config.ts (1)

32-32: Validate impact of disabling breadcrumbs on SEO

While disabling breadcrumbs can simplify navigation, breadcrumbs often help site visitors and search engines better understand the hierarchy of your documentation. Before finalizing this, ensure it aligns with your overall SEO strategy.

coderabbitai[bot]
coderabbitai bot previously approved these changes Dec 30, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 17930d3 and 0fdc0d5.

📒 Files selected for processing (4)
  • .github/workflows/docs.yml (1 hunks)
  • README.md (2 hunks)
  • docs/docusaurus.config.ts (2 hunks)
  • docs/src/css/custom.css (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/docusaurus.config.ts
🧰 Additional context used
🪛 Markdownlint (0.37.0)
README.md

1-1: null
Images should have alternate text (alt text)

(MD045, no-alt-text)

🔇 Additional comments (4)
.github/workflows/docs.yml (1)

58-60: LGTM! Verify script execution permissions.

The change from a direct file copy to a script execution provides more flexibility for README processing. The chmod command ensures proper execution permissions.

✅ Verification successful

Script permissions and content verified successfully

The verification confirms that:

  • The script exists at ./scripts/update_readme.sh
  • It has proper execution permissions (755 / -rwxr-xr-x)
  • It's a valid shell script that handles README processing
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify if update_readme.sh exists and has proper permissions

# Check if the script exists
if ! fd -t f "update_readme.sh" ./scripts/; then
  echo "Error: update_readme.sh not found in ./scripts/"
  exit 1
fi

# Check if the script is executable
fd -t f "update_readme.sh" ./scripts/ -x stat -c "%a %n" {}

Length of output: 162


Script:

#!/bin/bash
# Description: Verify if update_readme.sh exists and has proper permissions using ls
# Using ls instead of stat as it's more commonly available

# Check if the script exists and show its permissions
ls -l ./scripts/update_readme.sh 2>/dev/null || echo "File not found"

# Show the first few lines of the script to verify it's a shell script
head -n 3 ./scripts/update_readme.sh 2>/dev/null || echo "Cannot read file"

Length of output: 198

docs/src/css/custom.css (3)

24-38: LGTM! Well-structured root variables.

The root variables are well-organized, providing a comprehensive set of color and typography configurations.


42-89: LGTM! Comprehensive theme configuration.

The dark and light theme configurations are well-structured with appropriate color variables and search component styling.


102-136: LGTM! Clear typography hierarchy.

The typography settings establish a clear visual hierarchy with appropriate font weights and letter spacing for different heading levels.

docs/src/css/custom.css Outdated Show resolved Hide resolved
README.md Outdated Show resolved Hide resolved
README.md Outdated Show resolved Hide resolved
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
coderabbitai[bot]
coderabbitai bot previously approved these changes Dec 30, 2024
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@Nek-12 Nek-12 disabled auto-merge December 30, 2024 23:10
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
docs/src/css/custom.css (1)

17-21: ⚠️ Potential issue

Fix font-face declaration for Montserrat Alternates.

The current implementation incorrectly uses a Google Fonts CSS URL in the src property instead of direct font file URLs.

Apply this fix:

@font-face {
    font-family: "Montserrat Alternates";
-    src: url("https://fonts.googleapis.com/css2?family=Montserrat+Alternates:wght@500;600;700&display=swap");
+    src: url("https://fonts.googleapis.com/fonts/s/montserratalternates/v17/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xQIXFB7xG-GNxkg.woff2") format("woff2");
    font-display: swap;
+    font-weight: 500 700;
}
🧹 Nitpick comments (8)
.gitignore (1)

Line range hint 169-169: Enhance documentation comment clarity

The comment "# built and copied by dokka plugin" could be more descriptive.

Consider updating to:

-# built and copied by dokka plugin
+# Generated API documentation by Dokka plugin - rebuilt during documentation tasks
docs/src/css/custom.css (2)

31-38: Consider preloading primary fonts for better performance.

The font stacks are well-structured, but consider preloading Comfortaa and Montserrat Alternates to prevent layout shifts.

Add to your HTML head:

<link rel="preload" href="/path/to/comfortaa.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/path/to/montserrat-alternates.woff2" as="font" type="font/woff2" crossorigin>

139-145: Consider alternative to !important declarations.

The use of !important in admonition styles might make future maintenance difficult. Consider using more specific selectors instead.

Alternative approach:

-[class*="admonitionHeading"] {
-    font-family: var(--ifm-font-family-base) !important;
-    font-size: 1rem !important;
-    letter-spacing: 0.01em;
-    font-weight: 600;
-    text-transform: capitalize !important;
-}
+.theme-admonition .admonitionHeading_node_modules-\@docusaurus-theme-classic-lib-theme-Admonition-styles-module {
+    font-family: var(--ifm-font-family-base);
+    font-size: 1rem;
+    letter-spacing: 0.01em;
+    font-weight: 600;
+    text-transform: capitalize;
+}
docs/docs/statemanagement.md (5)

7-37: LGTM! Clear explanation of state requirements

The introduction effectively explains the key requirements for state management in FlowMVI.

Consider enhancing the CounterState example to demonstrate more best practices:

 data class CounterState(
     val counter: Int = 0,
-    val isLoading: Boolean = false
+    val isLoading: Boolean = false,
+    // Add documentation for state properties
+    /** Timestamp of the last counter update */
+    val lastUpdated: Long = System.currentTimeMillis()
 ) : MVIState

38-130: LGTM with minor formatting suggestions

The explanation of state families and LCE pattern is comprehensive and technically accurate.

Consider standardizing the unordered list formatting:

-* There are no unused / junk / placeholder values for each state.
-* State clients who use it cannot gain access to unwanted data.
+- There are no unused / junk / placeholder values for each state.
+- State clients who use it cannot gain access to unwanted data.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~48-~48: Possible missing article found.
Context: ...This means that if we pass our state to UI to render it, we want to avoid accident...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~88-~88: Consider placing the discourse marker ‘first’ at the beginning of the sentence for more clarity.
Context: ...rrorMessage(exception = this.e)) } ``` These functions first check the type of the state, and if it ...

(SENT_START_FIRST_PREMIUM)


[uncategorized] ~98-~98: Possible missing article found.
Context: ..., but also prevents various bugs due to asynchronous nature of state updates, such as the us...

(AI_HYDRA_LEO_MISSING_THE)

🪛 Markdownlint (0.37.0)

44-44: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


45-45: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


47-47: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


48-48: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


125-125: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


126-126: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


45-45: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


48-48: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


51-51: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


51-51: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


131-288: Consider adding thread-safe patterns example

The explanation of Serialized State Transactions is thorough and technically accurate.

Consider adding an example of a thread-safe pattern for handling concurrent updates:

// Example of safe concurrent state updates
suspend fun loadMoreItems() {
    updateState<Content, _> { currentState ->
        // Safe to use currentState here as we're in a transaction
        val lastIndex = currentState.items.lastIndex
        val newItems = repository.requestItems(atIndex = lastIndex, amount = 20)
        copy(items = items + newItems)
    }
}
🧰 Tools
🪛 LanguageTool

[style] ~160-~160: ‘make a decision’ might be wordy. Consider a shorter alternative.
Context: ...e need to read the current state to make a decision on which logic to execute next. In the ...

(EN_WORDINESS_PREMIUM_MAKE_A_DECISION)


[typographical] ~173-~173: Usually, there’s no comma before “if”.
Context: ...unctionmay be evaluated multiple times, ifvalue` is being concurrently updated. ...

(IF_NO_COMMA)


[uncategorized] ~180-~180: The preposition ‘of’ seems more likely in this position.
Context: ...e? Even if you always modify the state on main thread, or use update { }, the p...

(AI_HYDRA_LEO_REPLACE_ON_OF)


[style] ~190-~190: This phrase is redundant. Consider writing “sure”.
Context: ...ou have access to the state, you can be absolutely sure it will not change to something unexpec...

(ABSOLUTELY_SURE)


[uncategorized] ~191-~191: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...g and long-running code inside the block and it will only be executed once and o...

(COMMA_COMPOUND_SENTENCE)


[typographical] ~196-~196: The conjunction “so that” does not have a comma in front.
Context: ...both the initial and the resulting value, so that they can also respond to the update or ...

(SO_THAT_UNNECESSARY_COMMA)


[uncategorized] ~197-~197: Possible missing comma found.
Context: ...his does not happen when withState is called as the state does not change. ::: ###...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~213-~213: A comma may be missing after the conjunctive/linking adverb ‘Otherwise’.
Context: ... be created** for nested update blocks. Otherwise you would get a deadlock as the inn...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


[uncategorized] ~214-~214: Possible missing article found.
Context: ...ck** as the inner transaction waits for outer state update to finish, which waits for...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~243-~243: Consider a different noun to strengthen your wording.
Context: ...ou absolutely must squeeze the last drop of performance of the store, and you ar...

(DROP_DECLINE)

🪛 Markdownlint (0.37.0)

246-246: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


247-247: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


285-285: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


285-285: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


289-356: Consider adding error handling examples

The explanation of reactive state management is clear and accurate.

Consider adding an example of error handling in reactive flows:

whileSubscribed {
    repo.getItems()
        .catch { error ->
            updateState {
                State.Error(error)
            }
        }
        .collect { items ->
            updateState {
                State.Content(
                    items = items,
                    searchQuery = typed<Content>()?.searchQuery ?: ""
                )
            }
        }
}

1-356: Excellent documentation with comprehensive coverage

The documentation provides a thorough explanation of state management in FlowMVI, with clear examples and important warnings about potential pitfalls. The progression from basic concepts to advanced topics is well-structured and easy to follow.

Consider adding a section about testing strategies for state management, particularly around:

  • Unit testing state transitions
  • Testing concurrent state updates
  • Mocking dependencies in state-dependent flows
🧰 Tools
🪛 LanguageTool

[uncategorized] ~48-~48: Possible missing article found.
Context: ...This means that if we pass our state to UI to render it, we want to avoid accident...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~88-~88: Consider placing the discourse marker ‘first’ at the beginning of the sentence for more clarity.
Context: ...rrorMessage(exception = this.e)) } ``` These functions first check the type of the state, and if it ...

(SENT_START_FIRST_PREMIUM)


[uncategorized] ~98-~98: Possible missing article found.
Context: ..., but also prevents various bugs due to asynchronous nature of state updates, such as the us...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~160-~160: ‘make a decision’ might be wordy. Consider a shorter alternative.
Context: ...e need to read the current state to make a decision on which logic to execute next. In the ...

(EN_WORDINESS_PREMIUM_MAKE_A_DECISION)


[typographical] ~173-~173: Usually, there’s no comma before “if”.
Context: ...unctionmay be evaluated multiple times, ifvalue` is being concurrently updated. ...

(IF_NO_COMMA)


[uncategorized] ~180-~180: The preposition ‘of’ seems more likely in this position.
Context: ...e? Even if you always modify the state on main thread, or use update { }, the p...

(AI_HYDRA_LEO_REPLACE_ON_OF)


[style] ~190-~190: This phrase is redundant. Consider writing “sure”.
Context: ...ou have access to the state, you can be absolutely sure it will not change to something unexpec...

(ABSOLUTELY_SURE)


[uncategorized] ~191-~191: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...g and long-running code inside the block and it will only be executed once and o...

(COMMA_COMPOUND_SENTENCE)


[typographical] ~196-~196: The conjunction “so that” does not have a comma in front.
Context: ...both the initial and the resulting value, so that they can also respond to the update or ...

(SO_THAT_UNNECESSARY_COMMA)


[uncategorized] ~197-~197: Possible missing comma found.
Context: ...his does not happen when withState is called as the state does not change. ::: ###...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~213-~213: A comma may be missing after the conjunctive/linking adverb ‘Otherwise’.
Context: ... be created** for nested update blocks. Otherwise you would get a deadlock as the inn...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


[uncategorized] ~214-~214: Possible missing article found.
Context: ...ck** as the inner transaction waits for outer state update to finish, which waits for...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~243-~243: Consider a different noun to strengthen your wording.
Context: ...ou absolutely must squeeze the last drop of performance of the store, and you ar...

(DROP_DECLINE)

🪛 Markdownlint (0.37.0)

44-44: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


45-45: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


47-47: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


48-48: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


125-125: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


126-126: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


246-246: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


247-247: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


45-45: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


48-48: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


51-51: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


51-51: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


285-285: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


285-285: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0fdc0d5 and d8695dd.

📒 Files selected for processing (7)
  • .cursorignore (1 hunks)
  • .gitignore (1 hunks)
  • README.md (2 hunks)
  • docs/docs/README.md (1 hunks)
  • docs/docs/statemanagement.md (1 hunks)
  • docs/docusaurus.config.ts (3 hunks)
  • docs/src/css/custom.css (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • .cursorignore
  • docs/docs/README.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • README.md
  • docs/docusaurus.config.ts
🧰 Additional context used
🪛 LanguageTool
docs/docs/statemanagement.md

[uncategorized] ~48-~48: Possible missing article found.
Context: ...This means that if we pass our state to UI to render it, we want to avoid accident...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~88-~88: Consider placing the discourse marker ‘first’ at the beginning of the sentence for more clarity.
Context: ...rrorMessage(exception = this.e)) } ``` These functions first check the type of the state, and if it ...

(SENT_START_FIRST_PREMIUM)


[uncategorized] ~98-~98: Possible missing article found.
Context: ..., but also prevents various bugs due to asynchronous nature of state updates, such as the us...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~160-~160: ‘make a decision’ might be wordy. Consider a shorter alternative.
Context: ...e need to read the current state to make a decision on which logic to execute next. In the ...

(EN_WORDINESS_PREMIUM_MAKE_A_DECISION)


[typographical] ~173-~173: Usually, there’s no comma before “if”.
Context: ...unctionmay be evaluated multiple times, ifvalue` is being concurrently updated. ...

(IF_NO_COMMA)


[uncategorized] ~180-~180: The preposition ‘of’ seems more likely in this position.
Context: ...e? Even if you always modify the state on main thread, or use update { }, the p...

(AI_HYDRA_LEO_REPLACE_ON_OF)


[style] ~190-~190: This phrase is redundant. Consider writing “sure”.
Context: ...ou have access to the state, you can be absolutely sure it will not change to something unexpec...

(ABSOLUTELY_SURE)


[uncategorized] ~191-~191: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...g and long-running code inside the block and it will only be executed once and o...

(COMMA_COMPOUND_SENTENCE)


[typographical] ~196-~196: The conjunction “so that” does not have a comma in front.
Context: ...both the initial and the resulting value, so that they can also respond to the update or ...

(SO_THAT_UNNECESSARY_COMMA)


[uncategorized] ~197-~197: Possible missing comma found.
Context: ...his does not happen when withState is called as the state does not change. ::: ###...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~213-~213: A comma may be missing after the conjunctive/linking adverb ‘Otherwise’.
Context: ... be created** for nested update blocks. Otherwise you would get a deadlock as the inn...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


[uncategorized] ~214-~214: Possible missing article found.
Context: ...ck** as the inner transaction waits for outer state update to finish, which waits for...

(AI_HYDRA_LEO_MISSING_THE)


[style] ~243-~243: Consider a different noun to strengthen your wording.
Context: ...ou absolutely must squeeze the last drop of performance of the store, and you ar...

(DROP_DECLINE)

🪛 Markdownlint (0.37.0)
docs/docs/statemanagement.md

44-44: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


45-45: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


47-47: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


48-48: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


125-125: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


126-126: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


246-246: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


247-247: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


45-45: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


48-48: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


51-51: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


51-51: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


285-285: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)


285-285: Expected: asterisk; Actual: underscore
Strong style

(MD050, strong-style)

🔇 Additional comments (5)
.gitignore (1)

Line range hint 171-177: LGTM! Good security practices

The additions for ignoring sensitive files (service account, private keys) and IDE-specific configurations are following good security practices.

docs/src/css/custom.css (3)

7-15: LGTM: Monaspace Neon font-face declaration is well implemented.

The implementation includes:

  • Proper CDN URLs for both woff2 and woff formats
  • Correct font-display strategy
  • Comprehensive font-feature-settings

42-89: LGTM: Theme-specific styles are well-structured.

The implementation provides:

  • Clear color palette for dark theme
  • Comprehensive DocSearch customization
  • Proper use of CSS custom properties

91-104: LGTM: Component styles follow best practices.

The implementation uses:

  • Efficient SVG mask approach for the GitHub icon
  • Consistent font features for code elements
docs/docs/statemanagement.md (1)

1-6: LGTM! Well-structured document header

The document is properly structured with frontmatter metadata and a clear title.

.gitignore Show resolved Hide resolved
@Nek-12 Nek-12 enabled auto-merge December 31, 2024 00:25
@Nek-12 Nek-12 linked an issue Dec 31, 2024 that may be closed by this pull request
3 tasks
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
docs/src/css/custom.css (1)

17-21: ⚠️ Potential issue

Fix font-face declaration for Montserrat Alternates

The current declaration incorrectly uses a Google Fonts CSS URL instead of the actual font file URL.

Apply this fix:

@font-face {
    font-family: "Montserrat Alternates";
-    src: url("https://fonts.googleapis.com/css2?family=Montserrat+Alternates:wght@500;600;700&display=swap");
+    src: url("https://fonts.gstatic.com/s/montserratalternates/v17/mFTiWacfw6zH4dthXcyms1lPpC8I_b0juU0xQIXFB7xG-GNxkg.woff2") format("woff2");
    font-display: swap;
+    font-weight: 500;
}

Alternatively, consider using the Google Fonts preconnect approach instead of font-face declaration:

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat+Alternates:wght@500;600;700&display=swap" rel="stylesheet">
🧹 Nitpick comments (11)
docs/docs/misc/FAQ.md (4)

1-7: Fix heading hierarchy in the document.

The document structure jumps from h1 (#) to h3 (###), which violates markdown best practices. Consider using h2 (##) for the main sections to maintain proper heading hierarchy.

# FAQ

-### How to fix "Cannot inline bytecode" error?
+## Common Issues
+
+### How to fix "Cannot inline bytecode" error?
🧰 Tools
🪛 Markdownlint (0.37.0)

7-7: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time

(MD001, heading-increment)


Line range hint 43-52: Consider generalizing the naming convention reference.

The naming conventions section provides excellent guidelines, but consider making it more generally applicable rather than specifically referencing Respawn. This would make the documentation more inclusive for all users.

-Here's an example of rules we use at [Respawn](https://respawn.pro) to name our Contract classes:
+Here's a recommended set of naming conventions for Contract classes:

Line range hint 90-107: Enhance the paging implementation section with alternatives.

While the current solution for integrating with androidx.paging is practical, consider adding:

  1. A note about the architectural trade-offs being made
  2. Potential alternative approaches for specific use cases
  3. Best practices for managing the mutable state

This would help users make informed decisions about their implementation strategy.

🧰 Tools
🪛 LanguageTool

[formatting] ~94-~94: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ... property in the state. This is not good, because the state becomes mutable and non-stabl...

(COMMA_BEFORE_BECAUSE)


[formatting] ~97-~97: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...ch is tricky to use in whileSubscribed, because that block is rerun on every subscripti...

(COMMA_BEFORE_BECAUSE)


76-77: Improve language clarity and conciseness.

Consider these language improvements:

  1. Line 77: "after all the regular plugins" (remove "of")
  2. Line 141-142: "The library makes that easy" or "The library enables that easily" (fix grammar)

These changes would make the documentation more professional and concise.

Also applies to: 141-142

🧰 Tools
🪛 LanguageTool

[style] ~77-~77: Consider removing “of” to be more concise
Context: ...ion order * Decorators: FIFO, but after all of the regular plugins ### When I consume an ...

(ALL_OF_THE)

docs/src/css/custom.css (1)

119-119: Use CSS variable for heading font family

Replace hardcoded font family with the CSS variable for consistency.

-    font-family: Comfortaa;
+    font-family: var(--ifm-font-family-base);
docs/docs/plugins/prebuilt.md (2)

342-346: Fix redundant phrases and improve clarity

The static analysis tool identified several instances of redundant "outside of" phrases. Consider simplifying:

-   You can create a `CachedValue` outside of the store if you need to access it outside of the store builder scope,
+   You can create a `CachedValue` outside the store if you need to access it outside the store builder scope,
    but you **must** install the plugin using the value, and you must **not** try to access the value
-   outside of the store's lifecycle, or the attempt will throw.
+   outside the store's lifecycle, or the attempt will throw.
🧰 Tools
🪛 LanguageTool

[style] ~342-~342: This phrase is redundant. Consider using “outside”.
Context: ...el. - You can create a CachedValue outside of the store if you need to access it outs...

(OUTSIDE_OF)


[style] ~342-~342: This phrase is redundant. Consider using “outside”.
Context: ...e of the store if you need to access it outside of the store builder scope, but you **...

(OUTSIDE_OF)


[style] ~343-~343: This phrase is redundant. Consider using “outside”.
Context: ...ou must not try to access the value outside of the store's lifecycle, or the attem...

(OUTSIDE_OF)


263-270: Add warning block for critical behavior

Consider wrapping the important behavior notes in a warning block for better visibility, similar to the existing warning blocks in the document.

-   This plugin is designed to suspend inside its `block` because it already launches a background job.
-   You can safely collect flows and suspend forever in the `block`.
-   After the store is started, this plugin will begin receiving subscription events from the store.
+:::warning[Important Behavior Notes]
+- This plugin is designed to suspend inside its `block` because it already launches a background job
+- You can safely collect flows and suspend forever in the `block`
+- After the store is started, this plugin will begin receiving subscription events from the store
+:::
docs/docs/state/statemanagement.md (4)

23-27: Consider enhancing the example with additional documentation.

While the example is correct, it would be beneficial to add a comment explaining why data class is preferred over regular classes for state management (e.g., automatic equals, hashCode, and copy implementations).

+// Using data class provides automatic equals, hashCode, and copy implementations,
+// which are essential for state comparison and immutable updates
 data class CounterState(
     val counter: Int = 0,
     val isLoading: Boolean = false
 ) : MVIState

108-121: Add initialization order documentation for nested states.

For nested state families, it would be helpful to document the initialization order and explain why Loading is used as the default state for both feed and recommended.

 sealed interface FeedState: MVIState {
     data object Loading: FeedState
     data class Content(val items: List<Item>): FeedState
 }

-// implementing `MVIState` for nested states is not required but beneficial
+// Implementing `MVIState` for nested states:
+// 1. Ensures type safety for each state family
+// 2. Allows individual state families to be used independently
+// 3. Maintains consistency in state handling across the app
 sealed interface RecommendationsState: MVIState { /* ... */ }

+// Initialize with Loading states to handle the initial fetch of both feed and recommendations
+// This prevents undefined states during the first render
 data class ProgressiveState(
     val feed: FeedState = FeedState.Loading,
     val recommended: RecommendationsState = RecommendationsState.Loading,
     /* ... */
 ): MVIState

144-151: Enhance race condition example with timing indicators.

The race condition example would be clearer with visual indicators showing the potential timing of concurrent operations.

 val state = MutableStateFlow(State(items = emptyList()))

 suspend fun loadMoreItems() {
-    val lastIndex = state.value.items.lastIndex // (1)
-    val newItems = repository.requestItems(atIndex = lastIndex, amount = 20)
-    state.value = state.value.copy(items = items + newItems) // (2)
+    // Thread A                     | Thread B
+    val lastIndex =                 |
+        state.value.items.lastIndex | state.value = State(items = listOf(...))  // Race #1
+                                    |
+    val newItems = repository       |
+        .requestItems(              |
+            atIndex = lastIndex,    | // Using stale lastIndex
+            amount = 20             |
+        )                          |
+                                   |
+    state.value =                  | state.value = State(items = listOf(...))  // Race #2
+        state.value.copy(          | // This update will be lost
+            items = items + newItems|
+        )                          |
 }

1-355: Consider minor documentation style improvements.

While the technical content is solid, there are some opportunities to improve readability:

  • Consistent list indentation (2 spaces instead of 4)
  • More consistent comma usage in compound sentences
  • Simpler word choices (e.g., "sure" instead of "absolutely sure")
🧰 Tools
🪛 Markdownlint (0.37.0)

46-46: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


49-49: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)

🪛 LanguageTool

[style] ~89-~89: Consider placing the discourse marker ‘first’ at the beginning of the sentence for more clarity.
Context: ...rrorMessage(exception = this.e)) } ``` These functions first check the type of the state, and if it ...

(SENT_START_FIRST_PREMIUM)


[style] ~99-~99: Opting for a less wordy alternative here can improve the clarity of your writing.
Context: ...ctions. ::: Using the functions above not only simplifies our code but also prevents various bugs due to the asynchronous na...

(NOT_ONLY_ALSO)


[style] ~160-~160: ‘make a decision’ might be wordy. Consider a shorter alternative.
Context: ...e need to read the current state to make a decision on which logic to execute next. In the ...

(EN_WORDINESS_PREMIUM_MAKE_A_DECISION)


[typographical] ~173-~173: Usually, there’s no comma before “if”.
Context: ...unctionmay be evaluated multiple times, ifvalue` is being concurrently updated. ...

(IF_NO_COMMA)


[uncategorized] ~180-~180: The preposition ‘of’ seems more likely in this position.
Context: ...e? Even if you always modify the state on the main thread, or use update { }, t...

(AI_HYDRA_LEO_REPLACE_ON_OF)


[style] ~190-~190: This phrase is redundant. Consider writing “sure”.
Context: ...ou have access to the state, you can be absolutely sure it will not change to something unexpec...

(ABSOLUTELY_SURE)


[uncategorized] ~191-~191: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...g and long-running code inside the block and it will only be executed once and o...

(COMMA_COMPOUND_SENTENCE)


[typographical] ~196-~196: The conjunction “so that” does not have a comma in front.
Context: ...both the initial and the resulting value, so that they can also respond to the update or ...

(SO_THAT_UNNECESSARY_COMMA)


[uncategorized] ~197-~197: Possible missing comma found.
Context: ...his does not happen when withState is called as the state does not change. ::: ###...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~243-~243: Consider a different noun to strengthen your wording.
Context: ...ou absolutely must squeeze the last drop of performance from the store, and you ...

(DROP_DECLINE)


[uncategorized] ~294-~294: Possible missing comma found.
Context: ... while the subscribers are present (otherwise who is there to render the state?). Flo...

(AI_HYDRA_LEO_MISSING_COMMA)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d8695dd and 1904404.

📒 Files selected for processing (11)
  • docs/docs/integrations/_category_.json (1 hunks)
  • docs/docs/misc/CONTRIBUTING.md (1 hunks)
  • docs/docs/misc/FAQ.md (6 hunks)
  • docs/docs/misc/debugging.md (1 hunks)
  • docs/docs/plugins/custom.md (1 hunks)
  • docs/docs/plugins/prebuilt.md (8 hunks)
  • docs/docs/quickstart.md (1 hunks)
  • docs/docs/state/_category_.json (1 hunks)
  • docs/docs/state/savedstate.md (2 hunks)
  • docs/docs/state/statemanagement.md (1 hunks)
  • docs/src/css/custom.css (1 hunks)
✅ Files skipped from review due to trivial changes (7)
  • docs/docs/misc/CONTRIBUTING.md
  • docs/docs/integrations/category.json
  • docs/docs/plugins/custom.md
  • docs/docs/state/category.json
  • docs/docs/misc/debugging.md
  • docs/docs/state/savedstate.md
  • docs/docs/quickstart.md
🧰 Additional context used
🪛 LanguageTool
docs/docs/plugins/prebuilt.md

[typographical] ~116-~116: Consider adding a comma after ‘Literally’ for more clarity.
Context: ...rn 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: ...el. - You can create a CachedValue outside of the store if you need to access it outs...

(OUTSIDE_OF)


[style] ~342-~342: This phrase is redundant. Consider using “outside”.
Context: ...e of the store if you need to access it outside of the store builder scope, but you **...

(OUTSIDE_OF)


[style] ~343-~343: This phrase is redundant. Consider using “outside”.
Context: ...ou must not try to access the value outside of the store's lifecycle, or the attem...

(OUTSIDE_OF)


[uncategorized] ~462-~462: 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. - S...

(COMMA_COMPOUND_SENTENCE)

docs/docs/misc/FAQ.md

[style] ~77-~77: Consider removing “of” to be more concise
Context: ...ion order * Decorators: FIFO, but after all of the regular plugins ### When I consume an ...

(ALL_OF_THE)


[style] ~108-~108: Consider removing “of” to be more concise
Context: ... lot of data streams. Do I subscribe to all of the flows in my store? It's preferable to ...

(ALL_OF_THE)


[grammar] ~141-~141: Did you mean “doing”? Or maybe you should add a pronoun? In active voice, ‘allow’ + ‘to’ takes an object, usually a pronoun.
Context: ... Modularize the app. The library allows to do that easily. 2. Use nested classes. For...

(ALLOW_TO)

docs/docs/state/statemanagement.md

[style] ~89-~89: Consider placing the discourse marker ‘first’ at the beginning of the sentence for more clarity.
Context: ...rrorMessage(exception = this.e)) } ``` These functions first check the type of the state, and if it ...

(SENT_START_FIRST_PREMIUM)


[style] ~99-~99: Opting for a less wordy alternative here can improve the clarity of your writing.
Context: ...ctions. ::: Using the functions above not only simplifies our code but also prevents various bugs due to the asynchronous na...

(NOT_ONLY_ALSO)


[style] ~160-~160: ‘make a decision’ might be wordy. Consider a shorter alternative.
Context: ...e need to read the current state to make a decision on which logic to execute next. In the ...

(EN_WORDINESS_PREMIUM_MAKE_A_DECISION)


[typographical] ~173-~173: Usually, there’s no comma before “if”.
Context: ...unctionmay be evaluated multiple times, ifvalue` is being concurrently updated. ...

(IF_NO_COMMA)


[uncategorized] ~180-~180: The preposition ‘of’ seems more likely in this position.
Context: ...e? Even if you always modify the state on the main thread, or use update { }, t...

(AI_HYDRA_LEO_REPLACE_ON_OF)


[style] ~190-~190: This phrase is redundant. Consider writing “sure”.
Context: ...ou have access to the state, you can be absolutely sure it will not change to something unexpec...

(ABSOLUTELY_SURE)


[uncategorized] ~191-~191: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...g and long-running code inside the block and it will only be executed once and o...

(COMMA_COMPOUND_SENTENCE)


[typographical] ~196-~196: The conjunction “so that” does not have a comma in front.
Context: ...both the initial and the resulting value, so that they can also respond to the update or ...

(SO_THAT_UNNECESSARY_COMMA)


[uncategorized] ~197-~197: Possible missing comma found.
Context: ...his does not happen when withState is called as the state does not change. ::: ###...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~243-~243: Consider a different noun to strengthen your wording.
Context: ...ou absolutely must squeeze the last drop of performance from the store, and you ...

(DROP_DECLINE)


[uncategorized] ~294-~294: Possible missing comma found.
Context: ... while the subscribers are present (otherwise who is there to render the state?). Flo...

(AI_HYDRA_LEO_MISSING_COMMA)

🪛 Markdownlint (0.37.0)
docs/docs/misc/FAQ.md

7-7: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time

(MD001, heading-increment)

docs/docs/state/statemanagement.md

46-46: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


49-49: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)

🔇 Additional comments (6)
docs/docs/misc/FAQ.md (1)

Line range hint 1-158: Documentation changes look good overall!

The FAQ provides comprehensive coverage of common issues with clear explanations and helpful code examples. The structure is logical, and the content is well-organized. The suggested improvements are minor and don't impact the overall quality of the documentation.

🧰 Tools
🪛 LanguageTool

[style] ~77-~77: Consider removing “of” to be more concise
Context: ...ion order * Decorators: FIFO, but after all of the regular plugins ### When I consume an ...

(ALL_OF_THE)

docs/src/css/custom.css (2)

7-15: LGTM: Well-structured font-face declaration for Monaspace Neon

The declaration follows best practices with:

  • Multiple format support (woff2, woff)
  • Proper versioning in CDN URLs
  • Appropriate font-feature-settings
  • Swap display strategy for performance

43-91: LGTM: Well-structured theme configurations

The theme configurations are well-organized with:

  • Clear separation between light and dark themes
  • Comprehensive DocSearch styling
  • Proper use of CSS variables
docs/docs/plugins/prebuilt.md (2)

3-3: LGTM: Clear and descriptive sidebar label

The added sidebar label "Installing & Using Plugins" accurately reflects the content and maintains consistency with related documentation files.


90-115: Enhance readability of the plugin list

While the content is comprehensive, consider these improvements for better readability:

  1. Use consistent punctuation at the end of each description
  2. Ensure all documentation links are valid

Let's verify the documentation links:

-   **Saved State Plugin** - Save state somewhere else when it changes, and restore when the store starts.
+   **Saved State Plugin** - Save state somewhere else when it changes, and restore when the store starts
    See [saved state](/state/savedstate.md) for details.
✅ Verification successful

Documentation links are valid, minor formatting improvements suggested

The verification confirms that both documentation links (/state/savedstate.md and /misc/debugging.md) exist in the correct locations. The only remaining suggestion is to maintain consistent punctuation across plugin descriptions.

  • Consider ending all plugin descriptions with periods for consistency, as most entries already follow this pattern
  • For entries with additional information after the main description (like Saved State Plugin), consider using a period to separate the description from the reference

Example:

-   **Saved State Plugin** - Save state somewhere else when it changes, and restore when the store starts.
    See [saved state](/state/savedstate.md) for details.
+   **Saved State Plugin** - Save state somewhere else when it changes, and restore when the store starts.
    See [saved state](/state/savedstate.md) for details.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that the referenced documentation pages exist
# Check for the existence of linked documentation files
for path in "state/savedstate.md" "misc/debugging.md"; do
  if [ -f "docs/docs/$path" ]; then
    echo "✓ Found: $path"
  else
    echo "✗ Missing: $path"
  fi
done

Length of output: 325

docs/docs/state/statemanagement.md (1)

1-4: LGTM! Front matter configuration is well-structured.

The sidebar position and label are appropriately set for documentation organization.

docs/src/css/custom.css Show resolved Hide resolved
docs/docs/state/statemanagement.md Show resolved Hide resolved
@Nek-12 Nek-12 merged commit 3669c78 into master Dec 31, 2024
3 checks passed
@Nek-12 Nek-12 deleted the docs-seo branch December 31, 2024 00:33
@coderabbitai coderabbitai bot mentioned this pull request Dec 31, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[❔] Add docs on Testing, State Management, Prebuilt Plugins
1 participant