@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,318 @@
|
|
|
1
|
+
import { Component, signal, ChangeDetectionStrategy } 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 { ModusTabsComponent } from '../../components/modus-tabs.component';
|
|
6
|
+
import type { ITab } from '@trimble-oss/moduswebcomponents';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Demo page showcasing the Modus Tabs component.
|
|
10
|
+
*
|
|
11
|
+
* Demonstrates all tabs features including:
|
|
12
|
+
* - Basic bordered tabs for dashboards
|
|
13
|
+
* - Compact boxed tabs for cards and sidebars
|
|
14
|
+
* - Icon-only tabs for compact navigation
|
|
15
|
+
* - Icon + Label combinations
|
|
16
|
+
* - Label-only tabs
|
|
17
|
+
* - Disabled tabs
|
|
18
|
+
* - Interactive tab switching with state tracking
|
|
19
|
+
*/
|
|
20
|
+
@Component({
|
|
21
|
+
selector: 'app-tabs-demo-page',
|
|
22
|
+
imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusTabsComponent],
|
|
23
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
24
|
+
template: `
|
|
25
|
+
<demo-page
|
|
26
|
+
title="Modus Tabs"
|
|
27
|
+
description="Tabs organize content into logical sections without leaving the page. Keep labels short and related."
|
|
28
|
+
>
|
|
29
|
+
<!-- Project Tabs (Bordered) -->
|
|
30
|
+
<demo-example
|
|
31
|
+
title="Project tabs"
|
|
32
|
+
description="Bordered tabs pair well with dashboards and keep the content anchored."
|
|
33
|
+
>
|
|
34
|
+
<modus-tabs
|
|
35
|
+
[tabs]="projectTabs"
|
|
36
|
+
[activeTabIndex]="projectActiveTab()"
|
|
37
|
+
tabStyle="bordered"
|
|
38
|
+
size="md"
|
|
39
|
+
(tabChange)="handleProjectTabChange($event)"
|
|
40
|
+
>
|
|
41
|
+
<div slot="tab-0" class="text-sm text-foreground-80 py-2">
|
|
42
|
+
Review highlights, key metrics, and quick actions for the current project.
|
|
43
|
+
</div>
|
|
44
|
+
<div slot="tab-1" class="text-sm text-foreground-80 py-2">
|
|
45
|
+
Explore recent updates in chronological order to stay informed.
|
|
46
|
+
</div>
|
|
47
|
+
<div slot="tab-2" class="text-sm text-foreground-80 py-2">
|
|
48
|
+
Access shared documents and media assets that support this initiative.
|
|
49
|
+
</div>
|
|
50
|
+
</modus-tabs>
|
|
51
|
+
</demo-example>
|
|
52
|
+
|
|
53
|
+
<!-- Compact Tabs (Boxed) -->
|
|
54
|
+
<demo-example
|
|
55
|
+
title="Compact tabs"
|
|
56
|
+
description="Use the small size when tabs sit inside cards or sidebars."
|
|
57
|
+
>
|
|
58
|
+
<modus-tabs
|
|
59
|
+
[tabs]="compactTabs"
|
|
60
|
+
[activeTabIndex]="compactActiveTab()"
|
|
61
|
+
tabStyle="boxed"
|
|
62
|
+
size="sm"
|
|
63
|
+
(tabChange)="handleCompactTabChange($event)"
|
|
64
|
+
>
|
|
65
|
+
<div slot="tab-0" class="text-sm text-foreground-80 py-2">
|
|
66
|
+
Outline the work and align on timelines.
|
|
67
|
+
</div>
|
|
68
|
+
<div slot="tab-1" class="text-sm text-foreground-80 py-2">
|
|
69
|
+
Track progress as each milestone is completed.
|
|
70
|
+
</div>
|
|
71
|
+
<div slot="tab-2" class="text-sm text-foreground-80 py-2">
|
|
72
|
+
Capture lessons learned and share with the team.
|
|
73
|
+
</div>
|
|
74
|
+
</modus-tabs>
|
|
75
|
+
</demo-example>
|
|
76
|
+
|
|
77
|
+
<!-- Icon-only Tabs -->
|
|
78
|
+
<demo-example
|
|
79
|
+
title="Icon-only tabs"
|
|
80
|
+
description="Use icons without labels for compact navigation. Include aria-label for accessibility."
|
|
81
|
+
>
|
|
82
|
+
<modus-tabs
|
|
83
|
+
[tabs]="iconOnlyTabs"
|
|
84
|
+
[activeTabIndex]="iconOnlyActiveTab()"
|
|
85
|
+
tabStyle="bordered"
|
|
86
|
+
size="sm"
|
|
87
|
+
(tabChange)="handleIconOnlyTabChange($event)"
|
|
88
|
+
>
|
|
89
|
+
<div slot="tab-0" class="text-sm text-foreground-80 py-2">
|
|
90
|
+
Overview of your key metrics and recent activity.
|
|
91
|
+
</div>
|
|
92
|
+
<div slot="tab-1" class="text-sm text-foreground-80 py-2">
|
|
93
|
+
Detailed charts and performance insights.
|
|
94
|
+
</div>
|
|
95
|
+
<div slot="tab-2" class="text-sm text-foreground-80 py-2">
|
|
96
|
+
Geographic data and location-based information.
|
|
97
|
+
</div>
|
|
98
|
+
<div slot="tab-3" class="text-sm text-foreground-80 py-2">
|
|
99
|
+
View your latest notifications and alerts.
|
|
100
|
+
</div>
|
|
101
|
+
</modus-tabs>
|
|
102
|
+
</demo-example>
|
|
103
|
+
|
|
104
|
+
<!-- Icon + Label Tabs -->
|
|
105
|
+
<demo-example
|
|
106
|
+
title="Icon + Label tabs"
|
|
107
|
+
description="Combine icons with labels for clear navigation. Icons can be positioned left or right."
|
|
108
|
+
>
|
|
109
|
+
<modus-tabs
|
|
110
|
+
[tabs]="iconLabelTabs"
|
|
111
|
+
[activeTabIndex]="iconLabelActiveTab()"
|
|
112
|
+
tabStyle="bordered"
|
|
113
|
+
size="md"
|
|
114
|
+
(tabChange)="handleIconLabelTabChange($event)"
|
|
115
|
+
>
|
|
116
|
+
<div slot="tab-0" class="text-sm text-foreground-80 py-2">
|
|
117
|
+
Overview of your key metrics and recent activity.
|
|
118
|
+
</div>
|
|
119
|
+
<div slot="tab-1" class="text-sm text-foreground-80 py-2">
|
|
120
|
+
Detailed charts and performance insights.
|
|
121
|
+
</div>
|
|
122
|
+
<div slot="tab-2" class="text-sm text-foreground-80 py-2">
|
|
123
|
+
Configure your application settings and preferences.
|
|
124
|
+
</div>
|
|
125
|
+
<div slot="tab-3" class="text-sm text-foreground-80 py-2">
|
|
126
|
+
Find answers to common questions and get support.
|
|
127
|
+
</div>
|
|
128
|
+
</modus-tabs>
|
|
129
|
+
</demo-example>
|
|
130
|
+
|
|
131
|
+
<!-- Label-only Tabs -->
|
|
132
|
+
<demo-example
|
|
133
|
+
title="Label-only tabs"
|
|
134
|
+
description="Text-only tabs work well for simple navigation without visual clutter."
|
|
135
|
+
>
|
|
136
|
+
<modus-tabs
|
|
137
|
+
[tabs]="labelOnlyTabs"
|
|
138
|
+
[activeTabIndex]="labelOnlyActiveTab()"
|
|
139
|
+
tabStyle="boxed"
|
|
140
|
+
size="lg"
|
|
141
|
+
(tabChange)="handleLabelOnlyTabChange($event)"
|
|
142
|
+
>
|
|
143
|
+
<div slot="tab-0" class="text-sm text-foreground-80 py-2">
|
|
144
|
+
High-level summary of the current project status.
|
|
145
|
+
</div>
|
|
146
|
+
<div slot="tab-1" class="text-sm text-foreground-80 py-2">
|
|
147
|
+
Comprehensive information about all project aspects.
|
|
148
|
+
</div>
|
|
149
|
+
<div slot="tab-2" class="text-sm text-foreground-80 py-2">
|
|
150
|
+
Complete timeline of changes and updates.
|
|
151
|
+
</div>
|
|
152
|
+
<div slot="tab-3" class="text-sm text-foreground-80 py-2">
|
|
153
|
+
Configuration options and preferences.
|
|
154
|
+
</div>
|
|
155
|
+
</modus-tabs>
|
|
156
|
+
</demo-example>
|
|
157
|
+
|
|
158
|
+
<!-- Disabled Tabs -->
|
|
159
|
+
<demo-example
|
|
160
|
+
title="Disabled tabs"
|
|
161
|
+
description="Disable tabs that are not currently available or relevant."
|
|
162
|
+
>
|
|
163
|
+
<modus-tabs
|
|
164
|
+
[tabs]="disabledTabs"
|
|
165
|
+
[activeTabIndex]="disabledActiveTab()"
|
|
166
|
+
tabStyle="bordered"
|
|
167
|
+
size="md"
|
|
168
|
+
(tabChange)="handleDisabledTabChange($event)"
|
|
169
|
+
>
|
|
170
|
+
<div slot="tab-0" class="text-sm text-foreground-80 py-2">
|
|
171
|
+
This tab is currently active and functional.
|
|
172
|
+
</div>
|
|
173
|
+
<div slot="tab-1" class="text-sm text-foreground-80 py-2">
|
|
174
|
+
This content is not accessible due to disabled tab.
|
|
175
|
+
</div>
|
|
176
|
+
<div slot="tab-2" class="text-sm text-foreground-80 py-2">
|
|
177
|
+
Another active tab with different content.
|
|
178
|
+
</div>
|
|
179
|
+
<div slot="tab-3" class="text-sm text-foreground-80 py-2">
|
|
180
|
+
This content is also not accessible.
|
|
181
|
+
</div>
|
|
182
|
+
</modus-tabs>
|
|
183
|
+
</demo-example>
|
|
184
|
+
|
|
185
|
+
<!-- Interactive Example -->
|
|
186
|
+
<demo-example
|
|
187
|
+
title="Interactive example"
|
|
188
|
+
description="Switch tabs to see the event handling and state tracking in action."
|
|
189
|
+
>
|
|
190
|
+
<modus-tabs
|
|
191
|
+
[tabs]="interactiveTabs"
|
|
192
|
+
[activeTabIndex]="interactiveActiveTab()"
|
|
193
|
+
tabStyle="bordered"
|
|
194
|
+
size="md"
|
|
195
|
+
(tabChange)="handleInteractiveTabChange($event)"
|
|
196
|
+
>
|
|
197
|
+
<div slot="tab-0" class="text-sm text-foreground-80 py-2">
|
|
198
|
+
<div class="flex flex-col gap-2">
|
|
199
|
+
<div class="font-medium">Home Content</div>
|
|
200
|
+
<div>Welcome to the home section. Navigate between tabs to explore.</div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
<div slot="tab-1" class="text-sm text-foreground-80 py-2">
|
|
204
|
+
<div class="flex flex-col gap-2">
|
|
205
|
+
<div class="font-medium">Profile Content</div>
|
|
206
|
+
<div>View and manage your profile settings here.</div>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
<div slot="tab-2" class="text-sm text-foreground-80 py-2">
|
|
210
|
+
<div class="flex flex-col gap-2">
|
|
211
|
+
<div class="font-medium">Messages Content</div>
|
|
212
|
+
<div>Check your recent messages and notifications.</div>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</modus-tabs>
|
|
216
|
+
|
|
217
|
+
@if (tabChangeCount() > 0) {
|
|
218
|
+
<div class="mt-4 p-4 rounded-lg bg-muted text-muted-foreground">
|
|
219
|
+
<div class="font-semibold mb-2">Tab Change Event</div>
|
|
220
|
+
<div class="text-sm">Total tab switches: {{ tabChangeCount() }}</div>
|
|
221
|
+
@if (lastTabChange()) {
|
|
222
|
+
<div class="text-xs mt-1 text-muted-foreground">
|
|
223
|
+
Last change: Tab {{ lastTabChange()!.previousTab }} to Tab
|
|
224
|
+
{{ lastTabChange()!.newTab }}
|
|
225
|
+
</div>
|
|
226
|
+
}
|
|
227
|
+
</div>
|
|
228
|
+
}
|
|
229
|
+
</demo-example>
|
|
230
|
+
</demo-page>
|
|
231
|
+
`,
|
|
232
|
+
})
|
|
233
|
+
export class TabsDemoPageComponent {
|
|
234
|
+
// Project tabs data
|
|
235
|
+
readonly projectTabs: ITab[] = [{ label: 'Summary' }, { label: 'Activity' }, { label: 'Files' }];
|
|
236
|
+
readonly projectActiveTab = signal(0);
|
|
237
|
+
|
|
238
|
+
// Compact tabs data
|
|
239
|
+
readonly compactTabs: ITab[] = [{ label: 'Plan' }, { label: 'Deliver' }, { label: 'Review' }];
|
|
240
|
+
readonly compactActiveTab = signal(0);
|
|
241
|
+
|
|
242
|
+
// Icon-only tabs data
|
|
243
|
+
readonly iconOnlyTabs: ITab[] = [
|
|
244
|
+
{ icon: 'dashboard' },
|
|
245
|
+
{ icon: 'bar_graph' },
|
|
246
|
+
{ icon: 'map' },
|
|
247
|
+
{ icon: 'notifications' },
|
|
248
|
+
];
|
|
249
|
+
readonly iconOnlyActiveTab = signal(0);
|
|
250
|
+
|
|
251
|
+
// Icon + Label tabs data
|
|
252
|
+
readonly iconLabelTabs: ITab[] = [
|
|
253
|
+
{ icon: 'dashboard', label: 'Dashboard', iconPosition: 'left' },
|
|
254
|
+
{ icon: 'bar_graph', label: 'Analytics', iconPosition: 'left' },
|
|
255
|
+
{ icon: 'settings', label: 'Settings', iconPosition: 'right' },
|
|
256
|
+
{ icon: 'help', label: 'Help', iconPosition: 'right' },
|
|
257
|
+
];
|
|
258
|
+
readonly iconLabelActiveTab = signal(0);
|
|
259
|
+
|
|
260
|
+
// Label-only tabs data
|
|
261
|
+
readonly labelOnlyTabs: ITab[] = [
|
|
262
|
+
{ label: 'Overview' },
|
|
263
|
+
{ label: 'Details' },
|
|
264
|
+
{ label: 'History' },
|
|
265
|
+
{ label: 'Settings' },
|
|
266
|
+
];
|
|
267
|
+
readonly labelOnlyActiveTab = signal(0);
|
|
268
|
+
|
|
269
|
+
// Disabled tabs data
|
|
270
|
+
readonly disabledTabs: ITab[] = [
|
|
271
|
+
{ label: 'Active Tab', icon: 'check' },
|
|
272
|
+
{ label: 'Disabled Tab', icon: 'lock', disabled: true },
|
|
273
|
+
{ label: 'Another Active', icon: 'star' },
|
|
274
|
+
{ label: 'Also Disabled', disabled: true },
|
|
275
|
+
];
|
|
276
|
+
readonly disabledActiveTab = signal(0);
|
|
277
|
+
|
|
278
|
+
// Interactive tabs data
|
|
279
|
+
readonly interactiveTabs: ITab[] = [
|
|
280
|
+
{ label: 'Home', icon: 'house' },
|
|
281
|
+
{ label: 'Profile', icon: 'user' },
|
|
282
|
+
{ label: 'Messages', icon: 'email' },
|
|
283
|
+
];
|
|
284
|
+
readonly interactiveActiveTab = signal(0);
|
|
285
|
+
readonly tabChangeCount = signal(0);
|
|
286
|
+
readonly lastTabChange = signal<{ previousTab: number; newTab: number } | null>(null);
|
|
287
|
+
|
|
288
|
+
// Tab change handlers
|
|
289
|
+
handleProjectTabChange(event: { previousTab: number; newTab: number }): void {
|
|
290
|
+
this.projectActiveTab.set(event.newTab);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
handleCompactTabChange(event: { previousTab: number; newTab: number }): void {
|
|
294
|
+
this.compactActiveTab.set(event.newTab);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
handleIconOnlyTabChange(event: { previousTab: number; newTab: number }): void {
|
|
298
|
+
this.iconOnlyActiveTab.set(event.newTab);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
handleIconLabelTabChange(event: { previousTab: number; newTab: number }): void {
|
|
302
|
+
this.iconLabelActiveTab.set(event.newTab);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
handleLabelOnlyTabChange(event: { previousTab: number; newTab: number }): void {
|
|
306
|
+
this.labelOnlyActiveTab.set(event.newTab);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
handleDisabledTabChange(event: { previousTab: number; newTab: number }): void {
|
|
310
|
+
this.disabledActiveTab.set(event.newTab);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
handleInteractiveTabChange(event: { previousTab: number; newTab: number }): void {
|
|
314
|
+
this.interactiveActiveTab.set(event.newTab);
|
|
315
|
+
this.tabChangeCount.update((count) => count + 1);
|
|
316
|
+
this.lastTabChange.set(event);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
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 { ModusTextInputComponent } from '../../components/modus-text-input.component';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Demo page showcasing the Modus Text Input component.
|
|
9
|
+
*
|
|
10
|
+
* Demonstrates text input features including:
|
|
11
|
+
* - Basic text input
|
|
12
|
+
* - Input types (email, password, etc.)
|
|
13
|
+
* - Sizes
|
|
14
|
+
* - With clear button
|
|
15
|
+
* - With search icon
|
|
16
|
+
* - Interactive examples
|
|
17
|
+
*/
|
|
18
|
+
@Component({
|
|
19
|
+
selector: 'app-text-input-demo-page',
|
|
20
|
+
standalone: true,
|
|
21
|
+
imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusTextInputComponent],
|
|
22
|
+
template: `
|
|
23
|
+
<demo-page
|
|
24
|
+
title="Modus Text Input"
|
|
25
|
+
description="Text input components provide a way for users to enter text data. Use text inputs for names, emails, passwords, and any other text-based form data."
|
|
26
|
+
>
|
|
27
|
+
<demo-example title="Input Types" description="Text inputs with different input types.">
|
|
28
|
+
<div class="flex flex-col gap-6">
|
|
29
|
+
<div class="flex flex-col gap-2">
|
|
30
|
+
<modus-text-input
|
|
31
|
+
inputId="text-type-input"
|
|
32
|
+
label="Text"
|
|
33
|
+
type="text"
|
|
34
|
+
placeholder="Enter text"
|
|
35
|
+
/>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div class="flex flex-col gap-2">
|
|
39
|
+
<modus-text-input
|
|
40
|
+
inputId="email-type-input"
|
|
41
|
+
label="Email"
|
|
42
|
+
type="email"
|
|
43
|
+
placeholder="user@example.com"
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div class="flex flex-col gap-2">
|
|
48
|
+
<modus-text-input
|
|
49
|
+
inputId="password-type-input"
|
|
50
|
+
label="Password"
|
|
51
|
+
type="password"
|
|
52
|
+
placeholder="Enter password"
|
|
53
|
+
/>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div class="flex flex-col gap-2">
|
|
57
|
+
<modus-text-input
|
|
58
|
+
inputId="url-type-input"
|
|
59
|
+
label="URL"
|
|
60
|
+
type="url"
|
|
61
|
+
placeholder="https://example.com"
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<div class="flex flex-col gap-2">
|
|
66
|
+
<modus-text-input
|
|
67
|
+
inputId="tel-type-input"
|
|
68
|
+
label="Phone"
|
|
69
|
+
type="tel"
|
|
70
|
+
placeholder="+1 (555) 123-4567"
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</demo-example>
|
|
75
|
+
|
|
76
|
+
<demo-example title="Text Input Sizes" description="Text inputs in different sizes.">
|
|
77
|
+
<div class="flex flex-col gap-6">
|
|
78
|
+
<div class="flex flex-col gap-2">
|
|
79
|
+
<modus-text-input
|
|
80
|
+
inputId="small-text-input"
|
|
81
|
+
label="Small"
|
|
82
|
+
placeholder="Enter text"
|
|
83
|
+
size="sm"
|
|
84
|
+
/>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<div class="flex flex-col gap-2">
|
|
88
|
+
<modus-text-input
|
|
89
|
+
inputId="medium-text-input"
|
|
90
|
+
label="Medium"
|
|
91
|
+
placeholder="Enter text"
|
|
92
|
+
size="md"
|
|
93
|
+
/>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div class="flex flex-col gap-2">
|
|
97
|
+
<modus-text-input
|
|
98
|
+
inputId="large-text-input"
|
|
99
|
+
label="Large"
|
|
100
|
+
placeholder="Enter text"
|
|
101
|
+
size="lg"
|
|
102
|
+
/>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</demo-example>
|
|
106
|
+
|
|
107
|
+
<demo-example
|
|
108
|
+
title="Text Input with Icons"
|
|
109
|
+
description="Text inputs with clear button or search icon."
|
|
110
|
+
>
|
|
111
|
+
<div class="flex flex-col gap-6">
|
|
112
|
+
<div class="flex flex-col gap-2">
|
|
113
|
+
<modus-text-input
|
|
114
|
+
inputId="clear-input"
|
|
115
|
+
label="With Clear"
|
|
116
|
+
placeholder="Type to search..."
|
|
117
|
+
[includeClear]="true"
|
|
118
|
+
/>
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
<div class="flex flex-col gap-2">
|
|
122
|
+
<modus-text-input
|
|
123
|
+
inputId="search-input"
|
|
124
|
+
label="Search"
|
|
125
|
+
placeholder="Search..."
|
|
126
|
+
[includeSearch]="true"
|
|
127
|
+
/>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</demo-example>
|
|
131
|
+
|
|
132
|
+
<demo-example
|
|
133
|
+
title="Required and Disabled States"
|
|
134
|
+
description="Text inputs in required and disabled states."
|
|
135
|
+
>
|
|
136
|
+
<div class="flex flex-col gap-6">
|
|
137
|
+
<div class="flex flex-col gap-2">
|
|
138
|
+
<modus-text-input
|
|
139
|
+
inputId="required-input"
|
|
140
|
+
label="Required"
|
|
141
|
+
placeholder="This field is required"
|
|
142
|
+
[required]="true"
|
|
143
|
+
/>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<div class="flex flex-col gap-2">
|
|
147
|
+
<modus-text-input
|
|
148
|
+
inputId="disabled-input"
|
|
149
|
+
label="Disabled"
|
|
150
|
+
placeholder="Cannot edit"
|
|
151
|
+
[disabled]="true"
|
|
152
|
+
value="Disabled value"
|
|
153
|
+
/>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
</demo-example>
|
|
157
|
+
</demo-page>
|
|
158
|
+
`,
|
|
159
|
+
})
|
|
160
|
+
export class TextInputDemoPageComponent {}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { DemoPageComponent } from '../shared/demo-page.component';
|
|
3
|
+
import { DemoExampleComponent } from '../shared/demo-example.component';
|
|
4
|
+
import { ModusTextareaComponent } from '../../components/modus-textarea.component';
|
|
5
|
+
import type { IInputFeedbackProp } from '@trimble-oss/moduswebcomponents';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Demo page showcasing the Modus Textarea component.
|
|
9
|
+
*
|
|
10
|
+
* Demonstrates textarea features including:
|
|
11
|
+
* - Customer feedback (default size)
|
|
12
|
+
* - Detailed notes (increased height with info feedback)
|
|
13
|
+
* - Feedback states (info, success, error)
|
|
14
|
+
*/
|
|
15
|
+
@Component({
|
|
16
|
+
selector: 'app-textarea-demo-page',
|
|
17
|
+
imports: [DemoPageComponent, DemoExampleComponent, ModusTextareaComponent],
|
|
18
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
19
|
+
template: `
|
|
20
|
+
<demo-page
|
|
21
|
+
title="Modus Textarea"
|
|
22
|
+
description="Textareas support longer responses or feedback. Offer guidance on what to include and set an appropriate height."
|
|
23
|
+
>
|
|
24
|
+
<!-- Customer Feedback Example (from React) -->
|
|
25
|
+
<demo-example
|
|
26
|
+
title="Customer Feedback"
|
|
27
|
+
description="Use the default size for two to three sentence responses."
|
|
28
|
+
>
|
|
29
|
+
<modus-textarea
|
|
30
|
+
label="Share feedback"
|
|
31
|
+
placeholder="Tell us what worked well and what can improve."
|
|
32
|
+
[rows]="4"
|
|
33
|
+
/>
|
|
34
|
+
</demo-example>
|
|
35
|
+
|
|
36
|
+
<!-- Detailed Notes Example (from React) -->
|
|
37
|
+
<demo-example
|
|
38
|
+
title="Detailed Notes"
|
|
39
|
+
description="Increase the height when expecting longer entries."
|
|
40
|
+
>
|
|
41
|
+
<modus-textarea label="Site visit notes" [rows]="6" [feedback]="siteVisitFeedback" />
|
|
42
|
+
</demo-example>
|
|
43
|
+
|
|
44
|
+
<!-- Feedback States -->
|
|
45
|
+
<demo-example
|
|
46
|
+
title="Feedback States"
|
|
47
|
+
description="Display validation feedback with info, success, and error states."
|
|
48
|
+
>
|
|
49
|
+
<div class="flex flex-col gap-6">
|
|
50
|
+
<modus-textarea
|
|
51
|
+
label="Info feedback"
|
|
52
|
+
placeholder="Enter details..."
|
|
53
|
+
[rows]="3"
|
|
54
|
+
[feedback]="infoFeedback"
|
|
55
|
+
/>
|
|
56
|
+
<modus-textarea
|
|
57
|
+
label="Success feedback"
|
|
58
|
+
placeholder="Enter details..."
|
|
59
|
+
[rows]="3"
|
|
60
|
+
value="Valid input provided."
|
|
61
|
+
[feedback]="successFeedback"
|
|
62
|
+
/>
|
|
63
|
+
<modus-textarea
|
|
64
|
+
label="Error feedback"
|
|
65
|
+
placeholder="Enter details..."
|
|
66
|
+
[rows]="3"
|
|
67
|
+
[feedback]="errorFeedback"
|
|
68
|
+
/>
|
|
69
|
+
</div>
|
|
70
|
+
</demo-example>
|
|
71
|
+
</demo-page>
|
|
72
|
+
`,
|
|
73
|
+
})
|
|
74
|
+
export class TextareaDemoPageComponent {
|
|
75
|
+
// Feedback configurations
|
|
76
|
+
readonly siteVisitFeedback: IInputFeedbackProp = {
|
|
77
|
+
level: 'info',
|
|
78
|
+
message: 'Include location details and follow-up actions.',
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
readonly infoFeedback: IInputFeedbackProp = {
|
|
82
|
+
level: 'info',
|
|
83
|
+
message: 'This is helpful information about the field.',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
readonly successFeedback: IInputFeedbackProp = {
|
|
87
|
+
level: 'success',
|
|
88
|
+
message: 'Great! Your input looks good.',
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
readonly errorFeedback: IInputFeedbackProp = {
|
|
92
|
+
level: 'error',
|
|
93
|
+
message: 'This field is required. Please enter a value.',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, 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 { ModusThemeSwitcherComponent } from '../../components/modus-theme-switcher.component';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Demo page showcasing the Modus Theme Switcher component.
|
|
9
|
+
*
|
|
10
|
+
* Demonstrates theme switching functionality including:
|
|
11
|
+
* - Basic theme toggle between light and dark modes
|
|
12
|
+
* - System preference detection
|
|
13
|
+
* - Theme change event handling
|
|
14
|
+
*/
|
|
15
|
+
@Component({
|
|
16
|
+
selector: 'app-theme-switcher-demo-page',
|
|
17
|
+
standalone: true,
|
|
18
|
+
imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusThemeSwitcherComponent],
|
|
19
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
20
|
+
template: `
|
|
21
|
+
<demo-page
|
|
22
|
+
title="Modus Theme Switcher"
|
|
23
|
+
description="The theme switcher toggles between Modus light and dark modes. Place it in the header or settings where users expect personalization controls."
|
|
24
|
+
[showBackButton]="false"
|
|
25
|
+
>
|
|
26
|
+
<demo-example
|
|
27
|
+
title="Theme toggle"
|
|
28
|
+
description="Use the default configuration to respect system preferences and allow quick switching."
|
|
29
|
+
>
|
|
30
|
+
<div class="flex items-center gap-4">
|
|
31
|
+
<modus-theme-switcher [ariaLabel]="'Switch theme'" />
|
|
32
|
+
<div class="text-sm text-foreground-80">Toggle between light and dark experiences.</div>
|
|
33
|
+
</div>
|
|
34
|
+
</demo-example>
|
|
35
|
+
</demo-page>
|
|
36
|
+
`,
|
|
37
|
+
})
|
|
38
|
+
export class ThemeSwitcherDemoPageComponent {}
|