@julianoczkowski/create-trimble-app 2.0.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/README.md +191 -0
- package/bin/create-trimble-app.js +9 -0
- package/package.json +67 -0
- package/src/cli.js +134 -0
- package/src/frameworks.js +28 -0
- package/src/scaffold.js +209 -0
- package/src/utils/file.js +47 -0
- package/src/utils/git.js +140 -0
- package/src/utils/install.js +25 -0
- package/src/utils/logger.js +124 -0
- package/templates/angular/.cursor/commands/remove-dev-content.md +394 -0
- package/templates/angular/.cursor/mcp.json +13 -0
- package/templates/angular/.cursor/rules/modus-angular-20.mdc +82 -0
- package/templates/angular/.cursor/rules/modus-angular-accordion-state-management-short.mdc +45 -0
- package/templates/angular/.cursor/rules/modus-angular-accordion-state-management.mdc +322 -0
- package/templates/angular/.cursor/rules/modus-angular-best-practices.mdc +472 -0
- package/templates/angular/.cursor/rules/modus-angular-border-usage-short.mdc +48 -0
- package/templates/angular/.cursor/rules/modus-angular-border-usage.mdc +286 -0
- package/templates/angular/.cursor/rules/modus-angular-button-group-usage-short.mdc +47 -0
- package/templates/angular/.cursor/rules/modus-angular-button-group-usage.mdc +263 -0
- package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion-short.mdc +36 -0
- package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion.mdc +92 -0
- package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing-short.mdc +34 -0
- package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing.mdc +185 -0
- package/templates/angular/.cursor/rules/modus-angular-color-usage-short.mdc +56 -0
- package/templates/angular/.cursor/rules/modus-angular-color-usage.mdc +208 -0
- package/templates/angular/.cursor/rules/modus-angular-components-reference.mdc +114 -0
- package/templates/angular/.cursor/rules/modus-angular-design-system.mdc +273 -0
- package/templates/angular/.cursor/rules/modus-angular-development-workflow-short.mdc +43 -0
- package/templates/angular/.cursor/rules/modus-angular-development-workflow.mdc +145 -0
- package/templates/angular/.cursor/rules/modus-angular-essentials.mdc +272 -0
- package/templates/angular/.cursor/rules/modus-angular-forms-validation-short.mdc +56 -0
- package/templates/angular/.cursor/rules/modus-angular-forms-validation.mdc +124 -0
- package/templates/angular/.cursor/rules/modus-angular-icon-names.mdc +70 -0
- package/templates/angular/.cursor/rules/modus-angular-icons-short.mdc +40 -0
- package/templates/angular/.cursor/rules/modus-angular-icons.mdc +137 -0
- package/templates/angular/.cursor/rules/modus-angular-implementation-guides-short.mdc +36 -0
- package/templates/angular/.cursor/rules/modus-angular-implementation-guides.mdc +301 -0
- package/templates/angular/.cursor/rules/modus-angular-integration-short.mdc +60 -0
- package/templates/angular/.cursor/rules/modus-angular-integration.mdc +1096 -0
- package/templates/angular/.cursor/rules/modus-angular-master.mdc +164 -0
- package/templates/angular/.cursor/rules/modus-angular-modal-usage-short.mdc +51 -0
- package/templates/angular/.cursor/rules/modus-angular-modal-usage.mdc +115 -0
- package/templates/angular/.cursor/rules/modus-angular-navbar-usage-short.mdc +49 -0
- package/templates/angular/.cursor/rules/modus-angular-navbar-usage.mdc +146 -0
- package/templates/angular/.cursor/rules/modus-angular-no-emojis.mdc +66 -0
- package/templates/angular/.cursor/rules/modus-angular-opacity-utilities-short.mdc +43 -0
- package/templates/angular/.cursor/rules/modus-angular-opacity-utilities.mdc +160 -0
- package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu-short.mdc +51 -0
- package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu.mdc +83 -0
- package/templates/angular/.cursor/rules/modus-angular-semantic-html-short.mdc +36 -0
- package/templates/angular/.cursor/rules/modus-angular-semantic-html.mdc +81 -0
- package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage-short.mdc +50 -0
- package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage.mdc +136 -0
- package/templates/angular/.cursor/rules/modus-angular-table-usage-short.mdc +52 -0
- package/templates/angular/.cursor/rules/modus-angular-table-usage.mdc +151 -0
- package/templates/angular/.cursor/rules/modus-angular-tailwind-usage-short.mdc +44 -0
- package/templates/angular/.cursor/rules/modus-angular-tailwind-usage.mdc +242 -0
- package/templates/angular/.cursor/rules/modus-angular-themes-short.mdc +54 -0
- package/templates/angular/.cursor/rules/modus-angular-themes.mdc +222 -0
- package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage-short.mdc +52 -0
- package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage.mdc +130 -0
- package/templates/angular/.cursor/rules/ux/gestalt-laws-detailed.mdc +514 -0
- package/templates/angular/.cursor/rules/ux/ux-ui-foundations.mdc +235 -0
- package/templates/angular/.cursor/skills/run-lint-checks/SKILL.md +169 -0
- package/templates/angular/.editorconfig +17 -0
- package/templates/angular/.github/dependabot.yml +19 -0
- package/templates/angular/.github/workflows/a11y-check.yml +135 -0
- package/templates/angular/.github/workflows/ci.yml +44 -0
- package/templates/angular/.husky/pre-commit +32 -0
- package/templates/angular/.postcssrc.json +5 -0
- package/templates/angular/.vscode/extensions.json +4 -0
- package/templates/angular/.vscode/launch.json +20 -0
- package/templates/angular/.vscode/tasks.json +42 -0
- package/templates/angular/CLAUDE.md +148 -0
- package/templates/angular/README.md +92 -0
- package/templates/angular/amplify.yml +25 -0
- package/templates/angular/angular.json +106 -0
- package/templates/angular/data/modusIcons.ts +861 -0
- package/templates/angular/package-lock.json +11030 -0
- package/templates/angular/package.json +66 -0
- package/templates/angular/public/angular-icon.svg +12 -0
- package/templates/angular/public/favicon.ico +0 -0
- package/templates/angular/public/modus-icons.css +49 -0
- package/templates/angular/public/vite.svg +1 -0
- package/templates/angular/scripts/README.md +410 -0
- package/templates/angular/scripts/check-border-violations.js +352 -0
- package/templates/angular/scripts/check-icon-names.js +402 -0
- package/templates/angular/scripts/check-inline-styles.js +292 -0
- package/templates/angular/scripts/check-modus-colors.js +282 -0
- package/templates/angular/scripts/check-modus-icons.js +263 -0
- package/templates/angular/scripts/check-opacity-utilities.js +426 -0
- package/templates/angular/scripts/check-semantic-html.js +452 -0
- package/templates/angular/scripts/check-typescript.js +109 -0
- package/templates/angular/src/app/app.config.ts +29 -0
- package/templates/angular/src/app/app.css +0 -0
- package/templates/angular/src/app/app.html +4 -0
- package/templates/angular/src/app/app.routes.ts +351 -0
- package/templates/angular/src/app/app.spec.ts +27 -0
- package/templates/angular/src/app/app.ts +47 -0
- package/templates/angular/src/app/components/README.md +77 -0
- package/templates/angular/src/app/components/index.ts +53 -0
- package/templates/angular/src/app/components/modus-accordion.component.ts +50 -0
- package/templates/angular/src/app/components/modus-alert.component.ts +133 -0
- package/templates/angular/src/app/components/modus-autocomplete.component.ts +262 -0
- package/templates/angular/src/app/components/modus-avatar.component.ts +75 -0
- package/templates/angular/src/app/components/modus-badge.component.ts +84 -0
- package/templates/angular/src/app/components/modus-breadcrumbs.component.ts +65 -0
- package/templates/angular/src/app/components/modus-button-group.component.ts +82 -0
- package/templates/angular/src/app/components/modus-button.component.ts +292 -0
- package/templates/angular/src/app/components/modus-card.component.ts +73 -0
- package/templates/angular/src/app/components/modus-checkbox.component.ts +117 -0
- package/templates/angular/src/app/components/modus-chip.component.ts +97 -0
- package/templates/angular/src/app/components/modus-collapse.component.ts +118 -0
- package/templates/angular/src/app/components/modus-date.component.ts +165 -0
- package/templates/angular/src/app/components/modus-dropdown-menu.component.ts +108 -0
- package/templates/angular/src/app/components/modus-file-dropzone.component.ts +121 -0
- package/templates/angular/src/app/components/modus-handle.component.ts +96 -0
- package/templates/angular/src/app/components/modus-icon.component.ts +81 -0
- package/templates/angular/src/app/components/modus-input-feedback.component.ts +54 -0
- package/templates/angular/src/app/components/modus-input-label.component.ts +62 -0
- package/templates/angular/src/app/components/modus-loader.component.ts +48 -0
- package/templates/angular/src/app/components/modus-logo.component.ts +115 -0
- package/templates/angular/src/app/components/modus-menu-item.component.ts +116 -0
- package/templates/angular/src/app/components/modus-menu.component.ts +58 -0
- package/templates/angular/src/app/components/modus-modal.component.ts +70 -0
- package/templates/angular/src/app/components/modus-navbar.component.ts +303 -0
- package/templates/angular/src/app/components/modus-number-input.component.ts +174 -0
- package/templates/angular/src/app/components/modus-pagination.component.ts +74 -0
- package/templates/angular/src/app/components/modus-panel.component.ts +61 -0
- package/templates/angular/src/app/components/modus-progress.component.ts +62 -0
- package/templates/angular/src/app/components/modus-radio.component.ts +102 -0
- package/templates/angular/src/app/components/modus-rating.component.ts +80 -0
- package/templates/angular/src/app/components/modus-select.component.ts +131 -0
- package/templates/angular/src/app/components/modus-side-navigation.component.ts +90 -0
- package/templates/angular/src/app/components/modus-skeleton.component.ts +54 -0
- package/templates/angular/src/app/components/modus-slider.component.ts +132 -0
- package/templates/angular/src/app/components/modus-stepper.component.ts +65 -0
- package/templates/angular/src/app/components/modus-switch.component.ts +118 -0
- package/templates/angular/src/app/components/modus-table.component.ts +204 -0
- package/templates/angular/src/app/components/modus-tabs.component.ts +82 -0
- package/templates/angular/src/app/components/modus-text-input.component.ts +221 -0
- package/templates/angular/src/app/components/modus-textarea.component.ts +168 -0
- package/templates/angular/src/app/components/modus-theme-switcher.component.ts +45 -0
- package/templates/angular/src/app/components/modus-time-input.component.ts +172 -0
- package/templates/angular/src/app/components/modus-toast.component.ts +63 -0
- package/templates/angular/src/app/components/modus-toolbar.component.ts +43 -0
- package/templates/angular/src/app/components/modus-tooltip.component.ts +83 -0
- package/templates/angular/src/app/components/modus-typography.component.ts +79 -0
- package/templates/angular/src/app/components/modus-utility-panel.component.ts +275 -0
- package/templates/angular/src/app/components/theme-demo.component.ts +1242 -0
- package/templates/angular/src/app/data/component-demos.ts +360 -0
- package/templates/angular/src/app/data/modus-icons.ts +806 -0
- package/templates/angular/src/app/demos/accordion/accordion-demo.component.ts +212 -0
- package/templates/angular/src/app/demos/alert/alert-demo.component.ts +108 -0
- package/templates/angular/src/app/demos/autocomplete/autocomplete-demo.component.ts +174 -0
- package/templates/angular/src/app/demos/avatar/avatar-demo.component.ts +149 -0
- package/templates/angular/src/app/demos/badge/badge-demo.component.ts +148 -0
- package/templates/angular/src/app/demos/breadcrumbs/breadcrumbs-demo.component.ts +96 -0
- package/templates/angular/src/app/demos/button/button-demo.component.ts +256 -0
- package/templates/angular/src/app/demos/button-group/button-group-demo.component.ts +215 -0
- package/templates/angular/src/app/demos/card/card-demo.component.ts +180 -0
- package/templates/angular/src/app/demos/checkbox/checkbox-demo.component.ts +71 -0
- package/templates/angular/src/app/demos/chip/chip-demo.component.ts +183 -0
- package/templates/angular/src/app/demos/date/date-demo.component.ts +193 -0
- package/templates/angular/src/app/demos/dropdown/dropdown-demo.component.ts +196 -0
- package/templates/angular/src/app/demos/file-dropzone/file-dropzone-demo.component.ts +176 -0
- package/templates/angular/src/app/demos/handle/handle-demo.component.ts +265 -0
- package/templates/angular/src/app/demos/icon/icon-demo.component.ts +65 -0
- package/templates/angular/src/app/demos/input-feedback/input-feedback-demo.component.ts +189 -0
- package/templates/angular/src/app/demos/input-label/input-label-demo.component.ts +330 -0
- package/templates/angular/src/app/demos/loader/loader-demo.component.ts +143 -0
- package/templates/angular/src/app/demos/logo/logo-demo.component.ts +191 -0
- package/templates/angular/src/app/demos/menu/menu-demo.component.ts +72 -0
- package/templates/angular/src/app/demos/modal/modal-demo.component.ts +278 -0
- package/templates/angular/src/app/demos/navbar/navbar-demo.component.ts +135 -0
- package/templates/angular/src/app/demos/number-input/number-input-demo.component.ts +175 -0
- package/templates/angular/src/app/demos/pagination/pagination-demo.component.ts +134 -0
- package/templates/angular/src/app/demos/panel/panel-demo.component.ts +235 -0
- package/templates/angular/src/app/demos/progress/progress-demo.component.ts +169 -0
- package/templates/angular/src/app/demos/radio/radio-demo.component.ts +161 -0
- package/templates/angular/src/app/demos/rating/rating-demo.component.ts +97 -0
- package/templates/angular/src/app/demos/select/select-demo.component.ts +107 -0
- package/templates/angular/src/app/demos/shared/demo-example-clean.component.ts +41 -0
- package/templates/angular/src/app/demos/shared/demo-example.component.ts +42 -0
- package/templates/angular/src/app/demos/shared/demo-page.component.ts +97 -0
- package/templates/angular/src/app/demos/shared/index.ts +3 -0
- package/templates/angular/src/app/demos/side-navigation/side-navigation-demo.component.ts +524 -0
- package/templates/angular/src/app/demos/skeleton/skeleton-demo.component.ts +112 -0
- package/templates/angular/src/app/demos/slider/slider-demo.component.ts +76 -0
- package/templates/angular/src/app/demos/stepper/stepper-demo.component.ts +79 -0
- package/templates/angular/src/app/demos/switch/switch-demo.component.ts +113 -0
- package/templates/angular/src/app/demos/table/table-demo.component.ts +405 -0
- package/templates/angular/src/app/demos/tabs/tabs-demo.component.ts +318 -0
- package/templates/angular/src/app/demos/text-input/text-input-demo.component.ts +160 -0
- package/templates/angular/src/app/demos/textarea/textarea-demo.component.ts +95 -0
- package/templates/angular/src/app/demos/theme-switcher/theme-switcher-demo.component.ts +38 -0
- package/templates/angular/src/app/demos/time-input/time-input-demo.component.ts +130 -0
- package/templates/angular/src/app/demos/toast/toast-demo.component.ts +258 -0
- package/templates/angular/src/app/demos/toolbar/toolbar-demo.component.ts +54 -0
- package/templates/angular/src/app/demos/tooltip/tooltip-demo.component.ts +163 -0
- package/templates/angular/src/app/demos/utility-panel/utility-panel-demo.component.ts +197 -0
- package/templates/angular/src/app/dev/dev-config.ts +119 -0
- package/templates/angular/src/app/dev/dev-panel/dev-panel.component.ts +215 -0
- package/templates/angular/src/app/dev/dev-panel.service.ts +63 -0
- package/templates/angular/src/app/dev/index.ts +8 -0
- package/templates/angular/src/app/dev/theme-switcher-dropdown/theme-switcher-dropdown.component.ts +134 -0
- package/templates/angular/src/app/dev-pages/color-palette/color-palette.component.ts +229 -0
- package/templates/angular/src/app/dev-pages/components-gallery/components-gallery.component.ts +486 -0
- package/templates/angular/src/app/dev-pages/icons/icons.component.ts +149 -0
- package/templates/angular/src/app/pages/home/home.component.ts +251 -0
- package/templates/angular/src/app/services/README.md +57 -0
- package/templates/angular/src/app/services/theme.service.ts +163 -0
- package/templates/angular/src/environments/environment.development.ts +8 -0
- package/templates/angular/src/environments/environment.ts +8 -0
- package/templates/angular/src/index.html +14 -0
- package/templates/angular/src/main.ts +6 -0
- package/templates/angular/src/styles.css +1328 -0
- package/templates/angular/tsconfig.app.json +15 -0
- package/templates/angular/tsconfig.json +35 -0
- package/templates/angular/tsconfig.spec.json +14 -0
- package/templates/config.json +23 -0
- package/templates/react/.cursor/commands/remove-dev-content.md +311 -0
- package/templates/react/.cursor/mcp.json +13 -0
- package/templates/react/.cursor/rules/README.md +240 -0
- package/templates/react/.cursor/rules/border-usage-guidelines-short.mdc +22 -0
- package/templates/react/.cursor/rules/border-usage-guidelines.mdc +380 -0
- package/templates/react/.cursor/rules/chrome-devtools-testing-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/development-workflow-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/development-workflow-react.mdc +292 -0
- package/templates/react/.cursor/rules/implementation-guides-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/implementation-guides-react.mdc +446 -0
- package/templates/react/.cursor/rules/modus-accordion-state-management-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-accordion-state-management-react.mdc +445 -0
- package/templates/react/.cursor/rules/modus-button-group-usage-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-button-group-usage-react.mdc +117 -0
- package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react.mdc +492 -0
- package/templates/react/.cursor/rules/modus-color-usage-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-color-usage-react.mdc +420 -0
- package/templates/react/.cursor/rules/modus-components-reference.mdc +366 -0
- package/templates/react/.cursor/rules/modus-icon-names.mdc +63 -0
- package/templates/react/.cursor/rules/modus-icons-react-short.mdc +24 -0
- package/templates/react/.cursor/rules/modus-icons-react.mdc +402 -0
- package/templates/react/.cursor/rules/modus-modal-implementation-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-modal-implementation-react.mdc +831 -0
- package/templates/react/.cursor/rules/modus-navbar-side-navigation-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-navbar-side-navigation-react.mdc +247 -0
- package/templates/react/.cursor/rules/modus-no-emojis-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-opacity-utilities-react-short.mdc +70 -0
- package/templates/react/.cursor/rules/modus-opacity-utilities-react.mdc +208 -0
- package/templates/react/.cursor/rules/modus-react-best-practices-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-react-best-practices.mdc +508 -0
- package/templates/react/.cursor/rules/modus-react-essentials.mdc +209 -0
- package/templates/react/.cursor/rules/modus-react-integration-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-react-integration.mdc +509 -0
- package/templates/react/.cursor/rules/modus-react-key-warnings-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-react-key-warnings.mdc +805 -0
- package/templates/react/.cursor/rules/modus-react-master.mdc +160 -0
- package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react.mdc +442 -0
- package/templates/react/.cursor/rules/modus-semantic-html-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-semantic-html-react.mdc +427 -0
- package/templates/react/.cursor/rules/modus-tailwind-usage-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-tailwind-usage-react.mdc +642 -0
- package/templates/react/.cursor/rules/modus-themes-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-themes-react.mdc +506 -0
- package/templates/react/.cursor/rules/ux/gestalt-laws-detailed.mdc +456 -0
- package/templates/react/.cursor/rules/ux/ux-ui-foundations.mdc +211 -0
- package/templates/react/.cursor/skills/create-modus-form-component/SKILL.md +518 -0
- package/templates/react/.cursor/skills/create-modus-wrapper-component/SKILL.md +252 -0
- package/templates/react/.cursor/skills/fix-modus-component-event-issues/SKILL.md +345 -0
- package/templates/react/.cursor/skills/handle-modus-checkbox-value-bug/SKILL.md +202 -0
- package/templates/react/.cursor/skills/implement-modus-modal-with-refs/SKILL.md +386 -0
- package/templates/react/.cursor/skills/integrate-modus-icons/SKILL.md +300 -0
- package/templates/react/.cursor/skills/run-lint-checks/SKILL.md +235 -0
- package/templates/react/.cursor/skills/set-up-modus-event-listeners/SKILL.md +284 -0
- package/templates/react/.cursor/skills/style-modus-components-with-tailwind/SKILL.md +382 -0
- package/templates/react/.env.development +3 -0
- package/templates/react/.env.production +3 -0
- package/templates/react/.github/CODEOWNERS +28 -0
- package/templates/react/.github/ISSUE_TEMPLATE/bug_report.yml +176 -0
- package/templates/react/.github/ISSUE_TEMPLATE/config.yml +20 -0
- package/templates/react/.github/ISSUE_TEMPLATE/documentation.yml +115 -0
- package/templates/react/.github/ISSUE_TEMPLATE/feature_request.yml +171 -0
- package/templates/react/.github/ISSUE_TEMPLATE/question.yml +139 -0
- package/templates/react/.github/copilot-instructions.md +80 -0
- package/templates/react/.github/instructions/components.instructions.md +82 -0
- package/templates/react/.github/instructions/demos.instructions.md +82 -0
- package/templates/react/.github/instructions/pages.instructions.md +76 -0
- package/templates/react/.github/instructions/styles.instructions.md +77 -0
- package/templates/react/.github/instructions/typescript.instructions.md +101 -0
- package/templates/react/.github/pull_request_template.md +188 -0
- package/templates/react/.github/workflows/ci.yml +43 -0
- package/templates/react/.github/workflows/claude-code-review.yml +44 -0
- package/templates/react/.github/workflows/claude.yml +50 -0
- package/templates/react/.husky/pre-commit +28 -0
- package/templates/react/.vscode/extensions.json +8 -0
- package/templates/react/CLAUDE.md +119 -0
- package/templates/react/CODE_OF_CONDUCT.md +79 -0
- package/templates/react/CONTRIBUTING.md +65 -0
- package/templates/react/LICENSE +21 -0
- package/templates/react/README.md +728 -0
- package/templates/react/SECURITY.md +50 -0
- package/templates/react/eslint.config.js +23 -0
- package/templates/react/index.html +13 -0
- package/templates/react/package-lock.json +5209 -0
- package/templates/react/package.json +49 -0
- package/templates/react/postcss.config.js +6 -0
- package/templates/react/public/react.svg +1 -0
- package/templates/react/public/vite.svg +1 -0
- package/templates/react/readme_assets/getting_started_header.png +0 -0
- package/templates/react/readme_assets/hero.png +0 -0
- package/templates/react/readme_assets/modus_comp.png +0 -0
- package/templates/react/readme_assets/modus_figma_mcp.png +0 -0
- package/templates/react/readme_assets/teaser_comp.gif +0 -0
- package/templates/react/scripts/README.md +343 -0
- package/templates/react/scripts/check-border-violations.js +483 -0
- package/templates/react/scripts/check-icon-names.js +486 -0
- package/templates/react/scripts/check-inline-styles.js +364 -0
- package/templates/react/scripts/check-modus-colors.js +247 -0
- package/templates/react/scripts/check-modus-icons.js +256 -0
- package/templates/react/scripts/check-opacity-utilities.js +481 -0
- package/templates/react/scripts/check-semantic-html.js +476 -0
- package/templates/react/scripts/check-typescript.js +109 -0
- package/templates/react/src/App.css +42 -0
- package/templates/react/src/App.tsx +54 -0
- package/templates/react/src/assets/react.svg +1 -0
- package/templates/react/src/components/DemoExample.tsx +61 -0
- package/templates/react/src/components/DemoPage.tsx +81 -0
- package/templates/react/src/components/ModusAccordion.tsx +89 -0
- package/templates/react/src/components/ModusAlert.tsx +85 -0
- package/templates/react/src/components/ModusAutocomplete.tsx +207 -0
- package/templates/react/src/components/ModusAvatar.tsx +50 -0
- package/templates/react/src/components/ModusBadge.tsx +82 -0
- package/templates/react/src/components/ModusBreadcrumbs.tsx +75 -0
- package/templates/react/src/components/ModusButton.tsx +244 -0
- package/templates/react/src/components/ModusButtonGroup.tsx +91 -0
- package/templates/react/src/components/ModusCard.tsx +70 -0
- package/templates/react/src/components/ModusCheckbox.tsx +168 -0
- package/templates/react/src/components/ModusChip.tsx +93 -0
- package/templates/react/src/components/ModusDate.tsx +154 -0
- package/templates/react/src/components/ModusDropdownMenu.tsx +148 -0
- package/templates/react/src/components/ModusFileDropzone.tsx +140 -0
- package/templates/react/src/components/ModusHandle.tsx +101 -0
- package/templates/react/src/components/ModusIcon.tsx +49 -0
- package/templates/react/src/components/ModusInputFeedback.tsx +52 -0
- package/templates/react/src/components/ModusInputLabel.tsx +50 -0
- package/templates/react/src/components/ModusLoader.tsx +42 -0
- package/templates/react/src/components/ModusLogo.tsx +102 -0
- package/templates/react/src/components/ModusMenu.tsx +119 -0
- package/templates/react/src/components/ModusMenuItem.tsx +86 -0
- package/templates/react/src/components/ModusModal.tsx +145 -0
- package/templates/react/src/components/ModusNavbar.tsx +504 -0
- package/templates/react/src/components/ModusNumberInput.tsx +230 -0
- package/templates/react/src/components/ModusPagination.tsx +94 -0
- package/templates/react/src/components/ModusPanel.tsx +92 -0
- package/templates/react/src/components/ModusProgress.tsx +70 -0
- package/templates/react/src/components/ModusProvider.tsx +18 -0
- package/templates/react/src/components/ModusRadio.tsx +114 -0
- package/templates/react/src/components/ModusRating.tsx +108 -0
- package/templates/react/src/components/ModusSelect.tsx +171 -0
- package/templates/react/src/components/ModusSideNavigation.tsx +149 -0
- package/templates/react/src/components/ModusSkeleton.tsx +42 -0
- package/templates/react/src/components/ModusSlider.tsx +128 -0
- package/templates/react/src/components/ModusStepper.tsx +85 -0
- package/templates/react/src/components/ModusSwitch.tsx +130 -0
- package/templates/react/src/components/ModusTable.tsx +309 -0
- package/templates/react/src/components/ModusTabs.tsx +114 -0
- package/templates/react/src/components/ModusTextInput.tsx +179 -0
- package/templates/react/src/components/ModusTextarea.tsx +164 -0
- package/templates/react/src/components/ModusThemeSwitcher.tsx +58 -0
- package/templates/react/src/components/ModusTimeInput.tsx +176 -0
- package/templates/react/src/components/ModusToast.tsx +207 -0
- package/templates/react/src/components/ModusToolbar.tsx +70 -0
- package/templates/react/src/components/ModusTooltip.tsx +97 -0
- package/templates/react/src/components/ModusUtilityPanel.tsx +198 -0
- package/templates/react/src/components/ThemeSwitcherDropdown.tsx +117 -0
- package/templates/react/src/components/ThemeToggleSimple.tsx +157 -0
- package/templates/react/src/config/routes.ts +196 -0
- package/templates/react/src/contexts/ThemeContext.tsx +81 -0
- package/templates/react/src/contexts/ThemeContextData.tsx +89 -0
- package/templates/react/src/data/modusIcons.ts +865 -0
- package/templates/react/src/demos/accordion-demo/page.tsx +236 -0
- package/templates/react/src/demos/alert-demo/page.tsx +94 -0
- package/templates/react/src/demos/autocomplete-demo/page.tsx +166 -0
- package/templates/react/src/demos/avatar-demo/page.tsx +135 -0
- package/templates/react/src/demos/badge-demo/page.tsx +174 -0
- package/templates/react/src/demos/breadcrumbs-demo/page.tsx +88 -0
- package/templates/react/src/demos/button-demo/page.tsx +261 -0
- package/templates/react/src/demos/button-group-demo/page.tsx +231 -0
- package/templates/react/src/demos/card-demo/page.tsx +241 -0
- package/templates/react/src/demos/checkbox-demo/page.tsx +79 -0
- package/templates/react/src/demos/chip-demo/page.tsx +197 -0
- package/templates/react/src/demos/date-demo/page.tsx +179 -0
- package/templates/react/src/demos/dropdown-demo/page.tsx +150 -0
- package/templates/react/src/demos/file-dropzone-demo/page.tsx +186 -0
- package/templates/react/src/demos/handle-demo/page.tsx +313 -0
- package/templates/react/src/demos/icon-demo/page.tsx +72 -0
- package/templates/react/src/demos/input-feedback-demo/page.tsx +202 -0
- package/templates/react/src/demos/input-label-demo/page.tsx +392 -0
- package/templates/react/src/demos/loader-demo/page.tsx +138 -0
- package/templates/react/src/demos/logo-demo/page.tsx +292 -0
- package/templates/react/src/demos/menu-demo/page.tsx +70 -0
- package/templates/react/src/demos/modal-demo/page.tsx +332 -0
- package/templates/react/src/demos/navbar-demo/page.tsx +141 -0
- package/templates/react/src/demos/number-input-demo/page.tsx +180 -0
- package/templates/react/src/demos/pagination-demo/page.tsx +147 -0
- package/templates/react/src/demos/panel-demo/page.tsx +376 -0
- package/templates/react/src/demos/progress-demo/page.tsx +185 -0
- package/templates/react/src/demos/radio-demo/page.tsx +242 -0
- package/templates/react/src/demos/rating-demo/page.tsx +97 -0
- package/templates/react/src/demos/select-demo/page.tsx +111 -0
- package/templates/react/src/demos/side-navigation-demo/page.tsx +775 -0
- package/templates/react/src/demos/skeleton-demo/page.tsx +107 -0
- package/templates/react/src/demos/slider-demo/page.tsx +78 -0
- package/templates/react/src/demos/stepper-demo/page.tsx +86 -0
- package/templates/react/src/demos/switch-demo/page.tsx +146 -0
- package/templates/react/src/demos/table-demo/page.tsx +489 -0
- package/templates/react/src/demos/tabs-demo/page.tsx +187 -0
- package/templates/react/src/demos/text-input-demo/page.tsx +151 -0
- package/templates/react/src/demos/textarea-demo/page.tsx +73 -0
- package/templates/react/src/demos/theme-switcher-demo/page.tsx +26 -0
- package/templates/react/src/demos/time-input-demo/page.tsx +148 -0
- package/templates/react/src/demos/toast-demo/page.tsx +302 -0
- package/templates/react/src/demos/toolbar-demo/page.tsx +49 -0
- package/templates/react/src/demos/tooltip-demo/page.tsx +209 -0
- package/templates/react/src/demos/typography-test/page.tsx +28 -0
- package/templates/react/src/demos/utility-panel-demo/page.tsx +197 -0
- package/templates/react/src/dev/DevPanel.tsx +219 -0
- package/templates/react/src/dev/DevPanelContext.ts +14 -0
- package/templates/react/src/dev/DevPanelProvider.tsx +63 -0
- package/templates/react/src/dev/DevRoutes.tsx +98 -0
- package/templates/react/src/dev/config.ts +127 -0
- package/templates/react/src/dev/index.ts +8 -0
- package/templates/react/src/dev/useDevPanel.ts +17 -0
- package/templates/react/src/dev-pages/ColorPalettePage.tsx +347 -0
- package/templates/react/src/dev-pages/ComponentsGalleryPage.tsx +489 -0
- package/templates/react/src/dev-pages/IconsPage.tsx +137 -0
- package/templates/react/src/dev-pages/index.ts +3 -0
- package/templates/react/src/hooks/useTheme.ts +15 -0
- package/templates/react/src/index.css +635 -0
- package/templates/react/src/main.tsx +14 -0
- package/templates/react/src/pages/HomePage.tsx +283 -0
- package/templates/react/src/vite-env.d.ts +9 -0
- package/templates/react/tailwind.config.js +58 -0
- package/templates/react/tsconfig.app.json +27 -0
- package/templates/react/tsconfig.json +7 -0
- package/templates/react/tsconfig.node.json +25 -0
- package/templates/react/vite.config.ts +18 -0
package/src/utils/git.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { dirname } from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
3
|
+
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Copy bundled template to target directory
|
|
9
|
+
* @param {string} templateName - Name of the template (react, angular)
|
|
10
|
+
* @param {string} targetPath - Target directory path
|
|
11
|
+
* @returns {Promise<boolean>}
|
|
12
|
+
*/
|
|
13
|
+
export async function copyTemplate(templateName, targetPath) {
|
|
14
|
+
const fs = await import("fs/promises");
|
|
15
|
+
const path = await import("path");
|
|
16
|
+
|
|
17
|
+
const bundledPath = path.join(
|
|
18
|
+
__dirname,
|
|
19
|
+
"..",
|
|
20
|
+
"..",
|
|
21
|
+
"templates",
|
|
22
|
+
templateName,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
await fs.access(bundledPath);
|
|
27
|
+
} catch {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Template "${templateName}" not found.\n` +
|
|
30
|
+
`Expected at: ${bundledPath}\n\n` +
|
|
31
|
+
`This is a bug in create-trimble-app. Please report it at:\n` +
|
|
32
|
+
`https://github.com/julianoczkowski/create-trimble-app/issues`,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
await copyDirectory(bundledPath, targetPath);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Copy directory recursively
|
|
42
|
+
* @param {string} src - Source directory
|
|
43
|
+
* @param {string} dest - Destination directory
|
|
44
|
+
*/
|
|
45
|
+
async function copyDirectory(src, dest) {
|
|
46
|
+
const fs = await import("fs/promises");
|
|
47
|
+
const path = await import("path");
|
|
48
|
+
|
|
49
|
+
await fs.mkdir(dest, { recursive: true });
|
|
50
|
+
|
|
51
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
52
|
+
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
const srcPath = path.join(src, entry.name);
|
|
55
|
+
const destPath = path.join(dest, entry.name);
|
|
56
|
+
|
|
57
|
+
if (entry.isDirectory()) {
|
|
58
|
+
await copyDirectory(srcPath, destPath);
|
|
59
|
+
} else {
|
|
60
|
+
await fs.copyFile(srcPath, destPath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Check if a template exists
|
|
67
|
+
* @param {string} templateName - Name of the template
|
|
68
|
+
* @returns {Promise<boolean>}
|
|
69
|
+
*/
|
|
70
|
+
export async function hasTemplate(templateName) {
|
|
71
|
+
const fs = await import("fs/promises");
|
|
72
|
+
const path = await import("path");
|
|
73
|
+
|
|
74
|
+
const bundledPath = path.join(
|
|
75
|
+
__dirname,
|
|
76
|
+
"..",
|
|
77
|
+
"..",
|
|
78
|
+
"templates",
|
|
79
|
+
templateName,
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
await fs.access(bundledPath);
|
|
84
|
+
return true;
|
|
85
|
+
} catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get detailed error message based on error type
|
|
92
|
+
* @param {Error} error - Original error
|
|
93
|
+
* @returns {string}
|
|
94
|
+
*/
|
|
95
|
+
export function getDetailedErrorMessage(error) {
|
|
96
|
+
const message = error.message || "";
|
|
97
|
+
|
|
98
|
+
if (message.includes("ENOENT") || message.includes("no such file")) {
|
|
99
|
+
return (
|
|
100
|
+
`Failed to create project directory.\n\n` +
|
|
101
|
+
`Possible causes:\n` +
|
|
102
|
+
` • Invalid project name\n` +
|
|
103
|
+
` • Permission denied\n` +
|
|
104
|
+
` • Disk full\n\n` +
|
|
105
|
+
`Try a different project name or check disk permissions.`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (message.includes("EACCES") || message.includes("permission denied")) {
|
|
110
|
+
return (
|
|
111
|
+
`Permission denied when creating project.\n\n` +
|
|
112
|
+
`Try:\n` +
|
|
113
|
+
` • Running from a directory you have write access to\n` +
|
|
114
|
+
` • Checking folder permissions`
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (message.includes("ENOSPC")) {
|
|
119
|
+
return (
|
|
120
|
+
`Not enough disk space to create project.\n\n` +
|
|
121
|
+
`Free up some disk space and try again.`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (message.includes("EEXIST")) {
|
|
126
|
+
return (
|
|
127
|
+
`Directory already exists.\n\n` +
|
|
128
|
+
`Try:\n` +
|
|
129
|
+
` • Using a different project name\n` +
|
|
130
|
+
` • Using --current-folder to install in the current directory`
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Default error message
|
|
135
|
+
return (
|
|
136
|
+
`Failed to create project: ${message}\n\n` +
|
|
137
|
+
`If this problem persists, please report it at:\n` +
|
|
138
|
+
`https://github.com/julianoczkowski/create-trimble-app/issues`
|
|
139
|
+
);
|
|
140
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
|
|
5
|
+
export async function installDependencies(projectPath) {
|
|
6
|
+
const cwd = join(process.cwd(), projectPath);
|
|
7
|
+
|
|
8
|
+
// Detect package manager (or default to npm)
|
|
9
|
+
const packageManager = detectPackageManager(cwd);
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
await execa(packageManager, ["install"], {
|
|
13
|
+
cwd,
|
|
14
|
+
stdio: "inherit",
|
|
15
|
+
});
|
|
16
|
+
} catch (error) {
|
|
17
|
+
throw new Error(`Failed to install dependencies: ${error.message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function detectPackageManager(projectPath) {
|
|
22
|
+
if (existsSync(join(projectPath, "yarn.lock"))) return "yarn";
|
|
23
|
+
if (existsSync(join(projectPath, "pnpm-lock.yaml"))) return "pnpm";
|
|
24
|
+
return "npm";
|
|
25
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
|
|
3
|
+
// Helper function to create clickable terminal links
|
|
4
|
+
function createClickableLink(url, text) {
|
|
5
|
+
// OSC 8 hyperlink format: \u001b]8;;URL\u0007TEXT\u001b]8;;\u0007
|
|
6
|
+
return `\u001b]8;;${url}\u0007${chalk.blue(text)}\u001b]8;;\u0007`;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const logger = {
|
|
10
|
+
info: (message) => console.log(chalk.blue("ℹ"), message),
|
|
11
|
+
success: (message) => console.log(chalk.green("✓"), message),
|
|
12
|
+
warning: (message) => console.log(chalk.yellow("⚠"), message),
|
|
13
|
+
error: (message) => console.log(chalk.red("✗"), message),
|
|
14
|
+
|
|
15
|
+
// Styled messages
|
|
16
|
+
title: (message) => console.log(chalk.cyan.bold(message)),
|
|
17
|
+
subtitle: (message) => console.log(chalk.gray(message)),
|
|
18
|
+
highlight: (message) => console.log(chalk.magenta(message)),
|
|
19
|
+
|
|
20
|
+
// Security notice
|
|
21
|
+
securityNotice: () => {
|
|
22
|
+
console.log(
|
|
23
|
+
chalk.cyan(`
|
|
24
|
+
╔════════════════════════════════════════════════════════════╗
|
|
25
|
+
║ CREATE TRIMBLE APP - INFORMATION ║
|
|
26
|
+
╠════════════════════════════════════════════════════════════╣
|
|
27
|
+
║ ║
|
|
28
|
+
║ Templates are bundled directly in this npm package. ║
|
|
29
|
+
║ No external downloads required - works fully offline. ║
|
|
30
|
+
║ ║
|
|
31
|
+
║ Available Templates: ║
|
|
32
|
+
║ • React - React + Vite + Modus 2.0 Components ║
|
|
33
|
+
║ • Angular - Angular + Modus 2.0 Web Components ║
|
|
34
|
+
║ ║
|
|
35
|
+
║ Security: ║
|
|
36
|
+
║ • No runtime network dependencies ║
|
|
37
|
+
║ • Templates verified at publish time ║
|
|
38
|
+
║ • Published with npm provenance ║
|
|
39
|
+
║ ║
|
|
40
|
+
║ Source repositories: ║
|
|
41
|
+
║ • github.com/julianoczkowski/react-app ║
|
|
42
|
+
║ • github.com/julianoczkowski/angular-app ║
|
|
43
|
+
║ ║
|
|
44
|
+
║ Report issues: ║
|
|
45
|
+
║ https://github.com/julianoczkowski/create-trimble-app ║
|
|
46
|
+
║ ║
|
|
47
|
+
╚════════════════════════════════════════════════════════════╝
|
|
48
|
+
`),
|
|
49
|
+
);
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
// Special formatting
|
|
53
|
+
welcome: () => {
|
|
54
|
+
console.log(
|
|
55
|
+
chalk.cyan(`
|
|
56
|
+
+ ════════════════════════════════════════════════════════════╗
|
|
57
|
+
║ ║
|
|
58
|
+
║ ████████╗██████╗ ██╗███╗ ███╗██████╗ ██╗ ███████╗ ║
|
|
59
|
+
║ ╚══██╔══╝██╔══██╗██║████╗ ████║██╔══██╗██║ ██╔════╝ ║
|
|
60
|
+
║ ██║ ██████╔╝██║██╔████╔██║██████╔╝██║ █████╗ ║
|
|
61
|
+
║ ██║ ██╔══██╗██║██║╚██╔╝██║██╔══██╗██║ ██╔══╝ ║
|
|
62
|
+
║ ██║ ██║ ██║██║██║ ╚═╝ ██║██████╔╝███████╗███████╗ ║
|
|
63
|
+
║ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝╚═════╝ ╚══════╝╚══════╝ ║
|
|
64
|
+
║ ║
|
|
65
|
+
║ Create Your Trimble Application v1.0.0 ║
|
|
66
|
+
║ Modus 2 Web Components ║
|
|
67
|
+
║ Icons + Theming + MCP + Rules + Skills ║
|
|
68
|
+
║ ║
|
|
69
|
+
║ by Julian Oczkowski ║
|
|
70
|
+
║ ║
|
|
71
|
+
╚════════════════════════════════════════════════════════════ +
|
|
72
|
+
`),
|
|
73
|
+
);
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
nextSteps: (
|
|
77
|
+
projectName,
|
|
78
|
+
framework,
|
|
79
|
+
shouldInstall,
|
|
80
|
+
isCurrentFolder = false,
|
|
81
|
+
) => {
|
|
82
|
+
const projectPath = isCurrentFolder ? "current directory" : projectName;
|
|
83
|
+
const openCommand = isCurrentFolder
|
|
84
|
+
? "open current directory in your code editor"
|
|
85
|
+
: `open: '${projectName}' in your code editor`;
|
|
86
|
+
|
|
87
|
+
console.log(
|
|
88
|
+
chalk.green(`
|
|
89
|
+
🎉 Success! Your ${framework} project is ready!
|
|
90
|
+
|
|
91
|
+
📁 Project created at: ${chalk.cyan(projectPath)}
|
|
92
|
+
|
|
93
|
+
${chalk.gray("═".repeat(60))}
|
|
94
|
+
${chalk.gray("Next steps:")}
|
|
95
|
+
${chalk.cyan(openCommand)}
|
|
96
|
+
${!shouldInstall ? chalk.cyan(`run: npm install`) + "\n" : ""}${chalk.cyan(
|
|
97
|
+
`run: ${framework === "Angular" ? "npm run start" : "npm run dev"}`,
|
|
98
|
+
)}
|
|
99
|
+
|
|
100
|
+
${chalk.gray("═".repeat(60))}
|
|
101
|
+
${chalk.gray("How to use this project:")} ${createClickableLink(
|
|
102
|
+
"https://youtube.com",
|
|
103
|
+
"Watch Tutorial on YouTube",
|
|
104
|
+
)}
|
|
105
|
+
${chalk.gray("═".repeat(60))}
|
|
106
|
+
${chalk.gray("Additional Links:")}
|
|
107
|
+
${chalk.gray("Modus 2.0 Storybook:")} ${createClickableLink(
|
|
108
|
+
"https://trimble-oss.github.io/modus-wc-2.0/main/?path=/docs/documentation-getting-started--docs",
|
|
109
|
+
"Modus 2.0 Storybook",
|
|
110
|
+
)}
|
|
111
|
+
${chalk.gray("Modus Icons:")} ${createClickableLink(
|
|
112
|
+
"https://modus-icons.trimble.com/",
|
|
113
|
+
"Modus Icons",
|
|
114
|
+
)}
|
|
115
|
+
${chalk.gray("Figma Modus MCP:")} ${createClickableLink(
|
|
116
|
+
"https://trimble-oss.github.io/modus-wc-2.0/main/?path=/docs/documentation-modus-figma-mcp-integration-guide--docs",
|
|
117
|
+
"Figma Modus MCP",
|
|
118
|
+
)}
|
|
119
|
+
${chalk.gray("═".repeat(60))}
|
|
120
|
+
|
|
121
|
+
`),
|
|
122
|
+
);
|
|
123
|
+
},
|
|
124
|
+
};
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
# Remove Dev Content
|
|
2
|
+
|
|
3
|
+
Remove all development and exploration content from this Modus Angular app, preparing it for production use while keeping all core Modus wrapper components intact.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This command removes:
|
|
8
|
+
- Dev Panel (floating development panel with toggle button)
|
|
9
|
+
- All 44 component demo pages
|
|
10
|
+
- Reference pages (colors, icons, components gallery)
|
|
11
|
+
- Dev-only helper components and data files
|
|
12
|
+
- Icon reference data (`data/modusIcons.ts` and `src/app/data/`)
|
|
13
|
+
|
|
14
|
+
And updates:
|
|
15
|
+
- Icon names validation script to handle missing icon reference file gracefully
|
|
16
|
+
|
|
17
|
+
While preserving:
|
|
18
|
+
- All 48 Modus wrapper components
|
|
19
|
+
- Theme system (ThemeService)
|
|
20
|
+
- Core infrastructure (main.ts, styles.css, app.config.ts)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Step 1: Delete Entire Directories
|
|
25
|
+
|
|
26
|
+
Remove these directories completely:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
src/app/demos/ # 44 component demo pages + shared/
|
|
30
|
+
src/app/dev/ # Dev panel infrastructure (service, component, config)
|
|
31
|
+
src/app/dev-pages/ # Colors, Icons, Components gallery pages
|
|
32
|
+
src/app/data/ # component-demos.ts, modus-icons.ts (dev-only data)
|
|
33
|
+
data/ # modusIcons.ts (root level, used by dev IconsPage)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Step 2: Delete Dev-Only Files from src/app/components/
|
|
39
|
+
|
|
40
|
+
Remove this file from `src/app/components/`:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
src/app/components/theme-demo.component.ts
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Keep all other files - the 48 modus-*.component.ts wrappers, index.ts, and README.md.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Step 3: Update src/app/app.ts
|
|
51
|
+
|
|
52
|
+
Remove all dev panel imports and usage. The file should become:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import { Component, OnInit, inject } from '@angular/core';
|
|
56
|
+
import { RouterOutlet } from '@angular/router';
|
|
57
|
+
import { ThemeService } from './services/theme.service';
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Main Application Component.
|
|
61
|
+
*
|
|
62
|
+
* Structure:
|
|
63
|
+
* - Router outlet for application pages
|
|
64
|
+
*
|
|
65
|
+
* Getting Started:
|
|
66
|
+
* 1. Edit src/app/pages/home/home.component.ts for your landing page
|
|
67
|
+
* 2. Add new pages in src/app/pages/
|
|
68
|
+
* 3. Add routes in src/app/app.routes.ts
|
|
69
|
+
*/
|
|
70
|
+
@Component({
|
|
71
|
+
selector: 'app-root',
|
|
72
|
+
imports: [RouterOutlet],
|
|
73
|
+
template: `<router-outlet />`,
|
|
74
|
+
host: {
|
|
75
|
+
class: 'min-h-screen flex flex-col',
|
|
76
|
+
},
|
|
77
|
+
})
|
|
78
|
+
export class App implements OnInit {
|
|
79
|
+
private readonly themeService = inject(ThemeService);
|
|
80
|
+
|
|
81
|
+
ngOnInit(): void {
|
|
82
|
+
// Initialize theme service - loads theme from localStorage
|
|
83
|
+
this.themeService.getThemeConfig();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**What was removed:**
|
|
89
|
+
- Import: `import { DevPanelService, DevPanelComponent } from './dev';`
|
|
90
|
+
- Component import: `DevPanelComponent` from imports array
|
|
91
|
+
- Property: `readonly devPanelService = inject(DevPanelService);`
|
|
92
|
+
- Template: `@if (devPanelService.isEnabled()) { <app-dev-panel /> }`
|
|
93
|
+
- Comments referencing Dev Panel
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Step 4: Update src/app/app.routes.ts
|
|
98
|
+
|
|
99
|
+
Remove all dev routes and the conditional spread logic:
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { Routes } from '@angular/router';
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Application routes.
|
|
106
|
+
*
|
|
107
|
+
* Getting Started:
|
|
108
|
+
* 1. Add your application routes below the home route
|
|
109
|
+
* 2. Use lazy loading with loadComponent for optimal performance
|
|
110
|
+
*/
|
|
111
|
+
export const routes: Routes = [
|
|
112
|
+
// User routes - add your application routes here
|
|
113
|
+
{
|
|
114
|
+
path: '',
|
|
115
|
+
loadComponent: () =>
|
|
116
|
+
import('./pages/home/home.component').then((m) => m.HomeComponent),
|
|
117
|
+
title: 'Home',
|
|
118
|
+
},
|
|
119
|
+
// Example: Add more routes here
|
|
120
|
+
// {
|
|
121
|
+
// path: 'about',
|
|
122
|
+
// loadComponent: () =>
|
|
123
|
+
// import('./pages/about/about.component').then((m) => m.AboutComponent),
|
|
124
|
+
// title: 'About',
|
|
125
|
+
// },
|
|
126
|
+
];
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**What was removed:**
|
|
130
|
+
- Import: `import { environment } from '../environments/environment.development';`
|
|
131
|
+
- The entire conditional spread: `...(environment.devPanel ? [...] : [])`
|
|
132
|
+
- All dev route definitions (colors, icons, components, demos/*)
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Step 5: Update src/app/pages/home/home.component.ts
|
|
137
|
+
|
|
138
|
+
Remove all Dev Panel references from the HomePage. Specifically remove:
|
|
139
|
+
|
|
140
|
+
1. The "Open Dev Panel" button (the modus-button that dispatches a keyboard event)
|
|
141
|
+
2. The `openDevPanel()` method
|
|
142
|
+
3. The "Use the Dev Panel" getting started item mentioning Ctrl+Shift+D
|
|
143
|
+
4. The `ModusButtonComponent` import (if no longer needed)
|
|
144
|
+
5. The `CommonModule` import (if no longer needed)
|
|
145
|
+
|
|
146
|
+
Keep the overall page structure as a starting template for the user's app.
|
|
147
|
+
|
|
148
|
+
**Example of cleaned HomePage structure:**
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Home page component.
|
|
155
|
+
*
|
|
156
|
+
* This is the main landing page for the user's application.
|
|
157
|
+
* Edit this component to create your own home page.
|
|
158
|
+
*
|
|
159
|
+
* Getting Started:
|
|
160
|
+
* 1. Customize the hero section with your app's branding
|
|
161
|
+
* 2. Add your own features and content
|
|
162
|
+
*/
|
|
163
|
+
@Component({
|
|
164
|
+
selector: 'app-home',
|
|
165
|
+
standalone: true,
|
|
166
|
+
imports: [],
|
|
167
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
168
|
+
template: `
|
|
169
|
+
<div class="min-h-screen flex flex-col bg-background">
|
|
170
|
+
<div class="flex-1 flex flex-col items-center p-8">
|
|
171
|
+
<div class="max-w-4xl w-full space-y-8">
|
|
172
|
+
<!-- Header -->
|
|
173
|
+
<div class="text-center space-y-4">
|
|
174
|
+
<div class="flex items-center justify-center gap-3">
|
|
175
|
+
<i class="modus-icons text-5xl text-primary">launch</i>
|
|
176
|
+
</div>
|
|
177
|
+
<div class="text-4xl font-bold text-foreground">Modus Angular App</div>
|
|
178
|
+
<div class="text-xl text-foreground-60">
|
|
179
|
+
A production-ready Angular boilerplate with Modus Design System integration.
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
<!-- Getting Started - without Dev Panel references -->
|
|
184
|
+
<div class="bg-card border-default rounded-lg p-6 space-y-4">
|
|
185
|
+
<div class="text-lg font-semibold text-foreground">Getting Started</div>
|
|
186
|
+
<div class="space-y-4 text-foreground-80">
|
|
187
|
+
<div class="flex gap-3">
|
|
188
|
+
<div
|
|
189
|
+
class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
|
|
190
|
+
>
|
|
191
|
+
1
|
|
192
|
+
</div>
|
|
193
|
+
<div>
|
|
194
|
+
<div class="font-medium text-foreground">Build Your App</div>
|
|
195
|
+
<div class="text-sm text-foreground-60">
|
|
196
|
+
Start developing in
|
|
197
|
+
<code class="px-1 py-0.5 bg-muted rounded text-sm">src/app/pages/</code>
|
|
198
|
+
- add your routes in
|
|
199
|
+
<code class="px-1 py-0.5 bg-muted rounded text-sm">app.routes.ts</code>.
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
<div class="flex gap-3">
|
|
204
|
+
<div
|
|
205
|
+
class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
|
|
206
|
+
>
|
|
207
|
+
2
|
|
208
|
+
</div>
|
|
209
|
+
<div>
|
|
210
|
+
<div class="font-medium text-foreground">Use Modus Components</div>
|
|
211
|
+
<div class="text-sm text-foreground-60">
|
|
212
|
+
Import components from
|
|
213
|
+
<code class="px-1 py-0.5 bg-muted rounded text-sm">src/app/components/</code>
|
|
214
|
+
to build your UI.
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
</div>
|
|
218
|
+
<div class="flex gap-3">
|
|
219
|
+
<div
|
|
220
|
+
class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
|
|
221
|
+
>
|
|
222
|
+
3
|
|
223
|
+
</div>
|
|
224
|
+
<div>
|
|
225
|
+
<div class="font-medium text-foreground">Deploy</div>
|
|
226
|
+
<div class="text-sm text-foreground-60">
|
|
227
|
+
Run
|
|
228
|
+
<code class="px-1 py-0.5 bg-muted rounded text-sm">npm run build</code>
|
|
229
|
+
for a production-ready bundle.
|
|
230
|
+
</div>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
|
|
236
|
+
<!-- Keep MCP Servers section -->
|
|
237
|
+
<div class="bg-card border-default rounded-lg p-6 space-y-4">
|
|
238
|
+
<div class="text-lg font-semibold text-foreground">MCP Servers Included</div>
|
|
239
|
+
<div class="text-sm text-foreground-60 mb-4">
|
|
240
|
+
Pre-configured Model Context Protocol servers for AI-assisted development.
|
|
241
|
+
</div>
|
|
242
|
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
243
|
+
<div class="p-4 bg-muted rounded-lg">
|
|
244
|
+
<div class="font-medium text-foreground mb-1">Modus Docs MCP</div>
|
|
245
|
+
<div class="text-sm text-foreground-60">
|
|
246
|
+
Access Modus Web Components documentation directly in your AI assistant. Get
|
|
247
|
+
component props, usage examples, and best practices.
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
<div class="p-4 bg-muted rounded-lg">
|
|
251
|
+
<div class="font-medium text-foreground mb-1">Context7 MCP</div>
|
|
252
|
+
<div class="text-sm text-foreground-60">
|
|
253
|
+
Up-to-date library documentation for Angular, Vite, Tailwind, and other
|
|
254
|
+
dependencies.
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
|
|
260
|
+
<!-- Keep other sections as needed -->
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
`,
|
|
265
|
+
})
|
|
266
|
+
export class HomeComponent {}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Step 6: Update Icon Names Validation Script
|
|
272
|
+
|
|
273
|
+
Since `data/modusIcons.ts` is deleted (it was only used by the dev panel's IconsPage), we need to update the icon names validation script to handle the missing file gracefully.
|
|
274
|
+
|
|
275
|
+
Update `scripts/check-icon-names.js` to check if the file exists before reading it:
|
|
276
|
+
|
|
277
|
+
**Find this section near the top of the file (lines 12-33):**
|
|
278
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
import fs from 'fs';
|
|
281
|
+
import path from 'path';
|
|
282
|
+
import { createRequire } from 'module';
|
|
283
|
+
const require = createRequire(import.meta.url);
|
|
284
|
+
const { glob } = require('glob');
|
|
285
|
+
|
|
286
|
+
// Read and parse the Modus icons data from TypeScript file
|
|
287
|
+
const iconsContent = fs.readFileSync(path.join(process.cwd(), 'data/modusIcons.ts'), 'utf8');
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Replace it with:**
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
import fs from 'fs';
|
|
294
|
+
import path from 'path';
|
|
295
|
+
import { createRequire } from 'module';
|
|
296
|
+
const require = createRequire(import.meta.url);
|
|
297
|
+
const { glob } = require('glob');
|
|
298
|
+
|
|
299
|
+
// Colors for console output (moved to top)
|
|
300
|
+
const colors = {
|
|
301
|
+
red: '\x1b[31m',
|
|
302
|
+
green: '\x1b[32m',
|
|
303
|
+
yellow: '\x1b[33m',
|
|
304
|
+
blue: '\x1b[34m',
|
|
305
|
+
magenta: '\x1b[35m',
|
|
306
|
+
cyan: '\x1b[36m',
|
|
307
|
+
white: '\x1b[37m',
|
|
308
|
+
reset: '\x1b[0m',
|
|
309
|
+
bold: '\x1b[1m',
|
|
310
|
+
dim: '\x1b[2m',
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
// Check if modusIcons.ts exists (it may have been removed in production builds)
|
|
314
|
+
const iconsFilePath = path.join(process.cwd(), 'data/modusIcons.ts');
|
|
315
|
+
if (!fs.existsSync(iconsFilePath)) {
|
|
316
|
+
console.log(
|
|
317
|
+
`${colors.bold}${colors.yellow}Icon names validation skipped:${colors.reset}`
|
|
318
|
+
);
|
|
319
|
+
console.log(
|
|
320
|
+
`${colors.dim}The icon reference file (data/modusIcons.ts) is not present.${colors.reset}`
|
|
321
|
+
);
|
|
322
|
+
console.log(
|
|
323
|
+
`${colors.dim}This is normal if dev content has been removed.${colors.reset}\n`
|
|
324
|
+
);
|
|
325
|
+
process.exit(0);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Read and parse the Modus icons data from TypeScript file
|
|
329
|
+
const iconsContent = fs.readFileSync(iconsFilePath, 'utf8');
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
**Also remove the duplicate colors definition** that appears later in the file (around lines 38-49), since we've moved it to the top.
|
|
333
|
+
|
|
334
|
+
**What this does:**
|
|
335
|
+
- Moves the `colors` object definition to the top (before it's used)
|
|
336
|
+
- Checks if `modusIcons.ts` exists before trying to read it
|
|
337
|
+
- Gracefully skips validation with an informative message if the file is missing
|
|
338
|
+
- Exits with code 0 (success) so `npm run lint:all` continues without errors
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Files to KEEP (Do Not Touch)
|
|
343
|
+
|
|
344
|
+
These are core production files that must remain:
|
|
345
|
+
|
|
346
|
+
### Modus Wrapper Components (48 files in src/app/components/)
|
|
347
|
+
- `modus-accordion.component.ts` through `modus-utility-panel.component.ts`
|
|
348
|
+
- `index.ts` (barrel exports)
|
|
349
|
+
- `README.md`
|
|
350
|
+
|
|
351
|
+
### Theme System
|
|
352
|
+
- `src/app/services/theme.service.ts`
|
|
353
|
+
|
|
354
|
+
### Core Infrastructure
|
|
355
|
+
- `src/main.ts`
|
|
356
|
+
- `src/styles.css`
|
|
357
|
+
- `src/app/app.config.ts`
|
|
358
|
+
- `src/app/app.css`
|
|
359
|
+
- `src/app/app.html`
|
|
360
|
+
- `src/app/app.spec.ts`
|
|
361
|
+
|
|
362
|
+
### Configuration
|
|
363
|
+
- `angular.json`
|
|
364
|
+
- `package.json`
|
|
365
|
+
- `tsconfig.json` and related
|
|
366
|
+
- `src/environments/environment.ts`
|
|
367
|
+
- `src/environments/environment.development.ts`
|
|
368
|
+
|
|
369
|
+
### Cursor Rules
|
|
370
|
+
- `.cursor/rules/` (all files)
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## Verification Checklist
|
|
375
|
+
|
|
376
|
+
After removal, verify:
|
|
377
|
+
|
|
378
|
+
- [ ] `npm start` starts without errors
|
|
379
|
+
- [ ] `npm run build` completes successfully
|
|
380
|
+
- [ ] `npm run type-check` passes without errors
|
|
381
|
+
- [ ] `npm run lint:all` completes successfully (icon names validation will skip gracefully)
|
|
382
|
+
- [ ] No import errors in app.ts or app.routes.ts
|
|
383
|
+
- [ ] HomePage renders without Dev Panel button
|
|
384
|
+
- [ ] All Modus wrapper components are still present
|
|
385
|
+
- [ ] Theme switching still works via ThemeService
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Notes
|
|
390
|
+
|
|
391
|
+
- The Dev Panel is automatically hidden in production builds anyway (controlled by `environment.devPanel` flag)
|
|
392
|
+
- This command is for users who want a clean codebase without any dev exploration code
|
|
393
|
+
- All Modus wrapper components remain fully functional for building your app
|
|
394
|
+
- The environment files are kept but no longer referenced in routes (they can still be used for other purposes)
|