@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
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusButtonComponent } from '../../components/modus-button.component';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Home page component.
|
|
7
|
+
*
|
|
8
|
+
* This is the main landing page for the user's application.
|
|
9
|
+
* Edit this component to create your own home page.
|
|
10
|
+
*
|
|
11
|
+
* Getting Started:
|
|
12
|
+
* 1. Customize the hero section with your app's branding
|
|
13
|
+
* 2. Add your own features and content
|
|
14
|
+
* 3. Use Ctrl+Shift+D to open the Dev Panel for component reference
|
|
15
|
+
*/
|
|
16
|
+
@Component({
|
|
17
|
+
selector: 'app-home',
|
|
18
|
+
standalone: true,
|
|
19
|
+
imports: [CommonModule, ModusButtonComponent],
|
|
20
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
21
|
+
template: `
|
|
22
|
+
<div class="min-h-screen flex flex-col bg-background">
|
|
23
|
+
<div class="flex-1 flex flex-col items-center p-8">
|
|
24
|
+
<div class="max-w-4xl w-full space-y-8">
|
|
25
|
+
<!-- Header -->
|
|
26
|
+
<div class="text-center space-y-4">
|
|
27
|
+
<div class="text-4xl font-bold text-foreground">Modus Angular App</div>
|
|
28
|
+
<div class="text-xl text-foreground-60">
|
|
29
|
+
A production-ready Angular boilerplate with Modus Design System integration.
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<!-- Dev Panel Hint -->
|
|
34
|
+
<div class="flex justify-center">
|
|
35
|
+
<modus-button color="primary" size="lg" (buttonClick)="openDevPanel()">
|
|
36
|
+
<div class="flex items-center gap-2">
|
|
37
|
+
<i class="modus-icons">code</i>
|
|
38
|
+
<div>Open Dev Panel</div>
|
|
39
|
+
</div>
|
|
40
|
+
</modus-button>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<!-- Getting Started -->
|
|
44
|
+
<div class="bg-card border-default rounded-lg p-6 space-y-4">
|
|
45
|
+
<div class="text-lg font-semibold text-foreground">Getting Started</div>
|
|
46
|
+
<div class="space-y-4 text-foreground-80">
|
|
47
|
+
<div class="flex gap-3">
|
|
48
|
+
<div
|
|
49
|
+
class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
|
|
50
|
+
>
|
|
51
|
+
1
|
|
52
|
+
</div>
|
|
53
|
+
<div>
|
|
54
|
+
<div class="font-medium text-foreground">Build Your App</div>
|
|
55
|
+
<div class="text-sm text-foreground-60">
|
|
56
|
+
Start developing in
|
|
57
|
+
<code class="px-1 py-0.5 bg-muted rounded text-sm">src/app/pages/</code>
|
|
58
|
+
- add your routes in
|
|
59
|
+
<code class="px-1 py-0.5 bg-muted rounded text-sm">app.routes.ts</code>.
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="flex gap-3">
|
|
64
|
+
<div
|
|
65
|
+
class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
|
|
66
|
+
>
|
|
67
|
+
2
|
|
68
|
+
</div>
|
|
69
|
+
<div>
|
|
70
|
+
<div class="font-medium text-foreground">Use the Dev Panel</div>
|
|
71
|
+
<div class="text-sm text-foreground-60">
|
|
72
|
+
Press
|
|
73
|
+
<div class="inline px-1.5 py-0.5 bg-muted rounded text-xs font-mono">
|
|
74
|
+
Ctrl+Shift+D
|
|
75
|
+
</div>
|
|
76
|
+
to browse components, colors, and icons.
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="flex gap-3">
|
|
81
|
+
<div
|
|
82
|
+
class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
|
|
83
|
+
>
|
|
84
|
+
3
|
|
85
|
+
</div>
|
|
86
|
+
<div>
|
|
87
|
+
<div class="font-medium text-foreground">Deploy</div>
|
|
88
|
+
<div class="text-sm text-foreground-60">
|
|
89
|
+
In production, the Dev Panel is automatically hidden. Your app ships clean.
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<!-- MCP Servers -->
|
|
97
|
+
<div class="bg-card border-default rounded-lg p-6 space-y-4">
|
|
98
|
+
<div class="text-lg font-semibold text-foreground">MCP Servers Included</div>
|
|
99
|
+
<div class="text-sm text-foreground-60 mb-4">
|
|
100
|
+
Pre-configured Model Context Protocol servers for AI-assisted development.
|
|
101
|
+
</div>
|
|
102
|
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
103
|
+
<div class="p-4 bg-muted rounded-lg">
|
|
104
|
+
<div class="font-medium text-foreground mb-1">Modus Docs MCP</div>
|
|
105
|
+
<div class="text-sm text-foreground-60">
|
|
106
|
+
Access Modus Web Components documentation directly in your AI assistant. Get
|
|
107
|
+
component props, usage examples, and best practices.
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
<div class="p-4 bg-muted rounded-lg">
|
|
111
|
+
<div class="font-medium text-foreground mb-1">Context7 MCP</div>
|
|
112
|
+
<div class="text-sm text-foreground-60">
|
|
113
|
+
Up-to-date library documentation for Angular, Vite, Tailwind, and other
|
|
114
|
+
dependencies.
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<!-- Cursor Rules -->
|
|
121
|
+
<div class="bg-card border-default rounded-lg p-6 space-y-4">
|
|
122
|
+
<div class="text-lg font-semibold text-foreground">AI-Powered Development Rules</div>
|
|
123
|
+
<div class="text-sm text-foreground-60 mb-4">
|
|
124
|
+
Comprehensive Cursor rules ensure consistent, high-quality code generation.
|
|
125
|
+
</div>
|
|
126
|
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
127
|
+
<div class="space-y-3">
|
|
128
|
+
<div class="flex items-start gap-2">
|
|
129
|
+
<i class="modus-icons text-primary mt-0.5">widgets</i>
|
|
130
|
+
<div>
|
|
131
|
+
<div class="font-medium text-foreground">Component Patterns</div>
|
|
132
|
+
<div class="text-sm text-foreground-60">
|
|
133
|
+
Angular integration, state management, event handling for Modus Web Components
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
<div class="flex items-start gap-2">
|
|
138
|
+
<i class="modus-icons text-primary mt-0.5">palette</i>
|
|
139
|
+
<div>
|
|
140
|
+
<div class="font-medium text-foreground">Design System Compliance</div>
|
|
141
|
+
<div class="text-sm text-foreground-60">
|
|
142
|
+
Color usage, border utilities, opacity patterns, icon guidelines
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
<div class="flex items-start gap-2">
|
|
147
|
+
<i class="modus-icons text-primary mt-0.5">accessibility</i>
|
|
148
|
+
<div>
|
|
149
|
+
<div class="font-medium text-foreground">Accessibility Standards</div>
|
|
150
|
+
<div class="text-sm text-foreground-60">
|
|
151
|
+
Semantic HTML patterns, ARIA attributes, keyboard navigation
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
<div class="space-y-3">
|
|
157
|
+
<div class="flex items-start gap-2">
|
|
158
|
+
<i class="modus-icons text-primary mt-0.5">dashboard</i>
|
|
159
|
+
<div>
|
|
160
|
+
<div class="font-medium text-foreground">UX Foundations</div>
|
|
161
|
+
<div class="text-sm text-foreground-60">
|
|
162
|
+
Gestalt laws, visual hierarchy, spacing rhythms, interaction patterns
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="flex items-start gap-2">
|
|
167
|
+
<i class="modus-icons text-primary mt-0.5">wrench</i>
|
|
168
|
+
<div>
|
|
169
|
+
<div class="font-medium text-foreground">Development Workflow</div>
|
|
170
|
+
<div class="text-sm text-foreground-60">
|
|
171
|
+
Linting commands, quality gates, testing procedures
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="flex items-start gap-2">
|
|
176
|
+
<i class="modus-icons text-primary mt-0.5">bug</i>
|
|
177
|
+
<div>
|
|
178
|
+
<div class="font-medium text-foreground">Known Issues</div>
|
|
179
|
+
<div class="text-sm text-foreground-60">
|
|
180
|
+
Checkbox value inversion, modal patterns, select vs dropdown
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<!-- Quality Automation -->
|
|
189
|
+
<div class="bg-card border-default rounded-lg p-6 space-y-4">
|
|
190
|
+
<div class="text-lg font-semibold text-foreground">Quality Automation</div>
|
|
191
|
+
<div class="text-sm text-foreground-60 mb-4">
|
|
192
|
+
Pre-configured Husky hooks and GitHub workflows for automated quality assurance.
|
|
193
|
+
</div>
|
|
194
|
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
195
|
+
<div class="p-4 bg-muted rounded-lg">
|
|
196
|
+
<div class="font-medium text-foreground mb-2">Pre-commit Hooks</div>
|
|
197
|
+
<div class="text-sm text-foreground-60 space-y-1">
|
|
198
|
+
<div>TypeScript type checking</div>
|
|
199
|
+
<div>Design system color validation</div>
|
|
200
|
+
<div>Modus icon usage verification</div>
|
|
201
|
+
<div>Border and opacity pattern checks</div>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="p-4 bg-muted rounded-lg">
|
|
205
|
+
<div class="font-medium text-foreground mb-2">Linting Scripts</div>
|
|
206
|
+
<div class="text-sm text-foreground-60 space-y-1">
|
|
207
|
+
<div>Inline style detection</div>
|
|
208
|
+
<div>Semantic HTML enforcement</div>
|
|
209
|
+
<div>Icon name validation (700+ icons)</div>
|
|
210
|
+
<div>
|
|
211
|
+
Run all checks with
|
|
212
|
+
<code class="px-1 py-0.5 bg-background rounded text-xs font-mono"
|
|
213
|
+
>npm run lint:all</code
|
|
214
|
+
>
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
<!-- Footer -->
|
|
222
|
+
<div class="text-center pt-8 box-content">
|
|
223
|
+
<div class="flex items-center justify-center gap-3 mb-3">
|
|
224
|
+
<img src="/angular-icon.svg" alt="Angular" class="h-6 w-6" aria-hidden="true" />
|
|
225
|
+
<div class="text-foreground-40">+</div>
|
|
226
|
+
<img src="/vite.svg" alt="Vite" class="h-6 w-6" aria-hidden="true" />
|
|
227
|
+
</div>
|
|
228
|
+
<div class="text-sm font-mono text-foreground-40">
|
|
229
|
+
2026 Modus Angular App v1.0.0 + Angular 20 + Vite + Tailwind CSS - Created by Julian
|
|
230
|
+
Oczkowski
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
`,
|
|
237
|
+
})
|
|
238
|
+
export class HomeComponent {
|
|
239
|
+
/**
|
|
240
|
+
* Opens the Dev Panel by dispatching a keyboard event for Ctrl+Shift+D.
|
|
241
|
+
*/
|
|
242
|
+
openDevPanel(): void {
|
|
243
|
+
window.dispatchEvent(
|
|
244
|
+
new KeyboardEvent('keydown', {
|
|
245
|
+
ctrlKey: true,
|
|
246
|
+
shiftKey: true,
|
|
247
|
+
key: 'd',
|
|
248
|
+
}),
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Theme Service
|
|
2
|
+
|
|
3
|
+
The `ThemeService` manages Modus theme switching in the Angular application.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Theme Management**: Switch between Modus Classic, Modern, and Connect themes
|
|
8
|
+
- **Mode Toggle**: Toggle between light and dark modes
|
|
9
|
+
- **Persistence**: Theme preferences are saved to localStorage
|
|
10
|
+
- **System Theme Detection**: Automatically detects and applies system theme preference if no user preference is set
|
|
11
|
+
- **Reactive**: Uses Angular signals for reactive theme updates
|
|
12
|
+
|
|
13
|
+
## Available Themes
|
|
14
|
+
|
|
15
|
+
- `modus-classic` (Classic theme)
|
|
16
|
+
- `modus-modern` (Modern theme)
|
|
17
|
+
- `connect` (Connect theme)
|
|
18
|
+
|
|
19
|
+
Each theme supports both `light` and `dark` modes.
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { ThemeService } from './services/theme.service';
|
|
25
|
+
|
|
26
|
+
export class MyComponent {
|
|
27
|
+
constructor(private themeService: ThemeService) {
|
|
28
|
+
// Get current theme
|
|
29
|
+
const theme = this.themeService.theme();
|
|
30
|
+
const mode = this.themeService.mode();
|
|
31
|
+
|
|
32
|
+
// Set theme
|
|
33
|
+
this.themeService.setTheme('modus-modern', 'dark');
|
|
34
|
+
|
|
35
|
+
// Toggle mode
|
|
36
|
+
this.themeService.toggleMode();
|
|
37
|
+
|
|
38
|
+
// Set theme name only
|
|
39
|
+
this.themeService.setThemeName('modus-classic');
|
|
40
|
+
|
|
41
|
+
// Set mode only
|
|
42
|
+
this.themeService.setMode('light');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Theme Service API
|
|
48
|
+
|
|
49
|
+
- `theme: Signal<ThemeName>` - Current theme name signal
|
|
50
|
+
- `mode: Signal<ThemeMode>` - Current mode signal
|
|
51
|
+
- `setTheme(theme: ThemeName, mode?: ThemeMode): void` - Set theme and mode
|
|
52
|
+
- `setThemeName(theme: ThemeName): void` - Set theme name
|
|
53
|
+
- `setMode(mode: ThemeMode): void` - Set mode
|
|
54
|
+
- `toggleMode(): void` - Toggle between light and dark
|
|
55
|
+
- `getThemeConfig(): ThemeConfig` - Get current theme configuration
|
|
56
|
+
- `getFullThemeName(): string` - Get full theme name (e.g., "modus-modern-light")
|
|
57
|
+
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Injectable, signal } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
export type ThemeName = 'modus-classic' | 'modus-modern' | 'connect';
|
|
4
|
+
export type ThemeMode = 'light' | 'dark';
|
|
5
|
+
|
|
6
|
+
export interface ThemeConfig {
|
|
7
|
+
theme: ThemeName;
|
|
8
|
+
mode: ThemeMode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@Injectable({
|
|
12
|
+
providedIn: 'root',
|
|
13
|
+
})
|
|
14
|
+
export class ThemeService {
|
|
15
|
+
private readonly STORAGE_KEY = 'modus-theme-config';
|
|
16
|
+
|
|
17
|
+
// Current theme state
|
|
18
|
+
private _theme = signal<ThemeName>('modus-modern');
|
|
19
|
+
private _mode = signal<ThemeMode>('light');
|
|
20
|
+
|
|
21
|
+
// Public signals for components to react to
|
|
22
|
+
readonly theme = this._theme.asReadonly();
|
|
23
|
+
readonly mode = this._mode.asReadonly();
|
|
24
|
+
|
|
25
|
+
constructor() {
|
|
26
|
+
this.loadTheme();
|
|
27
|
+
this.watchSystemTheme();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Initialize theme from localStorage or use default
|
|
32
|
+
*/
|
|
33
|
+
private loadTheme(): void {
|
|
34
|
+
try {
|
|
35
|
+
const stored = localStorage.getItem(this.STORAGE_KEY);
|
|
36
|
+
if (stored) {
|
|
37
|
+
const config: ThemeConfig = JSON.parse(stored);
|
|
38
|
+
this.setTheme(config.theme, config.mode);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.warn('Failed to load theme from localStorage:', error);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Default theme
|
|
46
|
+
this.setTheme('modus-modern', 'light');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Watch system theme preference and update if user hasn't set a preference
|
|
51
|
+
*/
|
|
52
|
+
private watchSystemTheme(): void {
|
|
53
|
+
if (typeof window === 'undefined' || !window.matchMedia) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
58
|
+
const handleChange = (e: MediaQueryListEvent | MediaQueryList) => {
|
|
59
|
+
// Only apply system theme if no user preference is stored
|
|
60
|
+
if (!localStorage.getItem(this.STORAGE_KEY)) {
|
|
61
|
+
this._mode.set(e.matches ? 'dark' : 'light');
|
|
62
|
+
this.updateThemeAttributes();
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
mediaQuery.addEventListener('change', handleChange);
|
|
67
|
+
handleChange(mediaQuery);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Set theme and mode
|
|
72
|
+
*/
|
|
73
|
+
setTheme(theme: ThemeName, mode?: ThemeMode): void {
|
|
74
|
+
this._theme.set(theme);
|
|
75
|
+
if (mode) {
|
|
76
|
+
this._mode.set(mode);
|
|
77
|
+
}
|
|
78
|
+
this.updateThemeAttributes();
|
|
79
|
+
this.saveTheme();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Toggle between light and dark mode
|
|
84
|
+
*/
|
|
85
|
+
toggleMode(): void {
|
|
86
|
+
this._mode.set(this._mode() === 'light' ? 'dark' : 'light');
|
|
87
|
+
this.updateThemeAttributes();
|
|
88
|
+
this.saveTheme();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Set theme name
|
|
93
|
+
*/
|
|
94
|
+
setThemeName(theme: ThemeName): void {
|
|
95
|
+
this._theme.set(theme);
|
|
96
|
+
this.updateThemeAttributes();
|
|
97
|
+
this.saveTheme();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Set mode
|
|
102
|
+
*/
|
|
103
|
+
setMode(mode: ThemeMode): void {
|
|
104
|
+
this._mode.set(mode);
|
|
105
|
+
this.updateThemeAttributes();
|
|
106
|
+
this.saveTheme();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Update HTML attributes for theme
|
|
111
|
+
* This matches the behavior of modus-wc-theme-provider
|
|
112
|
+
*/
|
|
113
|
+
private updateThemeAttributes(): void {
|
|
114
|
+
if (typeof document === 'undefined') {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const root = document.documentElement;
|
|
119
|
+
const theme = this._theme();
|
|
120
|
+
const mode = this._mode();
|
|
121
|
+
|
|
122
|
+
// Update data-theme attribute (e.g., "modus-modern-light")
|
|
123
|
+
// This matches how modus-wc-theme-provider sets it
|
|
124
|
+
root.setAttribute('data-theme', `${theme}-${mode}`);
|
|
125
|
+
root.setAttribute('data-mode', mode);
|
|
126
|
+
|
|
127
|
+
// Update class for light/dark
|
|
128
|
+
root.classList.remove('light', 'dark');
|
|
129
|
+
root.classList.add(mode);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Save theme to localStorage
|
|
134
|
+
*/
|
|
135
|
+
private saveTheme(): void {
|
|
136
|
+
try {
|
|
137
|
+
const config: ThemeConfig = {
|
|
138
|
+
theme: this._theme(),
|
|
139
|
+
mode: this._mode(),
|
|
140
|
+
};
|
|
141
|
+
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(config));
|
|
142
|
+
} catch (error) {
|
|
143
|
+
console.warn('Failed to save theme to localStorage:', error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Get full theme name (e.g., "modus-modern-light")
|
|
149
|
+
*/
|
|
150
|
+
getFullThemeName(): string {
|
|
151
|
+
return `${this._theme()}-${this._mode()}`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Get current theme config
|
|
156
|
+
*/
|
|
157
|
+
getThemeConfig(): ThemeConfig {
|
|
158
|
+
return {
|
|
159
|
+
theme: this._theme(),
|
|
160
|
+
mode: this._mode(),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<title>Modus 2 Angular + Vite</title>
|
|
6
|
+
<base href="/" />
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
8
|
+
<link rel="icon" type="image/x-icon" href="favicon.ico" />
|
|
9
|
+
<link rel="stylesheet" href="/modus-icons.css" />
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<app-root></app-root>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|