@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,330 @@
|
|
|
1
|
+
import { Component, computed, signal } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
+
import { DemoPageComponent } from '../shared/demo-page.component';
|
|
5
|
+
import { DemoExampleComponent } from '../shared/demo-example.component';
|
|
6
|
+
import { ModusInputLabelComponent } from '../../components/modus-input-label.component';
|
|
7
|
+
import { ModusTextInputComponent } from '../../components/modus-text-input.component';
|
|
8
|
+
import { ModusCheckboxComponent } from '../../components/modus-checkbox.component';
|
|
9
|
+
import { ModusRadioComponent } from '../../components/modus-radio.component';
|
|
10
|
+
import { ModusDateComponent } from '../../components/modus-date.component';
|
|
11
|
+
import { ModusNumberInputComponent } from '../../components/modus-number-input.component';
|
|
12
|
+
import { ModusInputFeedbackComponent } from '../../components/modus-input-feedback.component';
|
|
13
|
+
import type { IInputFeedbackProp } from '@trimble-oss/moduswebcomponents';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Demo page showcasing the Modus Input Label component.
|
|
17
|
+
*
|
|
18
|
+
* Demonstrates input label features including:
|
|
19
|
+
* - Basic labels
|
|
20
|
+
* - Required labels
|
|
21
|
+
* - Labels with different form controls
|
|
22
|
+
* - Label sizes
|
|
23
|
+
* - Label accessibility
|
|
24
|
+
*/
|
|
25
|
+
@Component({
|
|
26
|
+
selector: 'app-input-label-demo-page',
|
|
27
|
+
standalone: true,
|
|
28
|
+
imports: [
|
|
29
|
+
CommonModule,
|
|
30
|
+
ReactiveFormsModule,
|
|
31
|
+
DemoPageComponent,
|
|
32
|
+
DemoExampleComponent,
|
|
33
|
+
ModusInputLabelComponent,
|
|
34
|
+
ModusTextInputComponent,
|
|
35
|
+
ModusCheckboxComponent,
|
|
36
|
+
ModusRadioComponent,
|
|
37
|
+
ModusDateComponent,
|
|
38
|
+
ModusNumberInputComponent,
|
|
39
|
+
ModusInputFeedbackComponent,
|
|
40
|
+
],
|
|
41
|
+
template: `
|
|
42
|
+
<demo-page
|
|
43
|
+
title="Modus Input Label"
|
|
44
|
+
description="Input labels provide clear identification for form controls. Always use labels to make forms accessible and user-friendly."
|
|
45
|
+
>
|
|
46
|
+
<demo-example title="Basic Label" description="Simple label for form inputs.">
|
|
47
|
+
<div class="flex flex-col gap-2">
|
|
48
|
+
<modus-input-label forId="basic-input" labelText="Email Address" />
|
|
49
|
+
<modus-text-input inputId="basic-input" placeholder="user@example.com" />
|
|
50
|
+
</div>
|
|
51
|
+
</demo-example>
|
|
52
|
+
|
|
53
|
+
<demo-example
|
|
54
|
+
title="Required Label"
|
|
55
|
+
description="Labels with required indicator for mandatory fields."
|
|
56
|
+
>
|
|
57
|
+
<div class="flex flex-col gap-6">
|
|
58
|
+
<div class="flex flex-col gap-2">
|
|
59
|
+
<modus-input-label forId="required-input" labelText="First Name" [required]="true" />
|
|
60
|
+
<modus-text-input
|
|
61
|
+
inputId="required-input"
|
|
62
|
+
placeholder="Enter first name"
|
|
63
|
+
[required]="true"
|
|
64
|
+
/>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="flex flex-col gap-2">
|
|
68
|
+
<modus-input-label forId="required-email" labelText="Email" [required]="true" />
|
|
69
|
+
<modus-text-input
|
|
70
|
+
inputId="required-email"
|
|
71
|
+
type="email"
|
|
72
|
+
placeholder="user@example.com"
|
|
73
|
+
[required]="true"
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</demo-example>
|
|
78
|
+
|
|
79
|
+
<demo-example
|
|
80
|
+
title="Labels with Different Form Controls"
|
|
81
|
+
description="Input labels work with various form control types."
|
|
82
|
+
>
|
|
83
|
+
<div class="flex flex-col gap-6">
|
|
84
|
+
<div class="flex flex-col gap-2">
|
|
85
|
+
<modus-input-label forId="checkbox-input" labelText="Accept Terms" [required]="true" />
|
|
86
|
+
<modus-checkbox
|
|
87
|
+
inputId="checkbox-input"
|
|
88
|
+
label="I agree to the terms and conditions"
|
|
89
|
+
[required]="true"
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<div class="flex flex-col gap-2">
|
|
94
|
+
<modus-input-label forId="radio-input" labelText="Select Option" />
|
|
95
|
+
<div class="flex flex-col gap-2">
|
|
96
|
+
<modus-radio
|
|
97
|
+
inputId="radio-input"
|
|
98
|
+
label="Option A"
|
|
99
|
+
name="radio-demo"
|
|
100
|
+
[value]="true"
|
|
101
|
+
/>
|
|
102
|
+
<modus-radio
|
|
103
|
+
inputId="radio-input-b"
|
|
104
|
+
label="Option B"
|
|
105
|
+
name="radio-demo"
|
|
106
|
+
[value]="false"
|
|
107
|
+
/>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="flex flex-col gap-2">
|
|
112
|
+
<modus-date inputId="date-input" label="Pick a date" />
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<div class="flex flex-col gap-2">
|
|
116
|
+
<modus-number-input
|
|
117
|
+
inputId="number-input"
|
|
118
|
+
label="Quantity"
|
|
119
|
+
placeholder="0"
|
|
120
|
+
[step]="1"
|
|
121
|
+
/>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
</demo-example>
|
|
125
|
+
|
|
126
|
+
<demo-example title="Label Sizes" description="Input labels in different sizes.">
|
|
127
|
+
<div class="flex flex-col gap-6">
|
|
128
|
+
<div class="flex flex-col gap-2">
|
|
129
|
+
<modus-input-label forId="small-label" labelText="Small Label" size="sm" />
|
|
130
|
+
<modus-text-input inputId="small-label" placeholder="Enter text" size="sm" />
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class="flex flex-col gap-2">
|
|
134
|
+
<modus-input-label forId="medium-label" labelText="Medium Label (Default)" size="md" />
|
|
135
|
+
<modus-text-input inputId="medium-label" placeholder="Enter text" size="md" />
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<div class="flex flex-col gap-2">
|
|
139
|
+
<modus-input-label forId="large-label" labelText="Large Label" size="lg" />
|
|
140
|
+
<modus-text-input inputId="large-label" placeholder="Enter text" size="lg" />
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</demo-example>
|
|
144
|
+
|
|
145
|
+
<demo-example
|
|
146
|
+
title="Real-World Form Example"
|
|
147
|
+
description="Complete form example with proper labels and validation feedback."
|
|
148
|
+
>
|
|
149
|
+
<div class="flex flex-col gap-6 p-6 rounded-lg bg-card border-default">
|
|
150
|
+
<div class="flex flex-col gap-2">
|
|
151
|
+
<modus-input-label forId="form-first-name" labelText="First Name" [required]="true" />
|
|
152
|
+
<modus-text-input
|
|
153
|
+
inputId="form-first-name"
|
|
154
|
+
placeholder="Enter first name"
|
|
155
|
+
[required]="true"
|
|
156
|
+
[value]="form.controls.firstName.value ?? ''"
|
|
157
|
+
[feedback]="firstNameFeedback()"
|
|
158
|
+
(inputChange)="handleFirstNameChange($event)"
|
|
159
|
+
(inputBlur)="handleFirstNameBlur()"
|
|
160
|
+
/>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<div class="flex flex-col gap-2">
|
|
164
|
+
<modus-input-label forId="form-last-name" labelText="Last Name" [required]="true" />
|
|
165
|
+
<modus-text-input
|
|
166
|
+
inputId="form-last-name"
|
|
167
|
+
placeholder="Enter last name"
|
|
168
|
+
[required]="true"
|
|
169
|
+
[value]="form.controls.lastName.value ?? ''"
|
|
170
|
+
[feedback]="lastNameFeedback()"
|
|
171
|
+
(inputChange)="handleLastNameChange($event)"
|
|
172
|
+
(inputBlur)="handleLastNameBlur()"
|
|
173
|
+
/>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<div class="flex flex-col gap-2">
|
|
177
|
+
<modus-input-label forId="form-email" labelText="Email Address" [required]="true" />
|
|
178
|
+
<modus-text-input
|
|
179
|
+
inputId="form-email"
|
|
180
|
+
type="email"
|
|
181
|
+
placeholder="user@example.com"
|
|
182
|
+
[required]="true"
|
|
183
|
+
[value]="form.controls.email.value ?? ''"
|
|
184
|
+
[feedback]="emailFeedback()"
|
|
185
|
+
(inputChange)="handleEmailChange($event)"
|
|
186
|
+
(inputBlur)="handleEmailBlur()"
|
|
187
|
+
/>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div class="flex flex-col gap-2">
|
|
191
|
+
<modus-input-label forId="form-checkbox" labelText="Agreement" [required]="true" />
|
|
192
|
+
<modus-checkbox
|
|
193
|
+
inputId="form-checkbox"
|
|
194
|
+
label="I agree to the terms and conditions"
|
|
195
|
+
[required]="true"
|
|
196
|
+
[value]="form.controls.agreement.value ?? false"
|
|
197
|
+
(inputChange)="handleAgreementChange($event)"
|
|
198
|
+
(inputBlur)="handleAgreementBlur()"
|
|
199
|
+
/>
|
|
200
|
+
@if (agreementFeedback()) {
|
|
201
|
+
<modus-input-feedback
|
|
202
|
+
[level]="agreementFeedback()!.level"
|
|
203
|
+
[message]="agreementFeedback()!.message"
|
|
204
|
+
/>
|
|
205
|
+
}
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</demo-example>
|
|
209
|
+
</demo-page>
|
|
210
|
+
`,
|
|
211
|
+
})
|
|
212
|
+
export class InputLabelDemoPageComponent {
|
|
213
|
+
private readonly fb = new FormBuilder();
|
|
214
|
+
|
|
215
|
+
readonly form = this.fb.group({
|
|
216
|
+
firstName: ['', [Validators.required, Validators.minLength(2)]],
|
|
217
|
+
lastName: ['', [Validators.required, Validators.minLength(2)]],
|
|
218
|
+
email: ['', [Validators.required, Validators.email]],
|
|
219
|
+
agreement: [false, Validators.requiredTrue],
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// Track touched state for each field
|
|
223
|
+
readonly touchedFields = signal<Set<string>>(new Set());
|
|
224
|
+
|
|
225
|
+
// Computed feedback for firstName
|
|
226
|
+
readonly firstNameFeedback = computed<IInputFeedbackProp | undefined>(() => {
|
|
227
|
+
const control = this.form.controls.firstName;
|
|
228
|
+
const isTouched = this.touchedFields().has('firstName');
|
|
229
|
+
if (!isTouched || !control.errors) return undefined;
|
|
230
|
+
|
|
231
|
+
if (control.errors['required']) {
|
|
232
|
+
return { level: 'error', message: 'First name is required.' };
|
|
233
|
+
}
|
|
234
|
+
if (control.errors['minlength']) {
|
|
235
|
+
return { level: 'error', message: 'First name must be at least 2 characters.' };
|
|
236
|
+
}
|
|
237
|
+
return undefined;
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// Computed feedback for lastName
|
|
241
|
+
readonly lastNameFeedback = computed<IInputFeedbackProp | undefined>(() => {
|
|
242
|
+
const control = this.form.controls.lastName;
|
|
243
|
+
const isTouched = this.touchedFields().has('lastName');
|
|
244
|
+
if (!isTouched || !control.errors) return undefined;
|
|
245
|
+
|
|
246
|
+
if (control.errors['required']) {
|
|
247
|
+
return { level: 'error', message: 'Last name is required.' };
|
|
248
|
+
}
|
|
249
|
+
if (control.errors['minlength']) {
|
|
250
|
+
return { level: 'error', message: 'Last name must be at least 2 characters.' };
|
|
251
|
+
}
|
|
252
|
+
return undefined;
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// Computed feedback for email
|
|
256
|
+
readonly emailFeedback = computed<IInputFeedbackProp | undefined>(() => {
|
|
257
|
+
const control = this.form.controls.email;
|
|
258
|
+
const isTouched = this.touchedFields().has('email');
|
|
259
|
+
if (!isTouched || !control.errors) return undefined;
|
|
260
|
+
|
|
261
|
+
if (control.errors['required']) {
|
|
262
|
+
return { level: 'error', message: 'Email address is required.' };
|
|
263
|
+
}
|
|
264
|
+
if (control.errors['email']) {
|
|
265
|
+
return { level: 'error', message: 'Please enter a valid email address.' };
|
|
266
|
+
}
|
|
267
|
+
return undefined;
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// Computed feedback for agreement checkbox
|
|
271
|
+
readonly agreementFeedback = computed<IInputFeedbackProp | undefined>(() => {
|
|
272
|
+
const control = this.form.controls.agreement;
|
|
273
|
+
const isTouched = this.touchedFields().has('agreement');
|
|
274
|
+
if (!isTouched || !control.errors) return undefined;
|
|
275
|
+
|
|
276
|
+
if (control.errors['required']) {
|
|
277
|
+
return { level: 'error', message: 'You must agree to the terms and conditions.' };
|
|
278
|
+
}
|
|
279
|
+
return undefined;
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
handleFirstNameChange(event: InputEvent): void {
|
|
283
|
+
const target = event.target as HTMLInputElement;
|
|
284
|
+
this.form.controls.firstName.setValue(target.value);
|
|
285
|
+
this.markFieldTouched('firstName');
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
handleFirstNameBlur(): void {
|
|
289
|
+
this.markFieldTouched('firstName');
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
handleLastNameChange(event: InputEvent): void {
|
|
293
|
+
const target = event.target as HTMLInputElement;
|
|
294
|
+
this.form.controls.lastName.setValue(target.value);
|
|
295
|
+
this.markFieldTouched('lastName');
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
handleLastNameBlur(): void {
|
|
299
|
+
this.markFieldTouched('lastName');
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
handleEmailChange(event: InputEvent): void {
|
|
303
|
+
const target = event.target as HTMLInputElement;
|
|
304
|
+
this.form.controls.email.setValue(target.value);
|
|
305
|
+
this.markFieldTouched('email');
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
handleEmailBlur(): void {
|
|
309
|
+
this.markFieldTouched('email');
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
handleAgreementChange(event: InputEvent): void {
|
|
313
|
+
const target = event.target as HTMLInputElement;
|
|
314
|
+
const checked = target.type === 'checkbox' ? target.checked : Boolean(target.value);
|
|
315
|
+
this.form.controls.agreement.setValue(checked);
|
|
316
|
+
this.markFieldTouched('agreement');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
handleAgreementBlur(): void {
|
|
320
|
+
this.markFieldTouched('agreement');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
private markFieldTouched(fieldName: string): void {
|
|
324
|
+
this.touchedFields.update((fields) => {
|
|
325
|
+
const newFields = new Set(fields);
|
|
326
|
+
newFields.add(fieldName);
|
|
327
|
+
return newFields;
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { DemoPageComponent } from '../shared/demo-page.component';
|
|
4
|
+
import { DemoExampleComponent } from '../shared/demo-example.component';
|
|
5
|
+
import { ModusLoaderComponent } from '../../components/modus-loader.component';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Demo page showcasing the Modus Loader component.
|
|
9
|
+
*
|
|
10
|
+
* Demonstrates loader features including:
|
|
11
|
+
* - All six loader variants (spinner, ball, bars, dots, infinity, ring)
|
|
12
|
+
* - Color options with theme-aware colors
|
|
13
|
+
* - Size options (xs, sm, md, lg)
|
|
14
|
+
* - Usage examples in real application contexts
|
|
15
|
+
*/
|
|
16
|
+
@Component({
|
|
17
|
+
selector: 'app-loader-demo-page',
|
|
18
|
+
standalone: true,
|
|
19
|
+
imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusLoaderComponent],
|
|
20
|
+
template: `
|
|
21
|
+
<demo-page
|
|
22
|
+
title="Modus Loader"
|
|
23
|
+
description="Loaders communicate that content is on the way. Select a variant that fits the space and avoid pairing multiple animations together."
|
|
24
|
+
>
|
|
25
|
+
<demo-example
|
|
26
|
+
title="All Variants"
|
|
27
|
+
description="Six different animation styles to choose from based on your use case."
|
|
28
|
+
>
|
|
29
|
+
<div class="grid grid-cols-2 md:grid-cols-3 gap-6">
|
|
30
|
+
<div class="flex flex-col items-center gap-2">
|
|
31
|
+
<modus-loader variant="spinner" size="md" />
|
|
32
|
+
<div class="text-sm text-foreground-80">Spinner</div>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="flex flex-col items-center gap-2">
|
|
35
|
+
<modus-loader variant="ball" size="md" />
|
|
36
|
+
<div class="text-sm text-foreground-80">Ball</div>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="flex flex-col items-center gap-2">
|
|
39
|
+
<modus-loader variant="bars" size="md" />
|
|
40
|
+
<div class="text-sm text-foreground-80">Bars</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="flex flex-col items-center gap-2">
|
|
43
|
+
<modus-loader variant="dots" size="md" />
|
|
44
|
+
<div class="text-sm text-foreground-80">Dots</div>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="flex flex-col items-center gap-2">
|
|
47
|
+
<modus-loader variant="infinity" size="md" />
|
|
48
|
+
<div class="text-sm text-foreground-80">Infinity</div>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="flex flex-col items-center gap-2">
|
|
51
|
+
<modus-loader variant="ring" size="md" />
|
|
52
|
+
<div class="text-sm text-foreground-80">Ring</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</demo-example>
|
|
56
|
+
|
|
57
|
+
<demo-example
|
|
58
|
+
title="Color Options"
|
|
59
|
+
description="Theme-aware colors that automatically adapt to light and dark themes."
|
|
60
|
+
>
|
|
61
|
+
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
|
|
62
|
+
<div class="flex flex-col items-center gap-2">
|
|
63
|
+
<modus-loader variant="spinner" color="primary" size="md" />
|
|
64
|
+
<div class="text-sm text-foreground-80">Primary</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="flex flex-col items-center gap-2">
|
|
67
|
+
<modus-loader variant="spinner" color="secondary" size="md" />
|
|
68
|
+
<div class="text-sm text-foreground-80">Secondary</div>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="flex flex-col items-center gap-2">
|
|
71
|
+
<modus-loader variant="spinner" color="accent" size="md" />
|
|
72
|
+
<div class="text-sm text-foreground-80">Accent</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="flex flex-col items-center gap-2">
|
|
75
|
+
<modus-loader variant="spinner" color="success" size="md" />
|
|
76
|
+
<div class="text-sm text-foreground-80">Success</div>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="flex flex-col items-center gap-2">
|
|
79
|
+
<modus-loader variant="spinner" color="warning" size="md" />
|
|
80
|
+
<div class="text-sm text-foreground-80">Warning</div>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="flex flex-col items-center gap-2">
|
|
83
|
+
<modus-loader variant="spinner" color="error" size="md" />
|
|
84
|
+
<div class="text-sm text-foreground-80">Error</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="flex flex-col items-center gap-2">
|
|
87
|
+
<modus-loader variant="spinner" color="info" size="md" />
|
|
88
|
+
<div class="text-sm text-foreground-80">Info</div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</demo-example>
|
|
92
|
+
|
|
93
|
+
<demo-example
|
|
94
|
+
title="Size Options"
|
|
95
|
+
description="Four size tokens from extra small to large for different contexts."
|
|
96
|
+
>
|
|
97
|
+
<div class="flex items-center justify-center gap-8">
|
|
98
|
+
<div class="flex flex-col items-center gap-2">
|
|
99
|
+
<modus-loader variant="spinner" size="xs" />
|
|
100
|
+
<div class="text-sm text-foreground-80">XS (16px)</div>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="flex flex-col items-center gap-2">
|
|
103
|
+
<modus-loader variant="spinner" size="sm" />
|
|
104
|
+
<div class="text-sm text-foreground-80">SM (20px)</div>
|
|
105
|
+
</div>
|
|
106
|
+
<div class="flex flex-col items-center gap-2">
|
|
107
|
+
<modus-loader variant="spinner" size="md" />
|
|
108
|
+
<div class="text-sm text-foreground-80">MD (24px)</div>
|
|
109
|
+
</div>
|
|
110
|
+
<div class="flex flex-col items-center gap-2">
|
|
111
|
+
<modus-loader variant="spinner" size="lg" />
|
|
112
|
+
<div class="text-sm text-foreground-80">LG (32px)</div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</demo-example>
|
|
116
|
+
|
|
117
|
+
<demo-example
|
|
118
|
+
title="Usage Examples"
|
|
119
|
+
description="Common patterns for using loaders in real applications."
|
|
120
|
+
>
|
|
121
|
+
<div class="flex flex-col gap-6">
|
|
122
|
+
<div class="flex items-center gap-3">
|
|
123
|
+
<modus-loader variant="spinner" size="md" />
|
|
124
|
+
<div class="text-sm text-foreground-80">Syncing records…</div>
|
|
125
|
+
</div>
|
|
126
|
+
<div class="flex items-center gap-2">
|
|
127
|
+
<modus-loader variant="dots" size="sm" color="secondary" />
|
|
128
|
+
<div class="text-sm text-foreground-80">Preparing report</div>
|
|
129
|
+
</div>
|
|
130
|
+
<div class="flex items-center gap-3">
|
|
131
|
+
<modus-loader variant="bars" size="sm" color="success" />
|
|
132
|
+
<div class="text-sm text-foreground-80">Upload complete</div>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="flex items-center gap-3">
|
|
135
|
+
<modus-loader variant="ring" size="lg" color="warning" />
|
|
136
|
+
<div class="text-lg text-foreground">Processing large dataset…</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
</demo-example>
|
|
140
|
+
</demo-page>
|
|
141
|
+
`,
|
|
142
|
+
})
|
|
143
|
+
export class LoaderDemoPageComponent {}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { DemoPageComponent } from '../shared/demo-page.component';
|
|
4
|
+
import { DemoExampleComponent } from '../shared/demo-example.component';
|
|
5
|
+
import { ModusLogoComponent, LogoName } from '../../components/modus-logo.component';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Demo page showcasing the Modus Logo component.
|
|
9
|
+
*
|
|
10
|
+
* Demonstrates logo features including:
|
|
11
|
+
* - Trimble product logos (19 logos)
|
|
12
|
+
* - Viewpoint product logos (17 logos)
|
|
13
|
+
* - Full logos vs emblem (icon-only) variants
|
|
14
|
+
* - Custom sizing with Tailwind classes
|
|
15
|
+
* - Theme awareness (automatic light/dark switching)
|
|
16
|
+
*/
|
|
17
|
+
@Component({
|
|
18
|
+
selector: 'app-logo-demo-page',
|
|
19
|
+
standalone: true,
|
|
20
|
+
imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusLogoComponent],
|
|
21
|
+
template: `
|
|
22
|
+
<demo-page
|
|
23
|
+
title="Modus Logo"
|
|
24
|
+
description="Display Trimble and Viewpoint product logos with consistent branding. Logos automatically switch between light and dark variants based on the current theme."
|
|
25
|
+
>
|
|
26
|
+
<demo-example
|
|
27
|
+
title="Trimble Product Logos"
|
|
28
|
+
description="Official Trimble product logos. Logos contain embedded brand colors and should not be modified."
|
|
29
|
+
>
|
|
30
|
+
<div class="grid grid-cols-2 gap-8">
|
|
31
|
+
@for (logo of trimbleLogos; track logo.name) {
|
|
32
|
+
<div
|
|
33
|
+
class="flex flex-col items-center gap-4 p-6 bg-muted rounded-lg"
|
|
34
|
+
>
|
|
35
|
+
<div class="h-20 flex items-center justify-center">
|
|
36
|
+
<modus-logo [name]="logo.name" customClass="max-h-20 max-w-64" />
|
|
37
|
+
</div>
|
|
38
|
+
<div class="text-sm text-muted-foreground text-center">{{ logo.display }}</div>
|
|
39
|
+
<code class="text-xs bg-background px-2 py-1 rounded">{{ logo.name }}</code>
|
|
40
|
+
</div>
|
|
41
|
+
}
|
|
42
|
+
</div>
|
|
43
|
+
</demo-example>
|
|
44
|
+
|
|
45
|
+
<demo-example
|
|
46
|
+
title="Viewpoint Product Logos"
|
|
47
|
+
description="Official Viewpoint product logos with proper brand colors."
|
|
48
|
+
>
|
|
49
|
+
<div class="grid grid-cols-2 gap-8">
|
|
50
|
+
@for (logo of viewpointLogos; track logo.name) {
|
|
51
|
+
<div
|
|
52
|
+
class="flex flex-col items-center gap-4 p-6 bg-muted rounded-lg"
|
|
53
|
+
>
|
|
54
|
+
<div class="h-20 flex items-center justify-center">
|
|
55
|
+
<modus-logo [name]="logo.name" customClass="max-h-20 max-w-64" />
|
|
56
|
+
</div>
|
|
57
|
+
<div class="text-sm text-muted-foreground text-center">{{ logo.display }}</div>
|
|
58
|
+
<code class="text-xs bg-background px-2 py-1 rounded">{{ logo.name }}</code>
|
|
59
|
+
</div>
|
|
60
|
+
}
|
|
61
|
+
</div>
|
|
62
|
+
</demo-example>
|
|
63
|
+
|
|
64
|
+
<demo-example
|
|
65
|
+
title="Emblem Variants"
|
|
66
|
+
description="Icon-only versions of logos for compact spaces like favicons, app icons, or navigation."
|
|
67
|
+
>
|
|
68
|
+
<div class="flex flex-wrap items-center gap-8">
|
|
69
|
+
@for (logo of featuredLogos; track logo.name) {
|
|
70
|
+
<div class="flex flex-col items-center gap-2">
|
|
71
|
+
<div
|
|
72
|
+
class="w-16 h-16 flex items-center justify-center bg-card rounded-lg border-default"
|
|
73
|
+
>
|
|
74
|
+
<modus-logo [name]="logo.name" [emblem]="true" customClass="w-10 h-10" />
|
|
75
|
+
</div>
|
|
76
|
+
<div class="text-xs text-foreground-60">{{ logo.display }}</div>
|
|
77
|
+
</div>
|
|
78
|
+
}
|
|
79
|
+
</div>
|
|
80
|
+
</demo-example>
|
|
81
|
+
|
|
82
|
+
<demo-example
|
|
83
|
+
title="Size Variations"
|
|
84
|
+
description="Control logo size using Tailwind CSS classes via the customClass prop."
|
|
85
|
+
>
|
|
86
|
+
<div class="flex flex-wrap items-end gap-8">
|
|
87
|
+
<div class="flex flex-col items-center gap-2">
|
|
88
|
+
<modus-logo name="trimble" customClass="h-6 w-auto" />
|
|
89
|
+
<div class="text-xs text-foreground-60">Small (h-6)</div>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="flex flex-col items-center gap-2">
|
|
92
|
+
<modus-logo name="trimble" customClass="h-10 w-auto" />
|
|
93
|
+
<div class="text-xs text-foreground-60">Medium (h-10)</div>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="flex flex-col items-center gap-2">
|
|
96
|
+
<modus-logo name="trimble" customClass="h-16 w-auto" />
|
|
97
|
+
<div class="text-xs text-foreground-60">Large (h-16)</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="flex flex-col items-center gap-2">
|
|
100
|
+
<modus-logo name="trimble" customClass="h-24 w-auto" />
|
|
101
|
+
<div class="text-xs text-foreground-60">Extra Large (h-24)</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</demo-example>
|
|
105
|
+
|
|
106
|
+
<demo-example
|
|
107
|
+
title="Theme Awareness"
|
|
108
|
+
description="Logos automatically switch between light and dark variants based on the data-theme attribute. Try switching themes to see the change."
|
|
109
|
+
>
|
|
110
|
+
<div class="flex flex-wrap items-center gap-8">
|
|
111
|
+
<div class="flex flex-col items-center gap-3 p-6 bg-card rounded-lg border-default">
|
|
112
|
+
<modus-logo name="trimble" customClass="h-12 w-auto" />
|
|
113
|
+
<div class="text-sm text-foreground-60">Trimble</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="flex flex-col items-center gap-3 p-6 bg-card rounded-lg border-default">
|
|
116
|
+
<modus-logo name="connect" customClass="h-12 w-auto" />
|
|
117
|
+
<div class="text-sm text-foreground-60">Trimble Connect</div>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="flex flex-col items-center gap-3 p-6 bg-card rounded-lg border-default">
|
|
120
|
+
<modus-logo name="viewpoint" customClass="h-12 w-auto" />
|
|
121
|
+
<div class="text-sm text-foreground-60">Viewpoint</div>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="mt-4 p-4 bg-muted rounded-lg">
|
|
125
|
+
<div class="text-sm text-foreground-80">
|
|
126
|
+
<div class="font-semibold mb-1">How it works</div>
|
|
127
|
+
<div>
|
|
128
|
+
The logo component observes the data-theme attribute on the HTML element and
|
|
129
|
+
automatically loads the appropriate light or dark SVG variant. No additional
|
|
130
|
+
configuration is required.
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</demo-example>
|
|
135
|
+
</demo-page>
|
|
136
|
+
`,
|
|
137
|
+
})
|
|
138
|
+
export class LogoDemoPageComponent {
|
|
139
|
+
/** Trimble product logos (19 logos) */
|
|
140
|
+
readonly trimbleLogos: { name: LogoName; display: string }[] = [
|
|
141
|
+
{ name: 'trimble', display: 'Trimble' },
|
|
142
|
+
{ name: 'siteworks', display: 'Siteworks' },
|
|
143
|
+
{ name: 'earthworks', display: 'Earthworks' },
|
|
144
|
+
{ name: 'financials', display: 'Financials' },
|
|
145
|
+
{ name: 'worksmanager', display: 'WorksManager' },
|
|
146
|
+
{ name: 'connect', display: 'Connect' },
|
|
147
|
+
{ name: 'unity_construct', display: 'Unity Construct' },
|
|
148
|
+
{ name: 'trade_servicelive', display: 'Trade ServiceLive' },
|
|
149
|
+
{ name: 'buildable', display: 'Buildable' },
|
|
150
|
+
{ name: 'livecount', display: 'LiveCount' },
|
|
151
|
+
{ name: 'supplier_xchange', display: 'Supplier Xchange' },
|
|
152
|
+
{ name: 'app_xchange', display: 'App Xchange' },
|
|
153
|
+
{ name: 'trimble_unity', display: 'Trimble Unity' },
|
|
154
|
+
{ name: 'sketchup', display: 'SketchUp' },
|
|
155
|
+
{ name: 'pc_miler', display: 'PC Miler' },
|
|
156
|
+
{ name: 'copilot', display: 'CoPilot' },
|
|
157
|
+
{ name: 'trimble_pay', display: 'Trimble Pay' },
|
|
158
|
+
{ name: 'projectsight', display: 'ProjectSight' },
|
|
159
|
+
{ name: 'demand_planning', display: 'Demand Planning' },
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
/** Viewpoint product logos (17 logos) */
|
|
163
|
+
readonly viewpointLogos: { name: LogoName; display: string }[] = [
|
|
164
|
+
{ name: 'viewpoint', display: 'Viewpoint' },
|
|
165
|
+
{ name: 'viewpoint_analytics', display: 'Analytics' },
|
|
166
|
+
{ name: 'viewpoint_epayments', display: 'ePayments' },
|
|
167
|
+
{ name: 'viewpoint_estimating', display: 'Estimating' },
|
|
168
|
+
{ name: 'viewpoint_field_management', display: 'Field Management' },
|
|
169
|
+
{ name: 'viewpoint_field_time', display: 'Field Time' },
|
|
170
|
+
{ name: 'viewpoint_financial_controls', display: 'Financial Controls' },
|
|
171
|
+
{ name: 'viewpoint_hr_management', display: 'HR Management' },
|
|
172
|
+
{ name: 'viewpoint_jobpac_connect', display: 'Jobpac Connect' },
|
|
173
|
+
{ name: 'viewpoint_procontractor', display: 'ProContractor' },
|
|
174
|
+
{ name: 'viewpoint_spectrum', display: 'Spectrum' },
|
|
175
|
+
{ name: 'viewpoint_team', display: 'Team' },
|
|
176
|
+
{ name: 'viewpoint_vista', display: 'Vista' },
|
|
177
|
+
{ name: 'viewpoint_spectrum_service_tech', display: 'Spectrum Service Tech' },
|
|
178
|
+
{ name: 'viewpoint_for_projects', display: 'For Projects' },
|
|
179
|
+
{ name: 'viewpoint_vista_field_service', display: 'Vista Field Service' },
|
|
180
|
+
{ name: 'viewpoint_field_view', display: 'Field View' },
|
|
181
|
+
];
|
|
182
|
+
|
|
183
|
+
/** Featured logos for emblem demonstration */
|
|
184
|
+
readonly featuredLogos: { name: LogoName; display: string }[] = [
|
|
185
|
+
{ name: 'trimble', display: 'Trimble' },
|
|
186
|
+
{ name: 'connect', display: 'Connect' },
|
|
187
|
+
{ name: 'sketchup', display: 'SketchUp' },
|
|
188
|
+
{ name: 'viewpoint', display: 'Viewpoint' },
|
|
189
|
+
{ name: 'viewpoint_vista', display: 'Vista' },
|
|
190
|
+
];
|
|
191
|
+
}
|