@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,954 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: excel-generator
|
|
3
|
+
description: Create Excel spreadsheets with formulas, charts, pivot summaries, and financial models.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Excel & Spreadsheet Generator
|
|
7
|
+
|
|
8
|
+
Create .xlsx files, Google Sheets, and PDF exports with formulas, formatting, charts, data validation, pivot summaries, and financial models.
|
|
9
|
+
|
|
10
|
+
Library Selection
|
|
11
|
+
|
|
12
|
+
Need Use Install
|
|
13
|
+
|
|
14
|
+
Create new .xlsx from scratch, fast, large files xlsxwriter pip install xlsxwriter
|
|
15
|
+
|
|
16
|
+
Read/modify existing .xlsx, or round-trip edits openpyxl pip install openpyxl
|
|
17
|
+
|
|
18
|
+
Read legacy .xls (Excel 97-2003) xlrd pip install xlrd
|
|
19
|
+
|
|
20
|
+
Dump a DataFrame quickly df.to_excel() uses openpyxl/xlsxwriter as engine
|
|
21
|
+
|
|
22
|
+
Generate Google Sheets gspread + google-auth pip install gspread google-auth
|
|
23
|
+
|
|
24
|
+
Export to PDF LibreOffice CLI system dependency (see PDF section)
|
|
25
|
+
|
|
26
|
+
Key gotchas:
|
|
27
|
+
|
|
28
|
+
Neither openpyxl nor xlsxwriter can read .xls — only .xlsx. Use xlrd for .xls.
|
|
29
|
+
|
|
30
|
+
xlsxwriter is write-only — it cannot open an existing file. Use openpyxl to edit.
|
|
31
|
+
|
|
32
|
+
openpyxl uses ~50x the file size in RAM. For 100K+ rows, use xlsxwriter or openpyxl.Workbook(write_only=True).
|
|
33
|
+
|
|
34
|
+
Formulas are stored as strings — Python does not evaluate them. Excel computes on open. openpyxl reading a formula cell gives you =SUM(A1:A10), not the result (unless you use data_only=True, which reads the last cached value).
|
|
35
|
+
|
|
36
|
+
Core Recipe — openpyxl
|
|
37
|
+
|
|
38
|
+
from openpyxl import Workbook
|
|
39
|
+
|
|
40
|
+
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
|
41
|
+
|
|
42
|
+
from openpyxl.utils import get*column*letter
|
|
43
|
+
|
|
44
|
+
from openpyxl.worksheet.table import Table, TableStyleInfo
|
|
45
|
+
|
|
46
|
+
from openpyxl.formatting.rule import ColorScaleRule, DataBarRule
|
|
47
|
+
|
|
48
|
+
from openpyxl.worksheet.datavalidation import DataValidation
|
|
49
|
+
|
|
50
|
+
wb = Workbook()
|
|
51
|
+
|
|
52
|
+
ws = wb.active
|
|
53
|
+
|
|
54
|
+
ws.title = "Sales"
|
|
55
|
+
|
|
56
|
+
headers = ["Product", "Units", "Price", "Revenue"]
|
|
57
|
+
|
|
58
|
+
ws.append(headers)
|
|
59
|
+
|
|
60
|
+
rows = [("Widget", 120, 9.99), ("Gadget", 80, 14.50), ("Gizmo", 200, 4.25)]
|
|
61
|
+
|
|
62
|
+
for r in rows:
|
|
63
|
+
|
|
64
|
+
ws.append(r)
|
|
65
|
+
|
|
66
|
+
for row in range(2, len(rows) + 2):
|
|
67
|
+
|
|
68
|
+
ws[f"D{row}"] = f"=B{row}*C{row}"
|
|
69
|
+
|
|
70
|
+
ws[f"D{len(rows)+2}"] = f"=SUM(D2:D{len(rows)+1})"
|
|
71
|
+
|
|
72
|
+
header*fill = PatternFill(start*color="2F5496", fill_type="solid")
|
|
73
|
+
|
|
74
|
+
for cell in ws[1]:
|
|
75
|
+
|
|
76
|
+
cell.font = Font(bold=True, color="FFFFFF")
|
|
77
|
+
|
|
78
|
+
cell.fill = header_fill
|
|
79
|
+
|
|
80
|
+
cell.alignment = Alignment(horizontal="center")
|
|
81
|
+
|
|
82
|
+
cell.border = Border(bottom=Side(border_style="medium"))
|
|
83
|
+
|
|
84
|
+
for row in ws.iter*rows(min*row=2, min*col=3, max*col=4):
|
|
85
|
+
|
|
86
|
+
for cell in row:
|
|
87
|
+
|
|
88
|
+
cell.number_format = '"$"#,##0.00'
|
|
89
|
+
|
|
90
|
+
for col in ws.columns:
|
|
91
|
+
|
|
92
|
+
max_len = max(len(str(c.value or "")) for c in col)
|
|
93
|
+
|
|
94
|
+
ws.column*dimensions[get*column*letter(col[0].column)].width = max*len + 3
|
|
95
|
+
|
|
96
|
+
ws.freeze_panes = "A2"
|
|
97
|
+
|
|
98
|
+
tab = Table(displayName="SalesTable", ref=f"A1:D{len(rows)+1}")
|
|
99
|
+
|
|
100
|
+
tab.tableStyleInfo = TableStyleInfo(name="TableStyleMedium9", showRowStripes=True)
|
|
101
|
+
|
|
102
|
+
ws.add_table(tab)
|
|
103
|
+
|
|
104
|
+
ws.conditional_formatting.add(f"D2:D{len(rows)+1}",
|
|
105
|
+
|
|
106
|
+
DataBarRule(start*type="min", end*type="max", color="638EC6"))
|
|
107
|
+
|
|
108
|
+
dv = DataValidation(type="list", formula1='"Active,Paused,Archived"', allow_blank=True)
|
|
109
|
+
|
|
110
|
+
ws.add*data*validation(dv)
|
|
111
|
+
|
|
112
|
+
dv.add("E2:E100")
|
|
113
|
+
|
|
114
|
+
wb.save("output.xlsx")
|
|
115
|
+
|
|
116
|
+
Charts (openpyxl)
|
|
117
|
+
|
|
118
|
+
from openpyxl.chart import BarChart, LineChart, PieChart, Reference
|
|
119
|
+
|
|
120
|
+
chart = BarChart()
|
|
121
|
+
|
|
122
|
+
chart.title = "Revenue by Product"
|
|
123
|
+
|
|
124
|
+
chart.y_axis.title = "Revenue ($)"
|
|
125
|
+
|
|
126
|
+
data = Reference(ws, min*col=4, min*row=1, max_row=4)
|
|
127
|
+
|
|
128
|
+
cats = Reference(ws, min*col=1, min*row=2, max_row=4)
|
|
129
|
+
|
|
130
|
+
chart.add*data(data, titles*from_data=True)
|
|
131
|
+
|
|
132
|
+
chart.set_categories(cats)
|
|
133
|
+
|
|
134
|
+
ws.add_chart(chart, "F2")
|
|
135
|
+
|
|
136
|
+
Chart gotchas:
|
|
137
|
+
|
|
138
|
+
Reference uses 1-indexed rows/cols (not 0-indexed).
|
|
139
|
+
|
|
140
|
+
titles*from*data=True consumes the first row of the data range as the series label — include the header row in data but NOT in cats.
|
|
141
|
+
|
|
142
|
+
Supported: BarChart, LineChart, PieChart, ScatterChart, AreaChart, DoughnutChart, RadarChart. 3D variants exist but render inconsistently.
|
|
143
|
+
|
|
144
|
+
Charts reference cells — if you later insert rows above, the chart range does NOT auto-adjust.
|
|
145
|
+
|
|
146
|
+
xlsxwriter (faster, write-only, richer formatting)
|
|
147
|
+
|
|
148
|
+
import xlsxwriter
|
|
149
|
+
|
|
150
|
+
wb = xlsxwriter.Workbook("report.xlsx")
|
|
151
|
+
|
|
152
|
+
ws = wb.add_worksheet("Data")
|
|
153
|
+
|
|
154
|
+
header*fmt = wb.add*format({"bold": True, "bg*color": "#2F5496", "font*color": "white", "border": 1})
|
|
155
|
+
|
|
156
|
+
money*fmt = wb.add*format({"num_format": "$#,##0.00"})
|
|
157
|
+
|
|
158
|
+
ws.write*row(0, 0, ["Product", "Units", "Price", "Revenue"], header*fmt)
|
|
159
|
+
|
|
160
|
+
data = [("Widget", 120, 9.99), ("Gadget", 80, 14.50)]
|
|
161
|
+
|
|
162
|
+
for i, (p, u, pr) in enumerate(data, start=1):
|
|
163
|
+
|
|
164
|
+
ws.write(i, 0, p)
|
|
165
|
+
|
|
166
|
+
ws.write(i, 1, u)
|
|
167
|
+
|
|
168
|
+
ws.write(i, 2, pr, money_fmt)
|
|
169
|
+
|
|
170
|
+
ws.write*formula(i, 3, f"=B{i+1}*C{i+1}", money*fmt)
|
|
171
|
+
|
|
172
|
+
ws.autofit()
|
|
173
|
+
|
|
174
|
+
ws.freeze_panes(1, 0)
|
|
175
|
+
|
|
176
|
+
wb.close()
|
|
177
|
+
|
|
178
|
+
pandas Shortcut (multi-sheet with formatting)
|
|
179
|
+
|
|
180
|
+
import pandas as pd
|
|
181
|
+
|
|
182
|
+
with pd.ExcelWriter("out.xlsx", engine="xlsxwriter") as writer:
|
|
183
|
+
|
|
184
|
+
df.to*excel(writer, sheet*name="Data", index=False)
|
|
185
|
+
|
|
186
|
+
summary.to*excel(writer, sheet*name="Summary", index=False)
|
|
187
|
+
|
|
188
|
+
wb, ws = writer.book, writer.sheets["Data"]
|
|
189
|
+
|
|
190
|
+
ws.set_column("A:A", 20)
|
|
191
|
+
|
|
192
|
+
ws.autofilter(0, 0, len(df), len(df.columns) - 1)
|
|
193
|
+
|
|
194
|
+
Google Sheets Generation
|
|
195
|
+
|
|
196
|
+
Use the gspread library with a service account or OAuth credentials. Requires the Google Sheets API and Google Drive API enabled.
|
|
197
|
+
|
|
198
|
+
Setup: Check if a Google Sheets integration is available via Replit integrations first. If not, the user needs to provide a service account JSON key.
|
|
199
|
+
|
|
200
|
+
import gspread
|
|
201
|
+
|
|
202
|
+
from google.oauth2.service_account import Credentials
|
|
203
|
+
|
|
204
|
+
scopes = [
|
|
205
|
+
|
|
206
|
+
"<https://www.googleapis.com/auth/spreadsheets>",
|
|
207
|
+
|
|
208
|
+
"<https://www.googleapis.com/auth/drive>",
|
|
209
|
+
|
|
210
|
+
]
|
|
211
|
+
|
|
212
|
+
creds = Credentials.from*service*account*file("service*account.json", scopes=scopes)
|
|
213
|
+
|
|
214
|
+
gc = gspread.authorize(creds)
|
|
215
|
+
|
|
216
|
+
sh = gc.create("Sales Report Q1")
|
|
217
|
+
|
|
218
|
+
ws = sh.sheet1
|
|
219
|
+
|
|
220
|
+
ws.update_title("Revenue")
|
|
221
|
+
|
|
222
|
+
ws.update("A1:D1", [["Product", "Units", "Price", "Revenue"]])
|
|
223
|
+
|
|
224
|
+
data = [["Widget", 120, 9.99], ["Gadget", 80, 14.50], ["Gizmo", 200, 4.25]]
|
|
225
|
+
|
|
226
|
+
ws.update(f"A2:C{len(data)+1}", data)
|
|
227
|
+
|
|
228
|
+
for i in range(2, len(data) + 2):
|
|
229
|
+
|
|
230
|
+
ws.update_acell(f"D{i}", f"=B{i}*C{i}")
|
|
231
|
+
|
|
232
|
+
ws.format("A1:D1", {
|
|
233
|
+
|
|
234
|
+
"backgroundColor": {"red": 0.18, "green": 0.33, "blue": 0.59},
|
|
235
|
+
|
|
236
|
+
"textFormat": {"bold": True, "foregroundColor": {"red": 1, "green": 1, "blue": 1}},
|
|
237
|
+
|
|
238
|
+
"horizontalAlignment": "CENTER"
|
|
239
|
+
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
ws.format(f"C2:D{len(data)+1}", {"numberFormat": {"type": "CURRENCY", "pattern": "$#,##0.00"}})
|
|
243
|
+
|
|
244
|
+
ws.freeze(rows=1)
|
|
245
|
+
|
|
246
|
+
sh.share("<user@example.com>", perm_type="user", role="writer")
|
|
247
|
+
|
|
248
|
+
print(f"Spreadsheet URL: {sh.url}")
|
|
249
|
+
|
|
250
|
+
Batch updates (faster for large writes):
|
|
251
|
+
|
|
252
|
+
ws.batch_update([
|
|
253
|
+
|
|
254
|
+
{"range": "A1:D1", "values": [headers]},
|
|
255
|
+
|
|
256
|
+
{"range": f"A2:C{len(data)+1}", "values": data},
|
|
257
|
+
|
|
258
|
+
])
|
|
259
|
+
|
|
260
|
+
Google Sheets gotchas:
|
|
261
|
+
|
|
262
|
+
API rate limits: 60 requests/min per user, 300 requests/min per project. Batch writes to stay under.
|
|
263
|
+
|
|
264
|
+
update() overwrites — it does not append. Use append_rows() to add to the end.
|
|
265
|
+
|
|
266
|
+
Formulas work the same as Excel (US-English function names).
|
|
267
|
+
|
|
268
|
+
Charts must be created via the Sheets API v4 batchUpdate with addChart request — gspread does not have a chart helper.
|
|
269
|
+
|
|
270
|
+
Conditional formatting requires gspread.utils or raw API calls.
|
|
271
|
+
|
|
272
|
+
Alternative — upload .xlsx to Google Drive:
|
|
273
|
+
|
|
274
|
+
from googleapiclient.discovery import build
|
|
275
|
+
|
|
276
|
+
from googleapiclient.http import MediaFileUpload
|
|
277
|
+
|
|
278
|
+
drive = build("drive", "v3", credentials=creds)
|
|
279
|
+
|
|
280
|
+
file_metadata = {"name": "Report", "mimeType": "application/vnd.google-apps.spreadsheet"}
|
|
281
|
+
|
|
282
|
+
media = MediaFileUpload("report.xlsx",
|
|
283
|
+
|
|
284
|
+
mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
|
285
|
+
|
|
286
|
+
file = drive.files().create(body=file*metadata, media*body=media,
|
|
287
|
+
|
|
288
|
+
fields="id,webViewLink").execute()
|
|
289
|
+
|
|
290
|
+
print(f"Google Sheets URL: {file['webViewLink']}")
|
|
291
|
+
|
|
292
|
+
PDF Export & Print Layout
|
|
293
|
+
|
|
294
|
+
Method 1: LibreOffice CLI (best fidelity)
|
|
295
|
+
|
|
296
|
+
libreoffice --headless --calc --convert-to pdf --outdir ./output report.xlsx
|
|
297
|
+
|
|
298
|
+
import subprocess
|
|
299
|
+
|
|
300
|
+
def xlsx*to*pdf(input*path, output*dir="./output"):
|
|
301
|
+
|
|
302
|
+
result = subprocess.run(
|
|
303
|
+
|
|
304
|
+
["libreoffice", "--headless", "--calc", "--convert-to", "pdf",
|
|
305
|
+
|
|
306
|
+
"--outdir", output*dir, input*path],
|
|
307
|
+
|
|
308
|
+
capture_output=True, text=True, timeout=60
|
|
309
|
+
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
if result.returncode != 0:
|
|
313
|
+
|
|
314
|
+
raise RuntimeError(f"Conversion failed: {result.stderr}")
|
|
315
|
+
|
|
316
|
+
return f"{output*dir}/{input*path.rsplit['/', 1](-1).replace('.xlsx', '.pdf')}"
|
|
317
|
+
|
|
318
|
+
Method 2: Print Layout in openpyxl
|
|
319
|
+
|
|
320
|
+
from openpyxl.worksheet.page import PageMargins, PrintPageSetup
|
|
321
|
+
|
|
322
|
+
ws.page_setup.orientation = "landscape"
|
|
323
|
+
|
|
324
|
+
ws.page*setup.paperSize = ws.PAPERSIZE*LETTER
|
|
325
|
+
|
|
326
|
+
ws.page_setup.fitToWidth = 1
|
|
327
|
+
|
|
328
|
+
ws.page_setup.fitToHeight = 0
|
|
329
|
+
|
|
330
|
+
ws.sheet_properties.pageSetUpPr.fitToPage = True
|
|
331
|
+
|
|
332
|
+
ws.page_margins = PageMargins(left=0.5, right=0.5, top=0.75, bottom=0.75,
|
|
333
|
+
|
|
334
|
+
header=0.3, footer=0.3)
|
|
335
|
+
|
|
336
|
+
ws.oddHeader.center.text = "Sales Report — Q1 2026"
|
|
337
|
+
|
|
338
|
+
ws.oddHeader.center.font = "Arial,Bold"
|
|
339
|
+
|
|
340
|
+
ws.oddHeader.center.size = 12
|
|
341
|
+
|
|
342
|
+
ws.oddFooter.center.text = "Page &P of &N"
|
|
343
|
+
|
|
344
|
+
ws.oddFooter.right.text = "&D"
|
|
345
|
+
|
|
346
|
+
ws.print*title*rows = "1:1"
|
|
347
|
+
|
|
348
|
+
ws.print*area = f"A1:F{last*row}"
|
|
349
|
+
|
|
350
|
+
ws.row_breaks.append(openpyxl.worksheet.pagebreak.Break(id=25))
|
|
351
|
+
|
|
352
|
+
Method 3: Print Layout in xlsxwriter
|
|
353
|
+
|
|
354
|
+
ws.set_landscape()
|
|
355
|
+
|
|
356
|
+
ws.set_paper(1)
|
|
357
|
+
|
|
358
|
+
ws.fit*to*pages(1, 0)
|
|
359
|
+
|
|
360
|
+
ws.set_margins(left=0.5, right=0.5, top=0.75, bottom=0.75)
|
|
361
|
+
|
|
362
|
+
ws.set_header("&C&\\Arial,Bold\\&14 Sales Report")
|
|
363
|
+
|
|
364
|
+
ws.set_footer("&CPage &P of &N")
|
|
365
|
+
|
|
366
|
+
ws.repeat_rows(0)
|
|
367
|
+
|
|
368
|
+
ws.print*area(0, 0, last*row, 5)
|
|
369
|
+
|
|
370
|
+
ws.set*page*break(25, 0)
|
|
371
|
+
|
|
372
|
+
Print layout tips:
|
|
373
|
+
|
|
374
|
+
Always set fitToWidth=1 for wide tables — prevents columns from being cut off across pages.
|
|
375
|
+
|
|
376
|
+
Use repeat_rows to repeat headers on every page — critical for multi-page tables.
|
|
377
|
+
|
|
378
|
+
Set margins to 0.5" for data-heavy sheets, 0.75"+ for presentation sheets.
|
|
379
|
+
|
|
380
|
+
Test with landscape for tables wider than 6 columns.
|
|
381
|
+
|
|
382
|
+
For Excel-native PDF: the user can also do File > Export > PDF in Excel after opening.
|
|
383
|
+
|
|
384
|
+
Financial Model Recipes
|
|
385
|
+
|
|
386
|
+
See `financial-models.md` for complete recipes covering:
|
|
387
|
+
|
|
388
|
+
3-Statement Model — Income Statement, Balance Sheet, Cash Flow linked together
|
|
389
|
+
|
|
390
|
+
DCF (Discounted Cash Flow) — FCF projections, discount factors, terminal value, equity bridge
|
|
391
|
+
|
|
392
|
+
LBO (Leveraged Buyout) — Sources & Uses, debt schedule, cash sweep, MOIC/IRR
|
|
393
|
+
|
|
394
|
+
Comparable Company Analysis — Comp table with multiples, summary stats, implied valuation
|
|
395
|
+
|
|
396
|
+
Merger Model (M&A) — Accretion/dilution analysis, pro forma EPS
|
|
397
|
+
|
|
398
|
+
Common patterns across all financial models:
|
|
399
|
+
|
|
400
|
+
Yellow-highlighted cells (#FFF2CC) = user inputs; everything else is formulas
|
|
401
|
+
|
|
402
|
+
Use freeze_panes on row 1 (headers) and column A (labels)
|
|
403
|
+
|
|
404
|
+
Currency format: '"$"#,##0.0' for millions, '"$"#,##0.00' for precise
|
|
405
|
+
|
|
406
|
+
Multiple format: '0.0x' for EV/EBITDA, leverage ratios
|
|
407
|
+
|
|
408
|
+
Totals use double-bottom border ("bottom": 6 in xlsxwriter)
|
|
409
|
+
|
|
410
|
+
Use named ranges or cell references to the Assumptions sheet for all inputs — never hardcode values in formula sheets
|
|
411
|
+
|
|
412
|
+
Always add a section_fmt for visual grouping (bold, light blue background, top+bottom border)
|
|
413
|
+
|
|
414
|
+
Pivot-Table-Style Summaries
|
|
415
|
+
|
|
416
|
+
Python cannot create native Excel PivotTables programmatically (they require cached data). Instead, build the equivalent summary using formulas or pandas aggregation.
|
|
417
|
+
|
|
418
|
+
Pattern 1: pandas groupby to formatted Excel output
|
|
419
|
+
|
|
420
|
+
import pandas as pd
|
|
421
|
+
|
|
422
|
+
df = pd.DataFrame({
|
|
423
|
+
|
|
424
|
+
"Region": ["East", "East", "West", "West", "East", "West"],
|
|
425
|
+
|
|
426
|
+
"Product": ["Widget", "Gadget", "Widget", "Gadget", "Widget", "Gadget"],
|
|
427
|
+
|
|
428
|
+
"Revenue": [120, 80, 150, 90, 200, 110],
|
|
429
|
+
|
|
430
|
+
"Units": [10, 5, 12, 6, 15, 8],
|
|
431
|
+
|
|
432
|
+
})
|
|
433
|
+
|
|
434
|
+
pivot = df.pivot_table(
|
|
435
|
+
|
|
436
|
+
values=["Revenue", "Units"],
|
|
437
|
+
|
|
438
|
+
index="Region",
|
|
439
|
+
|
|
440
|
+
columns="Product",
|
|
441
|
+
|
|
442
|
+
aggfunc="sum",
|
|
443
|
+
|
|
444
|
+
margins=True,
|
|
445
|
+
|
|
446
|
+
margins_name="Total"
|
|
447
|
+
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
pivot.columns = [f"{val} - {prod}" for val, prod in pivot.columns]
|
|
451
|
+
|
|
452
|
+
pivot = pivot.reset_index()
|
|
453
|
+
|
|
454
|
+
with pd.ExcelWriter("pivot_report.xlsx", engine="xlsxwriter") as writer:
|
|
455
|
+
|
|
456
|
+
df.to*excel(writer, sheet*name="Data", index=False)
|
|
457
|
+
|
|
458
|
+
pivot.to*excel(writer, sheet*name="Summary", index=False)
|
|
459
|
+
|
|
460
|
+
ws = writer.sheets["Summary"]
|
|
461
|
+
|
|
462
|
+
ws.autofit()
|
|
463
|
+
|
|
464
|
+
hdr*fmt = writer.book.add*format(
|
|
465
|
+
|
|
466
|
+
{"bold": True, "bg*color": "#2F5496", "font*color": "white"})
|
|
467
|
+
|
|
468
|
+
for col_num, value in enumerate(pivot.columns):
|
|
469
|
+
|
|
470
|
+
ws.write(0, col*num, value, hdr*fmt)
|
|
471
|
+
|
|
472
|
+
Pattern 2: SUMIFS-based pivot using formulas (dynamic in Excel)
|
|
473
|
+
|
|
474
|
+
import xlsxwriter
|
|
475
|
+
|
|
476
|
+
wb = xlsxwriter.Workbook("formula_pivot.xlsx")
|
|
477
|
+
|
|
478
|
+
ws*data = wb.add*worksheet("Data")
|
|
479
|
+
|
|
480
|
+
ws*pivot = wb.add*worksheet("Pivot")
|
|
481
|
+
|
|
482
|
+
headers = ["Region", "Product", "Revenue"]
|
|
483
|
+
|
|
484
|
+
data_rows = [("East", "Widget", 120), ("East", "Gadget", 80),
|
|
485
|
+
|
|
486
|
+
("West", "Widget", 150), ("West", "Gadget", 90),
|
|
487
|
+
|
|
488
|
+
("East", "Widget", 200), ("West", "Gadget", 110)]
|
|
489
|
+
|
|
490
|
+
ws*data.write*row(0, 0, headers)
|
|
491
|
+
|
|
492
|
+
for i, row in enumerate(data_rows, 1):
|
|
493
|
+
|
|
494
|
+
ws*data.write*row(i, 0, row)
|
|
495
|
+
|
|
496
|
+
last*data = len(data*rows)
|
|
497
|
+
|
|
498
|
+
regions = ["East", "West"]
|
|
499
|
+
|
|
500
|
+
products = ["Widget", "Gadget"]
|
|
501
|
+
|
|
502
|
+
ws_pivot.write(0, 0, "Region \\ Product")
|
|
503
|
+
|
|
504
|
+
for j, prod in enumerate(products):
|
|
505
|
+
|
|
506
|
+
ws_pivot.write(0, j + 1, prod)
|
|
507
|
+
|
|
508
|
+
ws_pivot.write(0, len(products) + 1, "Total")
|
|
509
|
+
|
|
510
|
+
for i, region in enumerate(regions):
|
|
511
|
+
|
|
512
|
+
ws_pivot.write(i + 1, 0, region)
|
|
513
|
+
|
|
514
|
+
for j, prod in enumerate(products):
|
|
515
|
+
|
|
516
|
+
ws*pivot.write*formula(i + 1, j + 1,
|
|
517
|
+
|
|
518
|
+
f'=SUMIFS(Data!C2:C{last*data+1}, Data!A2:A{last*data+1}, '
|
|
519
|
+
|
|
520
|
+
f'A{i+2}, Data!B2:B{last_data+1}, {chr(66+j)}1)')
|
|
521
|
+
|
|
522
|
+
ws*pivot.write*formula(i + 1, len(products) + 1,
|
|
523
|
+
|
|
524
|
+
f"=SUM(B{i+2}:{chr(65+len(products))}{i+2})")
|
|
525
|
+
|
|
526
|
+
ws_pivot.write(len(regions) + 1, 0, "Total")
|
|
527
|
+
|
|
528
|
+
for j in range(len(products) + 1):
|
|
529
|
+
|
|
530
|
+
col_letter = chr(66 + j)
|
|
531
|
+
|
|
532
|
+
ws*pivot.write*formula(len(regions) + 1, j + 1,
|
|
533
|
+
|
|
534
|
+
f"=SUM({col*letter}2:{col*letter}{len(regions)+1})")
|
|
535
|
+
|
|
536
|
+
wb.close()
|
|
537
|
+
|
|
538
|
+
Pattern 3: Multi-dimension pivot with percentage columns
|
|
539
|
+
|
|
540
|
+
## After building a pivot, add percentage-of-total columns
|
|
541
|
+
|
|
542
|
+
## =Cell / ColumnTotal formatted as "0.0%"
|
|
543
|
+
|
|
544
|
+
## =Cell / RowTotal formatted as "0.0%"
|
|
545
|
+
|
|
546
|
+
## Use IFERROR to handle division by zero
|
|
547
|
+
|
|
548
|
+
Multi-Workbook Linking
|
|
549
|
+
|
|
550
|
+
Excel supports cross-workbook references using [filename.xlsx]SheetName!Cell syntax. Python can write these formulas as strings.
|
|
551
|
+
|
|
552
|
+
Writing cross-workbook references
|
|
553
|
+
|
|
554
|
+
import xlsxwriter
|
|
555
|
+
|
|
556
|
+
wb = xlsxwriter.Workbook("master_report.xlsx")
|
|
557
|
+
|
|
558
|
+
ws = wb.add_worksheet("Consolidated")
|
|
559
|
+
|
|
560
|
+
ws.write(0, 0, "Region")
|
|
561
|
+
|
|
562
|
+
ws.write(0, 1, "Revenue")
|
|
563
|
+
|
|
564
|
+
ws.write(0, 2, "EBITDA")
|
|
565
|
+
|
|
566
|
+
regions = [
|
|
567
|
+
|
|
568
|
+
("East", "east_data.xlsx"),
|
|
569
|
+
|
|
570
|
+
("West", "west_data.xlsx"),
|
|
571
|
+
|
|
572
|
+
("Central", "central_data.xlsx"),
|
|
573
|
+
|
|
574
|
+
]
|
|
575
|
+
|
|
576
|
+
for i, (region, filename) in enumerate(regions, 1):
|
|
577
|
+
|
|
578
|
+
ws.write(i, 0, region)
|
|
579
|
+
|
|
580
|
+
ws.write_formula(i, 1, f"='[{filename}]Summary'!B2")
|
|
581
|
+
|
|
582
|
+
ws.write_formula(i, 2, f"='[{filename}]Summary'!B5")
|
|
583
|
+
|
|
584
|
+
ws.write(len(regions) + 1, 0, "Total")
|
|
585
|
+
|
|
586
|
+
ws.write_formula(len(regions) + 1, 1, f"=SUM(B2:B{len(regions)+1})")
|
|
587
|
+
|
|
588
|
+
ws.write_formula(len(regions) + 1, 2, f"=SUM(C2:C{len(regions)+1})")
|
|
589
|
+
|
|
590
|
+
wb.close()
|
|
591
|
+
|
|
592
|
+
Multi-workbook gotchas:
|
|
593
|
+
|
|
594
|
+
External references only resolve when both files are open in Excel or when Excel has cached values.
|
|
595
|
+
|
|
596
|
+
Python writes the formula string only — no values are cached. On first open, Excel will show \#REF! until the linked file is also open or the link is updated.
|
|
597
|
+
|
|
598
|
+
File paths in references can be relative ([file.xlsx]) or absolute ('C:\Reports\\file.xlsx]'). Prefer relative for portability.
|
|
599
|
+
|
|
600
|
+
When generating a suite of workbooks, generate all data workbooks first, then the master.
|
|
601
|
+
|
|
602
|
+
Google Sheets uses IMPORTRANGE("spreadsheet_url", "Sheet1!A1:B10") instead of bracket syntax.
|
|
603
|
+
|
|
604
|
+
Generating a workbook suite
|
|
605
|
+
|
|
606
|
+
import xlsxwriter
|
|
607
|
+
|
|
608
|
+
regions = {"East": [100, 200, 150], "West": [180, 220, 190],
|
|
609
|
+
|
|
610
|
+
"Central": [90, 110, 130]}
|
|
611
|
+
|
|
612
|
+
for region, revenues in regions.items():
|
|
613
|
+
|
|
614
|
+
wb = xlsxwriter.Workbook(f"{region.lower()}_data.xlsx")
|
|
615
|
+
|
|
616
|
+
ws = wb.add_worksheet("Summary")
|
|
617
|
+
|
|
618
|
+
ws.write(0, 0, "Quarter")
|
|
619
|
+
|
|
620
|
+
ws.write(0, 1, "Revenue")
|
|
621
|
+
|
|
622
|
+
for i, rev in enumerate(revenues, 1):
|
|
623
|
+
|
|
624
|
+
ws.write(i, 0, f"Q{i}")
|
|
625
|
+
|
|
626
|
+
ws.write(i, 1, rev)
|
|
627
|
+
|
|
628
|
+
ws.write(len(revenues) + 1, 0, "Total")
|
|
629
|
+
|
|
630
|
+
ws.write_formula(len(revenues) + 1, 1, f"=SUM(B2:B{len(revenues)+1})")
|
|
631
|
+
|
|
632
|
+
wb.close()
|
|
633
|
+
|
|
634
|
+
Excel Data Tables (Sensitivity Analysis)
|
|
635
|
+
|
|
636
|
+
Excel Data Tables (What-If Analysis > Data Table) let you vary one or two inputs and see how an output changes. Python cannot create native data tables, but you can build the equivalent grid of formulas.
|
|
637
|
+
|
|
638
|
+
One-Way Data Table
|
|
639
|
+
|
|
640
|
+
import xlsxwriter
|
|
641
|
+
|
|
642
|
+
wb = xlsxwriter.Workbook("sensitivity_1way.xlsx")
|
|
643
|
+
|
|
644
|
+
ws = wb.add_worksheet("Sensitivity")
|
|
645
|
+
|
|
646
|
+
ws.write(0, 0, "Revenue")
|
|
647
|
+
|
|
648
|
+
ws.write(0, 1, 1000)
|
|
649
|
+
|
|
650
|
+
ws.write(1, 0, "Margin")
|
|
651
|
+
|
|
652
|
+
ws.write(1, 1, 0.20)
|
|
653
|
+
|
|
654
|
+
ws.write(2, 0, "EBITDA")
|
|
655
|
+
|
|
656
|
+
ws.write_formula(2, 1, "=B1*B2")
|
|
657
|
+
|
|
658
|
+
margins = [0.10, 0.15, 0.20, 0.25, 0.30]
|
|
659
|
+
|
|
660
|
+
ws.write(4, 0, "Margin Sensitivity")
|
|
661
|
+
|
|
662
|
+
ws.write(5, 0, "Margin")
|
|
663
|
+
|
|
664
|
+
ws.write(5, 1, "EBITDA")
|
|
665
|
+
|
|
666
|
+
pct*fmt = wb.add*format({"num_format": "0.0%"})
|
|
667
|
+
|
|
668
|
+
money*fmt = wb.add*format({"num_format": '"$"#,##0.0'})
|
|
669
|
+
|
|
670
|
+
for i, margin in enumerate(margins):
|
|
671
|
+
|
|
672
|
+
ws.write(6 + i, 0, margin, pct_fmt)
|
|
673
|
+
|
|
674
|
+
ws.write*formula(6 + i, 1, f"=B1*A{7+i}", money*fmt)
|
|
675
|
+
|
|
676
|
+
wb.close()
|
|
677
|
+
|
|
678
|
+
Two-Way Data Table (Sensitivity Grid)
|
|
679
|
+
|
|
680
|
+
import xlsxwriter
|
|
681
|
+
|
|
682
|
+
wb = xlsxwriter.Workbook("sensitivity_2way.xlsx")
|
|
683
|
+
|
|
684
|
+
ws = wb.add_worksheet("IRR Sensitivity")
|
|
685
|
+
|
|
686
|
+
hdr = wb.add*format({"bold": True, "bg*color": "#1B3A5C",
|
|
687
|
+
|
|
688
|
+
"font_color": "white", "align": "center"})
|
|
689
|
+
|
|
690
|
+
corner = wb.add*format({"bold": True, "bg*color": "#1B3A5C",
|
|
691
|
+
|
|
692
|
+
"font*color": "white", "align": "center", "text*wrap": True})
|
|
693
|
+
|
|
694
|
+
pct = wb.add*format({"num*format": "0.0%", "align": "center"})
|
|
695
|
+
|
|
696
|
+
x*fmt = wb.add*format({"num_format": "0.0x", "align": "center"})
|
|
697
|
+
|
|
698
|
+
cell*pct = wb.add*format({"num_format": "0.0%", "align": "center",
|
|
699
|
+
|
|
700
|
+
"bg_color": "#F2F2F2"})
|
|
701
|
+
|
|
702
|
+
ws.write(0, 0, "Entry EBITDA")
|
|
703
|
+
|
|
704
|
+
ws.write(0, 1, 100)
|
|
705
|
+
|
|
706
|
+
ws.write(1, 0, "Equity Invested")
|
|
707
|
+
|
|
708
|
+
ws.write(1, 1, 400)
|
|
709
|
+
|
|
710
|
+
ws.write(2, 0, "Hold Period")
|
|
711
|
+
|
|
712
|
+
ws.write(2, 1, 5)
|
|
713
|
+
|
|
714
|
+
exit_multiples = [6.0, 7.0, 8.0, 9.0, 10.0]
|
|
715
|
+
|
|
716
|
+
ebitda*growth*rates = [0.00, 0.03, 0.05, 0.08, 0.10, 0.12]
|
|
717
|
+
|
|
718
|
+
start_row = 5
|
|
719
|
+
|
|
720
|
+
ws.write(start_row, 0, "EBITDA Growth \\ Exit Multiple", corner)
|
|
721
|
+
|
|
722
|
+
for j, mult in enumerate(exit_multiples):
|
|
723
|
+
|
|
724
|
+
ws.write(start*row, j + 1, mult, x*fmt)
|
|
725
|
+
|
|
726
|
+
for i, growth in enumerate(ebitda*growth*rates):
|
|
727
|
+
|
|
728
|
+
r = start_row + 1 + i
|
|
729
|
+
|
|
730
|
+
ws.write(r, 0, growth, pct)
|
|
731
|
+
|
|
732
|
+
for j, mult in enumerate(exit_multiples):
|
|
733
|
+
|
|
734
|
+
ws.write_formula(r, j + 1,
|
|
735
|
+
|
|
736
|
+
f"=IFERROR((B1*(1+A{r+1})^B3*{mult}/B2)^(1/B3)-1, 0)",
|
|
737
|
+
|
|
738
|
+
cell_pct)
|
|
739
|
+
|
|
740
|
+
ws.conditional*format(start*row+1, 1,
|
|
741
|
+
|
|
742
|
+
start*row+len(ebitda*growth*rates), len(exit*multiples), {
|
|
743
|
+
|
|
744
|
+
"type": "3*color*scale",
|
|
745
|
+
|
|
746
|
+
"min_color": "#F8696B",
|
|
747
|
+
|
|
748
|
+
"mid_color": "#FFEB84",
|
|
749
|
+
|
|
750
|
+
"max_color": "#63BE7B",
|
|
751
|
+
|
|
752
|
+
})
|
|
753
|
+
|
|
754
|
+
ws.autofit()
|
|
755
|
+
|
|
756
|
+
wb.close()
|
|
757
|
+
|
|
758
|
+
Data table tips:
|
|
759
|
+
|
|
760
|
+
Always use IFERROR wrappers — edge cases (negative equity, zero denominators) will produce \#DIV/0! or \#NUM!.
|
|
761
|
+
|
|
762
|
+
Apply 3-color-scale conditional formatting to make the grid scannable at a glance.
|
|
763
|
+
|
|
764
|
+
Label the corner cell clearly (e.g., "Growth \\ Multiple") so users know which axis is which.
|
|
765
|
+
|
|
766
|
+
For financial models, common sensitivity pairs: Entry Multiple vs Exit Multiple, Revenue Growth vs EBITDA Margin, WACC vs Terminal Growth.
|
|
767
|
+
|
|
768
|
+
Large Dataset Handling
|
|
769
|
+
|
|
770
|
+
For datasets exceeding 100K rows, standard openpyxl will consume excessive memory. Use these strategies:
|
|
771
|
+
|
|
772
|
+
xlsxwriter (streaming by default)
|
|
773
|
+
|
|
774
|
+
import xlsxwriter
|
|
775
|
+
|
|
776
|
+
wb = xlsxwriter.Workbook("large*dataset.xlsx", {"constant*memory": True})
|
|
777
|
+
|
|
778
|
+
ws = wb.add_worksheet()
|
|
779
|
+
|
|
780
|
+
ws.write_row(0, 0, ["ID", "Name", "Value", "Category", "Date"])
|
|
781
|
+
|
|
782
|
+
for i in range(1, 1*000*001):
|
|
783
|
+
|
|
784
|
+
ws.write*row(i, 0, [i, f"Item*{i}", i * 1.5, f"Cat_{i % 10}", "2026-01-01"])
|
|
785
|
+
|
|
786
|
+
wb.close()
|
|
787
|
+
|
|
788
|
+
constant_memory: True — reduces RAM usage further by flushing rows to disk. Trade-off: you cannot go back and edit earlier rows.
|
|
789
|
+
|
|
790
|
+
openpyxl write-only mode
|
|
791
|
+
|
|
792
|
+
from openpyxl import Workbook
|
|
793
|
+
|
|
794
|
+
wb = Workbook(write_only=True)
|
|
795
|
+
|
|
796
|
+
ws = wb.create_sheet("Data")
|
|
797
|
+
|
|
798
|
+
ws.append(["ID", "Name", "Value"])
|
|
799
|
+
|
|
800
|
+
for i in range(1, 500_001):
|
|
801
|
+
|
|
802
|
+
ws.append([i, f"Item_{i}", i * 1.5])
|
|
803
|
+
|
|
804
|
+
wb.save("large_openpyxl.xlsx")
|
|
805
|
+
|
|
806
|
+
write_only gotchas:
|
|
807
|
+
|
|
808
|
+
Cannot read or modify cells after writing — append-only.
|
|
809
|
+
|
|
810
|
+
Cannot add tables, merged cells, or conditional formatting.
|
|
811
|
+
|
|
812
|
+
Cannot set column widths (use xlsxwriter if you need formatting + large data).
|
|
813
|
+
|
|
814
|
+
Chunked reading of large files
|
|
815
|
+
|
|
816
|
+
from openpyxl import load_workbook
|
|
817
|
+
|
|
818
|
+
wb = load*workbook("huge*file.xlsx", read*only=True, data*only=True)
|
|
819
|
+
|
|
820
|
+
ws = wb.active
|
|
821
|
+
|
|
822
|
+
batch = []
|
|
823
|
+
|
|
824
|
+
for i, row in enumerate(ws.iter*rows(min*row=2, values_only=True)):
|
|
825
|
+
|
|
826
|
+
batch.append(row)
|
|
827
|
+
|
|
828
|
+
if len(batch) >= 10_000:
|
|
829
|
+
|
|
830
|
+
process_batch(batch)
|
|
831
|
+
|
|
832
|
+
batch = []
|
|
833
|
+
|
|
834
|
+
if batch:
|
|
835
|
+
|
|
836
|
+
process_batch(batch)
|
|
837
|
+
|
|
838
|
+
wb.close()
|
|
839
|
+
|
|
840
|
+
pandas chunked processing
|
|
841
|
+
|
|
842
|
+
import pandas as pd
|
|
843
|
+
|
|
844
|
+
chunks = pd.read*excel("huge*file.xlsx", sheet_name="Data", engine="openpyxl",
|
|
845
|
+
|
|
846
|
+
dtype={"ID": int, "Value": float},
|
|
847
|
+
|
|
848
|
+
usecols=["ID", "Name", "Value"])
|
|
849
|
+
|
|
850
|
+
for chunk in pd.read*csv("data.csv", chunksize=50*000):
|
|
851
|
+
|
|
852
|
+
process(chunk)
|
|
853
|
+
|
|
854
|
+
Performance comparison
|
|
855
|
+
|
|
856
|
+
Method Max Rows (practical) RAM for 1M rows Formatting
|
|
857
|
+
|
|
858
|
+
xlsxwriter constant_memory 1M+ ~200MB Full
|
|
859
|
+
|
|
860
|
+
xlsxwriter normal 1M+ ~500MB Full
|
|
861
|
+
|
|
862
|
+
openpyxl write_only 500K ~1GB None
|
|
863
|
+
|
|
864
|
+
openpyxl normal 100K ~5GB Full
|
|
865
|
+
|
|
866
|
+
pandas to_excel (xlsxwriter) 1M+ ~800MB Via engine
|
|
867
|
+
|
|
868
|
+
Decision tree:
|
|
869
|
+
|
|
870
|
+
Need formatting + large data -> xlsxwriter with constant_memory: True
|
|
871
|
+
|
|
872
|
+
Need to read + modify large file -> openpyxl read_only + process + xlsxwriter output
|
|
873
|
+
|
|
874
|
+
Just need data dump -> pandas to_excel with xlsxwriter engine
|
|
875
|
+
|
|
876
|
+
Over 1M rows -> split across multiple sheets (Excel limit is 1,048,576 rows per sheet)
|
|
877
|
+
|
|
878
|
+
Common Formula Patterns
|
|
879
|
+
|
|
880
|
+
Need Formula
|
|
881
|
+
|
|
882
|
+
Running total =SUM($B$2:B2) (drag down)
|
|
883
|
+
|
|
884
|
+
Lookup (modern) =XLOOKUP(A2, Data!A:A, Data!C:C, "Not found")
|
|
885
|
+
|
|
886
|
+
Lookup (compat) =VLOOKUP(A2, Data!A:C, 3, FALSE)
|
|
887
|
+
|
|
888
|
+
Conditional sum =SUMIFS(C:C, A:A, "Widget", B:B, ">100")
|
|
889
|
+
|
|
890
|
+
Count matching =COUNTIFS(A:A, "Active")
|
|
891
|
+
|
|
892
|
+
Percent of total =B2/SUM($B$2:$B$100)
|
|
893
|
+
|
|
894
|
+
Safe division =IFERROR(A2/B2, 0)
|
|
895
|
+
|
|
896
|
+
Gotcha: When writing formulas from Python, use US-English function names and comma separators regardless of the user's locale. Excel translates on open.
|
|
897
|
+
|
|
898
|
+
Number Format Codes
|
|
899
|
+
|
|
900
|
+
Format Code
|
|
901
|
+
|
|
902
|
+
Currency "$"#,##0.00
|
|
903
|
+
|
|
904
|
+
Thousands \#,##0
|
|
905
|
+
|
|
906
|
+
Percent 0.0%
|
|
907
|
+
|
|
908
|
+
Date yyyy-mm-dd
|
|
909
|
+
|
|
910
|
+
Negative in red \#,##0;[Red]-#,##0
|
|
911
|
+
|
|
912
|
+
Multiple (e.g. 2.5x) 0.0x
|
|
913
|
+
|
|
914
|
+
Millions shorthand \#,##0.0,,"M"
|
|
915
|
+
|
|
916
|
+
Accounting (neg in parens) "$"#,##0.00_);[Red]("$"#,##0.00)
|
|
917
|
+
|
|
918
|
+
Data Gathering — Use Web Search When Relevant
|
|
919
|
+
|
|
920
|
+
Before building the spreadsheet, determine whether the data requires external research. If the user asks for a report, analysis, or dataset about a public company, industry, market, or any publicly available information, use webSearch and webFetch to gather real data first.
|
|
921
|
+
|
|
922
|
+
Examples that require web search:
|
|
923
|
+
|
|
924
|
+
"Build me a financial model for Tesla" -> search for Tesla's latest 10-K/10-Q, revenue, margins, guidance
|
|
925
|
+
|
|
926
|
+
"Create a comp table for SaaS companies" -> search for revenue, ARR, multiples, headcount
|
|
927
|
+
|
|
928
|
+
"Make a spreadsheet comparing EV manufacturers" -> search for production numbers, market cap, deliveries
|
|
929
|
+
|
|
930
|
+
"Summarize Apple's last 5 quarters" -> search for quarterly earnings data
|
|
931
|
+
|
|
932
|
+
Do not fabricate numbers. If you cannot find a specific data point, leave the cell blank or mark it as "N/A -- not found" rather than guessing. Always cite the source (e.g., "Source: Tesla 10-K FY2025") in a notes row or sheet.
|
|
933
|
+
|
|
934
|
+
Output
|
|
935
|
+
|
|
936
|
+
Always present key findings and recommendations as a plaintext summary in chat, even when also generating files. The user should be able to understand the results without opening any files.
|
|
937
|
+
|
|
938
|
+
Limitations
|
|
939
|
+
|
|
940
|
+
Cannot write VBA macros (.xlsm requires keep_vba=True in openpyxl to preserve existing macros, not create them)
|
|
941
|
+
|
|
942
|
+
Formulas are not computed by Python -- open in Excel/LibreOffice to see results
|
|
943
|
+
|
|
944
|
+
openpyxl auto-width is an approximation (no font metrics); xlsxwriter's autofit() is better
|
|
945
|
+
|
|
946
|
+
Google Sheets import may drop some conditional formatting and chart styles
|
|
947
|
+
|
|
948
|
+
Cannot create native Excel PivotTables -- use formula-based or pandas-based summaries instead
|
|
949
|
+
|
|
950
|
+
Cannot create native Excel Data Tables (What-If) -- use formula grids as equivalent
|
|
951
|
+
|
|
952
|
+
Cross-workbook references show \#REF! until linked files are opened in Excel
|
|
953
|
+
|
|
954
|
+
Excel row limit is 1,048,576 per sheet -- split larger datasets across sheets
|