@rosetears/aili-pi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/extensions/index.ts +6 -0
- package/install.sh +5 -0
- package/manifests/adapter-evidence.json +45 -0
- package/manifests/capabilities.json +124 -0
- package/manifests/live-verification.json +26 -0
- package/manifests/provenance.json +71 -0
- package/manifests/roles.json +474 -0
- package/manifests/sbom.json +7797 -0
- package/manifests/skill-compatibility.json +8100 -0
- package/manifests/subagent-provenance.json +37 -0
- package/package.json +91 -0
- package/prompts/build.md +8 -0
- package/prompts/define.md +8 -0
- package/prompts/ideate.md +8 -0
- package/prompts/local-review.md +8 -0
- package/prompts/ship.md +8 -0
- package/roles/agent-evaluator.md +47 -0
- package/roles/ai-regression-scout.md +47 -0
- package/roles/browser-qa-runner.md +47 -0
- package/roles/code-reviewer.md +47 -0
- package/roles/code-scout.md +47 -0
- package/roles/convergence-reviewer.md +55 -0
- package/roles/doc-researcher.md +47 -0
- package/roles/e2e-artifact-runner.md +47 -0
- package/roles/implementer.md +47 -0
- package/roles/opensource-sanitizer.md +47 -0
- package/roles/plan-auditor.md +47 -0
- package/roles/pr-test-analyzer.md +47 -0
- package/roles/security-auditor.md +47 -0
- package/roles/silent-failure-reviewer.md +47 -0
- package/roles/spec-miner.md +47 -0
- package/roles/test-coverage-reviewer.md +47 -0
- package/roles/test-engineer.md +48 -0
- package/roles/web-performance-auditor.md +47 -0
- package/roles/web-researcher.md +47 -0
- package/scripts/apply-adapter-evidence.ts +73 -0
- package/scripts/bootstrap.sh +180 -0
- package/scripts/generate-provenance.ts +143 -0
- package/scripts/local-package-e2e.ts +51 -0
- package/scripts/sync-roles.ts +213 -0
- package/scripts/sync-skills.ts +356 -0
- package/scripts/validate-runtime.ts +11 -0
- package/skills/academic-paper-review/SKILL.md +81 -0
- package/skills/agents-md-initialization/SKILL.md +121 -0
- package/skills/agents-md-initialization/references/agents-template.md +83 -0
- package/skills/agents-md-initialization/references/agents_md.py +215 -0
- package/skills/ai-regression-scout/SKILL.md +24 -0
- package/skills/aili-delivery-flow/SKILL.md +125 -0
- package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
- package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
- package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
- package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
- package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
- package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
- package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
- package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
- package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
- package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
- package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
- package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
- package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
- package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
- package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
- package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
- package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
- package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
- package/skills/android-native-dev/SKILL.md +722 -0
- package/skills/android-native-dev/references/accessibility.md +209 -0
- package/skills/android-native-dev/references/adaptive-screens.md +231 -0
- package/skills/android-native-dev/references/design-style-guide.md +365 -0
- package/skills/android-native-dev/references/functional-requirements.md +229 -0
- package/skills/android-native-dev/references/motion-system.md +203 -0
- package/skills/android-native-dev/references/performance-stability.md +223 -0
- package/skills/android-native-dev/references/privacy-security.md +244 -0
- package/skills/android-native-dev/references/testing.md +554 -0
- package/skills/android-native-dev/references/visual-design.md +246 -0
- package/skills/api-and-interface-design/SKILL.md +318 -0
- package/skills/browser-qa/SKILL.md +32 -0
- package/skills/browser-testing-with-devtools/SKILL.md +323 -0
- package/skills/build-failure-repair/SKILL.md +49 -0
- package/skills/chart-visualization/SKILL.md +73 -0
- package/skills/ci-cd-and-automation/SKILL.md +353 -0
- package/skills/code-review-and-quality/SKILL.md +375 -0
- package/skills/code-review-quality-gates/SKILL.md +132 -0
- package/skills/code-simplification/SKILL.md +371 -0
- package/skills/comment-accuracy-review/SKILL.md +37 -0
- package/skills/consulting-analysis/SKILL.md +69 -0
- package/skills/context-engineering/SKILL.md +375 -0
- package/skills/coverage-review/SKILL.md +24 -0
- package/skills/data-analysis/SKILL.md +74 -0
- package/skills/deprecation-and-migration/SKILL.md +222 -0
- package/skills/documentation-and-adrs/SKILL.md +330 -0
- package/skills/e2e-artifact-handling/SKILL.md +30 -0
- package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
- package/skills/explain-by-allegory/SKILL.md +99 -0
- package/skills/flutter-dev/SKILL.md +162 -0
- package/skills/flutter-dev/references/animations.md +497 -0
- package/skills/flutter-dev/references/bloc-state.md +281 -0
- package/skills/flutter-dev/references/forms.md +656 -0
- package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
- package/skills/flutter-dev/references/localization.md +510 -0
- package/skills/flutter-dev/references/networking.md +566 -0
- package/skills/flutter-dev/references/performance.md +305 -0
- package/skills/flutter-dev/references/platform-specific.md +417 -0
- package/skills/flutter-dev/references/project-structure.md +273 -0
- package/skills/flutter-dev/references/riverpod-state.md +232 -0
- package/skills/flutter-dev/references/testing.md +364 -0
- package/skills/flutter-dev/references/widget-patterns.md +233 -0
- package/skills/frontend-dev/SKILL.md +468 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
- package/skills/frontend-dev/references/env-setup.md +33 -0
- package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
- package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
- package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
- package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
- package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
- package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
- package/skills/frontend-dev/references/motion-recipes.md +407 -0
- package/skills/frontend-dev/references/troubleshooting.md +85 -0
- package/skills/frontend-dev/scripts/minimax_image.py +137 -0
- package/skills/frontend-dev/scripts/minimax_music.py +157 -0
- package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
- package/skills/frontend-dev/scripts/minimax_video.py +187 -0
- package/skills/frontend-dev/templates/generator_template.js +223 -0
- package/skills/frontend-dev/templates/viewer.html +599 -0
- package/skills/frontend-ui-engineering/SKILL.md +367 -0
- package/skills/fullstack-dev/SKILL.md +819 -0
- package/skills/fullstack-dev/references/api-design.md +444 -0
- package/skills/fullstack-dev/references/auth-flow.md +165 -0
- package/skills/fullstack-dev/references/db-schema.md +706 -0
- package/skills/fullstack-dev/references/django-best-practices.md +466 -0
- package/skills/fullstack-dev/references/environment-management.md +78 -0
- package/skills/fullstack-dev/references/release-checklist.md +278 -0
- package/skills/fullstack-dev/references/technology-selection.md +254 -0
- package/skills/fullstack-dev/references/testing-strategy.md +404 -0
- package/skills/git-workflow-and-versioning/SKILL.md +446 -0
- package/skills/github-evidence-triage/SKILL.md +115 -0
- package/skills/harness-evolution/SKILL.md +59 -0
- package/skills/harness-evolution/references/activation-matrix.md +13 -0
- package/skills/harness-evolution/references/approval-policy.md +20 -0
- package/skills/harness-evolution/references/change-report-template.md +33 -0
- package/skills/harness-evolution/references/component-taxonomy.md +19 -0
- package/skills/harness-evolution/references/verdict-policy.md +13 -0
- package/skills/harness-issue-triage/SKILL.md +72 -0
- package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
- package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
- package/skills/harness-optimization-audit/SKILL.md +125 -0
- package/skills/idea-refine/SKILL.md +191 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
- package/skills/incremental-implementation/SKILL.md +252 -0
- package/skills/ios-application-dev/SKILL.md +212 -0
- package/skills/ios-application-dev/references/accessibility.md +259 -0
- package/skills/ios-application-dev/references/graphics-animation.md +350 -0
- package/skills/ios-application-dev/references/layout-system.md +199 -0
- package/skills/ios-application-dev/references/metal-shader.md +178 -0
- package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
- package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
- package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
- package/skills/ios-application-dev/references/system-integration.md +401 -0
- package/skills/ios-application-dev/references/uikit-components.md +297 -0
- package/skills/local-review-gate/SKILL.md +207 -0
- package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
- package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
- package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
- package/skills/local-review-gate/references/graphify-local-review.md +33 -0
- package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
- package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
- package/skills/local-review-gate/references/upstream-provenance.md +61 -0
- package/skills/mature-project-pattern-research/SKILL.md +155 -0
- package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
- package/skills/minimax-docx/LICENSE +21 -0
- package/skills/minimax-docx/SKILL.md +273 -0
- package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/skills/minimax-docx/references/comments_guide.md +191 -0
- package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/skills/minimax-docx/references/design_principles.md +819 -0
- package/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/skills/minimax-docx/references/openxml_units.md +72 -0
- package/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/skills/minimax-docx/references/typography_guide.md +294 -0
- package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/skills/minimax-docx/scripts/setup.sh +504 -0
- package/skills/minimax-pdf/README.md +222 -0
- package/skills/minimax-pdf/SKILL.md +218 -0
- package/skills/minimax-pdf/design/design.md +381 -0
- package/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/skills/minimax-pdf/scripts/make.sh +491 -0
- package/skills/minimax-pdf/scripts/merge.py +112 -0
- package/skills/minimax-pdf/scripts/palette.py +521 -0
- package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/skills/minimax-pdf/scripts/render_body.py +1052 -0
- package/skills/minimax-pdf/scripts/render_cover.js +111 -0
- package/skills/minimax-xlsx/SKILL.md +156 -0
- package/skills/minimax-xlsx/references/create.md +691 -0
- package/skills/minimax-xlsx/references/edit.md +684 -0
- package/skills/minimax-xlsx/references/fix.md +37 -0
- package/skills/minimax-xlsx/references/format.md +768 -0
- package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/skills/minimax-xlsx/references/validate.md +772 -0
- package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/skills/newsletter-generation/SKILL.md +71 -0
- package/skills/oss-release-readiness/SKILL.md +47 -0
- package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
- package/skills/performance-optimization/SKILL.md +364 -0
- package/skills/planning-and-task-breakdown/SKILL.md +290 -0
- package/skills/pptx-generator/SKILL.md +275 -0
- package/skills/pptx-generator/references/design-system.md +392 -0
- package/skills/pptx-generator/references/editing.md +162 -0
- package/skills/pptx-generator/references/pitfalls.md +112 -0
- package/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/skills/pptx-generator/references/slide-types.md +413 -0
- package/skills/pr-test-analysis/SKILL.md +24 -0
- package/skills/react-native-dev/SKILL.md +180 -0
- package/skills/react-native-dev/references/animations.md +254 -0
- package/skills/react-native-dev/references/components.md +124 -0
- package/skills/react-native-dev/references/engineering.md +527 -0
- package/skills/react-native-dev/references/forms.md +300 -0
- package/skills/react-native-dev/references/native-capabilities.md +163 -0
- package/skills/react-native-dev/references/navigation.md +271 -0
- package/skills/react-native-dev/references/networking.md +346 -0
- package/skills/react-native-dev/references/performance.md +215 -0
- package/skills/react-native-dev/references/state-management.md +230 -0
- package/skills/react-native-dev/references/styling.md +117 -0
- package/skills/react-native-dev/references/testing.md +341 -0
- package/skills/requirements-grilling/SKILL.md +447 -0
- package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
- package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
- package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
- package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
- package/skills/review-pipeline/SKILL.md +38 -0
- package/skills/rose-memory/SKILL.md +210 -0
- package/skills/rose-memory/references/README.md +48 -0
- package/skills/rose-memory/references/memory_cli.py +2384 -0
- package/skills/rose-memory/references/schema.sql +315 -0
- package/skills/security-and-hardening/SKILL.md +369 -0
- package/skills/session-handoff/SKILL.md +88 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
- package/skills/session-handoff/scripts/session_handoff.py +764 -0
- package/skills/shader-dev/SKILL.md +316 -0
- package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
- package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
- package/skills/shader-dev/reference/anti-aliasing.md +71 -0
- package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
- package/skills/shader-dev/reference/camera-effects.md +80 -0
- package/skills/shader-dev/reference/cellular-automata.md +635 -0
- package/skills/shader-dev/reference/color-palette.md +481 -0
- package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
- package/skills/shader-dev/reference/domain-repetition.md +436 -0
- package/skills/shader-dev/reference/domain-warping.md +419 -0
- package/skills/shader-dev/reference/fluid-simulation.md +425 -0
- package/skills/shader-dev/reference/fractal-rendering.md +525 -0
- package/skills/shader-dev/reference/lighting-model.md +639 -0
- package/skills/shader-dev/reference/matrix-transform.md +535 -0
- package/skills/shader-dev/reference/multipass-buffer.md +571 -0
- package/skills/shader-dev/reference/normal-estimation.md +418 -0
- package/skills/shader-dev/reference/particle-system.md +589 -0
- package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
- package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
- package/skills/shader-dev/reference/post-processing.md +375 -0
- package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
- package/skills/shader-dev/reference/procedural-noise.md +551 -0
- package/skills/shader-dev/reference/ray-marching.md +396 -0
- package/skills/shader-dev/reference/sdf-2d.md +724 -0
- package/skills/shader-dev/reference/sdf-3d.md +805 -0
- package/skills/shader-dev/reference/sdf-tricks.md +63 -0
- package/skills/shader-dev/reference/shadow-techniques.md +476 -0
- package/skills/shader-dev/reference/simulation-physics.md +644 -0
- package/skills/shader-dev/reference/sound-synthesis.md +578 -0
- package/skills/shader-dev/reference/terrain-rendering.md +839 -0
- package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
- package/skills/shader-dev/reference/texture-sampling.md +553 -0
- package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
- package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
- package/skills/shader-dev/reference/voxel-rendering.md +701 -0
- package/skills/shader-dev/reference/water-ocean.md +445 -0
- package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
- package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
- package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
- package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
- package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
- package/skills/shader-dev/techniques/camera-effects.md +115 -0
- package/skills/shader-dev/techniques/cellular-automata.md +531 -0
- package/skills/shader-dev/techniques/color-palette.md +380 -0
- package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
- package/skills/shader-dev/techniques/domain-repetition.md +333 -0
- package/skills/shader-dev/techniques/domain-warping.md +414 -0
- package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
- package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
- package/skills/shader-dev/techniques/lighting-model.md +527 -0
- package/skills/shader-dev/techniques/matrix-transform.md +455 -0
- package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
- package/skills/shader-dev/techniques/normal-estimation.md +318 -0
- package/skills/shader-dev/techniques/particle-system.md +1203 -0
- package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
- package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
- package/skills/shader-dev/techniques/post-processing.md +788 -0
- package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
- package/skills/shader-dev/techniques/procedural-noise.md +554 -0
- package/skills/shader-dev/techniques/ray-marching.md +467 -0
- package/skills/shader-dev/techniques/sdf-2d.md +631 -0
- package/skills/shader-dev/techniques/sdf-3d.md +589 -0
- package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
- package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
- package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
- package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
- package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
- package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
- package/skills/shader-dev/techniques/texture-sampling.md +382 -0
- package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
- package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
- package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
- package/skills/shader-dev/techniques/water-ocean.md +490 -0
- package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
- package/skills/shipping-and-launch/SKILL.md +334 -0
- package/skills/silent-failure-hunting/SKILL.md +24 -0
- package/skills/source-driven-development/SKILL.md +223 -0
- package/skills/spec-driven-development/SKILL.md +235 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
- package/skills/strategy-stress-test/SKILL.md +185 -0
- package/skills/systematic-literature-review/SKILL.md +77 -0
- package/skills/test-document-generator/SKILL.md +152 -0
- package/skills/test-document-generator/references/test-document-template.md +45 -0
- package/skills/test-driven-development/SKILL.md +399 -0
- package/skills/write-skills/GLOSSARY.md +113 -0
- package/skills/write-skills/SKILL.md +133 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
- package/src/runtime/child-guard.ts +70 -0
- package/src/runtime/conflicts.ts +25 -0
- package/src/runtime/contracts.ts +9 -0
- package/src/runtime/doctor.ts +134 -0
- package/src/runtime/global-resources.ts +152 -0
- package/src/runtime/index.ts +23 -0
- package/src/runtime/lifecycle.ts +19 -0
- package/src/runtime/native-integrations.ts +44 -0
- package/src/runtime/path-boundaries.ts +69 -0
- package/src/runtime/registry.ts +213 -0
- package/src/runtime/roles.ts +64 -0
- package/src/runtime/rose-context.ts +24 -0
- package/src/runtime/subagents.ts +426 -0
- package/templates/APPEND_SYSTEM.md +12 -0
- package/upstream/aili-workflows.lock.json +3226 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Performance Reference
|
|
2
|
+
|
|
3
|
+
Diagnosing and fixing performance issues in React Native / Expo apps.
|
|
4
|
+
|
|
5
|
+
## Profiling Workflow
|
|
6
|
+
|
|
7
|
+
Before optimizing, identify the actual bottleneck:
|
|
8
|
+
|
|
9
|
+
1. **JS thread** — Open React Native DevTools (press `j` in Metro terminal) → Profiler tab → record interaction → look for components with long render times
|
|
10
|
+
2. **Native thread** — iOS: Xcode Instruments (Time Profiler); Android: Android Studio CPU Profiler
|
|
11
|
+
3. **Measure, don't guess** — Always reproduce the issue in a release-like build (`npx expo run:ios --configuration Release`)
|
|
12
|
+
|
|
13
|
+
## Rendering
|
|
14
|
+
|
|
15
|
+
### Virtualized Lists
|
|
16
|
+
|
|
17
|
+
Never render large datasets inside a `ScrollView`. Use a virtualized list that recycles off-screen views:
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { FlashList } from "@shopify/flash-list";
|
|
21
|
+
|
|
22
|
+
function ProductCatalog({ products }: { products: Product[] }) {
|
|
23
|
+
return (
|
|
24
|
+
<FlashList
|
|
25
|
+
data={products}
|
|
26
|
+
renderItem={({ item }) => <ProductRow product={item} />}
|
|
27
|
+
estimatedItemSize={72}
|
|
28
|
+
keyExtractor={(p) => p.sku}
|
|
29
|
+
/>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const ProductRow = memo(function ProductRow({ product }: { product: Product }) {
|
|
34
|
+
return (
|
|
35
|
+
<View style={rowStyles.container}>
|
|
36
|
+
<Image source={product.thumbnail} style={rowStyles.image} />
|
|
37
|
+
<Text style={rowStyles.title}>{product.name}</Text>
|
|
38
|
+
</View>
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Key points:
|
|
44
|
+
- Wrap list items with `memo` to skip re-renders when props haven't changed
|
|
45
|
+
- Always provide `estimatedItemSize` — FlashList uses it for layout estimation
|
|
46
|
+
- Extract `renderItem` or use a named component to keep stable references
|
|
47
|
+
|
|
48
|
+
### Minimizing Re-renders
|
|
49
|
+
|
|
50
|
+
**Split state by concern.** A single large state object forces every subscriber to re-render on any change:
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
// Zustand — select only the slice you need
|
|
54
|
+
const count = useStore((s) => s.cart.itemCount);
|
|
55
|
+
|
|
56
|
+
// Jotai — one atom per concern
|
|
57
|
+
const cartTotalAtom = atom((get) => {
|
|
58
|
+
const items = get(cartItemsAtom);
|
|
59
|
+
return items.reduce((sum, i) => sum + i.price * i.qty, 0);
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**React Compiler** (Expo SDK 54+) automatically memoizes components and hooks. Enable it to eliminate most manual `useMemo`/`useCallback`:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
// app.json
|
|
67
|
+
{ "expo": { "experiments": { "reactCompiler": true } } }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Deferred Updates
|
|
71
|
+
|
|
72
|
+
When a state change triggers expensive computation (filtering a long list, rendering a complex tree), defer the update so typing or scrolling stays responsive:
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
const [search, setSearch] = useState("");
|
|
76
|
+
const deferred = useDeferredValue(search);
|
|
77
|
+
|
|
78
|
+
const results = useMemo(
|
|
79
|
+
() => catalog.filter((p) => p.name.toLowerCase().includes(deferred.toLowerCase())),
|
|
80
|
+
[catalog, deferred],
|
|
81
|
+
);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### TextInput on Android
|
|
85
|
+
|
|
86
|
+
Controlled `TextInput` (with `value` + `onChangeText`) can lag on Android because every keystroke round-trips through the JS thread. For search bars or other high-frequency inputs, prefer uncontrolled mode:
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
const ref = useRef<TextInput>(null);
|
|
90
|
+
|
|
91
|
+
<TextInput
|
|
92
|
+
ref={ref}
|
|
93
|
+
defaultValue=""
|
|
94
|
+
onEndEditing={(e) => handleSearch(e.nativeEvent.text)}
|
|
95
|
+
/>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Startup Time (TTI)
|
|
99
|
+
|
|
100
|
+
### Measuring
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
import { PerformanceObserver, performance } from "react-native-performance";
|
|
104
|
+
|
|
105
|
+
performance.mark("nativeLaunch");
|
|
106
|
+
|
|
107
|
+
export default function App() {
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
performance.measure("TTI", "nativeLaunch");
|
|
110
|
+
}, []);
|
|
111
|
+
// ...
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Always measure **cold starts** — kill the app completely before each measurement.
|
|
116
|
+
|
|
117
|
+
### Reducing TTI
|
|
118
|
+
|
|
119
|
+
- **Android bundle mmap** — Set `expo.useLegacyPackaging=false` in `android/gradle.properties` so Hermes memory-maps the bundle instead of decompressing it
|
|
120
|
+
- **Preload heavy routes** — Call `preloadRouteAsync("/dashboard")` (from `expo-router`) while the user is still on the splash/login screen
|
|
121
|
+
- **Lazy-load non-critical screens** — Screens behind deep navigation don't need to be in the initial bundle
|
|
122
|
+
|
|
123
|
+
## Bundle & App Size
|
|
124
|
+
|
|
125
|
+
### Inspecting the Bundle
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx expo export --platform ios --source-maps --output-dir dist
|
|
129
|
+
npx source-map-explorer dist/bundles/ios/*.js
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Common wins:
|
|
133
|
+
- **Direct imports** — `import groupBy from "lodash/groupBy"` instead of `import { groupBy } from "lodash"`
|
|
134
|
+
- **Remove dead Intl polyfills** — Hermes ships with built-in `Intl` support since SDK 50
|
|
135
|
+
- **Tree shaking** — Enable via `"experiments": { "treeShaking": true }` in app config (SDK 52+)
|
|
136
|
+
|
|
137
|
+
### Shrinking the Native Binary
|
|
138
|
+
|
|
139
|
+
```properties
|
|
140
|
+
# android/gradle.properties
|
|
141
|
+
android.enableProguardInReleaseBuilds=true
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Inspect the final artifact:
|
|
145
|
+
- iOS: download the `.ipa` from EAS, unzip, check `Payload/*.app` size
|
|
146
|
+
- Android: open the `.aab`/`.apk` in Android Studio → Build → Analyze APK
|
|
147
|
+
|
|
148
|
+
## Memory
|
|
149
|
+
|
|
150
|
+
### Preventing Leaks
|
|
151
|
+
|
|
152
|
+
Every subscription, listener, or long-lived resource acquired in `useEffect` must be cleaned up:
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
const sub = AppState.addEventListener("change", onAppStateChange);
|
|
157
|
+
return () => sub.remove();
|
|
158
|
+
}, []);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
For fetch calls, pass an `AbortSignal` and abort on unmount:
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
const ac = new AbortController();
|
|
166
|
+
loadProducts(ac.signal);
|
|
167
|
+
return () => ac.abort();
|
|
168
|
+
}, [categoryId]);
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Native Memory
|
|
172
|
+
|
|
173
|
+
- Monitor with Xcode Memory Graph Debugger (iOS) or Android Studio Memory Profiler
|
|
174
|
+
- Release heavy native resources (camera sessions, audio players) in cleanup
|
|
175
|
+
- In Swift/Kotlin modules, watch for retain cycles — use `[weak self]` / `WeakReference`
|
|
176
|
+
|
|
177
|
+
## Animations
|
|
178
|
+
|
|
179
|
+
Only animate **`transform`** and **`opacity`**. These properties are composited on the GPU and don't trigger layout recalculation:
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
const style = useAnimatedStyle(() => ({
|
|
183
|
+
opacity: withTiming(visible.value ? 1 : 0),
|
|
184
|
+
transform: [{ translateY: withSpring(offset.value) }],
|
|
185
|
+
}));
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Animating `width`, `height`, `margin`, `padding`, or `top`/`left` forces the layout engine to re-measure on every frame — a common source of dropped frames.
|
|
189
|
+
|
|
190
|
+
Keep gesture callbacks on the UI thread:
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
const drag = Gesture.Pan().onUpdate((e) => {
|
|
194
|
+
"worklet";
|
|
195
|
+
translateX.value = e.translationX;
|
|
196
|
+
});
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Native Module Performance
|
|
200
|
+
|
|
201
|
+
- Prefer **async** Turbo Module methods — synchronous calls block the JS thread
|
|
202
|
+
- Use native SDK implementations over JS polyfills (`expo-crypto` over `crypto-js`, `react-native-mmkv` over AsyncStorage for hot paths)
|
|
203
|
+
- **Android 16KB page alignment** is required for Google Play (2025+). Verify third-party `.so` files are compiled with 16KB alignment
|
|
204
|
+
|
|
205
|
+
## Troubleshooting Guide
|
|
206
|
+
|
|
207
|
+
| Symptom | Where to Look | Likely Fix |
|
|
208
|
+
|---------|--------------|------------|
|
|
209
|
+
| Scroll jank in long lists | JS thread — re-renders | Virtualized list + memoized items |
|
|
210
|
+
| Typing lag in search bar | JS thread — controlled input | Uncontrolled `TextInput` with `defaultValue` |
|
|
211
|
+
| Slow cold start | Bundle size, sync init | Mmap bundle, preload routes, lazy screens |
|
|
212
|
+
| App binary too large | Native assets, unused libs | R8 (Android), analyze bundle, direct imports |
|
|
213
|
+
| Growing memory over time | Effect cleanup | Return teardown from every `useEffect` |
|
|
214
|
+
| Choppy enter/exit animation | Animated properties | Only `transform` + `opacity`, use worklets |
|
|
215
|
+
| Re-renders cascade across app | Global state shape | Atomic selectors (Zustand/Jotai), React Compiler |
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# State Management Reference
|
|
2
|
+
|
|
3
|
+
Patterns for local, shared, and server state in React Native / Expo apps.
|
|
4
|
+
|
|
5
|
+
## Decision Guide
|
|
6
|
+
|
|
7
|
+
| State Type | Solution |
|
|
8
|
+
|------------|----------|
|
|
9
|
+
| Local UI state (toggle, input) | `useState` / `useReducer` |
|
|
10
|
+
| Shared app-wide state | Zustand or Jotai |
|
|
11
|
+
| Server/async data | React Query (TanStack Query) |
|
|
12
|
+
| Form state | React Hook Form (see forms.md) |
|
|
13
|
+
| Auth / session | Zustand + `expo-secure-store` |
|
|
14
|
+
|
|
15
|
+
**Avoid**: Redux for new projects (boilerplate), Context for high-frequency updates (re-render overhead).
|
|
16
|
+
|
|
17
|
+
## useState / useReducer
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
// Simple toggle
|
|
21
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
22
|
+
|
|
23
|
+
// Complex local state — useReducer
|
|
24
|
+
type State = { count: number; status: "idle" | "loading" | "error" };
|
|
25
|
+
type Action = { type: "increment" } | { type: "setStatus"; payload: State["status"] };
|
|
26
|
+
|
|
27
|
+
function reducer(state: State, action: Action): State {
|
|
28
|
+
switch (action.type) {
|
|
29
|
+
case "increment": return { ...state, count: state.count + 1 };
|
|
30
|
+
case "setStatus": return { ...state, status: action.payload };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const [state, dispatch] = useReducer(reducer, { count: 0, status: "idle" });
|
|
35
|
+
dispatch({ type: "increment" });
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Zustand (Shared State)
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx expo install zustand
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
// stores/settings-store.ts
|
|
46
|
+
import { create } from "zustand";
|
|
47
|
+
import { persist, createJSONStorage } from "zustand/middleware";
|
|
48
|
+
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
49
|
+
|
|
50
|
+
interface SettingsStore {
|
|
51
|
+
theme: "light" | "dark";
|
|
52
|
+
locale: string;
|
|
53
|
+
setTheme: (theme: "light" | "dark") => void;
|
|
54
|
+
setLocale: (locale: string) => void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const useSettingsStore = create<SettingsStore>()(
|
|
58
|
+
persist(
|
|
59
|
+
(set) => ({
|
|
60
|
+
theme: "light",
|
|
61
|
+
locale: "en",
|
|
62
|
+
setTheme: (theme) => set({ theme }),
|
|
63
|
+
setLocale: (locale) => set({ locale }),
|
|
64
|
+
}),
|
|
65
|
+
{
|
|
66
|
+
name: "settings-storage",
|
|
67
|
+
storage: createJSONStorage(() => AsyncStorage),
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
// Usage
|
|
73
|
+
const { theme, setTheme } = useSettingsStore();
|
|
74
|
+
const locale = useSettingsStore((s) => s.locale); // Selector — minimizes re-renders
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
// stores/cart-store.ts
|
|
79
|
+
interface CartStore {
|
|
80
|
+
items: CartItem[];
|
|
81
|
+
add: (product: Product) => void;
|
|
82
|
+
remove: (id: string) => void;
|
|
83
|
+
clear: () => void;
|
|
84
|
+
total: () => number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export const useCartStore = create<CartStore>()((set, get) => ({
|
|
88
|
+
items: [],
|
|
89
|
+
add: (product) => set((s) => ({
|
|
90
|
+
items: [...s.items, { product, quantity: 1 }],
|
|
91
|
+
})),
|
|
92
|
+
remove: (id) => set((s) => ({
|
|
93
|
+
items: s.items.filter((i) => i.product.id !== id),
|
|
94
|
+
})),
|
|
95
|
+
clear: () => set({ items: [] }),
|
|
96
|
+
total: () => get().items.reduce((sum, i) => sum + i.product.price * i.quantity, 0),
|
|
97
|
+
}));
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Jotai (Atomic State)
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx expo install jotai
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
// atoms/user-atoms.ts
|
|
108
|
+
import { atom } from "jotai";
|
|
109
|
+
import { atomWithStorage, createJSONStorage } from "jotai/utils";
|
|
110
|
+
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
111
|
+
|
|
112
|
+
const storage = createJSONStorage(() => AsyncStorage);
|
|
113
|
+
|
|
114
|
+
export const userAtom = atom<User | null>(null);
|
|
115
|
+
export const themeAtom = atomWithStorage<"light" | "dark">("theme", "light", storage);
|
|
116
|
+
|
|
117
|
+
// Derived atom — computed from others
|
|
118
|
+
export const isAdminAtom = atom((get) => get(userAtom)?.role === "admin");
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
// Usage — component only re-renders when its atoms change
|
|
123
|
+
import { useAtom, useAtomValue, useSetAtom } from "jotai";
|
|
124
|
+
|
|
125
|
+
function Header() {
|
|
126
|
+
const user = useAtomValue(userAtom); // read-only
|
|
127
|
+
const setTheme = useSetAtom(themeAtom); // write-only
|
|
128
|
+
const [theme, setThemeRW] = useAtom(themeAtom); // read + write
|
|
129
|
+
return <Text>{user?.name}</Text>;
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Zustand vs Jotai**:
|
|
134
|
+
- **Zustand** — store-based, better for related state with actions (auth, cart)
|
|
135
|
+
- **Jotai** — atom-based, better for independent values, fine-grained subscriptions, avoids re-renders
|
|
136
|
+
|
|
137
|
+
## React Query (Server State)
|
|
138
|
+
|
|
139
|
+
See [networking.md](networking.md) for full reference. Key patterns:
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
// Queries — read
|
|
143
|
+
const { data, isLoading } = useQuery({ queryKey: ["users"], queryFn: fetchUsers });
|
|
144
|
+
|
|
145
|
+
// Mutations — write
|
|
146
|
+
const mutation = useMutation({
|
|
147
|
+
mutationFn: createUser,
|
|
148
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: ["users"] }),
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// Optimistic update
|
|
152
|
+
const mutation = useMutation({
|
|
153
|
+
mutationFn: updateUser,
|
|
154
|
+
onMutate: async (newUser) => {
|
|
155
|
+
await queryClient.cancelQueries({ queryKey: ["user", newUser.id] });
|
|
156
|
+
const prev = queryClient.getQueryData(["user", newUser.id]);
|
|
157
|
+
queryClient.setQueryData(["user", newUser.id], newUser);
|
|
158
|
+
return { prev };
|
|
159
|
+
},
|
|
160
|
+
onError: (_err, variables, context) => {
|
|
161
|
+
queryClient.setQueryData(["user", variables.id], context?.prev);
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Minimize Re-renders
|
|
167
|
+
|
|
168
|
+
### Zustand Selectors
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
// ✗ Wrong — re-renders on any store change
|
|
172
|
+
const store = useAuthStore();
|
|
173
|
+
|
|
174
|
+
// ✓ Correct — re-renders only when user changes
|
|
175
|
+
const user = useAuthStore((s) => s.user);
|
|
176
|
+
const logout = useAuthStore((s) => s.logout); // Actions are stable references
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Dispatcher Pattern
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
// ✗ Wrong — passes callbacks that recreate on every render
|
|
183
|
+
function Parent() {
|
|
184
|
+
const [count, setCount] = useState(0);
|
|
185
|
+
return <Child onIncrement={() => setCount(c => c + 1)} />;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ✓ Correct — dispatcher reference is stable
|
|
189
|
+
function Parent() {
|
|
190
|
+
const [count, dispatch] = useReducer(reducer, 0);
|
|
191
|
+
return <Child dispatch={dispatch} />;
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### React Compiler (SDK 54+)
|
|
196
|
+
|
|
197
|
+
With React Compiler enabled, `memo`, `useCallback`, and `useMemo` are often unnecessary:
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
// app.json
|
|
201
|
+
{ "expo": { "experiments": { "reactCompiler": true } } }
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Context (Use Sparingly)
|
|
205
|
+
|
|
206
|
+
Context is suitable for infrequently-changing values (theme, locale, auth status). **Avoid** for high-frequency updates like scroll position or form input.
|
|
207
|
+
|
|
208
|
+
```tsx
|
|
209
|
+
const ThemeContext = createContext<"light" | "dark">("light");
|
|
210
|
+
|
|
211
|
+
function ThemeProvider({ children }: { children: ReactNode }) {
|
|
212
|
+
const [theme, setTheme] = useState<"light" | "dark">("light");
|
|
213
|
+
return <ThemeContext value={theme}>{children}</ThemeContext>; // React 19+
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Consume
|
|
217
|
+
const theme = use(ThemeContext); // React 19+
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Fallback on First Render
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
// ✓ Always show fallback while async state loads
|
|
224
|
+
function UserProfile({ userId }: { userId: string }) {
|
|
225
|
+
const { data, isLoading } = useQuery({ queryKey: ["user", userId], queryFn: () => fetchUser(userId) });
|
|
226
|
+
if (isLoading) return <UserProfileSkeleton />;
|
|
227
|
+
if (!data) return null;
|
|
228
|
+
return <Profile user={data} />;
|
|
229
|
+
}
|
|
230
|
+
```
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Styling Reference
|
|
2
|
+
|
|
3
|
+
StyleSheet, NativeWind/Tailwind, platform-specific styles, and theming for Expo/React Native.
|
|
4
|
+
|
|
5
|
+
## StyleSheet
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { StyleSheet } from "react-native";
|
|
9
|
+
const styles = StyleSheet.create({
|
|
10
|
+
container: { flex: 1, backgroundColor: "#fff" },
|
|
11
|
+
text: { fontSize: 16, fontWeight: "600" },
|
|
12
|
+
});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Prefer `StyleSheet.create` over inline style objects — it validates styles at creation time and enables potential future optimizations.
|
|
16
|
+
|
|
17
|
+
## Platform-Specific Styles
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { Platform, StyleSheet } from "react-native";
|
|
21
|
+
|
|
22
|
+
const styles = StyleSheet.create({
|
|
23
|
+
shadow: Platform.select({
|
|
24
|
+
ios: { shadowColor: "#000", shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1, shadowRadius: 4 },
|
|
25
|
+
android: { elevation: 4 },
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Since React Native 0.76+, `boxShadow` is supported as a unified cross-platform shadow API. Prefer it over platform-specific shadow properties when targeting New Architecture.
|
|
31
|
+
|
|
32
|
+
## NativeWind / Tailwind CSS
|
|
33
|
+
|
|
34
|
+
For existing projects, check which NativeWind version is in `package.json` and follow the corresponding docs. For new projects, use NativeWind v4 (stable).
|
|
35
|
+
|
|
36
|
+
### Installation (NativeWind v4)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx expo install nativewind tailwindcss@3 \
|
|
40
|
+
tailwind-merge clsx
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Configuration
|
|
44
|
+
|
|
45
|
+
```js
|
|
46
|
+
// babel.config.js
|
|
47
|
+
module.exports = function (api) {
|
|
48
|
+
api.cache(true);
|
|
49
|
+
return {
|
|
50
|
+
presets: ["babel-preset-expo"],
|
|
51
|
+
plugins: ["nativewind/babel"],
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```js
|
|
57
|
+
// tailwind.config.js
|
|
58
|
+
module.exports = {
|
|
59
|
+
content: ["./app/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}"],
|
|
60
|
+
presets: [require("nativewind/preset")],
|
|
61
|
+
theme: { extend: {} },
|
|
62
|
+
};
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```css
|
|
66
|
+
/* global.css */
|
|
67
|
+
@tailwind base;
|
|
68
|
+
@tailwind components;
|
|
69
|
+
@tailwind utilities;
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
// app/_layout.tsx
|
|
74
|
+
import "../global.css";
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Usage
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
<View className="flex-1 bg-white p-4">
|
|
81
|
+
<Text className="text-lg font-semibold text-gray-900">Title</Text>
|
|
82
|
+
<Pressable className="mt-4 rounded-lg bg-blue-500 px-4 py-2">
|
|
83
|
+
<Text className="text-center text-white font-medium">Button</Text>
|
|
84
|
+
</Pressable>
|
|
85
|
+
</View>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Conditional Classes
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
import { type ClassValue, clsx } from "clsx";
|
|
92
|
+
import { twMerge } from "tailwind-merge";
|
|
93
|
+
|
|
94
|
+
const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));
|
|
95
|
+
|
|
96
|
+
<View className={cn("p-4", isActive && "bg-blue-500", isDisabled && "opacity-50")} />
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Theming and Dark Mode
|
|
100
|
+
|
|
101
|
+
For apps using NativeWind, use Tailwind's `dark:` variant:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<View className="bg-white dark:bg-gray-900">
|
|
105
|
+
<Text className="text-gray-900 dark:text-white">Adaptive text</Text>
|
|
106
|
+
</View>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
For StyleSheet-based projects, read the system color scheme and map it to a theme object:
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
import { useColorScheme } from "react-native";
|
|
113
|
+
|
|
114
|
+
const colorScheme = useColorScheme(); // "light" | "dark"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Keep color tokens in a central `constants/colors.ts` file with light and dark variants. Pass the active palette via React Context or a Zustand store.
|