@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,118 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcCollapse } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Collapse size variant
|
|
7
|
+
*/
|
|
8
|
+
export type CollapseSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Collapse options interface for configuring the collapse header
|
|
12
|
+
*/
|
|
13
|
+
export interface ICollapseOptions {
|
|
14
|
+
/** The title to render in the collapse header */
|
|
15
|
+
title: string;
|
|
16
|
+
/** The description to render in the collapse header */
|
|
17
|
+
description?: string;
|
|
18
|
+
/** The Modus icon name to render in the collapse header */
|
|
19
|
+
icon?: string;
|
|
20
|
+
/** The icon's aria-label */
|
|
21
|
+
iconAriaLabel?: string;
|
|
22
|
+
/** The size of the collapse header */
|
|
23
|
+
size?: CollapseSize;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Props for the ModusCollapse component
|
|
28
|
+
*/
|
|
29
|
+
export interface ModusCollapseProps {
|
|
30
|
+
/** Indicates that the component should have a border */
|
|
31
|
+
bordered?: boolean;
|
|
32
|
+
/** Custom CSS class to apply to the outer div */
|
|
33
|
+
className?: string;
|
|
34
|
+
/** Controls whether the collapse is expanded or not */
|
|
35
|
+
expanded?: boolean;
|
|
36
|
+
/** A unique identifier used to set the id attributes of various elements */
|
|
37
|
+
collapseId?: string;
|
|
38
|
+
/** Configuration options for rendering the pre-laid out collapse component */
|
|
39
|
+
options?: ICollapseOptions;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Renders a Modus collapse component for showing and hiding content.
|
|
44
|
+
*
|
|
45
|
+
* The collapse component supports two slots:
|
|
46
|
+
* - `header` slot: For custom header content (when options is not set)
|
|
47
|
+
* - `content` slot: For the collapsible content
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```html
|
|
51
|
+
* <!-- Basic collapse with options -->
|
|
52
|
+
* <modus-collapse [options]="collapseOptions">
|
|
53
|
+
* <div slot="content">Collapse content</div>
|
|
54
|
+
* </modus-collapse>
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```html
|
|
59
|
+
* <!-- Custom header collapse -->
|
|
60
|
+
* <modus-collapse>
|
|
61
|
+
* <div slot="header">Custom Header</div>
|
|
62
|
+
* <div slot="content">Collapse content</div>
|
|
63
|
+
* </modus-collapse>
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
@Component({
|
|
67
|
+
selector: 'modus-collapse',
|
|
68
|
+
standalone: true,
|
|
69
|
+
imports: [CommonModule, ModusWcCollapse],
|
|
70
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
71
|
+
template: `
|
|
72
|
+
<modus-wc-collapse
|
|
73
|
+
[bordered]="bordered()"
|
|
74
|
+
[customClass]="className()"
|
|
75
|
+
[expanded]="expanded()"
|
|
76
|
+
[collapseId]="collapseId()"
|
|
77
|
+
[options]="options()"
|
|
78
|
+
[attr.aria-label]="ariaLabel()"
|
|
79
|
+
(expandedChange)="handleExpandedChange($event)"
|
|
80
|
+
>
|
|
81
|
+
<ng-content></ng-content>
|
|
82
|
+
</modus-wc-collapse>
|
|
83
|
+
`,
|
|
84
|
+
})
|
|
85
|
+
export class ModusCollapseComponent {
|
|
86
|
+
/** Indicates that the component should have a border */
|
|
87
|
+
readonly bordered = input<boolean | undefined>(false);
|
|
88
|
+
|
|
89
|
+
/** Custom CSS class to apply to the outer div */
|
|
90
|
+
readonly className = input<string | undefined>();
|
|
91
|
+
|
|
92
|
+
/** Controls whether the collapse is expanded or not */
|
|
93
|
+
readonly expanded = input<boolean | undefined>(false);
|
|
94
|
+
|
|
95
|
+
/** A unique identifier used to set the id attributes of various elements */
|
|
96
|
+
readonly collapseId = input<string | undefined>();
|
|
97
|
+
|
|
98
|
+
/** Configuration options for rendering the pre-laid out collapse component */
|
|
99
|
+
readonly options = input<ICollapseOptions | undefined>();
|
|
100
|
+
|
|
101
|
+
/** The ARIA label for the collapse */
|
|
102
|
+
readonly ariaLabel = input<string | undefined>();
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Event emitted when the expanded prop is internally changed.
|
|
106
|
+
* Emits an object with `expanded` (boolean) property.
|
|
107
|
+
*/
|
|
108
|
+
readonly expandedChange = output<{ expanded: boolean }>();
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Handles expanded change events from the Modus Collapse Web Component
|
|
112
|
+
*
|
|
113
|
+
* @param event - The custom event from the collapse containing expanded state
|
|
114
|
+
*/
|
|
115
|
+
handleExpandedChange(event: CustomEvent<{ expanded: boolean }>): void {
|
|
116
|
+
this.expandedChange.emit(event.detail);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcDate } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type {
|
|
5
|
+
Components,
|
|
6
|
+
DaisySize,
|
|
7
|
+
IInputFeedbackProp,
|
|
8
|
+
WeekStartDay,
|
|
9
|
+
} from '@trimble-oss/moduswebcomponents';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Props supported by the {@link ModusDateComponent}.
|
|
13
|
+
*/
|
|
14
|
+
export interface ModusDateProps {
|
|
15
|
+
/** Enables the bordered input style. */
|
|
16
|
+
bordered?: Components.ModusWcDate['bordered'];
|
|
17
|
+
/** Custom CSS class applied to the host element. */
|
|
18
|
+
className?: Components.ModusWcDate['customClass'];
|
|
19
|
+
/** Disables input interaction. */
|
|
20
|
+
disabled?: Components.ModusWcDate['disabled'];
|
|
21
|
+
/** Feedback message displayed below the control. */
|
|
22
|
+
feedback?: IInputFeedbackProp;
|
|
23
|
+
/** Date format pattern. */
|
|
24
|
+
format?: 'yyyy-mm-dd' | 'dd-mm-yyyy' | 'yyyy/mm/dd' | 'dd/mm/yyyy' | 'MMM DD, YYYY';
|
|
25
|
+
/** Identifier applied to the native input. */
|
|
26
|
+
inputId?: Components.ModusWcDate['inputId'];
|
|
27
|
+
/** Tab index applied to the native input. */
|
|
28
|
+
inputTabIndex?: Components.ModusWcDate['inputTabIndex'];
|
|
29
|
+
/** Input label text. */
|
|
30
|
+
label?: Components.ModusWcDate['label'];
|
|
31
|
+
/** Maximum allowed date value. */
|
|
32
|
+
max?: Components.ModusWcDate['max'];
|
|
33
|
+
/** Minimum allowed date value. */
|
|
34
|
+
min?: Components.ModusWcDate['min'];
|
|
35
|
+
/** Name attribute submitted in forms. */
|
|
36
|
+
name?: Components.ModusWcDate['name'];
|
|
37
|
+
/** Puts the input in read-only mode. */
|
|
38
|
+
readOnly?: Components.ModusWcDate['readOnly'];
|
|
39
|
+
/** Marks the input as required. */
|
|
40
|
+
required?: Components.ModusWcDate['required'];
|
|
41
|
+
/** Control size token. */
|
|
42
|
+
size?: DaisySize;
|
|
43
|
+
/** Current date value. */
|
|
44
|
+
value?: Components.ModusWcDate['value'];
|
|
45
|
+
/** First day of the week for the calendar view. */
|
|
46
|
+
weekStartDay?: WeekStartDay;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Angular wrapper for the Modus date input web component.
|
|
51
|
+
*/
|
|
52
|
+
@Component({
|
|
53
|
+
selector: 'modus-date',
|
|
54
|
+
imports: [CommonModule, ModusWcDate],
|
|
55
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
56
|
+
template: `
|
|
57
|
+
<modus-wc-date
|
|
58
|
+
[bordered]="bordered()"
|
|
59
|
+
[customClass]="className()"
|
|
60
|
+
[disabled]="disabled()"
|
|
61
|
+
[feedback]="feedback()"
|
|
62
|
+
[format]="format()"
|
|
63
|
+
[inputId]="inputId()"
|
|
64
|
+
[inputTabIndex]="inputTabIndex()"
|
|
65
|
+
[label]="label()"
|
|
66
|
+
[max]="max()"
|
|
67
|
+
[min]="min()"
|
|
68
|
+
[name]="name()"
|
|
69
|
+
[readOnly]="readOnly()"
|
|
70
|
+
[required]="required()"
|
|
71
|
+
[size]="size()"
|
|
72
|
+
[value]="value()"
|
|
73
|
+
[weekStartDay]="weekStartDay()"
|
|
74
|
+
(inputBlur)="handleBlur($event)"
|
|
75
|
+
(inputChange)="handleChange($event)"
|
|
76
|
+
(inputFocus)="handleFocus($event)"
|
|
77
|
+
(calendarMonthChange)="handleCalendarMonthChange($event)"
|
|
78
|
+
(calendarYearChange)="handleCalendarYearChange($event)"
|
|
79
|
+
/>
|
|
80
|
+
`,
|
|
81
|
+
})
|
|
82
|
+
export class ModusDateComponent {
|
|
83
|
+
/** Enables the bordered input style. */
|
|
84
|
+
readonly bordered = input<boolean | undefined>(true);
|
|
85
|
+
|
|
86
|
+
/** Custom CSS class applied to the host element. */
|
|
87
|
+
readonly className = input<string | undefined>();
|
|
88
|
+
|
|
89
|
+
/** Disables input interaction. */
|
|
90
|
+
readonly disabled = input<boolean | undefined>(false);
|
|
91
|
+
|
|
92
|
+
/** Feedback message displayed below the control. */
|
|
93
|
+
readonly feedback = input<IInputFeedbackProp | undefined>();
|
|
94
|
+
|
|
95
|
+
/** Date format pattern. */
|
|
96
|
+
readonly format = input<'yyyy-mm-dd' | 'dd-mm-yyyy' | 'yyyy/mm/dd' | 'dd/mm/yyyy' | 'MMM DD, YYYY' | undefined>('dd-mm-yyyy');
|
|
97
|
+
|
|
98
|
+
/** Identifier applied to the native input. */
|
|
99
|
+
readonly inputId = input<string | undefined>();
|
|
100
|
+
|
|
101
|
+
/** Tab index applied to the native input. */
|
|
102
|
+
readonly inputTabIndex = input<number | undefined>();
|
|
103
|
+
|
|
104
|
+
/** Input label text. */
|
|
105
|
+
readonly label = input<string | undefined>();
|
|
106
|
+
|
|
107
|
+
/** Maximum allowed date value. */
|
|
108
|
+
readonly max = input<string | undefined>();
|
|
109
|
+
|
|
110
|
+
/** Minimum allowed date value. */
|
|
111
|
+
readonly min = input<string | undefined>();
|
|
112
|
+
|
|
113
|
+
/** Name attribute submitted in forms. */
|
|
114
|
+
readonly name = input<string | undefined>('');
|
|
115
|
+
|
|
116
|
+
/** Puts the input in read-only mode. */
|
|
117
|
+
readonly readOnly = input<boolean | undefined>(false);
|
|
118
|
+
|
|
119
|
+
/** Marks the input as required. */
|
|
120
|
+
readonly required = input<boolean | undefined>(false);
|
|
121
|
+
|
|
122
|
+
/** Control size token. */
|
|
123
|
+
readonly size = input<DaisySize | undefined>('md');
|
|
124
|
+
|
|
125
|
+
/** Current date value. */
|
|
126
|
+
readonly value = input<string | undefined>();
|
|
127
|
+
|
|
128
|
+
/** First day of the week for the calendar view. */
|
|
129
|
+
readonly weekStartDay = input<WeekStartDay | undefined>('sunday');
|
|
130
|
+
|
|
131
|
+
/** Emits when the input loses focus. */
|
|
132
|
+
readonly inputBlur = output<FocusEvent>();
|
|
133
|
+
|
|
134
|
+
/** Emits when the value changes. */
|
|
135
|
+
readonly inputChange = output<InputEvent>();
|
|
136
|
+
|
|
137
|
+
/** Emits when the input gains focus. */
|
|
138
|
+
readonly inputFocus = output<FocusEvent>();
|
|
139
|
+
|
|
140
|
+
/** Emits when the calendar month selection changes. */
|
|
141
|
+
readonly calendarMonthChange = output<number>();
|
|
142
|
+
|
|
143
|
+
/** Emits when the calendar year selection changes. */
|
|
144
|
+
readonly calendarYearChange = output<number>();
|
|
145
|
+
|
|
146
|
+
handleBlur(event: CustomEvent<FocusEvent>): void {
|
|
147
|
+
this.inputBlur.emit(event.detail);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
handleChange(event: CustomEvent<InputEvent>): void {
|
|
151
|
+
this.inputChange.emit(event.detail);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
handleFocus(event: CustomEvent<FocusEvent>): void {
|
|
155
|
+
this.inputFocus.emit(event.detail);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
handleCalendarMonthChange(event: CustomEvent<number>): void {
|
|
159
|
+
this.calendarMonthChange.emit(event.detail);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
handleCalendarYearChange(event: CustomEvent<number>): void {
|
|
163
|
+
this.calendarYearChange.emit(event.detail);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcDropdownMenu, ModusWcMenu } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type {
|
|
5
|
+
Components,
|
|
6
|
+
DaisySize,
|
|
7
|
+
ModusSize,
|
|
8
|
+
PopoverPlacement,
|
|
9
|
+
} from '@trimble-oss/moduswebcomponents';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Props supported by the {@link ModusDropdownMenuComponent}.
|
|
13
|
+
*/
|
|
14
|
+
export interface ModusDropdownMenuProps {
|
|
15
|
+
/** Accessible label for the trigger button. */
|
|
16
|
+
buttonAriaLabel?: Components.ModusWcDropdownMenu['buttonAriaLabel'];
|
|
17
|
+
/** Button color token. */
|
|
18
|
+
buttonColor?: Components.ModusWcDropdownMenu['buttonColor'];
|
|
19
|
+
/** Button size token. */
|
|
20
|
+
buttonSize?: DaisySize;
|
|
21
|
+
/** Button visual variant. */
|
|
22
|
+
buttonVariant?: Components.ModusWcDropdownMenu['buttonVariant'];
|
|
23
|
+
/** CSS class applied to the host element. */
|
|
24
|
+
className?: Components.ModusWcDropdownMenu['customClass'];
|
|
25
|
+
/** Disables the dropdown trigger. */
|
|
26
|
+
disabled?: Components.ModusWcDropdownMenu['disabled'];
|
|
27
|
+
/** Adds a border to the menu panel. */
|
|
28
|
+
menuBordered?: Components.ModusWcDropdownMenu['menuBordered'];
|
|
29
|
+
/** Pixel offset between the button and menu. */
|
|
30
|
+
menuOffset?: Components.ModusWcDropdownMenu['menuOffset'];
|
|
31
|
+
/** Menu placement relative to the button. */
|
|
32
|
+
menuPlacement?: PopoverPlacement;
|
|
33
|
+
/** Menu size token. */
|
|
34
|
+
menuSize?: ModusSize;
|
|
35
|
+
/** Controls menu visibility. */
|
|
36
|
+
menuVisible?: Components.ModusWcDropdownMenu['menuVisible'];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Angular wrapper for the Modus dropdown menu web component.
|
|
41
|
+
*/
|
|
42
|
+
@Component({
|
|
43
|
+
selector: 'modus-dropdown-menu',
|
|
44
|
+
imports: [CommonModule, ModusWcDropdownMenu],
|
|
45
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
46
|
+
template: `
|
|
47
|
+
<modus-wc-dropdown-menu
|
|
48
|
+
[buttonAriaLabel]="buttonAriaLabel()"
|
|
49
|
+
[buttonColor]="buttonColor()"
|
|
50
|
+
[buttonSize]="buttonSize()"
|
|
51
|
+
[buttonVariant]="buttonVariant()"
|
|
52
|
+
[customClass]="className()"
|
|
53
|
+
[disabled]="disabled()"
|
|
54
|
+
[menuBordered]="menuBordered()"
|
|
55
|
+
[menuOffset]="menuOffset()"
|
|
56
|
+
[menuPlacement]="menuPlacement()"
|
|
57
|
+
[menuSize]="menuSize()"
|
|
58
|
+
[menuVisible]="menuVisible()"
|
|
59
|
+
(menuVisibilityChange)="handleVisibilityChange($event)"
|
|
60
|
+
>
|
|
61
|
+
<ng-content select="[slot='button']" slot="button" />
|
|
62
|
+
<ng-content select="[slot='menu']" slot="menu" />
|
|
63
|
+
</modus-wc-dropdown-menu>
|
|
64
|
+
`,
|
|
65
|
+
})
|
|
66
|
+
export class ModusDropdownMenuComponent {
|
|
67
|
+
/** Accessible label for the trigger button. */
|
|
68
|
+
readonly buttonAriaLabel = input<string | undefined>();
|
|
69
|
+
|
|
70
|
+
/** Button color token. */
|
|
71
|
+
readonly buttonColor = input<Components.ModusWcDropdownMenu['buttonColor'] | undefined>(
|
|
72
|
+
'primary'
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
/** Button size token. */
|
|
76
|
+
readonly buttonSize = input<DaisySize | undefined>('md');
|
|
77
|
+
|
|
78
|
+
/** Button visual variant. */
|
|
79
|
+
readonly buttonVariant = input<'borderless' | 'filled' | 'outlined' | undefined>('filled');
|
|
80
|
+
|
|
81
|
+
/** CSS class applied to the host element. */
|
|
82
|
+
readonly className = input<string | undefined>();
|
|
83
|
+
|
|
84
|
+
/** Disables the dropdown trigger. */
|
|
85
|
+
readonly disabled = input<boolean | undefined>(false);
|
|
86
|
+
|
|
87
|
+
/** Adds a border to the menu panel. */
|
|
88
|
+
readonly menuBordered = input<boolean | undefined>(true);
|
|
89
|
+
|
|
90
|
+
/** Pixel offset between the button and menu. */
|
|
91
|
+
readonly menuOffset = input<number | undefined>(10);
|
|
92
|
+
|
|
93
|
+
/** Menu placement relative to the button. */
|
|
94
|
+
readonly menuPlacement = input<PopoverPlacement | undefined>('bottom-start');
|
|
95
|
+
|
|
96
|
+
/** Menu size token. */
|
|
97
|
+
readonly menuSize = input<ModusSize | undefined>('md');
|
|
98
|
+
|
|
99
|
+
/** Controls menu visibility. */
|
|
100
|
+
readonly menuVisible = input<boolean | undefined>(false);
|
|
101
|
+
|
|
102
|
+
/** Emits when the menu visibility changes. */
|
|
103
|
+
readonly menuVisibilityChange = output<{ isVisible: boolean }>();
|
|
104
|
+
|
|
105
|
+
handleVisibilityChange(event: CustomEvent<{ isVisible: boolean }>): void {
|
|
106
|
+
this.menuVisibilityChange.emit(event.detail);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, ViewChild, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcFileDropzone } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type { Components } from '@trimble-oss/moduswebcomponents';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props supported by the {@link ModusFileDropzoneComponent}.
|
|
8
|
+
*/
|
|
9
|
+
export interface ModusFileDropzoneProps {
|
|
10
|
+
/** Accepted file types (e.g. `.jpg,.png`). */
|
|
11
|
+
acceptFileTypes?: Components.ModusWcFileDropzone['acceptFileTypes'];
|
|
12
|
+
/** Optional CSS class applied to the dropzone. */
|
|
13
|
+
className?: Components.ModusWcFileDropzone['customClass'];
|
|
14
|
+
/** Disables the dropzone interaction. */
|
|
15
|
+
disabled?: Components.ModusWcFileDropzone['disabled'];
|
|
16
|
+
/** Instructions displayed while dragging files. */
|
|
17
|
+
fileDraggedOverInstructions?: Components.ModusWcFileDropzone['fileDraggedOverInstructions'];
|
|
18
|
+
/** Shows contextual icons for upload, success, and error states. */
|
|
19
|
+
includeStateIcon?: Components.ModusWcFileDropzone['includeStateIcon'];
|
|
20
|
+
/** Default instructions displayed in the dropzone. */
|
|
21
|
+
instructions?: Components.ModusWcFileDropzone['instructions'];
|
|
22
|
+
/** Error message shown for invalid file type. */
|
|
23
|
+
invalidFileTypeMessage?: Components.ModusWcFileDropzone['invalidFileTypeMessage'];
|
|
24
|
+
/** Maximum number of files allowed. */
|
|
25
|
+
maxFileCount?: Components.ModusWcFileDropzone['maxFileCount'];
|
|
26
|
+
/** Maximum file name length. */
|
|
27
|
+
maxFileNameLength?: Components.ModusWcFileDropzone['maxFileNameLength'];
|
|
28
|
+
/** Maximum total file size in bytes. */
|
|
29
|
+
maxTotalFileSizeBytes?: Components.ModusWcFileDropzone['maxTotalFileSizeBytes'];
|
|
30
|
+
/** Allow multiple file selection. */
|
|
31
|
+
multiple?: Components.ModusWcFileDropzone['multiple'];
|
|
32
|
+
/** Success message shown after valid upload. */
|
|
33
|
+
successMessage?: Components.ModusWcFileDropzone['successMessage'];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Angular wrapper for the Modus file dropzone web component.
|
|
38
|
+
*/
|
|
39
|
+
@Component({
|
|
40
|
+
selector: 'modus-file-dropzone',
|
|
41
|
+
imports: [CommonModule, ModusWcFileDropzone],
|
|
42
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
43
|
+
template: `
|
|
44
|
+
<modus-wc-file-dropzone
|
|
45
|
+
[acceptFileTypes]="acceptFileTypes()"
|
|
46
|
+
[customClass]="className()"
|
|
47
|
+
[disabled]="disabled()"
|
|
48
|
+
[fileDraggedOverInstructions]="fileDraggedOverInstructions()"
|
|
49
|
+
[includeStateIcon]="includeStateIcon()"
|
|
50
|
+
[instructions]="instructions()"
|
|
51
|
+
[invalidFileTypeMessage]="invalidFileTypeMessage()"
|
|
52
|
+
[maxFileCount]="maxFileCount()"
|
|
53
|
+
[maxFileNameLength]="maxFileNameLength()"
|
|
54
|
+
[maxTotalFileSizeBytes]="maxTotalFileSizeBytes()"
|
|
55
|
+
[multiple]="multiple()"
|
|
56
|
+
[successMessage]="successMessage()"
|
|
57
|
+
(fileSelect)="handleFileSelect($event)"
|
|
58
|
+
>
|
|
59
|
+
<ng-content select="[slot='dropzone']" slot="dropzone" />
|
|
60
|
+
</modus-wc-file-dropzone>
|
|
61
|
+
`,
|
|
62
|
+
})
|
|
63
|
+
export class ModusFileDropzoneComponent {
|
|
64
|
+
@ViewChild(ModusWcFileDropzone, { read: ElementRef })
|
|
65
|
+
private readonly dropzoneElement?: ElementRef<HTMLElement>;
|
|
66
|
+
|
|
67
|
+
/** Accepted file types (e.g. `.jpg,.png`). */
|
|
68
|
+
readonly acceptFileTypes = input<string | undefined>();
|
|
69
|
+
|
|
70
|
+
/** Optional CSS class applied to the dropzone. */
|
|
71
|
+
readonly className = input<string | undefined>();
|
|
72
|
+
|
|
73
|
+
/** Disables the dropzone interaction. */
|
|
74
|
+
readonly disabled = input<boolean | undefined>(false);
|
|
75
|
+
|
|
76
|
+
/** Instructions displayed while dragging files. */
|
|
77
|
+
readonly fileDraggedOverInstructions = input<string | undefined>();
|
|
78
|
+
|
|
79
|
+
/** Shows contextual icons for upload, success, and error states. */
|
|
80
|
+
readonly includeStateIcon = input<boolean | undefined>(true);
|
|
81
|
+
|
|
82
|
+
/** Default instructions displayed in the dropzone. */
|
|
83
|
+
readonly instructions = input<string | undefined>();
|
|
84
|
+
|
|
85
|
+
/** Error message shown for invalid file type. */
|
|
86
|
+
readonly invalidFileTypeMessage = input<string | undefined>();
|
|
87
|
+
|
|
88
|
+
/** Maximum number of files allowed. */
|
|
89
|
+
readonly maxFileCount = input<number | undefined>();
|
|
90
|
+
|
|
91
|
+
/** Maximum file name length. */
|
|
92
|
+
readonly maxFileNameLength = input<number | undefined>();
|
|
93
|
+
|
|
94
|
+
/** Maximum total file size in bytes. */
|
|
95
|
+
readonly maxTotalFileSizeBytes = input<number | undefined>();
|
|
96
|
+
|
|
97
|
+
/** Allow multiple file selection. */
|
|
98
|
+
readonly multiple = input<boolean | undefined>(false);
|
|
99
|
+
|
|
100
|
+
/** Success message shown after valid upload. */
|
|
101
|
+
readonly successMessage = input<string | undefined>();
|
|
102
|
+
|
|
103
|
+
/** Emits selected files when the user drops or chooses files. */
|
|
104
|
+
readonly fileSelect = output<FileList>();
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Resets the dropzone to its initial state.
|
|
108
|
+
*/
|
|
109
|
+
async reset(): Promise<void> {
|
|
110
|
+
const element = this.dropzoneElement?.nativeElement as
|
|
111
|
+
| (HTMLElement & { reset?: () => Promise<void> })
|
|
112
|
+
| undefined;
|
|
113
|
+
if (element?.reset) {
|
|
114
|
+
await element.reset();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
handleFileSelect(event: CustomEvent<FileList>): void {
|
|
119
|
+
this.fileSelect.emit(event.detail);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcHandle } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
import type { Components } from '@trimble-oss/moduswebcomponents';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props supported by the {@link ModusHandleComponent}.
|
|
8
|
+
*/
|
|
9
|
+
export interface ModusHandleProps {
|
|
10
|
+
/** Custom CSS class applied to the handle. */
|
|
11
|
+
className?: Components.ModusWcHandle['customClass'];
|
|
12
|
+
/** Initial split percentage for the left/top panel. */
|
|
13
|
+
defaultSplit?: Components.ModusWcHandle['defaultSplit'];
|
|
14
|
+
/** Density token controlling handle spacing. */
|
|
15
|
+
density?: Components.ModusWcHandle['density'];
|
|
16
|
+
/** Left/top target element or selector. */
|
|
17
|
+
leftTarget?: Components.ModusWcHandle['leftTarget'];
|
|
18
|
+
/** Right/bottom target element or selector. */
|
|
19
|
+
rightTarget?: Components.ModusWcHandle['rightTarget'];
|
|
20
|
+
/** Orientation of the handle. */
|
|
21
|
+
orientation?: Components.ModusWcHandle['orientation'];
|
|
22
|
+
/** Size of the handle bar. */
|
|
23
|
+
size?: Components.ModusWcHandle['size'];
|
|
24
|
+
/** Handle type (bar or button). */
|
|
25
|
+
type?: Components.ModusWcHandle['type'];
|
|
26
|
+
/** Button color for button-style handles. */
|
|
27
|
+
buttonColor?: Components.ModusWcHandle['buttonColor'];
|
|
28
|
+
/** Button size for button-style handles. */
|
|
29
|
+
buttonSize?: Components.ModusWcHandle['buttonSize'];
|
|
30
|
+
/** Button variant for button-style handles. */
|
|
31
|
+
buttonVariant?: Components.ModusWcHandle['buttonVariant'];
|
|
32
|
+
/** Accessible label for the handle. */
|
|
33
|
+
ariaLabel?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Angular wrapper for the Modus handle web component.
|
|
38
|
+
*/
|
|
39
|
+
@Component({
|
|
40
|
+
selector: 'modus-handle',
|
|
41
|
+
imports: [CommonModule, ModusWcHandle],
|
|
42
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
43
|
+
template: `
|
|
44
|
+
<modus-wc-handle
|
|
45
|
+
[customClass]="className()"
|
|
46
|
+
[defaultSplit]="defaultSplit()"
|
|
47
|
+
[density]="density()"
|
|
48
|
+
[leftTarget]="leftTarget()"
|
|
49
|
+
[rightTarget]="rightTarget()"
|
|
50
|
+
[orientation]="orientation()"
|
|
51
|
+
[size]="size()"
|
|
52
|
+
[type]="type()"
|
|
53
|
+
[buttonColor]="buttonColor()"
|
|
54
|
+
[buttonSize]="buttonSize()"
|
|
55
|
+
[buttonVariant]="buttonVariant()"
|
|
56
|
+
[attr.aria-label]="ariaLabel()"
|
|
57
|
+
/>
|
|
58
|
+
`,
|
|
59
|
+
})
|
|
60
|
+
export class ModusHandleComponent {
|
|
61
|
+
/** Custom CSS class applied to the handle. */
|
|
62
|
+
readonly className = input<string | undefined>();
|
|
63
|
+
|
|
64
|
+
/** Initial split percentage for the left/top panel. */
|
|
65
|
+
readonly defaultSplit = input<Components.ModusWcHandle['defaultSplit'] | undefined>();
|
|
66
|
+
|
|
67
|
+
/** Density token controlling handle spacing. */
|
|
68
|
+
readonly density = input<Components.ModusWcHandle['density'] | undefined>();
|
|
69
|
+
|
|
70
|
+
/** Left/top target element or selector. */
|
|
71
|
+
readonly leftTarget = input<Components.ModusWcHandle['leftTarget'] | undefined>();
|
|
72
|
+
|
|
73
|
+
/** Right/bottom target element or selector. */
|
|
74
|
+
readonly rightTarget = input<Components.ModusWcHandle['rightTarget'] | undefined>();
|
|
75
|
+
|
|
76
|
+
/** Orientation of the handle. */
|
|
77
|
+
readonly orientation = input<Components.ModusWcHandle['orientation'] | undefined>('horizontal');
|
|
78
|
+
|
|
79
|
+
/** Size of the handle bar. */
|
|
80
|
+
readonly size = input<Components.ModusWcHandle['size'] | undefined>('default');
|
|
81
|
+
|
|
82
|
+
/** Handle type (bar or button). */
|
|
83
|
+
readonly type = input<Components.ModusWcHandle['type'] | undefined>('bar');
|
|
84
|
+
|
|
85
|
+
/** Button color for button-style handles. */
|
|
86
|
+
readonly buttonColor = input<Components.ModusWcHandle['buttonColor'] | undefined>('tertiary');
|
|
87
|
+
|
|
88
|
+
/** Button size for button-style handles. */
|
|
89
|
+
readonly buttonSize = input<Components.ModusWcHandle['buttonSize'] | undefined>('md');
|
|
90
|
+
|
|
91
|
+
/** Button variant for button-style handles. */
|
|
92
|
+
readonly buttonVariant = input<Components.ModusWcHandle['buttonVariant'] | undefined>('filled');
|
|
93
|
+
|
|
94
|
+
/** Accessible label for the handle. */
|
|
95
|
+
readonly ariaLabel = input<string | undefined>();
|
|
96
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ModusWcIcon } from '@trimble-oss/moduswebcomponents-angular';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Available variant styles for Modus icons.
|
|
7
|
+
*/
|
|
8
|
+
export type ModusIconVariant = 'outlined' | 'solid' | undefined;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Supported icon size tokens.
|
|
12
|
+
*/
|
|
13
|
+
export type ModusIconSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Input properties for the ModusIconComponent wrapper.
|
|
17
|
+
*/
|
|
18
|
+
export interface ModusIconProps {
|
|
19
|
+
/** The icon glyph name from the Modus icon font. */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Optional variant that selects the icon font family. */
|
|
22
|
+
variant?: ModusIconVariant;
|
|
23
|
+
/** Configures the size utility applied to the icon element. */
|
|
24
|
+
size?: ModusIconSize;
|
|
25
|
+
/** Indicates whether the icon is decorative-only. */
|
|
26
|
+
decorative?: boolean;
|
|
27
|
+
/** Custom CSS class applied to the `<modus-wc-icon>` host. */
|
|
28
|
+
className?: string;
|
|
29
|
+
/** Accessible label exposed when `decorative` is false. */
|
|
30
|
+
ariaLabel?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Angular wrapper for the Modus Web Component icon.
|
|
35
|
+
*
|
|
36
|
+
* Provides a typed, signal-driven API and supports projecting the icon name from Angular templates.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```html
|
|
40
|
+
* <modus-icon name="check_circle" variant="outlined" ariaLabel="Success" />
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
@Component({
|
|
44
|
+
selector: 'modus-icon',
|
|
45
|
+
imports: [CommonModule, ModusWcIcon],
|
|
46
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
47
|
+
template: `
|
|
48
|
+
<modus-wc-icon
|
|
49
|
+
[name]="name()"
|
|
50
|
+
[variant]="variant()"
|
|
51
|
+
[size]="size()"
|
|
52
|
+
[decorative]="decorative()"
|
|
53
|
+
[customClass]="className()"
|
|
54
|
+
[attr.aria-label]="computedAriaLabel()"
|
|
55
|
+
/>
|
|
56
|
+
`,
|
|
57
|
+
})
|
|
58
|
+
export class ModusIconComponent {
|
|
59
|
+
/** The icon glyph name from the Modus icon font. */
|
|
60
|
+
readonly name = input.required<string>();
|
|
61
|
+
|
|
62
|
+
/** Optional variant that selects the icon font family. */
|
|
63
|
+
readonly variant = input<ModusIconVariant>(undefined);
|
|
64
|
+
|
|
65
|
+
/** Configures the size utility applied to the icon element. */
|
|
66
|
+
readonly size = input<ModusIconSize>('md');
|
|
67
|
+
|
|
68
|
+
/** Indicates whether the icon is decorative-only. */
|
|
69
|
+
readonly decorative = input<boolean>(true);
|
|
70
|
+
|
|
71
|
+
/** Custom CSS class applied to the `<modus-wc-icon>` host. */
|
|
72
|
+
readonly className = input<string | undefined>();
|
|
73
|
+
|
|
74
|
+
/** Accessible label exposed when `decorative` is false. */
|
|
75
|
+
readonly ariaLabel = input<string | undefined>();
|
|
76
|
+
|
|
77
|
+
/** Determines the correct aria-label binding based on decorative state. */
|
|
78
|
+
readonly computedAriaLabel = computed(() =>
|
|
79
|
+
this.decorative() ? undefined : this.ariaLabel() ?? `${this.name()} icon`
|
|
80
|
+
);
|
|
81
|
+
}
|