@muskanmeet/invoicing-design-system 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/.cache/replit/env/latest +78 -0
- package/.cache/replit/env/latest.json +1 -0
- package/.cache/replit/modules/nodejs-20.res +1 -0
- package/.cache/replit/modules/python-3.11.res +1 -0
- package/.cache/replit/modules/replit-rtld-loader.res +1 -0
- package/.cache/replit/modules/replit.res +1 -0
- package/.cache/replit/modules.stamp +0 -0
- package/.cache/replit/nix/dotreplitenv.json +1 -0
- package/.cache/replit/toolchain.json +1 -0
- package/.cache/typescript/5.9/package-lock.json +50 -0
- package/.cache/typescript/5.9/package.json +1 -0
- package/.config/nextjs-nodejs/config.json +7 -0
- package/.eslintrc.json +3 -0
- package/.local/.commit_message +31 -0
- package/.local/secondary_skills/LICENSE.txt +21 -0
- package/.local/secondary_skills/ad-creative/.fingerprint +1 -0
- package/.local/secondary_skills/ad-creative/SKILL.md +872 -0
- package/.local/secondary_skills/ai-recruiter/.fingerprint +1 -0
- package/.local/secondary_skills/ai-recruiter/SKILL.md +1087 -0
- package/.local/secondary_skills/ai-sdr/.fingerprint +1 -0
- package/.local/secondary_skills/ai-sdr/SKILL.md +204 -0
- package/.local/secondary_skills/ai-secretary/.fingerprint +1 -0
- package/.local/secondary_skills/ai-secretary/SKILL.md +1132 -0
- package/.local/secondary_skills/branding-generator/.fingerprint +1 -0
- package/.local/secondary_skills/branding-generator/SKILL.md +286 -0
- package/.local/secondary_skills/competitive-analysis/.fingerprint +1 -0
- package/.local/secondary_skills/competitive-analysis/SKILL.md +429 -0
- package/.local/secondary_skills/content-machine/.fingerprint +1 -0
- package/.local/secondary_skills/content-machine/SKILL.md +321 -0
- package/.local/secondary_skills/deep-research/.fingerprint +1 -0
- package/.local/secondary_skills/deep-research/SKILL.md +517 -0
- package/.local/secondary_skills/design-thinker/.fingerprint +1 -0
- package/.local/secondary_skills/design-thinker/SKILL.md +327 -0
- package/.local/secondary_skills/excel-generator/.fingerprint +1 -0
- package/.local/secondary_skills/excel-generator/SKILL.md +954 -0
- package/.local/secondary_skills/excel-generator/financial-models.md +289 -0
- package/.local/secondary_skills/file-converter/.fingerprint +1 -0
- package/.local/secondary_skills/file-converter/SKILL.md +823 -0
- package/.local/secondary_skills/flashcard-generator/.fingerprint +1 -0
- package/.local/secondary_skills/flashcard-generator/SKILL.md +233 -0
- package/.local/secondary_skills/geo/.fingerprint +1 -0
- package/.local/secondary_skills/geo/SKILL.md +378 -0
- package/.local/secondary_skills/geo/references/content-patterns.md +158 -0
- package/.local/secondary_skills/geo/references/platform-notes.md +128 -0
- package/.local/secondary_skills/geo/references/scorecard.md +113 -0
- package/.local/secondary_skills/geo/references/technical-checklist.md +257 -0
- package/.local/secondary_skills/github-solution-finder/.fingerprint +1 -0
- package/.local/secondary_skills/github-solution-finder/SKILL.md +174 -0
- package/.local/secondary_skills/infographic-builder/.fingerprint +1 -0
- package/.local/secondary_skills/infographic-builder/SKILL.md +317 -0
- package/.local/secondary_skills/infographic-builder/antv-syntax.md +470 -0
- package/.local/secondary_skills/infographic-builder/react-fallback.md +210 -0
- package/.local/secondary_skills/insurance-optimizer/.fingerprint +1 -0
- package/.local/secondary_skills/insurance-optimizer/SKILL.md +209 -0
- package/.local/secondary_skills/interview-prep/.fingerprint +1 -0
- package/.local/secondary_skills/interview-prep/SKILL.md +349 -0
- package/.local/secondary_skills/invoice-generator/.fingerprint +1 -0
- package/.local/secondary_skills/invoice-generator/SKILL.md +527 -0
- package/.local/secondary_skills/legal-contract/.fingerprint +1 -0
- package/.local/secondary_skills/legal-contract/SKILL.md +977 -0
- package/.local/secondary_skills/meal-planner/.fingerprint +1 -0
- package/.local/secondary_skills/meal-planner/SKILL.md +517 -0
- package/.local/secondary_skills/personal-shopper/.fingerprint +1 -0
- package/.local/secondary_skills/personal-shopper/SKILL.md +361 -0
- package/.local/secondary_skills/photo-editor/.fingerprint +1 -0
- package/.local/secondary_skills/photo-editor/SKILL.md +605 -0
- package/.local/secondary_skills/podcast-generator/.fingerprint +1 -0
- package/.local/secondary_skills/podcast-generator/SKILL.md +560 -0
- package/.local/secondary_skills/podcast-marketing/.fingerprint +1 -0
- package/.local/secondary_skills/podcast-marketing/SKILL.md +550 -0
- package/.local/secondary_skills/podcast-marketing/audio-processing.md +530 -0
- package/.local/secondary_skills/podcast-marketing/content-atoms.md +253 -0
- package/.local/secondary_skills/podcast-marketing/content-calendar.md +318 -0
- package/.local/secondary_skills/podcast-marketing/content-templates.md +325 -0
- package/.local/secondary_skills/podcast-marketing/quote-cards.md +238 -0
- package/.local/secondary_skills/podcast-marketing/rss-and-batch.md +359 -0
- package/.local/secondary_skills/podcast-marketing/video-clips.md +660 -0
- package/.local/secondary_skills/podcast-marketing/youtube-processing.md +328 -0
- package/.local/secondary_skills/product-manager/.fingerprint +1 -0
- package/.local/secondary_skills/product-manager/SKILL.md +272 -0
- package/.local/secondary_skills/programmatic-seo/.fingerprint +1 -0
- package/.local/secondary_skills/programmatic-seo/SKILL.md +1207 -0
- package/.local/secondary_skills/real-estate-analyzer/.fingerprint +1 -0
- package/.local/secondary_skills/real-estate-analyzer/SKILL.md +786 -0
- package/.local/secondary_skills/recipe-creator/.fingerprint +1 -0
- package/.local/secondary_skills/recipe-creator/SKILL.md +259 -0
- package/.local/secondary_skills/recreate-screenshot/.fingerprint +1 -0
- package/.local/secondary_skills/recreate-screenshot/SKILL.md +215 -0
- package/.local/secondary_skills/replit-migration-guardrails/.fingerprint +1 -0
- package/.local/secondary_skills/replit-migration-guardrails/SKILL.md +55 -0
- package/.local/secondary_skills/replit-migration-guardrails/references/base44.md +47 -0
- package/.local/secondary_skills/replit-migration-guardrails/references/vercel.md +78 -0
- package/.local/secondary_skills/resume-maker/.fingerprint +1 -0
- package/.local/secondary_skills/resume-maker/SKILL.md +790 -0
- package/.local/secondary_skills/seo-auditor/.fingerprint +1 -0
- package/.local/secondary_skills/seo-auditor/SKILL.md +448 -0
- package/.local/secondary_skills/skill-creator/.fingerprint +1 -0
- package/.local/secondary_skills/skill-creator/SKILL.md +214 -0
- package/.local/secondary_skills/skill-finder/.fingerprint +1 -0
- package/.local/secondary_skills/skill-finder/SKILL.md +299 -0
- package/.local/secondary_skills/stock-analyzer/.fingerprint +1 -0
- package/.local/secondary_skills/stock-analyzer/SKILL.md +798 -0
- package/.local/secondary_skills/storyboard/.fingerprint +1 -0
- package/.local/secondary_skills/storyboard/SKILL.md +558 -0
- package/.local/secondary_skills/supplier-research/.fingerprint +1 -0
- package/.local/secondary_skills/supplier-research/SKILL.md +213 -0
- package/.local/secondary_skills/tax-reviewer/.fingerprint +1 -0
- package/.local/secondary_skills/tax-reviewer/SKILL.md +131 -0
- package/.local/secondary_skills/travel-assistant/.fingerprint +1 -0
- package/.local/secondary_skills/travel-assistant/SKILL.md +667 -0
- package/.local/secondary_skills/video-editing/.fingerprint +1 -0
- package/.local/secondary_skills/video-editing/SKILL.md +705 -0
- package/.local/secondary_skills/video-editing/dead-space-and-chunking.md +1081 -0
- package/.local/secondary_skills/video-editing/operations.md +1719 -0
- package/.local/secondary_skills/video-editing/virality-scoring.md +1212 -0
- package/.local/secondary_skills/video-editing/voiceover.md +788 -0
- package/.local/secondary_skills/website-cloning/.fingerprint +1 -0
- package/.local/secondary_skills/website-cloning/SKILL.md +544 -0
- package/.local/secondary_skills/website-cloning/extraction.md +1207 -0
- package/.local/secondary_skills/website-cloning/pitfalls.md +297 -0
- package/.local/skills/LICENSE.txt +21 -0
- package/.local/skills/agent-inbox/.fingerprint +1 -0
- package/.local/skills/agent-inbox/SKILL.md +128 -0
- package/.local/skills/artifacts/.fingerprint +1 -0
- package/.local/skills/artifacts/SKILL.md +21 -0
- package/.local/skills/artifacts/artifacts/automation/artifact.yaml +40 -0
- package/.local/skills/artifacts/artifacts/automation/files/package.json.template +47 -0
- package/.local/skills/artifacts/artifacts/automation/files/scripts/build.sh +6 -0
- package/.local/skills/artifacts/artifacts/automation/files/scripts/inngest.sh +18 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/global.d.ts +1 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/mastra/agents/agent.ts +89 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/mastra/index.ts +212 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/client.ts +17 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/index.ts +214 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/mastra/storage/index.ts +8 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/mastra/tools/exampleTool.ts +71 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/mastra/workflows/workflow.ts +203 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/triggers/cronTriggers.ts +61 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/triggers/exampleConnectorTrigger.ts +153 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/triggers/slackTriggers.ts +638 -0
- package/.local/skills/artifacts/artifacts/automation/files/src/triggers/telegramTriggers.ts +94 -0
- package/.local/skills/artifacts/artifacts/automation/files/tests/testCronAutomation.ts +86 -0
- package/.local/skills/artifacts/artifacts/automation/files/tests/testWebhookAutomation.ts +118 -0
- package/.local/skills/artifacts/artifacts/automation/files/tsconfig.json +26 -0
- package/.local/skills/artifacts/artifacts/data-visualization/artifact.yaml +48 -0
- package/.local/skills/artifacts/artifacts/expo/OWNERS +2 -0
- package/.local/skills/artifacts/artifacts/expo/artifact.yaml +47 -0
- package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/_layout.tsx +86 -0
- package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/index.tsx +28 -0
- package/.local/skills/artifacts/artifacts/expo/files/app/+not-found.tsx +45 -0
- package/.local/skills/artifacts/artifacts/expo/files/app/_layout.tsx +60 -0
- package/.local/skills/artifacts/artifacts/expo/files/app.json.template +38 -0
- package/.local/skills/artifacts/artifacts/expo/files/assets/images/icon.png +0 -0
- package/.local/skills/artifacts/artifacts/expo/files/babel.config.js +6 -0
- package/.local/skills/artifacts/artifacts/expo/files/components/ErrorBoundary.tsx +54 -0
- package/.local/skills/artifacts/artifacts/expo/files/components/ErrorFallback.tsx +278 -0
- package/.local/skills/artifacts/artifacts/expo/files/components/KeyboardAwareScrollViewCompat.tsx +29 -0
- package/.local/skills/artifacts/artifacts/expo/files/constants/colors.ts +59 -0
- package/.local/skills/artifacts/artifacts/expo/files/hooks/useColors.ts +24 -0
- package/.local/skills/artifacts/artifacts/expo/files/metro.config.js +3 -0
- package/.local/skills/artifacts/artifacts/expo/files/package.json.template +58 -0
- package/.local/skills/artifacts/artifacts/expo/files/scripts/build.js +573 -0
- package/.local/skills/artifacts/artifacts/expo/files/server/serve.js +135 -0
- package/.local/skills/artifacts/artifacts/expo/files/server/templates/landing-page.html +460 -0
- package/.local/skills/artifacts/artifacts/expo/files/tsconfig.json +23 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/artifact.yaml +15 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/components.json +21 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/index.html +31 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/mockupPreviewPlugin.ts +199 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/package.json.template +75 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/public/favicon.svg +3 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/.generated/mockup-components.ts +3 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/App.tsx +146 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/accordion.tsx +55 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert-dialog.tsx +139 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert.tsx +59 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/aspect-ratio.tsx +5 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/avatar.tsx +50 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/badge.tsx +43 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/breadcrumb.tsx +115 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button-group.tsx +83 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button.tsx +65 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/calendar.tsx +213 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/card.tsx +76 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/carousel.tsx +260 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/chart.tsx +367 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/checkbox.tsx +28 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/collapsible.tsx +11 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/command.tsx +153 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/context-menu.tsx +198 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dialog.tsx +120 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/drawer.tsx +116 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dropdown-menu.tsx +201 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/empty.tsx +104 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/field.tsx +244 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/form.tsx +176 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/hover-card.tsx +27 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-group.tsx +168 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-otp.tsx +69 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input.tsx +22 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/item.tsx +193 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/kbd.tsx +28 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/label.tsx +26 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/menubar.tsx +254 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/navigation-menu.tsx +128 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/pagination.tsx +117 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/popover.tsx +31 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/progress.tsx +28 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/radio-group.tsx +42 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/resizable.tsx +45 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/scroll-area.tsx +46 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/select.tsx +159 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/separator.tsx +29 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sheet.tsx +140 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sidebar.tsx +727 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/skeleton.tsx +15 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/slider.tsx +26 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sonner.tsx +31 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/spinner.tsx +16 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/switch.tsx +27 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/table.tsx +120 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tabs.tsx +53 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/textarea.tsx +22 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toast.tsx +127 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toaster.tsx +33 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle-group.tsx +61 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle.tsx +43 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tooltip.tsx +32 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-mobile.tsx +19 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-toast.ts +189 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/index.css +158 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/lib/utils.ts +6 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/main.tsx +5 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/tsconfig.json +20 -0
- package/.local/skills/artifacts/artifacts/mockup-sandbox/files/vite.config.ts +72 -0
- package/.local/skills/artifacts/artifacts/react-vite/artifact.yaml +41 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/components.json +20 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/index.html.template +24 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/package.json.template +77 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/public/favicon.svg +3 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/public/robots.txt +2 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/App.tsx +42 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/accordion.tsx +55 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert-dialog.tsx +139 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert.tsx +59 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/aspect-ratio.tsx +5 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/avatar.tsx +50 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/badge.tsx +43 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/breadcrumb.tsx +115 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button-group.tsx +83 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button.tsx +65 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/calendar.tsx +213 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/card.tsx +76 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/carousel.tsx +260 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/chart.tsx +367 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/checkbox.tsx +28 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/collapsible.tsx +11 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/command.tsx +153 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/context-menu.tsx +198 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dialog.tsx +120 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/drawer.tsx +116 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dropdown-menu.tsx +201 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/empty.tsx +104 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/field.tsx +244 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/form.tsx +176 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/hover-card.tsx +27 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-group.tsx +168 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-otp.tsx +69 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input.tsx +22 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/item.tsx +193 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/kbd.tsx +28 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/label.tsx +26 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/menubar.tsx +254 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/navigation-menu.tsx +128 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/pagination.tsx +117 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/popover.tsx +31 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/progress.tsx +28 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/radio-group.tsx +42 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/resizable.tsx +45 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/scroll-area.tsx +46 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/select.tsx +159 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/separator.tsx +29 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sheet.tsx +140 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sidebar.tsx +727 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/skeleton.tsx +15 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/slider.tsx +26 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sonner.tsx +31 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/spinner.tsx +16 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/switch.tsx +27 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/table.tsx +120 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tabs.tsx +53 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/textarea.tsx +22 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toast.tsx +127 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toaster.tsx +33 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle-group.tsx +61 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle.tsx +43 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tooltip.tsx +32 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-mobile.tsx +19 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-toast.ts +191 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/index.css +393 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/lib/utils.ts +6 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/main.tsx +5 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/src/pages/not-found.tsx +21 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/tsconfig.json +22 -0
- package/.local/skills/artifacts/artifacts/react-vite/files/vite.config.ts +75 -0
- package/.local/skills/artifacts/artifacts/slides/artifact.yaml +33 -0
- package/.local/skills/artifacts/artifacts/slides/files/index.html.template +46 -0
- package/.local/skills/artifacts/artifacts/slides/files/package.json.template +30 -0
- package/.local/skills/artifacts/artifacts/slides/files/public/favicon.svg +3 -0
- package/.local/skills/artifacts/artifacts/slides/files/scripts/validate-slides.ts +193 -0
- package/.local/skills/artifacts/artifacts/slides/files/src/App.tsx +251 -0
- package/.local/skills/artifacts/artifacts/slides/files/src/data/slides-manifest.json +1 -0
- package/.local/skills/artifacts/artifacts/slides/files/src/data/slidesManifestSchema.ts +33 -0
- package/.local/skills/artifacts/artifacts/slides/files/src/index.css +48 -0
- package/.local/skills/artifacts/artifacts/slides/files/src/main.tsx +14 -0
- package/.local/skills/artifacts/artifacts/slides/files/src/slideLoader.ts +51 -0
- package/.local/skills/artifacts/artifacts/slides/files/tsconfig.json +17 -0
- package/.local/skills/artifacts/artifacts/slides/files/vite.config.ts +74 -0
- package/.local/skills/artifacts/artifacts/video-js/artifact.yaml +38 -0
- package/.local/skills/artifacts/artifacts/video-js/files/index.html.template +27 -0
- package/.local/skills/artifacts/artifacts/video-js/files/package.json.template +36 -0
- package/.local/skills/artifacts/artifacts/video-js/files/public/favicon.svg +3 -0
- package/.local/skills/artifacts/artifacts/video-js/files/scripts/validate-recording.sh +38 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/App.tsx +5 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/ReplitLoadingScene.tsx +105 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/VideoTemplate.tsx +30 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/index.ts +1 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/hooks/use-mobile.tsx +19 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/index.css +50 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/lib/utils.ts +6 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/animations.ts +239 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/hooks.ts +104 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/index.ts +19 -0
- package/.local/skills/artifacts/artifacts/video-js/files/src/main.tsx +5 -0
- package/.local/skills/artifacts/artifacts/video-js/files/tsconfig.json +16 -0
- package/.local/skills/artifacts/artifacts/video-js/files/vite.config.ts +79 -0
- package/.local/skills/artifacts/bootstrap-legacy.js +115 -0
- package/.local/skills/artifacts/bootstrap.js +118 -0
- package/.local/skills/artifacts/references/multi-artifact-creation.md +94 -0
- package/.local/skills/canvas/.fingerprint +1 -0
- package/.local/skills/canvas/SKILL.md +534 -0
- package/.local/skills/canvas/__init__.py +1 -0
- package/.local/skills/code_review/.fingerprint +1 -0
- package/.local/skills/code_review/SKILL.md +82 -0
- package/.local/skills/database/.fingerprint +1 -0
- package/.local/skills/database/SKILL.md +351 -0
- package/.local/skills/database/references/database-migrations-on-publish.md +57 -0
- package/.local/skills/delegation/.fingerprint +1 -0
- package/.local/skills/delegation/SKILL.md +200 -0
- package/.local/skills/deployment/.fingerprint +1 -0
- package/.local/skills/deployment/SKILL.md +261 -0
- package/.local/skills/deployment/references/deployment-failure-debugging.md +243 -0
- package/.local/skills/deployment/references/deployment-logs.md +147 -0
- package/.local/skills/design/.fingerprint +1 -0
- package/.local/skills/design/SKILL.md +235 -0
- package/.local/skills/design-exploration/.fingerprint +1 -0
- package/.local/skills/design-exploration/SKILL.md +95 -0
- package/.local/skills/diagnostics/.fingerprint +1 -0
- package/.local/skills/diagnostics/SKILL.md +122 -0
- package/.local/skills/environment-secrets/.fingerprint +1 -0
- package/.local/skills/environment-secrets/SKILL.md +201 -0
- package/.local/skills/expo/.fingerprint +1 -0
- package/.local/skills/expo/OWNERS +2 -0
- package/.local/skills/expo/SKILL.md +298 -0
- package/.local/skills/expo/references/design_and_aesthetics.md +141 -0
- package/.local/skills/expo/references/device_features_and_permissions.md +48 -0
- package/.local/skills/expo/references/first_build.md +114 -0
- package/.local/skills/expo/references/react_context.md +54 -0
- package/.local/skills/external_apis/.fingerprint +1 -0
- package/.local/skills/external_apis/SKILL.md +25 -0
- package/.local/skills/external_apis/references/brave.md +116 -0
- package/.local/skills/external_apis/references/elevenlabs.md +44 -0
- package/.local/skills/external_apis/references/exa.md +34 -0
- package/.local/skills/external_apis/references/firecrawl.md +37 -0
- package/.local/skills/external_apis/references/nano_banana.md +33 -0
- package/.local/skills/follow-up-tasks/.fingerprint +1 -0
- package/.local/skills/follow-up-tasks/SKILL.md +80 -0
- package/.local/skills/image-search/.fingerprint +1 -0
- package/.local/skills/image-search/SKILL.md +150 -0
- package/.local/skills/integrations/.fingerprint +1 -0
- package/.local/skills/integrations/SKILL.md +205 -0
- package/.local/skills/media-generation/.fingerprint +1 -0
- package/.local/skills/media-generation/SKILL.md +170 -0
- package/.local/skills/media-generation/audio_generation.md +138 -0
- package/.local/skills/media-generation/video_generation.md +82 -0
- package/.local/skills/mockup-extract/.fingerprint +1 -0
- package/.local/skills/mockup-extract/SKILL.md +123 -0
- package/.local/skills/mockup-graduate/.fingerprint +1 -0
- package/.local/skills/mockup-graduate/SKILL.md +97 -0
- package/.local/skills/mockup-sandbox/.fingerprint +1 -0
- package/.local/skills/mockup-sandbox/SKILL.md +750 -0
- package/.local/skills/package-management/.fingerprint +1 -0
- package/.local/skills/package-management/SKILL.md +264 -0
- package/.local/skills/post_merge_setup/.fingerprint +1 -0
- package/.local/skills/post_merge_setup/SKILL.md +102 -0
- package/.local/skills/project_tasks/.fingerprint +1 -0
- package/.local/skills/project_tasks/SKILL.md +361 -0
- package/.local/skills/query-integration-data/.fingerprint +1 -0
- package/.local/skills/query-integration-data/SKILL.md +385 -0
- package/.local/skills/react-vite/.fingerprint +1 -0
- package/.local/skills/react-vite/SKILL.md +110 -0
- package/.local/skills/react-vite/references/frontend_general_rules.md +66 -0
- package/.local/skills/react-vite/references/seo.md +158 -0
- package/.local/skills/remove-image-background/.fingerprint +1 -0
- package/.local/skills/remove-image-background/SKILL.md +55 -0
- package/.local/skills/repl_setup/.fingerprint +1 -0
- package/.local/skills/repl_setup/SKILL.md +90 -0
- package/.local/skills/repl_setup/references/angular.md +103 -0
- package/.local/skills/repl_setup/references/react_vite.md +121 -0
- package/.local/skills/repl_setup/references/vue.md +102 -0
- package/.local/skills/replit-docs/.fingerprint +1 -0
- package/.local/skills/replit-docs/SKILL.md +81 -0
- package/.local/skills/revenuecat/.fingerprint +1 -0
- package/.local/skills/revenuecat/SKILL.md +133 -0
- package/.local/skills/revenuecat/references/initial-setup.md +566 -0
- package/.local/skills/revenuecat/references/replit-revenuecat-sdk-docs.md +279 -0
- package/.local/skills/revenuecat/references/subsequent-management.md +63 -0
- package/.local/skills/security_scan/.fingerprint +1 -0
- package/.local/skills/security_scan/SKILL.md +51 -0
- package/.local/skills/skill-authoring/.fingerprint +1 -0
- package/.local/skills/skill-authoring/SKILL.md +99 -0
- package/.local/skills/slides/.fingerprint +1 -0
- package/.local/skills/slides/SKILL.md +523 -0
- package/.local/skills/slides/references/brand_research.md +86 -0
- package/.local/skills/slides/references/export_failures.md +36 -0
- package/.local/skills/slides/references/exporting.md +49 -0
- package/.local/skills/slides/references/importing.md +40 -0
- package/.local/skills/slides/references/visual_qa.md +121 -0
- package/.local/skills/slides/templates/90s-board-deck.md +285 -0
- package/.local/skills/slides/templates/academic-lecture.md +437 -0
- package/.local/skills/slides/templates/adventure-outdoor.md +845 -0
- package/.local/skills/slides/templates/analytics-dashboard.md +407 -0
- package/.local/skills/slides/templates/annual-report-cover.md +592 -0
- package/.local/skills/slides/templates/apple-minimal.md +570 -0
- package/.local/skills/slides/templates/architecture-studio.md +339 -0
- package/.local/skills/slides/templates/arctic-expedition.md +582 -0
- package/.local/skills/slides/templates/arctic-minimal.md +364 -0
- package/.local/skills/slides/templates/art-deco.md +308 -0
- package/.local/skills/slides/templates/artisan-ceramics.md +659 -0
- package/.local/skills/slides/templates/artisan-food.md +709 -0
- package/.local/skills/slides/templates/artisanal-chalkboard.md +623 -0
- package/.local/skills/slides/templates/astronomy-log.md +562 -0
- package/.local/skills/slides/templates/aurora-expedition.md +754 -0
- package/.local/skills/slides/templates/automotive-electric.md +339 -0
- package/.local/skills/slides/templates/bauhaus-avant-garde.md +443 -0
- package/.local/skills/slides/templates/bioluminescent-sea.md +814 -0
- package/.local/skills/slides/templates/biophilic-urban.md +565 -0
- package/.local/skills/slides/templates/blackboard-chalk.md +517 -0
- package/.local/skills/slides/templates/blueprint.md +478 -0
- package/.local/skills/slides/templates/botanical-index.md +822 -0
- package/.local/skills/slides/templates/botanical-wellness.md +611 -0
- package/.local/skills/slides/templates/brand-book-page.md +466 -0
- package/.local/skills/slides/templates/brutalist-concrete.md +362 -0
- package/.local/skills/slides/templates/brutalist-studio.md +325 -0
- package/.local/skills/slides/templates/brutalist-web-punk.md +591 -0
- package/.local/skills/slides/templates/celestial-observatory.md +453 -0
- package/.local/skills/slides/templates/ceramics-artisan.md +740 -0
- package/.local/skills/slides/templates/cinema-verite.md +415 -0
- package/.local/skills/slides/templates/claymorphism.md +737 -0
- package/.local/skills/slides/templates/collage-zine.md +357 -0
- package/.local/skills/slides/templates/copper-sage.md +325 -0
- package/.local/skills/slides/templates/coral-reef.md +508 -0
- package/.local/skills/slides/templates/corporate-grid.md +331 -0
- package/.local/skills/slides/templates/corporate-memphis-flat.md +938 -0
- package/.local/skills/slides/templates/cosmos-explorer.md +998 -0
- package/.local/skills/slides/templates/cpg-coffee.md +850 -0
- package/.local/skills/slides/templates/craft-coffee-roast.md +693 -0
- package/.local/skills/slides/templates/creative-agency.md +244 -0
- package/.local/skills/slides/templates/creative-director.md +875 -0
- package/.local/skills/slides/templates/culinary-brand.md +698 -0
- package/.local/skills/slides/templates/de-stijl-construct.md +320 -0
- package/.local/skills/slides/templates/desert-dunes-photo.md +483 -0
- package/.local/skills/slides/templates/desert-mirror.md +577 -0
- package/.local/skills/slides/templates/desert-modernism.md +439 -0
- package/.local/skills/slides/templates/developer-api-docs.md +654 -0
- package/.local/skills/slides/templates/editorial-magazine.md +694 -0
- package/.local/skills/slides/templates/engineering-blueprint.md +730 -0
- package/.local/skills/slides/templates/executive-mono.md +363 -0
- package/.local/skills/slides/templates/expedition-peak.md +298 -0
- package/.local/skills/slides/templates/fashion-campaign.md +681 -0
- package/.local/skills/slides/templates/fashion-editorial.md +497 -0
- package/.local/skills/slides/templates/figma-geometric.md +420 -0
- package/.local/skills/slides/templates/film-noir.md +857 -0
- package/.local/skills/slides/templates/fitness-athletics.md +663 -0
- package/.local/skills/slides/templates/flat-vector.md +912 -0
- package/.local/skills/slides/templates/fluid-luxe.md +665 -0
- package/.local/skills/slides/templates/furniture-brand.md +505 -0
- package/.local/skills/slides/templates/gallery-modern.md +436 -0
- package/.local/skills/slides/templates/gaming-esports.md +410 -0
- package/.local/skills/slides/templates/geodesic-future.md +368 -0
- package/.local/skills/slides/templates/glass-artisan.md +666 -0
- package/.local/skills/slides/templates/glassmorphism.md +320 -0
- package/.local/skills/slides/templates/greenhouse-botanical.md +662 -0
- package/.local/skills/slides/templates/healthcare-clarity.md +468 -0
- package/.local/skills/slides/templates/holographic-drop.md +663 -0
- package/.local/skills/slides/templates/hospitality-resort.md +608 -0
- package/.local/skills/slides/templates/hypercar-launch.md +557 -0
- package/.local/skills/slides/templates/infographic-title.md +306 -0
- package/.local/skills/slides/templates/ink-wash.md +244 -0
- package/.local/skills/slides/templates/investor-memo.md +509 -0
- package/.local/skills/slides/templates/isometric-data.md +703 -0
- package/.local/skills/slides/templates/ivory-boardroom.md +439 -0
- package/.local/skills/slides/templates/japanese-minimal.md +308 -0
- package/.local/skills/slides/templates/jazz-blue-note.md +478 -0
- package/.local/skills/slides/templates/kinetic-type.md +206 -0
- package/.local/skills/slides/templates/lagoon-luxury.md +320 -0
- package/.local/skills/slides/templates/lavender-pastoral.md +577 -0
- package/.local/skills/slides/templates/linear-precise.md +460 -0
- package/.local/skills/slides/templates/lineart-sketch.md +930 -0
- package/.local/skills/slides/templates/lost-temple.md +689 -0
- package/.local/skills/slides/templates/luxury-fashion.md +269 -0
- package/.local/skills/slides/templates/luxury-watch.md +678 -0
- package/.local/skills/slides/templates/marble-elegance.md +673 -0
- package/.local/skills/slides/templates/mediterranean-travel.md +811 -0
- package/.local/skills/slides/templates/memphis-design.md +426 -0
- package/.local/skills/slides/templates/midnight-jazz.md +260 -0
- package/.local/skills/slides/templates/minimalist-poster.md +538 -0
- package/.local/skills/slides/templates/molten-craft.md +743 -0
- package/.local/skills/slides/templates/moroccan-tile.md +738 -0
- package/.local/skills/slides/templates/motorsport.md +782 -0
- package/.local/skills/slides/templates/mountain-drift.md +311 -0
- package/.local/skills/slides/templates/music-label.md +641 -0
- package/.local/skills/slides/templates/neo-tokyo.md +637 -0
- package/.local/skills/slides/templates/neobrutalism.md +334 -0
- package/.local/skills/slides/templates/newspaper-broadsheet.md +687 -0
- package/.local/skills/slides/templates/noir-fragrance.md +672 -0
- package/.local/skills/slides/templates/non-profit-impact.md +320 -0
- package/.local/skills/slides/templates/ocean-breeze.md +398 -0
- package/.local/skills/slides/templates/origami-couture.md +636 -0
- package/.local/skills/slides/templates/origami-paper.md +308 -0
- package/.local/skills/slides/templates/pastel-playground.md +1114 -0
- package/.local/skills/slides/templates/perfume-noir.md +646 -0
- package/.local/skills/slides/templates/prairie-storm.md +625 -0
- package/.local/skills/slides/templates/private-equity-dark.md +506 -0
- package/.local/skills/slides/templates/renaissance-florals.md +225 -0
- package/.local/skills/slides/templates/retro-print.md +880 -0
- package/.local/skills/slides/templates/retro-vinyl-sleeve.md +229 -0
- package/.local/skills/slides/templates/riso-zine.md +1094 -0
- package/.local/skills/slides/templates/risograph.md +1151 -0
- package/.local/skills/slides/templates/saas-product-launch.md +972 -0
- package/.local/skills/slides/templates/scandinavian.md +372 -0
- package/.local/skills/slides/templates/skater-culture.md +583 -0
- package/.local/skills/slides/templates/slate-modern.md +469 -0
- package/.local/skills/slides/templates/sneaker-drop.md +1006 -0
- package/.local/skills/slides/templates/social-campaign.md +321 -0
- package/.local/skills/slides/templates/stained-glass.md +574 -0
- package/.local/skills/slides/templates/strategy-one-pager.md +508 -0
- package/.local/skills/slides/templates/street-drop.md +677 -0
- package/.local/skills/slides/templates/street-mural.md +588 -0
- package/.local/skills/slides/templates/studio-noir.md +466 -0
- package/.local/skills/slides/templates/sustainability-esg.md +686 -0
- package/.local/skills/slides/templates/swiss-archive.md +648 -0
- package/.local/skills/slides/templates/swiss-typographic.md +364 -0
- package/.local/skills/slides/templates/tea-ceremony.md +456 -0
- package/.local/skills/slides/templates/tech-earbuds.md +870 -0
- package/.local/skills/slides/templates/terracotta-studio.md +235 -0
- package/.local/skills/slides/templates/thesis-defense.md +390 -0
- package/.local/skills/slides/templates/travel-aerial.md +648 -0
- package/.local/skills/slides/templates/treasury-policy.md +475 -0
- package/.local/skills/slides/templates/tropical-lush.md +332 -0
- package/.local/skills/slides/templates/underwater-dream.md +627 -0
- package/.local/skills/slides/templates/urban-golden.md +342 -0
- package/.local/skills/slides/templates/vintage-apothecary.md +552 -0
- package/.local/skills/slides/templates/vintage-ticket-stub.md +637 -0
- package/.local/skills/slides/templates/vinyl-crate.md +550 -0
- package/.local/skills/slides/templates/vision-editorial.md +612 -0
- package/.local/skills/slides/templates/volcanic-edge.md +347 -0
- package/.local/skills/slides/templates/watercolor-city.md +827 -0
- package/.local/skills/slides/templates/wine-spirits.md +203 -0
- package/.local/skills/slides/templates/wireframe-prototype.md +718 -0
- package/.local/skills/slides/templates/workspace-design.md +782 -0
- package/.local/skills/slides/templates/workspace-modern.md +406 -0
- package/.local/skills/slides/templates/zen-meditation.md +284 -0
- package/.local/skills/slides/templates/zen-void.md +244 -0
- package/.local/skills/stripe/.fingerprint +1 -0
- package/.local/skills/stripe/SKILL.md +455 -0
- package/.local/skills/stripe/references/code-templates.md +588 -0
- package/.local/skills/threat_modeling/.fingerprint +1 -0
- package/.local/skills/threat_modeling/SKILL.md +240 -0
- package/.local/skills/validation/.fingerprint +1 -0
- package/.local/skills/validation/SKILL.md +237 -0
- package/.local/skills/video-js/.fingerprint +1 -0
- package/.local/skills/video-js/SKILL.md +793 -0
- package/.local/skills/video-js/references/audio.md +237 -0
- package/.local/skills/video-js/references/finalize_playback.md +16 -0
- package/.local/skills/video-js/references/first_build.md +87 -0
- package/.local/skills/video-js/references/scene_selectors.md +428 -0
- package/.local/skills/web-search/.fingerprint +1 -0
- package/.local/skills/web-search/SKILL.md +110 -0
- package/.local/skills/whop/.fingerprint +1 -0
- package/.local/skills/whop/SKILL.md +104 -0
- package/.local/skills/whop/references/code-templates.md +66 -0
- package/.local/skills/whop/references/whop-api.mjs +22 -0
- package/.local/skills/whop/references/whop-mcp.mjs +40 -0
- package/.local/skills/whop/references/whopClient.ts +54 -0
- package/.local/skills/workflows/.fingerprint +1 -0
- package/.local/skills/workflows/SKILL.md +245 -0
- package/.local/state/replit/agent/.agent_state_037313043e76b5c652f276153ea014a68570e145.bin +0 -0
- package/.local/state/replit/agent/.agent_state_0f5361c2a53ab324b2a941a797f6494891be084c.bin +0 -0
- package/.local/state/replit/agent/.agent_state_4272443827dc90eac8c5b1963a34ee86da70bb99.bin +0 -0
- package/.local/state/replit/agent/.agent_state_4f14655950cbd611b228b4f0e1f664b66a56af24.bin +0 -0
- package/.local/state/replit/agent/.agent_state_ce28955a30856aa3d095b3568c322c8ec098993f.bin +0 -0
- package/.local/state/replit/agent/.agent_state_ec5347d04ebfbf6cf850fe04e15590d423e96d1d.bin +0 -0
- package/.local/state/replit/agent/.agent_state_f68f8c104d815ccc387290f0fba2c87c818d29f1.bin +0 -0
- package/.local/state/replit/agent/.agent_state_f87c1803a179510408c57c7a380c26f5c2197a30.bin +0 -0
- package/.local/state/replit/agent/.agent_state_main.bin +0 -0
- package/.local/state/replit/agent/.latest.json +1 -0
- package/.local/state/replit/agent/repl_state.bin +0 -0
- package/.local/state/scribe/scribe.db +0 -0
- package/.local/state/scribe/scribe.db-shm +0 -0
- package/.local/state/scribe/scribe.db-wal +0 -0
- package/.local/state/workflow-logs/2tfQP52ibxJTy4lpZ7_JX/start_application.shell.exec.0 +27 -0
- package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.external.managed.0 +31 -0
- package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.json +1 -0
- package/.local/state/workflow-logs/85n-z_SHy4JSGaUeJIcxy/start_application.shell.exec.0 +18 -0
- package/.local/state/workflow-logs/GIL2Ql5124lrEqGrfRO4k/start_application.shell.exec.0 +222 -0
- package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.external.managed.0 +45 -0
- package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.json +1 -0
- package/.local/state/workflow-logs/OKp1t-fEO5U_zQi1SKOQ-/start_application.shell.exec.0 +10 -0
- package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.external.managed.0 +43 -0
- package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.json +1 -0
- package/.local/state/workflow-logs/UDYycRqPV-N4B7whZP-yX/start_application.shell.exec.0 +252 -0
- package/.local/state/workflow-logs/V8Anmvz-HuvAztflZ8yCo/start_application.shell.exec.0 +87 -0
- package/.local/state/workflow-logs/a5fMnjr9tCwoaFY93pYuN/start_application.shell.exec.0 +2519 -0
- package/.local/state/workflow-logs/ggFzYcdHfIlW0owP2pb0U/start_application.shell.exec.0 +28 -0
- package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.external.managed.0 +41 -0
- package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.json +1 -0
- package/.local/state/workflow-logs/nbLvtuGJXB0wPmnruB3BE/start_application.shell.exec.0 +199 -0
- package/.local/state/workflow-logs/uDhN6S0ypUEh0MphXaFGY/start_application.shell.exec.0 +73 -0
- package/.local/state/workflow-logs/xZqU5CdTivcY6KEDEcVmD/start_application.shell.exec.0 +17 -0
- package/.local/tasks/breadcrumb-component.md +89 -0
- package/.local/tasks/calendar-component.md +93 -0
- package/.local/tasks/invoicing-design-system-app.md +39 -0
- package/.local/tasks/task-1.md +42 -0
- package/.local/tasks/task-7.md +92 -0
- package/.local/tasks/task-8.md +96 -0
- package/.replit +34 -0
- package/.upm/store.json +1 -0
- package/README.md +121 -0
- package/app/dashboard/page.tsx +10 -0
- package/app/design-system/page.tsx +802 -0
- package/app/invoices/page.tsx +10 -0
- package/app/layout.tsx +28 -0
- package/app/login/page.tsx +5 -0
- package/app/page.tsx +93 -0
- package/app/signup/page.tsx +5 -0
- package/attached_assets/Colors_1779781016394.png +0 -0
- package/attached_assets/Navy_1779781016404.png +0 -0
- package/attached_assets/Orange_1779781016405.png +0 -0
- package/attached_assets/Screenshot_2026-05-26_at_1.14.29_PM_1779781472515.png +0 -0
- package/attached_assets/Screenshot_2026-05-26_at_11.28.20_AM_1779775171071.png +0 -0
- package/attached_assets/Screenshot_2026-05-26_at_2.04.42_PM_1779784485318.png +0 -0
- package/attached_assets/Typography_1779781016406.png +0 -0
- package/design-system/components/avatar.tsx +46 -0
- package/design-system/components/badge.tsx +34 -0
- package/design-system/components/breadcrumb.tsx +149 -0
- package/design-system/components/button.tsx +57 -0
- package/design-system/components/calendar.tsx +77 -0
- package/design-system/components/card.tsx +62 -0
- package/design-system/components/checkbox.tsx +27 -0
- package/design-system/components/date-picker.tsx +153 -0
- package/design-system/components/dialog.tsx +106 -0
- package/design-system/components/dropdown-menu.tsx +88 -0
- package/design-system/components/form-field.tsx +78 -0
- package/design-system/components/input.tsx +25 -0
- package/design-system/components/label.tsx +25 -0
- package/design-system/components/popover.tsx +30 -0
- package/design-system/components/radio-group.tsx +35 -0
- package/design-system/components/select.tsx +84 -0
- package/design-system/components/separator.tsx +24 -0
- package/design-system/components/switch.tsx +28 -0
- package/design-system/components/table.tsx +80 -0
- package/design-system/components/tabs.tsx +54 -0
- package/design-system/components/textarea.tsx +25 -0
- package/design-system/components/toast.tsx +118 -0
- package/design-system/components/toaster.tsx +38 -0
- package/design-system/components/tooltip.tsx +27 -0
- package/design-system/hooks/index.ts +2 -0
- package/design-system/hooks/use-media-query.ts +27 -0
- package/design-system/hooks/use-toast.ts +91 -0
- package/design-system/index.ts +36 -0
- package/design-system/lib/cn.ts +6 -0
- package/design-system/styles.css +142 -0
- package/design-system/tokens/tokens.css +149 -0
- package/design-system/tokens/tokens.ts +190 -0
- package/next.config.mjs +6 -0
- package/package.json +46 -0
- package/postcss.config.mjs +6 -0
- package/screens/_shared/app-shell.tsx +145 -0
- package/screens/auth/auth-screen.tsx +156 -0
- package/screens/dashboard/dashboard-screen.tsx +207 -0
- package/screens/index.ts +17 -0
- package/screens/invoices/invoices-screen.tsx +317 -0
- package/tailwind.config.ts +110 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: environment-secrets
|
|
3
|
+
description: Manage environment variables and secrets. View, set, delete env vars and request secrets from users.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Environment Secrets Skill
|
|
7
|
+
|
|
8
|
+
Manage environment variables and secrets (such as API keys, tokens, and credentials). View, set, delete environment variables and request secrets from users.
|
|
9
|
+
|
|
10
|
+
The user can also change the values of any environment variables/secrets using the "secrets" tab in the Replit GUI.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
Use this skill when:
|
|
15
|
+
|
|
16
|
+
- You need to check what environment variables or secrets exist
|
|
17
|
+
- Setting sensitive configuration values (ports, hostnames, feature flags)
|
|
18
|
+
- Deleting obsolete environment variables
|
|
19
|
+
- Requesting API keys, tokens, or other secrets from the user
|
|
20
|
+
|
|
21
|
+
## When NOT to Use
|
|
22
|
+
|
|
23
|
+
- Never set sensitive values directly (API keys, passwords, tokens) - always use `requestEnvVar` to request from user
|
|
24
|
+
- Don't modify runtime-managed variables (REPLIT_DOMAINS, REPL_ID, DATABASE_URL for Helium DBs)
|
|
25
|
+
|
|
26
|
+
## Environment Types
|
|
27
|
+
|
|
28
|
+
Environment variables are scoped to specific environments:
|
|
29
|
+
|
|
30
|
+
- **shared**: Available in both development and production
|
|
31
|
+
- **development**: Only available in development environment
|
|
32
|
+
- **production**: Only available in production environment
|
|
33
|
+
|
|
34
|
+
By default, you should use the 'shared' environment to store environment variables unless there is a clear reason why it would require different values in development and production.
|
|
35
|
+
|
|
36
|
+
An environment variable stored in the 'shared' environment can not be modified in 'development' or 'production' environments. To modify it, delete it from the 'shared' environment and re-add it to 'development' and 'production' environments.
|
|
37
|
+
|
|
38
|
+
Secrets are global and not environment-scoped.
|
|
39
|
+
|
|
40
|
+
## Available Functions
|
|
41
|
+
|
|
42
|
+
### viewEnvVars(type, environment, keys)
|
|
43
|
+
|
|
44
|
+
View environment variables and/or secrets.
|
|
45
|
+
|
|
46
|
+
**Parameters:**
|
|
47
|
+
|
|
48
|
+
- `type` (str, default "all"): What to view: "env", "secret", or "all"
|
|
49
|
+
- `environment` (str, optional): Filter by environment: "shared", "development", "production"
|
|
50
|
+
- `keys` (list[str], optional): Filter by specific keys
|
|
51
|
+
|
|
52
|
+
**Returns:** Dict with `envVars`, `secrets`, and `runtimeManaged` fields
|
|
53
|
+
|
|
54
|
+
**Example:**
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
// View all env vars and secrets
|
|
58
|
+
const result = await viewEnvVars();
|
|
59
|
+
console.log(result.envVars); // {shared: {PORT: '3000'}, development: {...}}
|
|
60
|
+
console.log(result.secrets); // {OPENAI_API_KEY: true, STRIPE_KEY: true}
|
|
61
|
+
|
|
62
|
+
// Check if specific secrets exist
|
|
63
|
+
const result2 = await viewEnvVars({ type: "secret", keys: ["OPENAI_API_KEY", "STRIPE_KEY"] });
|
|
64
|
+
if (result2.secrets.OPENAI_API_KEY) {
|
|
65
|
+
console.log("OpenAI key is configured");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// View only development env vars
|
|
69
|
+
const result3 = await viewEnvVars({ type: "env", environment: "development" });
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### setEnvVars(values, environment)
|
|
73
|
+
|
|
74
|
+
Set environment variables. Cannot be used for secrets.
|
|
75
|
+
|
|
76
|
+
**Parameters:**
|
|
77
|
+
|
|
78
|
+
- `values` (dict[str, str], required): Key-value pairs to set
|
|
79
|
+
- `environment` (str, default "shared"): Target: "shared", "development", "production"
|
|
80
|
+
|
|
81
|
+
**Returns:** Dict with `environment` and `keys` that were set
|
|
82
|
+
|
|
83
|
+
**Example:**
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
// Set shared config (available in dev and prod)
|
|
87
|
+
await setEnvVars({ values: { PORT: "3000", DEBUG: "false" } });
|
|
88
|
+
|
|
89
|
+
// Set development-only config
|
|
90
|
+
await setEnvVars({ values: { LOG_LEVEL: "debug" }, environment: "development" });
|
|
91
|
+
|
|
92
|
+
// Set production config
|
|
93
|
+
await setEnvVars({ values: { LOG_LEVEL: "error" }, environment: "production" });
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### deleteEnvVars(keys, environment)
|
|
97
|
+
|
|
98
|
+
Delete environment variables.
|
|
99
|
+
|
|
100
|
+
**Parameters:**
|
|
101
|
+
|
|
102
|
+
- `keys` (list[str], required): Keys to delete
|
|
103
|
+
- `environment` (str, default "shared"): Target: "shared", "development", "production"
|
|
104
|
+
|
|
105
|
+
**Returns:** Dict with `environment` and `keys` that were deleted
|
|
106
|
+
|
|
107
|
+
**Example:**
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
// Delete from shared environment
|
|
111
|
+
await deleteEnvVars({ keys: ["OLD_CONFIG", "DEPRECATED_FLAG"] });
|
|
112
|
+
|
|
113
|
+
// Delete from specific environment
|
|
114
|
+
await deleteEnvVars({ keys: ["DEBUG"], environment: "development" });
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### requestEnvVar(requestType, keys, envVars, userMessage)
|
|
118
|
+
|
|
119
|
+
Request secrets or environment variables from the user. This pauses agent execution until the user provides the values.
|
|
120
|
+
|
|
121
|
+
**Parameters:**
|
|
122
|
+
|
|
123
|
+
- `requestType` (str, required): "secret" or "env"
|
|
124
|
+
- `keys` (list[str], required if requestType="secret"): Secret keys to request
|
|
125
|
+
- `envVars` (list[dict], required if requestType="env"): Env vars with `key` and `environment`
|
|
126
|
+
- `userMessage` (str, optional): Custom message for user
|
|
127
|
+
|
|
128
|
+
**Returns:** Dict with `requested`, `userMessage`, and `waitingForInput`
|
|
129
|
+
|
|
130
|
+
**Example - Request secrets:**
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
// Request API keys from user
|
|
134
|
+
await requestEnvVar({
|
|
135
|
+
requestType: "secret",
|
|
136
|
+
keys: ["OPENAI_API_KEY", "STRIPE_SECRET_KEY"],
|
|
137
|
+
userMessage: "Please provide your API keys to enable the payment feature"
|
|
138
|
+
});
|
|
139
|
+
// Agent pauses here until user provides the secrets
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Example - Request env vars:**
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
// Request non-sensitive config from user
|
|
146
|
+
await requestEnvVar({
|
|
147
|
+
requestType: "env",
|
|
148
|
+
envVars: [
|
|
149
|
+
{ key: "CUSTOM_DOMAIN", environment: "production" },
|
|
150
|
+
{ key: "FEATURE_FLAG", environment: "shared" }
|
|
151
|
+
],
|
|
152
|
+
userMessage: "Please provide the following configuration values"
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Best Practices
|
|
157
|
+
|
|
158
|
+
1. **Check before requesting**: Always use `viewEnvVars` first to see what's already configured
|
|
159
|
+
2. **Use shared for common config**: Put variables needed in both dev and prod in "shared"
|
|
160
|
+
3. **Never hardcode secrets**: Always request secrets from users via `requestEnvVar`
|
|
161
|
+
4. **Provide helpful messages**: Include context when requesting secrets so users know why they're needed
|
|
162
|
+
5. **Handle conflicts**: If you need to move a var between environments, delete from old first
|
|
163
|
+
|
|
164
|
+
## Example Workflow
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
// 1. Check current configuration
|
|
168
|
+
const result = await viewEnvVars();
|
|
169
|
+
|
|
170
|
+
// 2. Check if required secrets exist
|
|
171
|
+
const missingSecrets = [];
|
|
172
|
+
for (const key of ["OPENAI_API_KEY", "DATABASE_URL"]) {
|
|
173
|
+
if (!result.secrets[key]) {
|
|
174
|
+
missingSecrets.push(key);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// 3. Request missing secrets from user
|
|
179
|
+
if (missingSecrets.length > 0) {
|
|
180
|
+
await requestEnvVar({
|
|
181
|
+
requestType: "secret",
|
|
182
|
+
keys: missingSecrets,
|
|
183
|
+
userMessage: "The following API keys are needed for the chat feature"
|
|
184
|
+
});
|
|
185
|
+
} else {
|
|
186
|
+
// 4. Set non-sensitive config
|
|
187
|
+
await setEnvVars({
|
|
188
|
+
values: {
|
|
189
|
+
CHAT_ENABLED: "true",
|
|
190
|
+
MAX_TOKENS: "4096"
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Restrictions
|
|
197
|
+
|
|
198
|
+
- Cannot view secret values (only existence status)
|
|
199
|
+
- Cannot set or modify secrets directly
|
|
200
|
+
- Cannot modify runtime-managed variables
|
|
201
|
+
- Variables cannot exist in both "shared" and a specific environment simultaneously
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ac77210f10174f2a2524e8726672be1e
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: expo
|
|
3
|
+
description: Guidelines for building mobile applications using Expo, covering UI design, animations, React context patterns, and native device feature permission (Camera, Location, FileUploads)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Always follow these guidelines when building a mobile application using Expo:
|
|
7
|
+
|
|
8
|
+
## Architecture
|
|
9
|
+
|
|
10
|
+
- iOS 26 exists. Use NativeTabs from expo-router for native tab bars with liquid glass support. Use `isLiquidGlassAvailable()` from expo-glass-effect to check availability and fall back to classic Tabs with BlurView for older iOS/Android.
|
|
11
|
+
- Follow modern React Native patterns and best-practices.
|
|
12
|
+
- Put as much of the app in the frontend as possible. The backend should only be responsible for data persistence and making API calls.
|
|
13
|
+
- Use React context for state that is shared across multiple components.
|
|
14
|
+
- Use React Query (@tanstack/react-query) for server state fetching.
|
|
15
|
+
- Use useState for very local state.
|
|
16
|
+
- Minimize the number of files. Collapse similar components into a single file.
|
|
17
|
+
- If the app is complex and requires functionality that can't be done in a single request, it is okay to stub out the backend and implement the frontend first.
|
|
18
|
+
- ALWAYS use native device capabilities (camera, location, contacts, etc.) when the app requires them. NEVER use fake/mock data when real device features are available and appropriate.
|
|
19
|
+
- Client-Server: the Expo client talks to an Express + TypeScript server via a RESTful API. The server handles data storage, API requests, auth, and any other server-specific logic.
|
|
20
|
+
|
|
21
|
+
## Routing
|
|
22
|
+
|
|
23
|
+
This stack uses Expo Router for file-based routing (similar to Next.js Pages Router) for the frontend. The backend uses Express with TypeScript.
|
|
24
|
+
|
|
25
|
+
- Every file in the `app/` directory becomes a route
|
|
26
|
+
- Use `_layout.tsx` files to define shared layouts
|
|
27
|
+
- Use `(group)` directories for layout groups without affecting URLs
|
|
28
|
+
- Use `[param].tsx` for dynamic routes
|
|
29
|
+
|
|
30
|
+
Example structure:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
app/
|
|
34
|
+
_layout.tsx # Root layout with providers
|
|
35
|
+
index.tsx # Home route (/)
|
|
36
|
+
(tabs)/_layout.tsx # Tab layout
|
|
37
|
+
(tabs)/index.tsx # First tab (/)
|
|
38
|
+
(tabs)/settings.tsx # Settings tab (/settings)
|
|
39
|
+
profile/_layout.tsx # Profile stack layout
|
|
40
|
+
profile/index.tsx # /profile
|
|
41
|
+
profile/[id].tsx # /profile/:id
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
For dynamic parameters: `const { id } = useLocalSearchParams()` from "expo-router"
|
|
45
|
+
|
|
46
|
+
## State Management
|
|
47
|
+
|
|
48
|
+
- Use React Query for server state (always use object API)
|
|
49
|
+
- Use useState for very local state
|
|
50
|
+
- Avoid props drilling - use React context for shared state
|
|
51
|
+
- Don't wrap <RootLayoutNav/> in a context hook - wrap at the root layout level
|
|
52
|
+
- React Query provider should be the top level provider
|
|
53
|
+
- Use AsyncStorage inside context providers for persistent state
|
|
54
|
+
|
|
55
|
+
## TypeScript Guidance
|
|
56
|
+
|
|
57
|
+
- TypeScript first: Proper typing with interfaces and type safety
|
|
58
|
+
- Explicit Type Annotations for useState: Always use `useState<Type[]>([])` not `useState([])`
|
|
59
|
+
- Type Verification: Before using any property or method, verify it exists in the type definition
|
|
60
|
+
- Null/Undefined Handling: Use optional chaining (`?.`) and nullish coalescing (`??`)
|
|
61
|
+
- Complete Object Creation: Include ALL required properties when creating objects
|
|
62
|
+
- Style Properties: Use literal values for variables used in styles (e.g., `const fontWeight = "bold" as const`)
|
|
63
|
+
|
|
64
|
+
## Imports
|
|
65
|
+
|
|
66
|
+
You can import using `@/` to avoid relative paths (e.g., `import { Button } from '@/components/Button'`)
|
|
67
|
+
|
|
68
|
+
## Styling
|
|
69
|
+
|
|
70
|
+
Use react-native's `StyleSheet` for styling. Reference colors from `constants/colors.ts` via the `useColors()` hook in `hooks/useColors.ts` — avoid hardcoding hex values in components.
|
|
71
|
+
|
|
72
|
+
If this Expo artifact is part of a multi-artifact project (e.g., alongside a react-vite web app), read `design_and_aesthetics.md` before writing component code — it covers how to sync colors, fonts, and radius from the sibling artifact so both share the same visual identity.
|
|
73
|
+
|
|
74
|
+
## Networking
|
|
75
|
+
- Use `@/lib/query-client` for all data fetching.
|
|
76
|
+
- Queries should not define their own queryFn — the default fetcher in `@/lib/query-client` is already configured. This only applies when the app's QueryClient is imported from `@/lib/query-client`; if the project still uses a bare `new QueryClient()`, migrate it first.
|
|
77
|
+
- Mutations should use `apiRequest` from `@/lib/query-client` and invalidate cache by queryKey after.
|
|
78
|
+
- Use array query keys for hierarchical data: `queryKey: ['/api/recipes', id]`
|
|
79
|
+
- API URLs: Use `getApiUrl()` from `@/lib/query-client`. Construct URLs with `new URL(path, getApiUrl())`.
|
|
80
|
+
- Do not hardcode domain URLs or hostnames. Use `process.env.EXPO_PUBLIC_DOMAIN` for domain config or `getApiUrl()` for API requests.
|
|
81
|
+
- Do not create a new QueryClient() — use `@/lib/query-client` instead.
|
|
82
|
+
|
|
83
|
+
## App Icon
|
|
84
|
+
|
|
85
|
+
Generate a custom app icon for the app. Read the mobile-ui skill's app-icon.md reference for guidelines.
|
|
86
|
+
|
|
87
|
+
## Workflow
|
|
88
|
+
- The Expo App runs on port 8081. All web_application_feedback should go through port 8081 as that is where the user's app runs.
|
|
89
|
+
- The Express backend runs on port 5000. It serves APIs and a static landing page in server/templates/landing-page.html. Do NOT use port 5000 for web_application_feedback — it only serves the API and a landing page.
|
|
90
|
+
- There are two workflows for this stack:
|
|
91
|
+
- `Start Backend`: Restarts (or starts) the Express server. Use `await restartWorkflow({ workflowName: "Start Backend" })` after backend changes. Do not restart this workflow for frontend-only changes — restarting takes time and degrades UX.
|
|
92
|
+
- `Start Frontend`: Restarts (or starts) the Expo dev server. HMR handles most code changes automatically. Do not restart unless you updated dependencies or fixed an error.
|
|
93
|
+
- After presenting the artifact, call `suggestDeploy()` so the user knows their app is ready to publish.
|
|
94
|
+
|
|
95
|
+
## React Native Pitfalls
|
|
96
|
+
|
|
97
|
+
Avoid these common mistakes:
|
|
98
|
+
|
|
99
|
+
- UUID Generation:
|
|
100
|
+
- Do not use the 'uuid' package — it requires crypto.getRandomValues() which crashes on iOS/Android
|
|
101
|
+
- Use instead: `Date.now().toString() + Math.random().toString(36).substr(2, 9)`
|
|
102
|
+
- Or use expo-crypto: `import * as Crypto from 'expo-crypto'; Crypto.randomUUID()` — pin to version 15.0.x (expo-crypto v55+ crashes in Expo Go)
|
|
103
|
+
|
|
104
|
+
- Import Verification:
|
|
105
|
+
- Check existing template files for correct import paths before using them
|
|
106
|
+
- useBottomTabBarHeight is from '@react-navigation/bottom-tabs', not 'expo-router'
|
|
107
|
+
- When unsure, read the actual files to verify exports exist
|
|
108
|
+
|
|
109
|
+
- Scrolling Containers — assess whether scrolling is needed:
|
|
110
|
+
- Not everything needs to be scrollable. Fixed layouts (timers, dashboards, single-screen UIs) should use View, not ScrollView
|
|
111
|
+
- FlatList: Add scrollEnabled={data.length > 0} to prevent empty bounce
|
|
112
|
+
- Avoid contentInsetAdjustmentBehavior="automatic" with transparent/large-title headers — it causes over-scrolling
|
|
113
|
+
- ScrollView is for content that exceeds screen height. If content fits, use View
|
|
114
|
+
|
|
115
|
+
- useEffect Anti-Patterns:
|
|
116
|
+
- Do not sync props to state with useEffect (causes infinite loops)
|
|
117
|
+
- BAD: `useEffect(() => setState(prop), [prop])` then `useEffect(() => onChange(state), [state])`
|
|
118
|
+
- GOOD: Derive values directly from props: `const hours = Math.floor(value / 3600)`
|
|
119
|
+
- Only call onChange on explicit user actions (onPress, onChangeText), not in useEffect
|
|
120
|
+
|
|
121
|
+
- Mobile Typography:
|
|
122
|
+
- Maximum font size for display/hero text (clocks, timers, large numbers): 48-64pt (not 96pt)
|
|
123
|
+
- Body text: 14-16pt, Headers: 20-28pt
|
|
124
|
+
- Always test that text fits on a 375pt wide screen (iPhone SE)
|
|
125
|
+
|
|
126
|
+
- Empty State Design: Use simple text-based empty states (icon + descriptive text), not placeholder images.
|
|
127
|
+
|
|
128
|
+
- Expo Router Header Configuration:
|
|
129
|
+
- Do not set headerShown dynamically inside screen components — it causes remounts on every re-render
|
|
130
|
+
- Configure all header options in _layout.tsx where screens are registered
|
|
131
|
+
- Individual screens should only set dynamic content (headerLeft/headerRight buttons), not headerShown
|
|
132
|
+
|
|
133
|
+
- Safe Area / Top Padding:
|
|
134
|
+
- Do not use hardcoded top padding (24px, 40px, etc.) — it will be wrong on different devices. Use `useSafeAreaInsets()` from react-native-safe-area-context and apply `insets.top` to `paddingTop`. This handles iPhone notch, Dynamic Island, and Android status bars automatically.
|
|
135
|
+
- Absolutely positioned headers: when a header is positioned absolutely over scrollable content:
|
|
136
|
+
- Header uses: `top: insets.top` (positions header below notch/Dynamic Island)
|
|
137
|
+
- Content below needs: `paddingTop: insets.top + headerContentHeight` (e.g. `insets.top + 70` where 70 = header's internal height). Do NOT use a fixed value like `paddingTop: 100` — it fails on devices with different insets (47px on older iPhones, 59px+ on Dynamic Island).
|
|
138
|
+
|
|
139
|
+
- Streaming API Responses (OpenAI, etc.):
|
|
140
|
+
- For streaming, read the mobile-ui skill's expo-fetch.md reference
|
|
141
|
+
- Use `import { fetch } from 'expo/fetch'` which supports getReader() on all platforms
|
|
142
|
+
|
|
143
|
+
- Keyboard Handling:
|
|
144
|
+
- For detailed keyboard handling patterns (forms, chat, FlatList with inputs), read the mobile-ui skill's keyboard.md reference
|
|
145
|
+
- Use `react-native-keyboard-controller` for all keyboard handling — it provides better control than React Native's built-in KeyboardAvoidingView and works consistently across iOS and Android
|
|
146
|
+
- Do not use InputAccessoryView — it doesn't render properly in Expo Go
|
|
147
|
+
- Forms with multiple inputs: Use `KeyboardAwareScrollViewCompat` with `bottomOffset` and `keyboardShouldPersistTaps="handled"`
|
|
148
|
+
- Chat/messaging: Use `KeyboardAvoidingView` from `react-native-keyboard-controller` with `behavior="padding"` on both platforms, `keyboardDismissMode="interactive"` and `keyboardShouldPersistTaps="handled"` on FlatList
|
|
149
|
+
- keyboardVerticalOffset: `0` for transparent/no header, `headerHeight` for opaque header
|
|
150
|
+
- Use useSafeAreaInsets() for bottom padding on the input container to avoid home indicator overlap
|
|
151
|
+
- Do not nest KeyboardAvoidingViews — only one should wrap your content
|
|
152
|
+
- For chat UIs: Use inverted FlatList (see below) — no additional scroll logic needed. Do not try to implement auto-scroll with scrollToEnd() — it has timing bugs. Inverted FlatList handles this automatically.
|
|
153
|
+
|
|
154
|
+
- Chat Apps — state and FlatList patterns:
|
|
155
|
+
- For chat app implementation patterns (stale closures, inverted FlatList, streaming), read the mobile-ui skill's expo-fetch.md reference
|
|
156
|
+
- Key rules: Use inverted FlatList (not scrollToEnd), capture state before async operations, use ListHeaderComponent for typing indicator
|
|
157
|
+
- FlatList Boolean Props — type coercion: props like `scrollEnabled` and `showsVerticalScrollIndicator` expect booleans. Using `someString || anotherValue` can pass a string and cause `TypeError: expected dynamic type 'boolean', but had type 'string'`. Coerce with `!!`:
|
|
158
|
+
- BAD: `scrollEnabled={data || someString}`
|
|
159
|
+
- GOOD: `scrollEnabled={!!data || !!someString}`
|
|
160
|
+
|
|
161
|
+
- RevenueCat compatibility:
|
|
162
|
+
- RevenueCat works in Expo Go and does not require a native build. In Expo Go, the SDK automatically runs in Preview API Mode, replacing native calls with JavaScript mocks so your app loads without errors.
|
|
163
|
+
- RevenueCat works on the web out of the box without any additional configuration.
|
|
164
|
+
|
|
165
|
+
- Custom ErrorBoundary component:
|
|
166
|
+
- Use `reloadAppAsync` from `expo` with the ErrorBoundary component to restart the app when it crashes: `import { reloadAppAsync } from 'expo'`. Do not use `reloadAsync` from `expo-updates` for this purpose.
|
|
167
|
+
- The ErrorBoundary is a minimal class component (required by React's error boundary API) with a functional ErrorFallback component for the UI. The consuming component should remain functional.
|
|
168
|
+
- Do not add local state to the ErrorFallback component — it only renders if the app crashes. Use as-is unless the user requests otherwise. (Dev-mode-only state guarded by `__DEV__` is acceptable for debugging.)
|
|
169
|
+
- The ErrorFallback uses `useColors()` and `useSafeAreaInsets` for theming and positioning. The ErrorBoundary wrapper uses React's class component error boundary API (`getDerivedStateFromError`, `componentDidCatch`).
|
|
170
|
+
|
|
171
|
+
- react-native-maps:
|
|
172
|
+
- Pin version to exactly 1.18.0 in package.json — this is the only version compatible with Expo Go currently. Other versions cause crashes.
|
|
173
|
+
- Do not add react-native-maps to the plugins array in app.json — it will crash the app.
|
|
174
|
+
|
|
175
|
+
- Over use of text:
|
|
176
|
+
- Mobile apps should be designed for touch input, not text input.
|
|
177
|
+
- Most buttons should not have text. They should have icons.
|
|
178
|
+
- If you have to use text, use it sparingly and only for very important information.
|
|
179
|
+
- Applications do not need a title like "Chatbot" or "AI Assistant". They should look like market leading apps.
|
|
180
|
+
|
|
181
|
+
## Gestures
|
|
182
|
+
|
|
183
|
+
Use PanResponder from 'react-native' for gesture handling.
|
|
184
|
+
|
|
185
|
+
## Safe Area View
|
|
186
|
+
|
|
187
|
+
When to use SafeAreaView:
|
|
188
|
+
|
|
189
|
+
1. Built-in tabs or header: Don't add SafeAreaView - they handle insets automatically
|
|
190
|
+
2. Custom header: Add SafeAreaView to the header component
|
|
191
|
+
3. Removed header: Add SafeAreaView inside a View with background color (not just white space)
|
|
192
|
+
4. Pages inside stacks: Don't add SafeAreaView if parent _layout.tsx has header enabled
|
|
193
|
+
|
|
194
|
+
Games and absolute positioning: account for safe area insets in positioning calculations using `useSafeAreaInsets()`. Apply insets in game physics. Avoid `SafeAreaView` in game screens — factor insets into the game loop instead.
|
|
195
|
+
|
|
196
|
+
## Font Loading and SplashScreen
|
|
197
|
+
|
|
198
|
+
The scaffold ships with `@expo-google-fonts/inter` pre-installed and already loaded in `_layout.tsx` with the correct `useFonts` + `SplashScreen` font-gating pattern. Available weights: `Inter_400Regular`, `Inter_500Medium`, `Inter_600SemiBold`, `Inter_700Bold`.
|
|
199
|
+
|
|
200
|
+
If the user wants a different font, swap the import and `useFonts` call — keep the same font-gating pattern.
|
|
201
|
+
|
|
202
|
+
Rules:
|
|
203
|
+
|
|
204
|
+
- Do NOT remove the font-gating pattern from `_layout.tsx`
|
|
205
|
+
- Handle `fontError` alongside `fontsLoaded` — if font loading fails, the app should still render rather than showing a white screen forever
|
|
206
|
+
- Tie `SplashScreen.hideAsync()` to `[fontsLoaded, fontError]` — do not call it unconditionally in `useEffect([], [])`
|
|
207
|
+
- The `if (!fontsLoaded && !fontError) return null` must come after the `useEffect` hook, not before it (hooks cannot be called conditionally)
|
|
208
|
+
|
|
209
|
+
## Library Compatibility
|
|
210
|
+
|
|
211
|
+
- ONLY use libraries from the Expo Go compatible list
|
|
212
|
+
- Do not install additional native libraries unless they're JS only
|
|
213
|
+
- Pre-installed: expo-router, @expo/vector-icons, @tanstack/react-query, react-native-reanimated
|
|
214
|
+
- Error boundary: Custom ErrorBoundary component (components/ErrorBoundary.tsx)
|
|
215
|
+
|
|
216
|
+
## Insets
|
|
217
|
+
|
|
218
|
+
Web-only insets for web edge cases (always implement for every app):
|
|
219
|
+
|
|
220
|
+
- Apply on web only (Platform.OS === "web")
|
|
221
|
+
- Always add at least a 67px top inset to top-level header content for the status bar. Additional vertical padding will likely still be required.
|
|
222
|
+
- Always add a 34px bottom inset
|
|
223
|
+
- If using a bottom tab bar, instead modify the tab bar height to be 84px (50px + 34px). Do not add paddingBottom to the tab bar.
|
|
224
|
+
- Do not add these insets on iOS/Android; native safe areas already handle them
|
|
225
|
+
- Before finishing any screen, verify that web platform insets handling is implemented and correct.
|
|
226
|
+
|
|
227
|
+
## Web Compatibility
|
|
228
|
+
|
|
229
|
+
Write code that does not crash in React Native Web. Account for platform-specific compatibility.
|
|
230
|
+
|
|
231
|
+
Polyfilled APIs (work on web without Platform checks):
|
|
232
|
+
|
|
233
|
+
- expo-secure-store, expo-haptics, react-native-maps, Alert, RefreshControl
|
|
234
|
+
|
|
235
|
+
Partial Web Support:
|
|
236
|
+
|
|
237
|
+
- expo-camera (no switch camera, no recordAsync)
|
|
238
|
+
- expo-clipboard, expo-file-system, expo-image, expo-notifications, expo-video
|
|
239
|
+
- react-native-reanimated: Layout animations don't work on web, native driver not supported
|
|
240
|
+
|
|
241
|
+
No Web Support (use Platform.OS checks):
|
|
242
|
+
|
|
243
|
+
- expo-battery, expo-brightness, expo-contacts, expo-device, expo-local-authentication
|
|
244
|
+
- expo-location (use web geolocation API), expo-media-library, expo-sensors, expo-sharing
|
|
245
|
+
|
|
246
|
+
Example workaround:
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
if (Platform.OS !== 'web') {
|
|
250
|
+
// Native-only code
|
|
251
|
+
} else {
|
|
252
|
+
// Web alternative
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Payments
|
|
257
|
+
|
|
258
|
+
If prompted to add payments (i.e. subscriptions, in-app purchases, etc.), always use RevenueCat. Do not use Stripe unless the user explicitly requests it.
|
|
259
|
+
|
|
260
|
+
## Testing
|
|
261
|
+
|
|
262
|
+
- Add testID to interactive elements for testing
|
|
263
|
+
- Use mobile screen sizes for automated testing
|
|
264
|
+
- Recommended dimensions: height: 720, width: 400
|
|
265
|
+
|
|
266
|
+
## Replit Environment
|
|
267
|
+
|
|
268
|
+
- User can scan QR code from Replit's URL bar menu to test on their physical device via Expo Go
|
|
269
|
+
- Hot module reloading (HMR) is enabled - no need to restart the dev server for code changes
|
|
270
|
+
|
|
271
|
+
## Publishing
|
|
272
|
+
|
|
273
|
+
Replit has a built-in publishing flow for Expo apps called **Expo Launch**. Expo Launch handles the production build and **App Store (iOS) submission only** — the user triggers it by clicking the Publish button. More information can be found in the Replit docs which you can search. Only call `suggestDeploy()` after the app is fully built and verified (see `## Workflow` for when to call it), and only when iOS publishing is relevant. Do not call it mid-build or in response to a planning question.
|
|
274
|
+
|
|
275
|
+
- If the user asks what **Expo Launch** is: explain it is Replit's built-in flow for building and submitting the app to the App Store (iOS). More info is in the Replit docs.
|
|
276
|
+
- If the user asks about **Google Play (Android)** publishing: let them know it is **not currently supported** on Replit. Do not call `suggestDeploy()` for Android-only requests.
|
|
277
|
+
- Do not attempt to help with EAS CLI commands or manual App Store submission — Replit's Expo Launch handles App Store publishing.
|
|
278
|
+
- `suggestDeploy()` only works from the main agent context. Do not call it from a task-agent or subrepl session — it will return `success: false`. Instead, remind the user to publish from the main project after merging.
|
|
279
|
+
|
|
280
|
+
## Forbidden Changes
|
|
281
|
+
- NEVER edit package.json directly. See package management skill for instructions on installing packages.
|
|
282
|
+
- NEVER change bundle identifiers after initial setup unless user explicitly requests it.
|
|
283
|
+
- NEVER downgrade the version of React Native or Expo that is declared in package.json.
|
|
284
|
+
- NEVER run `npx expo start` or `npx expo` directly in a shell. Use the `restart_workflow` tool instead — running expo directly will miss environment variables (like `PORT`) injected into the workflow.
|
|
285
|
+
- NEVER create app.config.ts or app.config.js. The project MUST use a static app.json for Expo configuration. Dynamic config files (app.config.ts/js) break the Expo Launch build process. If you need to modify Expo settings, edit app.json directly. If an existing app.config.ts or app.config.js is present in the project, migrate its settings to app.json and delete the dynamic config file.
|
|
286
|
+
- NEVER run or suggest running EAS CLI commands (`npx eas build`, `npx eas submit`, `npx eas update`, `npx eas init`, `eas build`, etc.). iOS publishing is handled via Replit's Expo Launch.
|
|
287
|
+
|
|
288
|
+
## References
|
|
289
|
+
|
|
290
|
+
Before writing code, identify whether any reference below applies to the task. If it does, read it first.
|
|
291
|
+
|
|
292
|
+
- `.local/skills/expo/references/first_build.md` - Use this reference when first building an Expo app (from 0 to 1)
|
|
293
|
+
- `.local/skills/expo/references/react_context.md` - Use this reference when creating or modifying shared state with React context, provider composition, or context-based hooks.
|
|
294
|
+
- `.local/skills/expo/references/design_and_aesthetics.md` - Use this reference when designing or restyling UI, selecting iconography, or implementing animations and visual polish. Skip the "Cross-Artifact Design Consistency" section unless this expo artifact is part of a multi-artifact project with a sibling web app.
|
|
295
|
+
- `.local/skills/expo/references/device_features_and_permissions.md` - Use this reference when implementing camera, location, notifications, contacts, file uploads, or any permission request/denial flow.
|
|
296
|
+
- mobile-ui skill's `.local/skills/mobile-ui/references/keyboard.md` - Use this reference when implementing any keyboard handling — forms with multiple inputs, chat/messaging UIs, FlatList with inputs, or keyboard utilities (dismiss, detect visibility).
|
|
297
|
+
- mobile-ui skill's `.local/skills/mobile-ui/references/sheets.md` - Use this reference when implementing modals, sheets, formSheet presentations, auth flows (login/register), wizards, or overlay UI.
|
|
298
|
+
- mobile-ui skill's `.local/skills/mobile-ui/references/tabs.md` - Use this reference when implementing tab bars — covers NativeTabs with liquid glass support (SDK 54+) and classic Tabs fallback with detailed code examples.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Design
|
|
2
|
+
|
|
3
|
+
This is the MOST CRITICAL aspect of mobile app development. Make designs beautiful, not cookie cutter.
|
|
4
|
+
Draw inspiration from iOS, Instagram, Airbnb, popular habit trackers, Coinbase.
|
|
5
|
+
Mobile designs should feel mobile and clean - use mobile-native design patterns, not web-like designs.
|
|
6
|
+
|
|
7
|
+
- NEVER use emojis in the application
|
|
8
|
+
- BUTTONS: Prefer icon buttons over text buttons (e.g., checkmark icon instead of "Done", X icon instead of "Cancel"). Text buttons often don't render well on mobile. Use @expo/vector-icons for button icons. Do NOT add backgroundColor or borderRadius to icon buttons.
|
|
9
|
+
|
|
10
|
+
## Cross-Artifact Design Consistency
|
|
11
|
+
|
|
12
|
+
When building a mobile artifact alongside a sibling web artifact, synchronize the design tokens before writing component code. The mobile app should share the same visual identity — colors, fonts, and border radius — so both artifacts feel like one product.
|
|
13
|
+
|
|
14
|
+
### Colors
|
|
15
|
+
|
|
16
|
+
Derive the mobile palette from the sibling artifact rather than inventing a new one. Steps:
|
|
17
|
+
|
|
18
|
+
1. **Read the sibling artifact's CSS/style file.** For react-vite, this is `artifacts/<web-slug>/src/index.css`. Look for the `:root` block and `.dark` block containing color definitions (may be `--color-*` custom properties with HSL/hex values).
|
|
19
|
+
2. **Extract every color token:** primary, accent, background, foreground, muted, destructive, card, border, etc. Convert HSL to hex if needed.
|
|
20
|
+
3. **Update `constants/colors.ts`** with the extracted values. Update the `light` key with the sibling's light-theme colors. If the sibling has a `.dark` block, add a `dark` key with the same token names — `useColors()` will automatically pick it up (no hook changes needed).
|
|
21
|
+
4. **Verify colors match** by checking the primary color side-by-side. If the mobile primary doesn't match the web primary, fix the extraction before continuing.
|
|
22
|
+
|
|
23
|
+
When the sibling uses shadcn tokens (`--primary`, `--background`, `--accent`, `--muted`, etc.), they map directly to `colors.ts` key names (no translation needed).
|
|
24
|
+
|
|
25
|
+
Example mapping (CSS → colors.ts):
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
/* index.css */ /* colors.ts */
|
|
29
|
+
--background: 0 0% 100% → background: "#ffffff"
|
|
30
|
+
--primary: 32 97% 50% → primary: "#fb8804"
|
|
31
|
+
--accent: 14 100% 50% → accent: "#ff3c00"
|
|
32
|
+
--muted: 0 0% 94% → muted: "#f0f0f0"
|
|
33
|
+
--muted-foreground: 0 0% 45% → mutedForeground: "#737373"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Typography
|
|
37
|
+
|
|
38
|
+
Use the same font family as the sibling artifact. The scaffold ships with Inter. If the web artifact uses a different font (e.g., Plus Jakarta Sans, Poppins, etc.):
|
|
39
|
+
|
|
40
|
+
1. Read the sibling's `--app-font-sans` (or `--font-*`) CSS variable to find the font family name.
|
|
41
|
+
2. If the font is available on Google Fonts, install the matching `@expo-google-fonts/*` package. If it's a custom/self-hosted font (e.g. Adobe, brand fonts), download the `.ttf`/`.otf` files into `assets/fonts/` and load them with `expo-font`'s `Font.loadAsync()` or `useFonts`.
|
|
42
|
+
3. Update the `useFonts` call in `app/_layout.tsx` with the correct weight imports (Regular, SemiBold, Bold, etc.)
|
|
43
|
+
4. Apply the font consistently via `fontFamily: "font-name"` in `StyleSheet` styles.
|
|
44
|
+
|
|
45
|
+
Font sizes on mobile (in pt) do not need to match web sizes (in rem), but the typographic hierarchy and weight proportions should feel identical. If the web app uses bold headlines and light body text, the mobile app should do the same.
|
|
46
|
+
|
|
47
|
+
### Border Radius
|
|
48
|
+
|
|
49
|
+
Match the sibling artifact's border radius approach. The web artifact typically defines `--radius: 0.5rem` (8px) with a "small unless circle or pill" rule. Update the `radius` value in `constants/colors.ts` (e.g., `radius: 8` for `0.5rem`, `radius: 24` for `1.5rem`). Use `colors.radius` from the `useColors()` hook for cards, buttons, inputs, and modals so interactive elements feel consistent across platforms.
|
|
50
|
+
|
|
51
|
+
### Splash Screen
|
|
52
|
+
|
|
53
|
+
After customizing the palette, update `app.json` so the splash screen matches the brand:
|
|
54
|
+
|
|
55
|
+
- Set `splash.backgroundColor` to the `background` color from `constants/colors.ts` (light theme value). Expo's `app.json` only supports a single splash color, so pick the light theme background as the default.
|
|
56
|
+
- For dark-mode-aware launches, use `expo-system-ui` to call `SystemUI.setBackgroundColorAsync()` in the root `_layout.tsx` based on the current color scheme. This overrides the static splash color at runtime before the app content renders.
|
|
57
|
+
|
|
58
|
+
If no sibling artifact exists yet, choose a distinctive, cohesive palette and populate both light and dark themes in `constants/colors.ts`. Future artifacts should then derive their design tokens from this file.
|
|
59
|
+
|
|
60
|
+
## Frontend Aesthetics
|
|
61
|
+
|
|
62
|
+
Avoid generic "AI slop" aesthetics - make creative, distinctive frontends that surprise and delight.
|
|
63
|
+
|
|
64
|
+
Color & Theme:
|
|
65
|
+
|
|
66
|
+
- Always use the semantic tokens from `constants/colors.ts` — never hardcode hex values in components.
|
|
67
|
+
- Commit to a cohesive aesthetic. Use variables for consistency.
|
|
68
|
+
- Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
|
|
69
|
+
- Avoid clichéd color schemes (particularly purple gradients on white backgrounds).
|
|
70
|
+
|
|
71
|
+
Motion:
|
|
72
|
+
|
|
73
|
+
- Use animations for effects and micro-interactions.
|
|
74
|
+
- Prioritize react-native-reanimated solutions.
|
|
75
|
+
- Focus on high-impact moments: animated elements (progress bars), micro-interactions (button press animations, haptics).
|
|
76
|
+
|
|
77
|
+
Backgrounds:
|
|
78
|
+
|
|
79
|
+
- Create atmosphere and depth rather than defaulting to solid colors.
|
|
80
|
+
- Layer gradients, use geometric patterns, or add contextual effects.
|
|
81
|
+
|
|
82
|
+
Avoid:
|
|
83
|
+
|
|
84
|
+
- Predictable layouts and component patterns
|
|
85
|
+
- Cookie-cutter design that lacks context-specific character
|
|
86
|
+
- Converging on common choices (Space Grotesk, etc.) - think outside the box
|
|
87
|
+
|
|
88
|
+
## Icons
|
|
89
|
+
|
|
90
|
+
- Use @expo/vector-icons for icons (built into Expo)
|
|
91
|
+
- Available icon sets: Ionicons, MaterialIcons, Feather, FontAwesome, MaterialCommunityIcons, etc.
|
|
92
|
+
- Example:
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
import { Ionicons, Feather, MaterialIcons } from '@expo/vector-icons';
|
|
96
|
+
import { useColors } from '@/hooks/useColors';
|
|
97
|
+
|
|
98
|
+
function MyScreen() {
|
|
99
|
+
// useColors() must be called inside a component or custom hook
|
|
100
|
+
const colors = useColors();
|
|
101
|
+
return (
|
|
102
|
+
<>
|
|
103
|
+
<Ionicons name="home" size={24} color={colors.foreground} />
|
|
104
|
+
<Feather name="settings" size={24} color={colors.foreground} />
|
|
105
|
+
<MaterialIcons name="person" size={24} color={colors.primary} />
|
|
106
|
+
</>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
- Browse available icons at: <https://icons.expo.fyi>
|
|
112
|
+
|
|
113
|
+
## Animations
|
|
114
|
+
|
|
115
|
+
- Use react-native-reanimated for animations (pre-installed)
|
|
116
|
+
- Provides better performance than the basic Animated API
|
|
117
|
+
- Note: Layout animations don't work on web
|
|
118
|
+
- IMPORTANT - useAnimatedStyle HOOKS RULE:
|
|
119
|
+
- NEVER call useAnimatedStyle inside .map(), .filter(), or any loop
|
|
120
|
+
- NEVER call useAnimatedStyle conditionally (inside if statements)
|
|
121
|
+
- This causes "rendered more hooks than during previous render" error
|
|
122
|
+
- SOLUTION: Extract animated items into separate components
|
|
123
|
+
|
|
124
|
+
BAD - calling hook inside map:
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
items.map(item => {
|
|
128
|
+
const style = useAnimatedStyle(() => ({}));
|
|
129
|
+
return <Animated.View style={style} />;
|
|
130
|
+
})
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
GOOD - extract to component:
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
function AnimatedItem({ item }) {
|
|
137
|
+
const style = useAnimatedStyle(() => ({}));
|
|
138
|
+
return <Animated.View style={style} />;
|
|
139
|
+
}
|
|
140
|
+
// Then: items.map(item => <AnimatedItem item={item} />)
|
|
141
|
+
```
|