@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,82 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcButtonGroup } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type { Components } from '@trimble-oss/moduswebcomponents';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props supported by the {@link ModusButtonGroupComponent}.
|
|
8
|
+
*/
|
|
9
|
+
export interface ModusButtonGroupProps {
|
|
10
|
+
/** Variant applied to all buttons within the group. */
|
|
11
|
+
variant?: Components.ModusWcButtonGroup['variant'];
|
|
12
|
+
/** Color applied to all buttons within the group. */
|
|
13
|
+
color?: Components.ModusWcButtonGroup['color'];
|
|
14
|
+
/** Disable all buttons within the group. */
|
|
15
|
+
disabled?: Components.ModusWcButtonGroup['disabled'];
|
|
16
|
+
/** Layout orientation for the group. */
|
|
17
|
+
orientation?: Components.ModusWcButtonGroup['orientation'];
|
|
18
|
+
/** Selection behavior for the group. */
|
|
19
|
+
selectionType?: Components.ModusWcButtonGroup['selectionType'];
|
|
20
|
+
/** Accessible label for the group. */
|
|
21
|
+
ariaLabel?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Angular wrapper for the Modus button group web component.
|
|
26
|
+
*/
|
|
27
|
+
@Component({
|
|
28
|
+
selector: 'modus-button-group',
|
|
29
|
+
imports: [CommonModule, ModusWcButtonGroup],
|
|
30
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
31
|
+
template: `
|
|
32
|
+
<modus-wc-button-group
|
|
33
|
+
[variant]="variant()"
|
|
34
|
+
[color]="color()"
|
|
35
|
+
[disabled]="disabled()"
|
|
36
|
+
[orientation]="orientation()"
|
|
37
|
+
[selectionType]="selectionType()"
|
|
38
|
+
[attr.aria-label]="ariaLabel()"
|
|
39
|
+
(buttonGroupClick)="handleButtonGroupClick($event)"
|
|
40
|
+
(buttonSelectionChange)="handleButtonSelectionChange($event)"
|
|
41
|
+
>
|
|
42
|
+
<ng-content />
|
|
43
|
+
</modus-wc-button-group>
|
|
44
|
+
`,
|
|
45
|
+
})
|
|
46
|
+
export class ModusButtonGroupComponent {
|
|
47
|
+
/** Variant applied to all buttons within the group. */
|
|
48
|
+
readonly variant = input<Components.ModusWcButtonGroup['variant'] | undefined>('outlined');
|
|
49
|
+
|
|
50
|
+
/** Color applied to all buttons within the group. */
|
|
51
|
+
readonly color = input<Components.ModusWcButtonGroup['color'] | undefined>();
|
|
52
|
+
|
|
53
|
+
/** Disable all buttons within the group. */
|
|
54
|
+
readonly disabled = input<Components.ModusWcButtonGroup['disabled'] | undefined>(false);
|
|
55
|
+
|
|
56
|
+
/** Layout orientation for the group. */
|
|
57
|
+
readonly orientation = input<Components.ModusWcButtonGroup['orientation'] | undefined>('horizontal');
|
|
58
|
+
|
|
59
|
+
/** Selection behavior for the group. */
|
|
60
|
+
readonly selectionType = input<Components.ModusWcButtonGroup['selectionType'] | undefined>('default');
|
|
61
|
+
|
|
62
|
+
/** Accessible label for the group. */
|
|
63
|
+
readonly ariaLabel = input<string | undefined>();
|
|
64
|
+
|
|
65
|
+
/** Emits when a button in the group is clicked. */
|
|
66
|
+
readonly buttonGroupClick = output<{ button: HTMLElement; isSelected: boolean }>();
|
|
67
|
+
|
|
68
|
+
/** Emits when the group selection changes. */
|
|
69
|
+
readonly buttonSelectionChange = output<{ selectedButtons: HTMLElement[] }>();
|
|
70
|
+
|
|
71
|
+
handleButtonGroupClick(
|
|
72
|
+
event: CustomEvent<{ button: HTMLElement; isSelected: boolean }>,
|
|
73
|
+
): void {
|
|
74
|
+
this.buttonGroupClick.emit(event.detail);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
handleButtonSelectionChange(
|
|
78
|
+
event: CustomEvent<{ selectedButtons: HTMLElement[] }>,
|
|
79
|
+
): void {
|
|
80
|
+
this.buttonSelectionChange.emit(event.detail);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcButton } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Button color variant
|
|
7
|
+
*/
|
|
8
|
+
export type ButtonColor = 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Button style variant
|
|
12
|
+
*/
|
|
13
|
+
export type ButtonVariant = 'filled' | 'outlined' | 'borderless';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Button size
|
|
17
|
+
*/
|
|
18
|
+
export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Button shape
|
|
22
|
+
*/
|
|
23
|
+
export type ButtonShape = 'rectangle' | 'square' | 'circle';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Icon position relative to button text
|
|
27
|
+
*/
|
|
28
|
+
export type IconPosition = 'left' | 'right' | 'only';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Props for the ModusButton component
|
|
32
|
+
*/
|
|
33
|
+
export interface ModusButtonProps {
|
|
34
|
+
/** The color of the button */
|
|
35
|
+
color?: ButtonColor;
|
|
36
|
+
/** The variant of the button */
|
|
37
|
+
variant?: ButtonVariant;
|
|
38
|
+
/** The size of the button */
|
|
39
|
+
size?: ButtonSize;
|
|
40
|
+
/** The shape of the button */
|
|
41
|
+
shape?: ButtonShape;
|
|
42
|
+
/** Whether the button is disabled */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
/** Whether the button should take up the full width */
|
|
45
|
+
fullWidth?: boolean;
|
|
46
|
+
/** Whether the button is pressed (for toggle buttons) */
|
|
47
|
+
pressed?: boolean;
|
|
48
|
+
/** The type of the button */
|
|
49
|
+
type?: 'button' | 'submit' | 'reset';
|
|
50
|
+
/** An icon to display in the button */
|
|
51
|
+
icon?: string;
|
|
52
|
+
/** The position of the icon relative to the button text */
|
|
53
|
+
iconPosition?: IconPosition;
|
|
54
|
+
/** Icon size using Tailwind text utilities. If not provided, size is determined by button size and icon position */
|
|
55
|
+
iconSize?:
|
|
56
|
+
| 'text-2xs'
|
|
57
|
+
| 'text-xs'
|
|
58
|
+
| 'text-sm'
|
|
59
|
+
| 'text-base'
|
|
60
|
+
| 'text-lg'
|
|
61
|
+
| 'text-xl'
|
|
62
|
+
| 'text-2xl'
|
|
63
|
+
| 'text-3xl'
|
|
64
|
+
| 'text-4xl';
|
|
65
|
+
/** The ARIA label for the button */
|
|
66
|
+
ariaLabel?: string;
|
|
67
|
+
/** A callback function to handle button clicks */
|
|
68
|
+
onButtonClick?: () => void;
|
|
69
|
+
/** A custom CSS class to apply to the button */
|
|
70
|
+
className?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Renders a Modus button component with full customization support.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```html
|
|
78
|
+
* <!-- Basic button -->
|
|
79
|
+
* <modus-button>Click me</modus-button>
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```html
|
|
84
|
+
* <!-- Icon button with custom styling -->
|
|
85
|
+
* <modus-button
|
|
86
|
+
* icon="add"
|
|
87
|
+
* iconPosition="left"
|
|
88
|
+
* color="primary"
|
|
89
|
+
* size="lg"
|
|
90
|
+
* (buttonClick)="handleClick()"
|
|
91
|
+
* >
|
|
92
|
+
* Add Item
|
|
93
|
+
* </modus-button>
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```html
|
|
98
|
+
* <!-- Icon-only button with accessibility -->
|
|
99
|
+
* <modus-button
|
|
100
|
+
* icon="settings"
|
|
101
|
+
* iconPosition="only"
|
|
102
|
+
* ariaLabel="Open settings"
|
|
103
|
+
* (buttonClick)="openSettings()"
|
|
104
|
+
* ></modus-button>
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
@Component({
|
|
108
|
+
selector: 'modus-button',
|
|
109
|
+
standalone: true,
|
|
110
|
+
imports: [CommonModule, ModusWcButton],
|
|
111
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
112
|
+
template: `
|
|
113
|
+
<modus-wc-button
|
|
114
|
+
[color]="color()"
|
|
115
|
+
[variant]="variant()"
|
|
116
|
+
[size]="size()"
|
|
117
|
+
[shape]="shape()"
|
|
118
|
+
[disabled]="disabled()"
|
|
119
|
+
[fullWidth]="fullWidth()"
|
|
120
|
+
[pressed]="pressed()"
|
|
121
|
+
[type]="type()"
|
|
122
|
+
[customClass]="className()"
|
|
123
|
+
[attr.aria-label]="getAriaLabel()"
|
|
124
|
+
(buttonClick)="handleButtonClick($event)"
|
|
125
|
+
>
|
|
126
|
+
@if (icon() && iconPosition() === 'left') {
|
|
127
|
+
<i class="modus-icons {{ getIconSize() }} mr-2">{{ icon() }}</i>
|
|
128
|
+
}
|
|
129
|
+
<ng-content></ng-content>
|
|
130
|
+
@if (icon() && iconPosition() === 'right') {
|
|
131
|
+
<i class="modus-icons {{ getIconSize() }} ml-2">{{ icon() }}</i>
|
|
132
|
+
} @if (icon() && iconPosition() === 'only') {
|
|
133
|
+
<i class="modus-icons {{ getIconSize() }}">{{ icon() }}</i>
|
|
134
|
+
}
|
|
135
|
+
</modus-wc-button>
|
|
136
|
+
`,
|
|
137
|
+
})
|
|
138
|
+
export class ModusButtonComponent {
|
|
139
|
+
/** The color of the button */
|
|
140
|
+
readonly color = input<ButtonColor>('primary');
|
|
141
|
+
|
|
142
|
+
/** The variant of the button */
|
|
143
|
+
readonly variant = input<ButtonVariant>('filled');
|
|
144
|
+
|
|
145
|
+
/** The size of the button */
|
|
146
|
+
readonly size = input<ButtonSize>('md');
|
|
147
|
+
|
|
148
|
+
/** The shape of the button */
|
|
149
|
+
readonly shape = input<ButtonShape>('rectangle');
|
|
150
|
+
|
|
151
|
+
/** Whether the button is disabled */
|
|
152
|
+
readonly disabled = input<boolean>(false);
|
|
153
|
+
|
|
154
|
+
/** Whether the button should take up the full width */
|
|
155
|
+
readonly fullWidth = input<boolean>(false);
|
|
156
|
+
|
|
157
|
+
/** Whether the button is pressed (for toggle buttons) */
|
|
158
|
+
readonly pressed = input<boolean>(false);
|
|
159
|
+
|
|
160
|
+
/** The type of the button */
|
|
161
|
+
readonly type = input<'button' | 'submit' | 'reset'>('button');
|
|
162
|
+
|
|
163
|
+
/** An icon to display in the button */
|
|
164
|
+
readonly icon = input<string | undefined>();
|
|
165
|
+
|
|
166
|
+
/** The position of the icon relative to the button text */
|
|
167
|
+
readonly iconPosition = input<IconPosition>('left');
|
|
168
|
+
|
|
169
|
+
/** Icon size using Tailwind text utilities. If not provided, size is determined by button size and icon position */
|
|
170
|
+
readonly iconSize = input<
|
|
171
|
+
| 'text-2xs'
|
|
172
|
+
| 'text-xs'
|
|
173
|
+
| 'text-sm'
|
|
174
|
+
| 'text-base'
|
|
175
|
+
| 'text-lg'
|
|
176
|
+
| 'text-xl'
|
|
177
|
+
| 'text-2xl'
|
|
178
|
+
| 'text-3xl'
|
|
179
|
+
| 'text-4xl'
|
|
180
|
+
>();
|
|
181
|
+
|
|
182
|
+
/** The ARIA label for the button */
|
|
183
|
+
readonly ariaLabel = input<string | undefined>();
|
|
184
|
+
|
|
185
|
+
/** A custom CSS class to apply to the button */
|
|
186
|
+
readonly className = input<string | undefined>();
|
|
187
|
+
|
|
188
|
+
/** Callback function for button clicks (optional) */
|
|
189
|
+
readonly onButtonClick = input<(() => void) | undefined>();
|
|
190
|
+
|
|
191
|
+
/** Event emitter for button clicks */
|
|
192
|
+
readonly buttonClick = output<MouseEvent | KeyboardEvent>();
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Handles button click events from the Modus Web Component
|
|
196
|
+
*
|
|
197
|
+
* Emits the event to parent components and calls the optional callback
|
|
198
|
+
*
|
|
199
|
+
* @param event - The click or keyboard event from the button (from Stencil CustomEvent)
|
|
200
|
+
*/
|
|
201
|
+
handleButtonClick(event: CustomEvent<MouseEvent | KeyboardEvent>): void {
|
|
202
|
+
// Stop event propagation to prevent double-firing
|
|
203
|
+
event.stopPropagation();
|
|
204
|
+
|
|
205
|
+
if (!this.disabled()) {
|
|
206
|
+
// Extract the actual event from CustomEvent detail
|
|
207
|
+
const actualEvent = event.detail;
|
|
208
|
+
|
|
209
|
+
// Emit Angular event
|
|
210
|
+
this.buttonClick.emit(actualEvent);
|
|
211
|
+
|
|
212
|
+
// Call React-like callback if provided
|
|
213
|
+
const callback = this.onButtonClick();
|
|
214
|
+
if (callback) {
|
|
215
|
+
callback();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Determines the appropriate icon size based on button size, icon position, and explicit iconSize input.
|
|
222
|
+
*
|
|
223
|
+
* @returns The Tailwind text utility class for icon sizing
|
|
224
|
+
*/
|
|
225
|
+
getIconSize(): string {
|
|
226
|
+
// If iconSize is explicitly provided, use it
|
|
227
|
+
const explicitSize = this.iconSize();
|
|
228
|
+
if (explicitSize) {
|
|
229
|
+
return explicitSize;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Determine size based on button size and icon position
|
|
233
|
+
const buttonSize = this.size();
|
|
234
|
+
const position = this.iconPosition();
|
|
235
|
+
|
|
236
|
+
// Icon-only buttons are generally larger
|
|
237
|
+
if (position === 'only') {
|
|
238
|
+
switch (buttonSize) {
|
|
239
|
+
case 'xs':
|
|
240
|
+
return 'text-sm'; // 12px
|
|
241
|
+
case 'sm':
|
|
242
|
+
return 'text-base'; // 14px
|
|
243
|
+
case 'md':
|
|
244
|
+
return 'text-xl'; // 18px (current default)
|
|
245
|
+
case 'lg':
|
|
246
|
+
return 'text-2xl'; // 20px
|
|
247
|
+
default:
|
|
248
|
+
return 'text-xl'; // 18px default
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Icons with text (left/right position)
|
|
253
|
+
switch (buttonSize) {
|
|
254
|
+
case 'xs':
|
|
255
|
+
return 'text-xs'; // 10px
|
|
256
|
+
case 'sm':
|
|
257
|
+
return 'text-sm'; // 12px
|
|
258
|
+
case 'md':
|
|
259
|
+
return 'text-lg'; // 16px (current default)
|
|
260
|
+
case 'lg':
|
|
261
|
+
return 'text-xl'; // 18px
|
|
262
|
+
default:
|
|
263
|
+
return 'text-lg'; // 16px default
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Generates appropriate ARIA label for accessibility.
|
|
269
|
+
*
|
|
270
|
+
* For icon-only buttons, ensures proper accessibility by returning
|
|
271
|
+
* the provided ariaLabel or falling back to undefined.
|
|
272
|
+
*
|
|
273
|
+
* @returns The appropriate ARIA label or undefined
|
|
274
|
+
*/
|
|
275
|
+
getAriaLabel(): string | undefined {
|
|
276
|
+
const ariaLabelValue = this.ariaLabel();
|
|
277
|
+
if (ariaLabelValue) {
|
|
278
|
+
return ariaLabelValue;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// For icon-only buttons, ariaLabel should be provided
|
|
282
|
+
// If not provided, the component will rely on default ARIA behavior
|
|
283
|
+
if (this.iconPosition() === 'only' && !ariaLabelValue) {
|
|
284
|
+
// Note: In a production app, you might want to extract text content
|
|
285
|
+
// from ng-content as a fallback, but that requires ViewChild and
|
|
286
|
+
// content projection which is more complex
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcCard } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type { Components } from '@trimble-oss/moduswebcomponents';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props supported by the {@link ModusCardComponent}.
|
|
8
|
+
*/
|
|
9
|
+
export interface ModusCardProps {
|
|
10
|
+
/** Applies background coverage to figures provided in the header slot. */
|
|
11
|
+
backgroundFigure?: Components.ModusWcCard['backgroundFigure'];
|
|
12
|
+
/** Enables the bordered card style. */
|
|
13
|
+
bordered?: Components.ModusWcCard['bordered'];
|
|
14
|
+
/** Optional CSS class applied to the card. */
|
|
15
|
+
className?: Components.ModusWcCard['customClass'];
|
|
16
|
+
/** Layout orientation for the card content. */
|
|
17
|
+
layout?: Components.ModusWcCard['layout'];
|
|
18
|
+
/** Controls the internal padding density. */
|
|
19
|
+
padding?: Components.ModusWcCard['padding'];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Angular wrapper for the Modus card web component.
|
|
24
|
+
*
|
|
25
|
+
* Cards provide a flexible container for grouping related content with optional
|
|
26
|
+
* header and footer slots.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```html
|
|
30
|
+
* <modus-card layout="vertical" padding="normal">
|
|
31
|
+
* <h3 slot="header">Project Overview</h3>
|
|
32
|
+
* <p>Important summary information lives here.</p>
|
|
33
|
+
* <div slot="footer">Updated 5 minutes ago</div>
|
|
34
|
+
* </modus-card>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
@Component({
|
|
38
|
+
selector: 'modus-card',
|
|
39
|
+
imports: [CommonModule, ModusWcCard],
|
|
40
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
41
|
+
template: `
|
|
42
|
+
<modus-wc-card
|
|
43
|
+
[backgroundFigure]="backgroundFigure()"
|
|
44
|
+
[bordered]="bordered()"
|
|
45
|
+
[customClass]="className()"
|
|
46
|
+
[layout]="layout()"
|
|
47
|
+
[padding]="padding()"
|
|
48
|
+
>
|
|
49
|
+
<ng-content select="[slot='header']" slot="header" />
|
|
50
|
+
<ng-content select="[slot='title']" slot="title" />
|
|
51
|
+
<ng-content select="[slot='subtitle']" slot="subtitle" />
|
|
52
|
+
<ng-content />
|
|
53
|
+
<ng-content select="[slot='actions']" slot="actions" />
|
|
54
|
+
<ng-content select="[slot='footer']" slot="footer" />
|
|
55
|
+
</modus-wc-card>
|
|
56
|
+
`,
|
|
57
|
+
})
|
|
58
|
+
export class ModusCardComponent {
|
|
59
|
+
/** Applies background coverage to figures provided in the header slot. */
|
|
60
|
+
readonly backgroundFigure = input<boolean | undefined>();
|
|
61
|
+
|
|
62
|
+
/** Enables the bordered card style. */
|
|
63
|
+
readonly bordered = input<boolean | undefined>();
|
|
64
|
+
|
|
65
|
+
/** Optional CSS class applied to the card. */
|
|
66
|
+
readonly className = input<string | undefined>();
|
|
67
|
+
|
|
68
|
+
/** Layout orientation for the card content. */
|
|
69
|
+
readonly layout = input<'vertical' | 'horizontal' | undefined>('vertical');
|
|
70
|
+
|
|
71
|
+
/** Controls the internal padding density. */
|
|
72
|
+
readonly padding = input<'normal' | 'compact' | undefined>('normal');
|
|
73
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcCheckbox } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type { Components, ModusSize } from '@trimble-oss/moduswebcomponents';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props supported by the {@link ModusCheckboxComponent}.
|
|
8
|
+
*/
|
|
9
|
+
export interface ModusCheckboxProps {
|
|
10
|
+
/** Custom CSS class applied to the checkbox input. */
|
|
11
|
+
className?: Components.ModusWcCheckbox['customClass'];
|
|
12
|
+
/** Whether the checkbox is disabled. */
|
|
13
|
+
disabled?: Components.ModusWcCheckbox['disabled'];
|
|
14
|
+
/** Indeterminate visual state for tri-state checkboxes. */
|
|
15
|
+
indeterminate?: Components.ModusWcCheckbox['indeterminate'];
|
|
16
|
+
/** Identifier applied to the checkbox input element. */
|
|
17
|
+
inputId?: Components.ModusWcCheckbox['inputId'];
|
|
18
|
+
/** Tab index applied to the checkbox input. */
|
|
19
|
+
inputTabIndex?: Components.ModusWcCheckbox['inputTabIndex'];
|
|
20
|
+
/** Optional label rendered alongside the checkbox. */
|
|
21
|
+
label?: Components.ModusWcCheckbox['label'];
|
|
22
|
+
/** Name attribute submitted in form payloads. */
|
|
23
|
+
name?: Components.ModusWcCheckbox['name'];
|
|
24
|
+
/** Marks the checkbox as required. */
|
|
25
|
+
required?: Components.ModusWcCheckbox['required'];
|
|
26
|
+
/** Size token controlling checkbox dimensions. */
|
|
27
|
+
size?: ModusSize;
|
|
28
|
+
/** Bound value indicating whether the checkbox is selected. */
|
|
29
|
+
value?: Components.ModusWcCheckbox['value'];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Angular wrapper for the Modus checkbox web component.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```html
|
|
37
|
+
* <modus-checkbox
|
|
38
|
+
* label="Accept terms"
|
|
39
|
+
* [value]="acceptTerms()"
|
|
40
|
+
* (valueChange)="acceptTerms.set($event)"
|
|
41
|
+
* />
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
@Component({
|
|
45
|
+
selector: 'modus-checkbox',
|
|
46
|
+
imports: [CommonModule, ModusWcCheckbox],
|
|
47
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
48
|
+
template: `
|
|
49
|
+
<modus-wc-checkbox
|
|
50
|
+
[customClass]="className()"
|
|
51
|
+
[disabled]="disabled()"
|
|
52
|
+
[indeterminate]="indeterminate()"
|
|
53
|
+
[inputId]="inputId()"
|
|
54
|
+
[inputTabIndex]="inputTabIndex()"
|
|
55
|
+
[label]="label()"
|
|
56
|
+
[name]="name()"
|
|
57
|
+
[required]="required()"
|
|
58
|
+
[size]="size()"
|
|
59
|
+
[value]="value()"
|
|
60
|
+
(inputBlur)="handleBlur($event)"
|
|
61
|
+
(inputChange)="handleChange($event)"
|
|
62
|
+
(inputFocus)="handleFocus($event)"
|
|
63
|
+
/>
|
|
64
|
+
`,
|
|
65
|
+
})
|
|
66
|
+
export class ModusCheckboxComponent {
|
|
67
|
+
/** Custom CSS class applied to the checkbox input. */
|
|
68
|
+
readonly className = input<string | undefined>();
|
|
69
|
+
|
|
70
|
+
/** Whether the checkbox is disabled. */
|
|
71
|
+
readonly disabled = input<boolean | undefined>(false);
|
|
72
|
+
|
|
73
|
+
/** Indeterminate visual state for tri-state checkboxes. */
|
|
74
|
+
readonly indeterminate = input<boolean | undefined>(false);
|
|
75
|
+
|
|
76
|
+
/** Identifier applied to the checkbox input element. */
|
|
77
|
+
readonly inputId = input<string | undefined>();
|
|
78
|
+
|
|
79
|
+
/** Tab index applied to the checkbox input. */
|
|
80
|
+
readonly inputTabIndex = input<number | undefined>();
|
|
81
|
+
|
|
82
|
+
/** Optional label rendered alongside the checkbox. */
|
|
83
|
+
readonly label = input<string | undefined>();
|
|
84
|
+
|
|
85
|
+
/** Name attribute submitted in form payloads. */
|
|
86
|
+
readonly name = input<string | undefined>('');
|
|
87
|
+
|
|
88
|
+
/** Marks the checkbox as required. */
|
|
89
|
+
readonly required = input<boolean | undefined>(false);
|
|
90
|
+
|
|
91
|
+
/** Size token controlling checkbox dimensions. */
|
|
92
|
+
readonly size = input<ModusSize | undefined>('md');
|
|
93
|
+
|
|
94
|
+
/** Bound value indicating whether the checkbox is selected. */
|
|
95
|
+
readonly value = input<boolean | undefined>(false);
|
|
96
|
+
|
|
97
|
+
/** Emits when the checkbox loses focus. */
|
|
98
|
+
readonly inputBlur = output<FocusEvent>();
|
|
99
|
+
|
|
100
|
+
/** Emits when the checkbox value changes. */
|
|
101
|
+
readonly inputChange = output<InputEvent>();
|
|
102
|
+
|
|
103
|
+
/** Emits when the checkbox gains focus. */
|
|
104
|
+
readonly inputFocus = output<FocusEvent>();
|
|
105
|
+
|
|
106
|
+
handleBlur(event: CustomEvent<FocusEvent>): void {
|
|
107
|
+
this.inputBlur.emit(event.detail);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
handleChange(event: CustomEvent<InputEvent>): void {
|
|
111
|
+
this.inputChange.emit(event.detail);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
handleFocus(event: CustomEvent<FocusEvent>): void {
|
|
115
|
+
this.inputFocus.emit(event.detail);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcChip } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type { Components, ModusSize } from '@trimble-oss/moduswebcomponents';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props supported by the {@link ModusChipComponent}.
|
|
8
|
+
*/
|
|
9
|
+
export interface ModusChipProps {
|
|
10
|
+
/** Marks the chip as active. */
|
|
11
|
+
active?: Components.ModusWcChip['active'];
|
|
12
|
+
/** Custom CSS class applied to the chip wrapper. */
|
|
13
|
+
className?: Components.ModusWcChip['customClass'];
|
|
14
|
+
/** Disables user interaction. */
|
|
15
|
+
disabled?: Components.ModusWcChip['disabled'];
|
|
16
|
+
/** Highlights the chip error state. */
|
|
17
|
+
hasError?: Components.ModusWcChip['hasError'];
|
|
18
|
+
/** Text label rendered inside the chip. */
|
|
19
|
+
label?: Components.ModusWcChip['label'];
|
|
20
|
+
/** Visual shape of the chip. */
|
|
21
|
+
shape?: Components.ModusWcChip['shape'];
|
|
22
|
+
/** Displays the remove icon button. */
|
|
23
|
+
showRemove?: Components.ModusWcChip['showRemove'];
|
|
24
|
+
/** Size token controlling chip dimensions. */
|
|
25
|
+
size?: ModusSize;
|
|
26
|
+
/** Visual variant controlling background and outline. */
|
|
27
|
+
variant?: Components.ModusWcChip['variant'];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Angular wrapper for the Modus chip web component.
|
|
32
|
+
*
|
|
33
|
+
* Chips are compact elements for displaying selections or filters. Use the
|
|
34
|
+
* `(chipClick)` and `(chipRemove)` outputs to respond to user interaction.
|
|
35
|
+
*/
|
|
36
|
+
@Component({
|
|
37
|
+
selector: 'modus-chip',
|
|
38
|
+
imports: [CommonModule, ModusWcChip],
|
|
39
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
40
|
+
template: `
|
|
41
|
+
<modus-wc-chip
|
|
42
|
+
[active]="active()"
|
|
43
|
+
[customClass]="className()"
|
|
44
|
+
[disabled]="disabled()"
|
|
45
|
+
[hasError]="hasError()"
|
|
46
|
+
[label]="label()"
|
|
47
|
+
[shape]="shape()"
|
|
48
|
+
[showRemove]="showRemove()"
|
|
49
|
+
[size]="size()"
|
|
50
|
+
[variant]="variant()"
|
|
51
|
+
(chipClick)="handleChipClick($event)"
|
|
52
|
+
(chipRemove)="handleChipRemove($event)"
|
|
53
|
+
/>
|
|
54
|
+
`,
|
|
55
|
+
})
|
|
56
|
+
export class ModusChipComponent {
|
|
57
|
+
/** Marks the chip as active. */
|
|
58
|
+
readonly active = input<boolean | undefined>(false);
|
|
59
|
+
|
|
60
|
+
/** Custom CSS class applied to the chip wrapper. */
|
|
61
|
+
readonly className = input<string | undefined>();
|
|
62
|
+
|
|
63
|
+
/** Disables user interaction. */
|
|
64
|
+
readonly disabled = input<boolean | undefined>(false);
|
|
65
|
+
|
|
66
|
+
/** Highlights the chip error state. */
|
|
67
|
+
readonly hasError = input<boolean | undefined>(false);
|
|
68
|
+
|
|
69
|
+
/** Text label rendered inside the chip. */
|
|
70
|
+
readonly label = input<string | undefined>();
|
|
71
|
+
|
|
72
|
+
/** Visual shape of the chip. */
|
|
73
|
+
readonly shape = input<'rectangle' | 'circle' | undefined>('rectangle');
|
|
74
|
+
|
|
75
|
+
/** Displays the remove icon button. */
|
|
76
|
+
readonly showRemove = input<boolean | undefined>(false);
|
|
77
|
+
|
|
78
|
+
/** Size token controlling chip dimensions. */
|
|
79
|
+
readonly size = input<ModusSize | undefined>('md');
|
|
80
|
+
|
|
81
|
+
/** Visual variant controlling background and outline. */
|
|
82
|
+
readonly variant = input<'filled' | 'outline' | undefined>('filled');
|
|
83
|
+
|
|
84
|
+
/** Emits when the chip is clicked. */
|
|
85
|
+
readonly chipClick = output<MouseEvent | KeyboardEvent>();
|
|
86
|
+
|
|
87
|
+
/** Emits when the remove icon is activated. */
|
|
88
|
+
readonly chipRemove = output<MouseEvent | KeyboardEvent>();
|
|
89
|
+
|
|
90
|
+
handleChipClick(event: CustomEvent<MouseEvent | KeyboardEvent>): void {
|
|
91
|
+
this.chipClick.emit(event.detail);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
handleChipRemove(event: CustomEvent<MouseEvent | KeyboardEvent>): void {
|
|
95
|
+
this.chipRemove.emit(event.detail);
|
|
96
|
+
}
|
|
97
|
+
}
|