@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,428 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-scene-controls
|
|
3
|
+
description: Add interactive scene controls (jump, lock-loop, progress bar) to video-js artifacts. Use when building or updating the scene selector overlay for animated videos. Replaces the old scene_selectors.md pattern with a cleaner hook-based architecture.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Video Scene Controls
|
|
7
|
+
|
|
8
|
+
Interactive control bar for video-js artifacts that lets viewers jump between scenes and lock-loop individual scenes. The bar renders only inside an iframe (the Replit preview pane) so exports stay clean.
|
|
9
|
+
|
|
10
|
+
## Architecture
|
|
11
|
+
|
|
12
|
+
Three files, clear separation of concerns:
|
|
13
|
+
|
|
14
|
+
| File | Role |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `useSceneControls.ts` | Hook that encapsulates all playback workarounds behind a clean index-based API |
|
|
17
|
+
| `VideoWithControls.tsx` | Wrapper component: iframe gate, control bar UI, hover/tap reveal |
|
|
18
|
+
| `VideoTemplate.tsx` | Scene renderer: accepts optional `durations`, `loop`, `onSceneChange` props |
|
|
19
|
+
|
|
20
|
+
### Why the workarounds exist
|
|
21
|
+
|
|
22
|
+
The `useVideoPlayer` hook in `src/lib/video/hooks.ts` is read-only (the recording/export pipeline depends on it). It accepts a static `durations` object and advances linearly. It has no `seekTo`, `loopCurrent`, or `setActiveScene` API. The `useSceneControls` hook works around these limitations:
|
|
23
|
+
|
|
24
|
+
- **Jumping to a scene**: Rotate the durations object so the target scene is first, then remount `VideoTemplate` via a `mountKey` bump.
|
|
25
|
+
- **Scene-lock looping**: Create a 2-entry durations object with the same scene under `_r1` / `_r2` suffixes. A single entry won't loop because `setCurrentScene(0)` is a no-op when already at 0.
|
|
26
|
+
- **Tracking the active scene**: `VideoTemplate` calls `onSceneChange(rawKey)` on every scene transition. The hook strips `_r1`/`_r2` suffixes and maps back to the original index.
|
|
27
|
+
|
|
28
|
+
These workarounds are hidden inside the hook. Consumers just use `jumpTo(index)` and `toggleLock()`.
|
|
29
|
+
|
|
30
|
+
## When to use
|
|
31
|
+
|
|
32
|
+
Run this step once, right after the design subagent finishes the initial video build and workflow logs are clean. Skip on iteration prompts. The main agent runs this directly — never delegate to a subagent.
|
|
33
|
+
|
|
34
|
+
## Files to create/edit
|
|
35
|
+
|
|
36
|
+
### 1. `useSceneControls.ts`
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
40
|
+
|
|
41
|
+
const REPEAT_SUFFIX_RE = /_r[12]$/;
|
|
42
|
+
|
|
43
|
+
export function stripRepeatSuffix(key: string): string {
|
|
44
|
+
return key.replace(REPEAT_SUFFIX_RE, '');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function rotateFromIndex(
|
|
48
|
+
durations: Record<string, number>,
|
|
49
|
+
startIndex: number,
|
|
50
|
+
): Record<string, number> {
|
|
51
|
+
const keys = Object.keys(durations);
|
|
52
|
+
if (startIndex <= 0) return durations;
|
|
53
|
+
const result: Record<string, number> = {};
|
|
54
|
+
for (let i = 0; i < keys.length; i++) {
|
|
55
|
+
const key = keys[(startIndex + i) % keys.length];
|
|
56
|
+
result[key] = durations[key];
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function buildLockedDurations(key: string, duration: number): Record<string, number> {
|
|
62
|
+
return { [`${key}_r1`]: duration, [`${key}_r2`]: duration };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function useSceneControls(baseDurations: Record<string, number>) {
|
|
66
|
+
const sceneKeys = useMemo(() => Object.keys(baseDurations), [baseDurations]);
|
|
67
|
+
|
|
68
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
69
|
+
const [locked, setLocked] = useState(false);
|
|
70
|
+
const [mountKey, setMountKey] = useState(0);
|
|
71
|
+
const [tick, setTick] = useState(0);
|
|
72
|
+
|
|
73
|
+
const durations = useMemo(() => {
|
|
74
|
+
if (locked) {
|
|
75
|
+
const key = sceneKeys[activeIndex];
|
|
76
|
+
return buildLockedDurations(key, baseDurations[key]);
|
|
77
|
+
}
|
|
78
|
+
return rotateFromIndex(baseDurations, activeIndex);
|
|
79
|
+
}, [locked, activeIndex, sceneKeys, baseDurations]);
|
|
80
|
+
|
|
81
|
+
const onSceneChange = useCallback(
|
|
82
|
+
(rawKey: string) => {
|
|
83
|
+
const clean = stripRepeatSuffix(rawKey);
|
|
84
|
+
const idx = sceneKeys.indexOf(clean);
|
|
85
|
+
if (idx >= 0) setActiveIndex(idx);
|
|
86
|
+
setTick((t) => t + 1);
|
|
87
|
+
},
|
|
88
|
+
[sceneKeys],
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const jumpTo = useCallback((index: number) => {
|
|
92
|
+
setActiveIndex(index);
|
|
93
|
+
setMountKey((k) => k + 1);
|
|
94
|
+
setTick((t) => t + 1);
|
|
95
|
+
}, []);
|
|
96
|
+
|
|
97
|
+
const toggleLock = useCallback(() => {
|
|
98
|
+
setLocked((prev) => !prev);
|
|
99
|
+
setMountKey((k) => k + 1);
|
|
100
|
+
setTick((t) => t + 1);
|
|
101
|
+
}, []);
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
sceneKeys,
|
|
105
|
+
activeIndex,
|
|
106
|
+
locked,
|
|
107
|
+
mountKey,
|
|
108
|
+
tick,
|
|
109
|
+
durations,
|
|
110
|
+
activeDuration: baseDurations[sceneKeys[activeIndex]] ?? 0,
|
|
111
|
+
onSceneChange,
|
|
112
|
+
jumpTo,
|
|
113
|
+
toggleLock,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Hook API:**
|
|
119
|
+
|
|
120
|
+
| Return value | Type | Description |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| `sceneKeys` | `string[]` | Original scene keys in order |
|
|
123
|
+
| `activeIndex` | `number` | Index of the currently playing scene |
|
|
124
|
+
| `locked` | `boolean` | Whether scene-lock is on |
|
|
125
|
+
| `mountKey` | `number` | Increments on jump/lock — use as `key` on `VideoTemplate` to force remount |
|
|
126
|
+
| `tick` | `number` | Increments on every scene change — drives progress bar reset |
|
|
127
|
+
| `durations` | `Record<string, number>` | Computed durations object to pass to `VideoTemplate` |
|
|
128
|
+
| `activeDuration` | `number` | Duration of the currently active scene in ms |
|
|
129
|
+
| `onSceneChange` | `(rawKey: string) => void` | Pass to `VideoTemplate`'s `onSceneChange` prop |
|
|
130
|
+
| `jumpTo` | `(index: number) => void` | Jump to scene by index |
|
|
131
|
+
| `toggleLock` | `() => void` | Toggle scene-lock |
|
|
132
|
+
|
|
133
|
+
### 2. VideoTemplate changes
|
|
134
|
+
|
|
135
|
+
Export `SCENE_DURATIONS` and accept optional props. Strip `_r[12]` suffixes to resolve scene components:
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
export const SCENE_DURATIONS = { /* design subagent's values */ };
|
|
139
|
+
const SCENE_COMPONENTS: Record<string, React.ComponentType> = {
|
|
140
|
+
/* map each duration key to its scene component */
|
|
141
|
+
};
|
|
142
|
+
export default function VideoTemplate({
|
|
143
|
+
durations = SCENE_DURATIONS,
|
|
144
|
+
loop = true,
|
|
145
|
+
onSceneChange,
|
|
146
|
+
}: {
|
|
147
|
+
durations?: Record<string, number>;
|
|
148
|
+
loop?: boolean;
|
|
149
|
+
onSceneChange?: (sceneKey: string) => void;
|
|
150
|
+
} = {}) {
|
|
151
|
+
const { currentScene, currentSceneKey } = useVideoPlayer({ durations, loop });
|
|
152
|
+
useEffect(() => { onSceneChange?.(currentSceneKey); }, [currentSceneKey, onSceneChange]);
|
|
153
|
+
const baseSceneKey = currentSceneKey.replace(/_r[12]$/, '') as keyof typeof SCENE_DURATIONS;
|
|
154
|
+
const sceneIndex = Object.keys(SCENE_DURATIONS).indexOf(baseSceneKey);
|
|
155
|
+
const SceneComponent = SCENE_COMPONENTS[baseSceneKey];
|
|
156
|
+
return (
|
|
157
|
+
<div className="relative w-full h-screen overflow-hidden">
|
|
158
|
+
{/* ... persistent background/midground layers using sceneIndex for position arrays ... */}
|
|
159
|
+
<AnimatePresence mode="popLayout">
|
|
160
|
+
{SceneComponent && <SceneComponent key={currentSceneKey} />}
|
|
161
|
+
</AnimatePresence>
|
|
162
|
+
</div>
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**IMPORTANT — AnimatePresence key must be `currentSceneKey`, NOT `baseSceneKey`.** When scene-lock is active, the hook creates two durations entries with `_r1` / `_r2` suffixes that both map to the same base scene. If you use `baseSceneKey` as the key, both iterations produce the same key and AnimatePresence won't re-mount/re-animate the scene — causing the loop to appear frozen. Using `currentSceneKey` (which includes the suffix) ensures the key alternates between e.g. `build2_r1` and `build2_r2`, triggering a proper exit/enter cycle on every loop.
|
|
168
|
+
|
|
169
|
+
For persistent elements that use index-based position arrays (e.g. bottle position, background opacity), use `sceneIndex` (derived from `baseSceneKey`) instead of `currentScene` — this ensures they resolve to the correct position regardless of duration rotation.
|
|
170
|
+
|
|
171
|
+
Defaults preserve existing behavior so the export path (`<VideoTemplate />` with no props) is identical to pre-controls behavior.
|
|
172
|
+
|
|
173
|
+
### 3. VideoWithControls wrapper
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
export default function VideoWithControls() {
|
|
177
|
+
const isIframed = typeof window !== 'undefined' && window.self !== window.top;
|
|
178
|
+
|
|
179
|
+
const {
|
|
180
|
+
sceneKeys, activeIndex, locked, mountKey, tick,
|
|
181
|
+
durations, activeDuration, onSceneChange, jumpTo, toggleLock,
|
|
182
|
+
} = useSceneControls(SCENE_DURATIONS);
|
|
183
|
+
|
|
184
|
+
// ... collapse/hover/tap state ...
|
|
185
|
+
|
|
186
|
+
// Export path: no props, preserves recording markers
|
|
187
|
+
if (!isIframed) return <VideoTemplate />;
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<div className="relative w-full h-screen">
|
|
191
|
+
<VideoTemplate
|
|
192
|
+
key={mountKey}
|
|
193
|
+
durations={durations}
|
|
194
|
+
loop
|
|
195
|
+
onSceneChange={onSceneChange}
|
|
196
|
+
/>
|
|
197
|
+
{/* Control bar sensor + ControlBar component */}
|
|
198
|
+
</div>
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Update `App.tsx` to render `VideoWithControls` instead of `VideoTemplate`.
|
|
204
|
+
|
|
205
|
+
## Control bar UI
|
|
206
|
+
|
|
207
|
+
Full-width strip at the bottom of the video. Left-to-right inside the bar: **scene-lock button, vertical divider, segmented progress bar, scene counter, collapse chevron**. The bar sits inside a taller invisible hover sensor so it reappears on mouseover after the user has collapsed it.
|
|
208
|
+
|
|
209
|
+
### Visibility behavior
|
|
210
|
+
|
|
211
|
+
- Bar shows by default on load.
|
|
212
|
+
- Clicking the chevron hides it (slides down via `translate-y-full opacity-0 pointer-events-none`).
|
|
213
|
+
- While collapsed, moving the mouse into the bottom `height: 25%` of the video reveals it. Leaving the sensor hides it again.
|
|
214
|
+
- Clicking the chevron a second time (it now reads `ChevronUp`) pins the bar visible again even when the mouse leaves.
|
|
215
|
+
- On touch, tapping inside the sensor while collapsed pins the bar until the user taps outside the sensor.
|
|
216
|
+
- Use `translate-y` + `opacity` for the slide — not `display: none`, which would kill the hover sensor.
|
|
217
|
+
|
|
218
|
+
### ControlBar
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
const PROGRESS_TICK_MS = 60;
|
|
222
|
+
|
|
223
|
+
interface ControlBarProps {
|
|
224
|
+
visible: boolean;
|
|
225
|
+
collapsed: boolean;
|
|
226
|
+
locked: boolean;
|
|
227
|
+
sceneKeys: string[];
|
|
228
|
+
activeIndex: number;
|
|
229
|
+
activeDuration: number;
|
|
230
|
+
tick: number;
|
|
231
|
+
onToggleLock: () => void;
|
|
232
|
+
onJumpTo: (index: number) => void;
|
|
233
|
+
onToggleCollapsed: () => void;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function ControlBar({
|
|
237
|
+
visible, collapsed, locked, sceneKeys, activeIndex, activeDuration, tick,
|
|
238
|
+
onToggleLock, onJumpTo, onToggleCollapsed,
|
|
239
|
+
}: ControlBarProps) {
|
|
240
|
+
return (
|
|
241
|
+
<div
|
|
242
|
+
className={`flex items-center gap-3 bg-black/50 backdrop-blur-sm px-5 py-4 transition-all duration-200 ease-out ${
|
|
243
|
+
visible
|
|
244
|
+
? 'translate-y-0 opacity-100 pointer-events-auto'
|
|
245
|
+
: 'translate-y-full opacity-0 pointer-events-none'
|
|
246
|
+
}`}
|
|
247
|
+
aria-hidden={!visible}
|
|
248
|
+
>
|
|
249
|
+
<button
|
|
250
|
+
onClick={onToggleLock}
|
|
251
|
+
className={`w-14 h-14 flex items-center justify-center transition-colors rounded-lg shrink-0 ${
|
|
252
|
+
locked
|
|
253
|
+
? 'text-white bg-white/15 hover:bg-white/25'
|
|
254
|
+
: 'text-white/60 hover:text-white hover:bg-white/10'
|
|
255
|
+
}`}
|
|
256
|
+
title={locked ? 'Loop current scene: on' : 'Loop current scene: off'}
|
|
257
|
+
aria-label={locked ? 'Loop current scene: on' : 'Loop current scene: off'}
|
|
258
|
+
aria-pressed={locked}
|
|
259
|
+
>
|
|
260
|
+
<Repeat className="w-8 h-8" />
|
|
261
|
+
</button>
|
|
262
|
+
|
|
263
|
+
<div className="w-px self-stretch bg-white/15" aria-hidden="true" />
|
|
264
|
+
|
|
265
|
+
<ProgressSegments
|
|
266
|
+
sceneKeys={sceneKeys}
|
|
267
|
+
activeIndex={activeIndex}
|
|
268
|
+
activeDuration={activeDuration}
|
|
269
|
+
tick={tick}
|
|
270
|
+
onJumpTo={onJumpTo}
|
|
271
|
+
/>
|
|
272
|
+
|
|
273
|
+
<div className="text-xl text-white/60 font-mono tabular-nums shrink-0">
|
|
274
|
+
{activeIndex + 1}/{sceneKeys.length}
|
|
275
|
+
</div>
|
|
276
|
+
|
|
277
|
+
<button
|
|
278
|
+
onClick={onToggleCollapsed}
|
|
279
|
+
className="w-14 h-14 flex items-center justify-center text-white/60 hover:text-white hover:bg-white/10 transition-colors rounded-lg shrink-0"
|
|
280
|
+
title={collapsed ? 'Show controls' : 'Hide controls'}
|
|
281
|
+
aria-label={collapsed ? 'Show controls' : 'Hide controls'}
|
|
282
|
+
aria-expanded={!collapsed}
|
|
283
|
+
>
|
|
284
|
+
{collapsed ? <ChevronUp className="w-10 h-10" /> : <ChevronDown className="w-10 h-10" />}
|
|
285
|
+
</button>
|
|
286
|
+
</div>
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### ProgressSegments (isolated timer)
|
|
292
|
+
|
|
293
|
+
The 60ms interval lives here so its ticks don't re-render `VideoWithControls` or `VideoTemplate`.
|
|
294
|
+
|
|
295
|
+
```tsx
|
|
296
|
+
function ProgressSegments({
|
|
297
|
+
sceneKeys, activeIndex, activeDuration, tick, onJumpTo,
|
|
298
|
+
}: {
|
|
299
|
+
sceneKeys: string[];
|
|
300
|
+
activeIndex: number;
|
|
301
|
+
activeDuration: number;
|
|
302
|
+
tick: number;
|
|
303
|
+
onJumpTo: (index: number) => void;
|
|
304
|
+
}) {
|
|
305
|
+
const [elapsed, setElapsed] = useState(0);
|
|
306
|
+
|
|
307
|
+
useEffect(() => {
|
|
308
|
+
setElapsed(0);
|
|
309
|
+
const start = performance.now();
|
|
310
|
+
const id = window.setInterval(() => {
|
|
311
|
+
setElapsed(performance.now() - start);
|
|
312
|
+
}, PROGRESS_TICK_MS);
|
|
313
|
+
return () => window.clearInterval(id);
|
|
314
|
+
}, [tick]);
|
|
315
|
+
|
|
316
|
+
const progress = activeDuration > 0 ? Math.min(1, elapsed / activeDuration) : 0;
|
|
317
|
+
|
|
318
|
+
return (
|
|
319
|
+
<div className="flex-1 flex items-center gap-1.5">
|
|
320
|
+
{sceneKeys.map((key, i) => {
|
|
321
|
+
const isActive = i === activeIndex;
|
|
322
|
+
const fill = isActive ? progress * 100 : 0;
|
|
323
|
+
return (
|
|
324
|
+
<button
|
|
325
|
+
key={key}
|
|
326
|
+
onClick={() => onJumpTo(i)}
|
|
327
|
+
className="flex-1 h-3 bg-white/20 rounded-full overflow-hidden cursor-pointer hover:h-4 hover:bg-white/25 transition-all relative min-h-[12px]"
|
|
328
|
+
aria-label={`Jump to scene ${i + 1}`}
|
|
329
|
+
aria-current={isActive ? 'true' : undefined}
|
|
330
|
+
>
|
|
331
|
+
<div
|
|
332
|
+
className="absolute inset-y-0 left-0 bg-white/90 rounded-full transition-[width] duration-100"
|
|
333
|
+
style={{ width: `${fill}%` }}
|
|
334
|
+
/>
|
|
335
|
+
</button>
|
|
336
|
+
);
|
|
337
|
+
})}
|
|
338
|
+
</div>
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Sizing notes
|
|
344
|
+
|
|
345
|
+
- Scene-lock and chevron buttons are both `w-14 h-14` (56px). Scene-lock icon is `w-8 h-8`; chevron is `w-10 h-10` because `ChevronDown`/`ChevronUp` read visually lighter than `Repeat` at the same size.
|
|
346
|
+
- Progress segments are `h-3` normally, `h-4` on hover (makes them easier to click). `flex-1` keeps them equal width.
|
|
347
|
+
- Scene counter is `text-xl` so it reads alongside the 32–40px icons.
|
|
348
|
+
- Bar container padding is `px-5 py-4`; gap between elements is `gap-3`.
|
|
349
|
+
- No text labels on segments — `aria-label` only. The scene counter gives the "N/total" context.
|
|
350
|
+
|
|
351
|
+
### Sensor + reveal (inside `VideoWithControls`)
|
|
352
|
+
|
|
353
|
+
```tsx
|
|
354
|
+
const sensorRef = useRef<HTMLDivElement | null>(null);
|
|
355
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
356
|
+
const [hovering, setHovering] = useState(false);
|
|
357
|
+
const [tapPinned, setTapPinned] = useState(false);
|
|
358
|
+
|
|
359
|
+
const handlePointerEnter = useCallback((e: React.PointerEvent<HTMLDivElement>) => {
|
|
360
|
+
if (e.pointerType === 'mouse') setHovering(true);
|
|
361
|
+
}, []);
|
|
362
|
+
const handlePointerLeave = useCallback((e: React.PointerEvent<HTMLDivElement>) => {
|
|
363
|
+
if (e.pointerType === 'mouse') setHovering(false);
|
|
364
|
+
}, []);
|
|
365
|
+
const handlePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {
|
|
366
|
+
if (e.pointerType === 'mouse') return;
|
|
367
|
+
if (collapsed) setTapPinned(true);
|
|
368
|
+
}, [collapsed]);
|
|
369
|
+
const handleToggleCollapsed = useCallback(() => {
|
|
370
|
+
setCollapsed(c => {
|
|
371
|
+
// Clear any stale hover/tap-pin state so the chevron click wins.
|
|
372
|
+
if (!c) { setHovering(false); setTapPinned(false); }
|
|
373
|
+
return !c;
|
|
374
|
+
});
|
|
375
|
+
}, []);
|
|
376
|
+
|
|
377
|
+
// Clear tapPinned when the user taps outside the sensor.
|
|
378
|
+
useEffect(() => {
|
|
379
|
+
if (!(collapsed && tapPinned)) return;
|
|
380
|
+
const onDocPointerDown = (e: PointerEvent) => {
|
|
381
|
+
if (e.pointerType === 'mouse') return;
|
|
382
|
+
const sensor = sensorRef.current;
|
|
383
|
+
if (sensor && !sensor.contains(e.target as Node)) setTapPinned(false);
|
|
384
|
+
};
|
|
385
|
+
document.addEventListener('pointerdown', onDocPointerDown);
|
|
386
|
+
return () => document.removeEventListener('pointerdown', onDocPointerDown);
|
|
387
|
+
}, [collapsed, tapPinned]);
|
|
388
|
+
|
|
389
|
+
const barVisible = !collapsed || hovering || tapPinned;
|
|
390
|
+
|
|
391
|
+
// In the return():
|
|
392
|
+
<div
|
|
393
|
+
ref={sensorRef}
|
|
394
|
+
className="absolute bottom-0 left-0 right-0 z-50 flex flex-col justify-end"
|
|
395
|
+
style={{ height: '25%' }}
|
|
396
|
+
onPointerEnter={handlePointerEnter}
|
|
397
|
+
onPointerLeave={handlePointerLeave}
|
|
398
|
+
onPointerDown={handlePointerDown}
|
|
399
|
+
>
|
|
400
|
+
<div className="flex-1 w-full" aria-hidden="true" />
|
|
401
|
+
<ControlBar
|
|
402
|
+
visible={barVisible}
|
|
403
|
+
collapsed={collapsed}
|
|
404
|
+
locked={locked}
|
|
405
|
+
sceneKeys={sceneKeys}
|
|
406
|
+
activeIndex={activeIndex}
|
|
407
|
+
activeDuration={activeDuration}
|
|
408
|
+
tick={tick}
|
|
409
|
+
onToggleLock={toggleLock}
|
|
410
|
+
onJumpTo={jumpTo}
|
|
411
|
+
onToggleCollapsed={handleToggleCollapsed}
|
|
412
|
+
/>
|
|
413
|
+
</div>
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
The invisible `flex-1 w-full` filler above the bar gives the pointer a target area to mouse into while the bar is hidden. The sensor stays mounted at all times so `onPointerEnter` re-fires on every re-entry, not just the first.
|
|
417
|
+
|
|
418
|
+
## Recording safety
|
|
419
|
+
|
|
420
|
+
- **Export path** (`!isIframed`): renders `<VideoTemplate />` with no props. `startRecording` fires on mount, `stopRecording` after the last scene. No rotation, no lock, no remounts.
|
|
421
|
+
- **Preview path** (iframed): `window.startRecording` / `window.stopRecording` are undefined, so marker calls are no-ops. Mount key bumps are safe.
|
|
422
|
+
|
|
423
|
+
## Validation
|
|
424
|
+
|
|
425
|
+
1. Run `bash scripts/validate-recording.sh` — fix any issues.
|
|
426
|
+
2. Restart the workflow.
|
|
427
|
+
3. Read logs — fix build errors until clean.
|
|
428
|
+
4. Call `presentArtifact`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
bc95ce25fa8d00f8d30221cd174df5bb
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web-search
|
|
3
|
+
description: Search the web, fetch content, extract branding profiles, and capture screenshots from URLs. Use for real-time information, API documentation, current events, design matching, and visual reference.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Web Search Skill
|
|
7
|
+
|
|
8
|
+
## When to Use
|
|
9
|
+
|
|
10
|
+
- Real-time information (news, prices, events)
|
|
11
|
+
- Looking up API documentation or SDK guides
|
|
12
|
+
- Current technical information beyond training data
|
|
13
|
+
- Verifying facts from authoritative sources
|
|
14
|
+
|
|
15
|
+
## When NOT to Use
|
|
16
|
+
|
|
17
|
+
- Replit-specific features (use the `replit-docs` skill)
|
|
18
|
+
- Searching for real web images or logo files (use the `image-search` skill)
|
|
19
|
+
- Image or video generation (use the `media-generation` skill)
|
|
20
|
+
- Code search within the project (use grep/glob tools)
|
|
21
|
+
|
|
22
|
+
## Available Functions
|
|
23
|
+
|
|
24
|
+
### Single web search — webSearch(query)
|
|
25
|
+
|
|
26
|
+
**Parameters:**
|
|
27
|
+
|
|
28
|
+
- `query` (str, required): Natural language search query phrased as a complete question
|
|
29
|
+
|
|
30
|
+
**Returns:** Dict with `searchAnswer` and `resultPages` (list of title/url/snippet dicts)
|
|
31
|
+
|
|
32
|
+
**Example:**
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
const results = await webSearch({ query: "OpenAI API rate limits 2026" });
|
|
36
|
+
for (const page of results.resultPages) {
|
|
37
|
+
console.log(`${page.title}: ${page.url}`);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Multiple web searches — webSearch({ queries })
|
|
42
|
+
|
|
43
|
+
Run multiple searches concurrently (max 10).
|
|
44
|
+
|
|
45
|
+
**Parameters:**
|
|
46
|
+
|
|
47
|
+
- `queries` (list[str]): List of natural language search queries phrased as complete questions
|
|
48
|
+
|
|
49
|
+
**Returns:** List of result dicts, each with `searchAnswer` and `resultPages` (list of title/url/snippet dicts)
|
|
50
|
+
|
|
51
|
+
**Example:**
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
const results = await webSearch({
|
|
55
|
+
queries: ["OpenAI API rate limits 2026", "Anthropic API rate limits 2026"]
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### webFetch(url)
|
|
60
|
+
|
|
61
|
+
Fetch and extract content from a URL as markdown.
|
|
62
|
+
|
|
63
|
+
**Parameters:**
|
|
64
|
+
|
|
65
|
+
- `url` (str, required): Full HTTPS URL to fetch
|
|
66
|
+
|
|
67
|
+
**Returns:** Dict with `markdown` key containing page content
|
|
68
|
+
|
|
69
|
+
**Example:**
|
|
70
|
+
|
|
71
|
+
```javascript
|
|
72
|
+
const content = await webFetch({ url: "https://platform.openai.com/docs/guides/rate-limits" });
|
|
73
|
+
console.log(content.markdown.slice(0, 1000));
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Best Practices
|
|
77
|
+
|
|
78
|
+
1. **Use natural language queries**: write queries as complete questions with context.
|
|
79
|
+
2. **Chain search and fetch**: search first, then fetch specific pages for details.
|
|
80
|
+
3. **Be specific**: include dates, versions, or other specifics in queries.
|
|
81
|
+
4. **Verify with fetch**: don't rely only on search snippets for critical information.
|
|
82
|
+
5. **Use branding for design matching**: when replicating a site's visual style, use `extractBranding` to get exact colors, fonts, and spacing.
|
|
83
|
+
6. **Use screenshot for visual reference**: when you need to see what a site looks like before replicating its design.
|
|
84
|
+
|
|
85
|
+
## Example Workflow
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
// Find information about a topic
|
|
89
|
+
const searchResult = await webSearch({ query: "FastAPI dependency injection tutorial 2026" });
|
|
90
|
+
|
|
91
|
+
// Get full content from the most relevant result
|
|
92
|
+
if (searchResult.resultPages.length > 0) {
|
|
93
|
+
const bestUrl = searchResult.resultPages[0].url;
|
|
94
|
+
const fullContent = await webFetch({ url: bestUrl });
|
|
95
|
+
console.log(fullContent.markdown);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Limitations
|
|
100
|
+
|
|
101
|
+
- Cannot access social media platforms (LinkedIn, Twitter, Instagram, Facebook, Reddit, YouTube)
|
|
102
|
+
- Cannot download media files (images, videos, audio)
|
|
103
|
+
- Paywalled or authenticated content may be inaccessible
|
|
104
|
+
|
|
105
|
+
## Copyright
|
|
106
|
+
|
|
107
|
+
- Respect copyright for media content from websites.
|
|
108
|
+
- You can reference or link to public content.
|
|
109
|
+
- Do not copy media files (images, videos, audio) directly from websites.
|
|
110
|
+
- Use the `media-generation` skill for images and videos instead.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
28bf49da5a3e237c44d0dbeb138b60ff
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: whop
|
|
3
|
+
description: Guidelines for using Whop to integrate commerce, payment plans, checkout, and subscription management
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
IMPORTANT: You have everything you need. Do NOT ask the user for Whop Company ID, Plan ID, or API key — retrieve them yourself (Step 1 and Step 3 below). Use Whop's hosted checkout (redirect-based) for payments (Step 4). For access control, verify the user's Whop account and ask Whop whether that account has access; do not treat a redirect, email string, or client state as proof of purchase. Execute the steps directly — do not plan or re-read references before acting.
|
|
7
|
+
|
|
8
|
+
## Helper scripts — write these first
|
|
9
|
+
|
|
10
|
+
Write these two files to the project root using the sources in `./references/`. Run via `shell_exec` (NOT `code_execution` — `process.env` is unavailable there). The proxy injects `api_key` automatically — no credentials needed.
|
|
11
|
+
|
|
12
|
+
**whop-mcp.mjs** (source: `./references/whop-mcp.mjs`) — for MCP tools:
|
|
13
|
+
```bash
|
|
14
|
+
node whop-mcp.mjs --list-tools # discover available tools
|
|
15
|
+
node whop-mcp.mjs --schema create_plan # check params before calling
|
|
16
|
+
node whop-mcp.mjs create_product '{"title":"Pro Access"}' # call a tool
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**whop-api.mjs** (source: `./references/whop-api.mjs`) — for REST API:
|
|
20
|
+
```bash
|
|
21
|
+
node whop-api.mjs POST /api/v1/plans '{"company_id":"biz_xxx","product_id":"prod_xxx","initial_price":9.99,"currency":"usd","billing_period":30}'
|
|
22
|
+
node whop-api.mjs POST /api/v1/checkout_configurations '{"plan_id":"plan_xxx","redirect_url":"https://myapp.repl.co/done"}'
|
|
23
|
+
node whop-api.mjs GET '/api/v1/payments?company_id=biz_xxx&first=10&order=created_at&direction=desc'
|
|
24
|
+
node whop-api.mjs GET '/api/v1/payments?company_id=biz_xxx&checkout_configuration_ids[]=ch_xxx'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Always run `--schema <tool>` before calling an unfamiliar MCP tool.
|
|
28
|
+
|
|
29
|
+
## Step 1: Connect and get credentials
|
|
30
|
+
|
|
31
|
+
1. Propose the Whop integration if not already connected (reference `integrations` skill).
|
|
32
|
+
The connection is auto-provisioned — no user login or OAuth. A Whop store is created automatically.
|
|
33
|
+
2. Call `listConnections('whop')` in `code_execution` to get `company_id` (biz_xxx) and `api_key` (apik_xxx).
|
|
34
|
+
3. Store `company_id` as a Replit Configuration named `WHOP_COMPANY_ID`.
|
|
35
|
+
|
|
36
|
+
## Step 2: Write server code
|
|
37
|
+
|
|
38
|
+
Write **whopClient.ts** to the API server directory (source: `./references/whopClient.ts`). This provides `getWhopClient()` which lazily fetches credentials from the Replit connection API. Never import it in frontend code.
|
|
39
|
+
|
|
40
|
+
Install: `pnpm add @whop/sdk`
|
|
41
|
+
|
|
42
|
+
Use the app's existing server and auth patterns. Read `./references/code-templates.md` only if you need route shape or SDK method names; adapt it instead of copying it verbatim.
|
|
43
|
+
|
|
44
|
+
## Key facts and references
|
|
45
|
+
|
|
46
|
+
- **Whop plan = Stripe product/price.** When user says "create a product," they mean create a Whop plan.
|
|
47
|
+
- **Products** are just groupings — not directly purchasable.
|
|
48
|
+
- Prices are in **dollars** (9.99 = $9.99, 100 = $100). NOT cents like Stripe.
|
|
49
|
+
- Dates are **ISO 8601 strings** — parse with `new Date(str)`. Do NOT multiply by 1000.
|
|
50
|
+
- Plans reference products via `plan.product.id`, NOT `plan.product_id`.
|
|
51
|
+
- List endpoints return `{ data: [...] }`.
|
|
52
|
+
- `company_id` is required for most SDK methods — read from `process.env.WHOP_COMPANY_ID`.
|
|
53
|
+
- Whop is the system of record for purchases and membership access.
|
|
54
|
+
- Purchases are tied to the buyer's Whop account. If a user cannot access a purchase, they are often logged into the wrong Whop account/email.
|
|
55
|
+
- In a Whop app/iframe, verify the `x-whop-user-token` server-side to get the Whop `userId`, then call `users.checkAccess(resourceId, { id: userId })`. Gate paid features on Whop's response, not on local checkout state.
|
|
56
|
+
- For non-Whop-hosted apps, use a real auth bridge such as Whop OAuth or a server-verified membership/payment flow. Do not rely on client-supplied email, membership ID, checkout ID, or `success=true`.
|
|
57
|
+
|
|
58
|
+
- **API server directory**: `server/`
|
|
59
|
+
- **Client app directory**: `client/`
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
### Reference files
|
|
63
|
+
|
|
64
|
+
- ./references/code-templates.md -- Example routes and checkout flow using the Whop SDK
|
|
65
|
+
- ./references/whopClient.ts -- Server-side Whop SDK client that fetches credentials from the Replit connection API
|
|
66
|
+
- ./references/whop-mcp.mjs -- Helper script for calling Whop MCP tools via the OpenInt proxy
|
|
67
|
+
- ./references/whop-api.mjs -- Helper script for direct Whop REST API calls (plans, checkout configs, payments)
|
|
68
|
+
|
|
69
|
+
## Step 3: Create product and plan
|
|
70
|
+
|
|
71
|
+
Run these via `shell_exec` — do NOT ask the user for IDs:
|
|
72
|
+
1. `node whop-mcp.mjs create_product '{"title":"<product name>"}'` → get `prod_xxx`
|
|
73
|
+
2. `node whop-api.mjs POST /api/v1/plans '{"company_id":"biz_xxx","product_id":"prod_xxx","initial_price":<dollars>,"currency":"usd","billing_period":30}'` → get `plan_xxx`
|
|
74
|
+
3. Store `plan_xxx` as a Replit Configuration `WHOP_PLAN_ID`
|
|
75
|
+
|
|
76
|
+
## Step 4: Implement checkout flow
|
|
77
|
+
|
|
78
|
+
1. User clicks "Subscribe" → app calls server `POST /api/whop/checkout` with `plan_id`
|
|
79
|
+
2. Server creates checkout config: `POST /checkout_configurations` with `{ plan_id, redirect_url }` → returns `{ id: "ch_xxx", purchase_url }`
|
|
80
|
+
3. Frontend redirects user to `purchase_url` (Whop hosted checkout)
|
|
81
|
+
4. User pays → Whop redirects back to `redirect_url`
|
|
82
|
+
5. Server verifies purchase/account access with Whop before granting paid access:
|
|
83
|
+
- For Whop apps, verify the Whop user token and call `users.checkAccess` for the product, experience, or company.
|
|
84
|
+
- For external apps, verify the matching payment/membership server-side and bind it to the authenticated user.
|
|
85
|
+
6. Store only the minimal local mapping needed by the app; Whop remains the source of truth.
|
|
86
|
+
|
|
87
|
+
## Step 5: Add manage subscription page
|
|
88
|
+
|
|
89
|
+
Add `/account` or `/settings` page with cancel and view subscription. See `./references/code-templates.md` for routes.
|
|
90
|
+
|
|
91
|
+
## Rules (read these last — they override any conflicting info above)
|
|
92
|
+
|
|
93
|
+
- Do NOT ask the user for Company ID, Plan ID, or API key — get them yourself
|
|
94
|
+
- Use `whop-mcp.mjs` and `whop-api.mjs` to manage the Whop account (create products, plans, list payments, etc.) — do NOT ask the user to do these in the Whop dashboard
|
|
95
|
+
- Use Whop's hosted checkout (redirect-based) for all payment flows
|
|
96
|
+
- Use `getWhopClient()` from `whopClient.ts` for all server-side API calls in the user's app
|
|
97
|
+
- Do NOT import `whopClient.ts` in frontend code — it is server-only
|
|
98
|
+
- Do NOT duplicate product/plan catalogs in your database — query Whop
|
|
99
|
+
- Do NOT hardcode `api_key` in source — always fetch via `getWhopClient()`
|
|
100
|
+
- In Whop apps, use Whop account login: verify `x-whop-user-token` and check access with Whop
|
|
101
|
+
- For external apps, add a secure auth bridge before granting access
|
|
102
|
+
- Never grant paid access from a redirect, client-supplied email, membership ID, checkout ID, or `success` query param
|
|
103
|
+
- Store `company_id` in a Replit Configuration
|
|
104
|
+
- Store only minimal purchase/access mappings needed by the app; keep Whop as the source of truth
|