@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,61 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the DemoExample component.
|
|
5
|
+
*/
|
|
6
|
+
interface DemoExampleProps {
|
|
7
|
+
/** The title of the demo example. */
|
|
8
|
+
title: string;
|
|
9
|
+
/** A description of the demo example. */
|
|
10
|
+
description: string | ReactNode;
|
|
11
|
+
/** The content of the demo example. */
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Renders a styled container for a demo example.
|
|
17
|
+
* @param {DemoExampleProps} props - The component props.
|
|
18
|
+
* @param {string} props.title - The title of the demo example.
|
|
19
|
+
* @param {string | ReactNode} props.description - A description of the demo example.
|
|
20
|
+
* @param {ReactNode} props.children - The content of the demo example.
|
|
21
|
+
* @returns {JSX.Element} The rendered demo example component.
|
|
22
|
+
*/
|
|
23
|
+
export default function DemoExample({
|
|
24
|
+
title,
|
|
25
|
+
description,
|
|
26
|
+
children,
|
|
27
|
+
}: DemoExampleProps) {
|
|
28
|
+
return (
|
|
29
|
+
<div className="flex flex-col gap-4 rounded-lg bg-background p-6 border-default">
|
|
30
|
+
<div className="flex flex-col gap-1">
|
|
31
|
+
<div className="text-lg font-medium text-foreground">{title}</div>
|
|
32
|
+
<div className="text-sm text-foreground opacity-80">{description}</div>
|
|
33
|
+
</div>
|
|
34
|
+
<div className="flex flex-col gap-4">{children}</div>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Renders a clean, unstyled container for a demo example.
|
|
41
|
+
* @param {DemoExampleProps} props - The component props.
|
|
42
|
+
* @param {string} props.title - The title of the demo example.
|
|
43
|
+
* @param {string | ReactNode} props.description - A description of the demo example.
|
|
44
|
+
* @param {ReactNode} props.children - The content of the demo example.
|
|
45
|
+
* @returns {JSX.Element} The rendered clean demo example component.
|
|
46
|
+
*/
|
|
47
|
+
export function DemoExampleClean({
|
|
48
|
+
title,
|
|
49
|
+
description,
|
|
50
|
+
children,
|
|
51
|
+
}: DemoExampleProps) {
|
|
52
|
+
return (
|
|
53
|
+
<div className="flex flex-col gap-4 rounded-lg bg-background p-6 border-dashed">
|
|
54
|
+
<div className="flex flex-col gap-1">
|
|
55
|
+
<div className="text-lg font-medium text-foreground">{title}</div>
|
|
56
|
+
<div className="text-sm text-foreground opacity-80">{description}</div>
|
|
57
|
+
</div>
|
|
58
|
+
<div className="flex flex-col gap-4">{children}</div>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { useNavigate } from "react-router-dom";
|
|
3
|
+
import ModusButton from "./ModusButton";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Props for the DemoPage component.
|
|
7
|
+
*/
|
|
8
|
+
interface DemoPageProps {
|
|
9
|
+
/** The title of the demo page. */
|
|
10
|
+
title: string;
|
|
11
|
+
/** A description of the demo page. */
|
|
12
|
+
description: string;
|
|
13
|
+
/** The content of the demo page. */
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
/** Whether to show the back button. Defaults to true. */
|
|
16
|
+
showBackButton?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Renders a standard layout for a demo page.
|
|
21
|
+
* @param {DemoPageProps} props - The component props.
|
|
22
|
+
* @param {string} props.title - The title of the demo page.
|
|
23
|
+
* @param {string} props.description - A description of the demo page.
|
|
24
|
+
* @param {ReactNode} props.children - The content of the demo page.
|
|
25
|
+
* @param {boolean} props.showBackButton - Whether to show the back button. Defaults to true.
|
|
26
|
+
* @returns {JSX.Element} The rendered demo page component.
|
|
27
|
+
*/
|
|
28
|
+
export default function DemoPage({
|
|
29
|
+
title,
|
|
30
|
+
description,
|
|
31
|
+
children,
|
|
32
|
+
showBackButton = true,
|
|
33
|
+
}: DemoPageProps) {
|
|
34
|
+
const navigate = useNavigate();
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Handles the click event for the "Component List" button, navigating to the components gallery page.
|
|
38
|
+
*/
|
|
39
|
+
const handleComponentListClick = () => {
|
|
40
|
+
navigate("/dev/components");
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<div className="max-w-6xl mx-auto p-8 bg-background">
|
|
45
|
+
{showBackButton && (
|
|
46
|
+
<div className="flex items-center gap-4 mb-6">
|
|
47
|
+
<ModusButton
|
|
48
|
+
variant="filled"
|
|
49
|
+
color="tertiary"
|
|
50
|
+
size="md"
|
|
51
|
+
onButtonClick={handleComponentListClick}
|
|
52
|
+
>
|
|
53
|
+
<i className="modus-icons">arrow_back</i> Component List
|
|
54
|
+
</ModusButton>
|
|
55
|
+
</div>
|
|
56
|
+
)}
|
|
57
|
+
<div className="text-center mb-12">
|
|
58
|
+
<div className="text-4xl font-semibold mb-4 text-foreground">
|
|
59
|
+
{title}
|
|
60
|
+
</div>
|
|
61
|
+
<div className="text-lg leading-relaxed text-foreground text-center">
|
|
62
|
+
{description}
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
<div className="flex flex-col gap-6">{children}</div>
|
|
66
|
+
|
|
67
|
+
{/* Footer */}
|
|
68
|
+
<div className="text-center pt-8 box-content">
|
|
69
|
+
<div className="flex items-center justify-center gap-3 mb-3">
|
|
70
|
+
<img src="/vite.svg" alt="Vite" className="h-6 w-6" />
|
|
71
|
+
<div className="text-foreground-40">+</div>
|
|
72
|
+
<img src="/react.svg" alt="React" className="h-6 w-6" />
|
|
73
|
+
</div>
|
|
74
|
+
<div className="text-sm font-mono text-foreground-40">
|
|
75
|
+
2026 Modus React App v1.0.0 + React 19 + Vite + Tailwind CSS -
|
|
76
|
+
Created by Julian Oczkowski
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ModusWcAccordion,
|
|
3
|
+
ModusWcCollapse,
|
|
4
|
+
} from "@trimble-oss/moduswebcomponents-react";
|
|
5
|
+
import type { ReactNode } from "react";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents the options for a collapse panel.
|
|
9
|
+
*/
|
|
10
|
+
interface CollapseOptions {
|
|
11
|
+
/** The title of the collapse panel. */
|
|
12
|
+
title: string;
|
|
13
|
+
/** A description for the collapse panel. */
|
|
14
|
+
description?: string;
|
|
15
|
+
/** An icon to display in the collapse panel. */
|
|
16
|
+
icon?: string;
|
|
17
|
+
/** The ARIA label for the icon. */
|
|
18
|
+
iconAriaLabel?: string;
|
|
19
|
+
/** The size of the collapse panel. */
|
|
20
|
+
size?: 'xs' | 'sm' | 'md' | 'lg';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Represents an item in the accordion.
|
|
25
|
+
*/
|
|
26
|
+
interface AccordionItem {
|
|
27
|
+
/** A unique identifier for the accordion item. */
|
|
28
|
+
id: string;
|
|
29
|
+
/** The options for the collapse panel. */
|
|
30
|
+
options: CollapseOptions;
|
|
31
|
+
/** The content to display when the accordion item is expanded. */
|
|
32
|
+
content: ReactNode;
|
|
33
|
+
/** Whether the accordion item is expanded by default. */
|
|
34
|
+
expanded?: boolean;
|
|
35
|
+
/** Whether the accordion item has a border. */
|
|
36
|
+
bordered?: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Props for the ModusAccordion component.
|
|
41
|
+
*/
|
|
42
|
+
interface ModusAccordionProps {
|
|
43
|
+
/** The items to display in the accordion. */
|
|
44
|
+
items: AccordionItem[];
|
|
45
|
+
/** A custom CSS class to apply to the accordion. */
|
|
46
|
+
customClass?: string;
|
|
47
|
+
/** A callback function to handle the expanded change event. */
|
|
48
|
+
onExpandedChange?: (event: CustomEvent<{ expanded: boolean; index: number }>) => void;
|
|
49
|
+
/** A CSS class to apply to the container element. */
|
|
50
|
+
className?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Renders a Modus accordion component with a set of items.
|
|
55
|
+
* @param {ModusAccordionProps} props - The component props.
|
|
56
|
+
* @param {AccordionItem[]} props.items - The items to display in the accordion.
|
|
57
|
+
* @param {string} [props.customClass=""] - A custom CSS class to apply to the accordion.
|
|
58
|
+
* @param {(event: CustomEvent<{ expanded: boolean; index: number }>) => void} [props.onExpandedChange] - A callback function to handle the expanded change event.
|
|
59
|
+
* @param {string} [props.className=""] - A CSS class to apply to the container element.
|
|
60
|
+
* @returns {JSX.Element} The rendered accordion component.
|
|
61
|
+
*/
|
|
62
|
+
export default function ModusAccordion({
|
|
63
|
+
items,
|
|
64
|
+
customClass = '',
|
|
65
|
+
onExpandedChange,
|
|
66
|
+
className = '',
|
|
67
|
+
}: ModusAccordionProps) {
|
|
68
|
+
return (
|
|
69
|
+
<div className={className}>
|
|
70
|
+
<ModusWcAccordion
|
|
71
|
+
custom-class={customClass}
|
|
72
|
+
onExpandedChange={onExpandedChange}
|
|
73
|
+
>
|
|
74
|
+
{items.map((item) => (
|
|
75
|
+
<ModusWcCollapse
|
|
76
|
+
key={item.id}
|
|
77
|
+
id={`collapse-${item.id}`}
|
|
78
|
+
collapse-id={item.id}
|
|
79
|
+
bordered={item.bordered || false}
|
|
80
|
+
options={item.options}
|
|
81
|
+
expanded={item.expanded}
|
|
82
|
+
>
|
|
83
|
+
<div slot="content">{item.content}</div>
|
|
84
|
+
</ModusWcCollapse>
|
|
85
|
+
))}
|
|
86
|
+
</ModusWcAccordion>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import { ModusWcAlert } from "@trimble-oss/moduswebcomponents-react";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Props for the ModusAlert component.
|
|
7
|
+
*/
|
|
8
|
+
export interface ModusAlertProps {
|
|
9
|
+
/** The title of the alert. */
|
|
10
|
+
alertTitle?: string;
|
|
11
|
+
/** A description for the alert. */
|
|
12
|
+
alertDescription?: string;
|
|
13
|
+
/** The variant of the alert, controlling its color and icon. */
|
|
14
|
+
variant?: 'info' | 'success' | 'warning' | 'error';
|
|
15
|
+
/** Whether the alert can be dismissed. */
|
|
16
|
+
dismissible?: boolean;
|
|
17
|
+
/** An icon to display in the alert. */
|
|
18
|
+
icon?: string;
|
|
19
|
+
/** The ARIA role of the alert. */
|
|
20
|
+
role?: 'alert' | 'log' | 'marquee' | 'status' | 'timer';
|
|
21
|
+
/** A custom CSS class to apply to the alert. */
|
|
22
|
+
customClass?: string;
|
|
23
|
+
/** A callback function to handle the dismiss click event. */
|
|
24
|
+
onDismissClick?: (event: CustomEvent<void>) => void;
|
|
25
|
+
/** The content to display inside the alert. */
|
|
26
|
+
children?: ReactNode;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Renders a Modus alert component.
|
|
31
|
+
* @param {ModusAlertProps} props - The component props.
|
|
32
|
+
* @param {string} [props.alertTitle] - The title of the alert.
|
|
33
|
+
* @param {string} [props.alertDescription] - A description for the alert.
|
|
34
|
+
* @param {'info' | 'success' | 'warning' | 'error'} [props.variant='info'] - The variant of the alert.
|
|
35
|
+
* @param {boolean} [props.dismissible=false] - Whether the alert can be dismissed.
|
|
36
|
+
* @param {string} [props.icon] - An icon to display in the alert.
|
|
37
|
+
* @param {'alert' | 'log' | 'marquee' | 'status' | 'timer'} [props.role='status'] - The ARIA role of the alert.
|
|
38
|
+
* @param {string} [props.customClass] - A custom CSS class to apply to the alert.
|
|
39
|
+
* @param {(event: CustomEvent<void>) => void} [props.onDismissClick] - A callback function to handle the dismiss click event.
|
|
40
|
+
* @param {ReactNode} [props.children] - The content to display inside the alert.
|
|
41
|
+
* @returns {JSX.Element} The rendered alert component.
|
|
42
|
+
*/
|
|
43
|
+
export default function ModusAlert({
|
|
44
|
+
alertTitle,
|
|
45
|
+
alertDescription,
|
|
46
|
+
variant = 'info',
|
|
47
|
+
dismissible = false,
|
|
48
|
+
icon,
|
|
49
|
+
role = 'status',
|
|
50
|
+
customClass,
|
|
51
|
+
onDismissClick,
|
|
52
|
+
children,
|
|
53
|
+
}: ModusAlertProps) {
|
|
54
|
+
const alertRef = useRef<HTMLModusWcAlertElement>(null);
|
|
55
|
+
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
const alert = alertRef.current;
|
|
58
|
+
if (!alert || !onDismissClick) return;
|
|
59
|
+
|
|
60
|
+
const handleDismissClick = (event: Event) => {
|
|
61
|
+
const customEvent = event as CustomEvent<void>;
|
|
62
|
+
onDismissClick(customEvent);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
alert.addEventListener("dismissClick", handleDismissClick);
|
|
66
|
+
return () => {
|
|
67
|
+
alert.removeEventListener("dismissClick", handleDismissClick);
|
|
68
|
+
};
|
|
69
|
+
}, [onDismissClick]);
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<ModusWcAlert
|
|
73
|
+
ref={alertRef}
|
|
74
|
+
alert-title={alertTitle}
|
|
75
|
+
alert-description={alertDescription}
|
|
76
|
+
variant={variant}
|
|
77
|
+
dismissible={dismissible}
|
|
78
|
+
icon={icon}
|
|
79
|
+
role={role}
|
|
80
|
+
custom-class={customClass}
|
|
81
|
+
>
|
|
82
|
+
{children}
|
|
83
|
+
</ModusWcAlert>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import { ModusWcAutocomplete } from "@trimble-oss/moduswebcomponents-react";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Represents an item in the autocomplete list.
|
|
7
|
+
*/
|
|
8
|
+
export interface AutocompleteItem {
|
|
9
|
+
/** The label to display for the item. */
|
|
10
|
+
label: string;
|
|
11
|
+
/** The value of the item. */
|
|
12
|
+
value: string;
|
|
13
|
+
/** Whether the item is visible in the menu. */
|
|
14
|
+
visibleInMenu: boolean;
|
|
15
|
+
/** Whether the item is selected. */
|
|
16
|
+
selected?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Represents the content to display when there are no results.
|
|
21
|
+
*/
|
|
22
|
+
export interface AutocompleteNoResults {
|
|
23
|
+
/** The main label to display. */
|
|
24
|
+
label: string;
|
|
25
|
+
/** A sub-label to display. */
|
|
26
|
+
subLabel: string;
|
|
27
|
+
/** The severity of the message. */
|
|
28
|
+
severity?: 'error' | 'info' | 'success' | 'warning';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Props for the ModusAutocomplete component.
|
|
33
|
+
*/
|
|
34
|
+
export interface ModusAutocompleteProps {
|
|
35
|
+
/** Whether the autocomplete has a border. */
|
|
36
|
+
bordered?: boolean;
|
|
37
|
+
/** Whether the autocomplete is disabled. */
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
/** Whether multiple items can be selected. */
|
|
40
|
+
multiSelect?: boolean;
|
|
41
|
+
/** The items to display in the autocomplete list. */
|
|
42
|
+
items: AutocompleteItem[];
|
|
43
|
+
/** The value of the autocomplete. */
|
|
44
|
+
value?: string;
|
|
45
|
+
/** The placeholder text for the input. */
|
|
46
|
+
placeholder?: string;
|
|
47
|
+
/** The label for the autocomplete. */
|
|
48
|
+
label?: string;
|
|
49
|
+
/** The size of the autocomplete. */
|
|
50
|
+
size?: 'sm' | 'md' | 'lg';
|
|
51
|
+
/** The debounce time in milliseconds for input changes. */
|
|
52
|
+
debounceMs?: number;
|
|
53
|
+
/** The minimum number of characters to trigger the autocomplete. */
|
|
54
|
+
minChars?: number;
|
|
55
|
+
/** Whether to leave the menu open after an item is selected. */
|
|
56
|
+
leaveMenuOpen?: boolean;
|
|
57
|
+
/** Whether to show a spinner. */
|
|
58
|
+
showSpinner?: boolean;
|
|
59
|
+
/** The content to display when there are no results. */
|
|
60
|
+
noResults?: AutocompleteNoResults;
|
|
61
|
+
/** A custom CSS class to apply to the autocomplete. */
|
|
62
|
+
customClass?: string;
|
|
63
|
+
/** Whether the autocomplete is read-only. */
|
|
64
|
+
readOnly?: boolean;
|
|
65
|
+
/** Whether the autocomplete is required. */
|
|
66
|
+
required?: boolean;
|
|
67
|
+
/** The ID of the input element. */
|
|
68
|
+
inputId?: string;
|
|
69
|
+
/** The tab index of the input element. */
|
|
70
|
+
inputTabIndex?: number;
|
|
71
|
+
/** The name of the input element. */
|
|
72
|
+
name?: string;
|
|
73
|
+
/** The ARIA label for the autocomplete. */
|
|
74
|
+
'aria-label'?: string;
|
|
75
|
+
/** A callback function to handle input changes. */
|
|
76
|
+
onInputChange?: (event: CustomEvent<Event>) => void;
|
|
77
|
+
/** A callback function to handle input focus. */
|
|
78
|
+
onInputFocus?: (event: CustomEvent<FocusEvent>) => void;
|
|
79
|
+
/** A callback function to handle input blur. */
|
|
80
|
+
onInputBlur?: (event: CustomEvent<FocusEvent>) => void;
|
|
81
|
+
/** A callback function to handle item selection. */
|
|
82
|
+
onItemSelect?: (event: CustomEvent<AutocompleteItem>) => void;
|
|
83
|
+
/** A callback function to handle chip removal. */
|
|
84
|
+
onChipRemove?: (event: CustomEvent<AutocompleteItem>) => void;
|
|
85
|
+
/** The content to display inside the autocomplete. */
|
|
86
|
+
children?: ReactNode;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Renders a Modus autocomplete component.
|
|
91
|
+
* @param {ModusAutocompleteProps} props - The component props.
|
|
92
|
+
* @returns {JSX.Element} The rendered autocomplete component.
|
|
93
|
+
*/
|
|
94
|
+
export default function ModusAutocomplete({
|
|
95
|
+
bordered = true,
|
|
96
|
+
disabled = false,
|
|
97
|
+
multiSelect = false,
|
|
98
|
+
items,
|
|
99
|
+
value = '',
|
|
100
|
+
placeholder,
|
|
101
|
+
label,
|
|
102
|
+
size = 'md',
|
|
103
|
+
debounceMs = 300,
|
|
104
|
+
minChars = 0,
|
|
105
|
+
leaveMenuOpen = false,
|
|
106
|
+
showSpinner = false,
|
|
107
|
+
noResults,
|
|
108
|
+
customClass,
|
|
109
|
+
readOnly = false,
|
|
110
|
+
required = false,
|
|
111
|
+
inputId,
|
|
112
|
+
inputTabIndex,
|
|
113
|
+
name,
|
|
114
|
+
'aria-label': ariaLabel,
|
|
115
|
+
onInputChange,
|
|
116
|
+
onInputFocus,
|
|
117
|
+
onInputBlur,
|
|
118
|
+
onItemSelect,
|
|
119
|
+
onChipRemove,
|
|
120
|
+
children,
|
|
121
|
+
}: ModusAutocompleteProps) {
|
|
122
|
+
const autocompleteRef = useRef<HTMLModusWcAutocompleteElement>(null);
|
|
123
|
+
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
const autocomplete = autocompleteRef.current;
|
|
126
|
+
if (!autocomplete) return;
|
|
127
|
+
|
|
128
|
+
const handleInputChange = (event: Event) => {
|
|
129
|
+
const customEvent = event as CustomEvent<Event>;
|
|
130
|
+
onInputChange?.(customEvent);
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const handleInputFocus = (event: Event) => {
|
|
134
|
+
const customEvent = event as CustomEvent<FocusEvent>;
|
|
135
|
+
onInputFocus?.(customEvent);
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const handleInputBlur = (event: Event) => {
|
|
139
|
+
const customEvent = event as CustomEvent<FocusEvent>;
|
|
140
|
+
onInputBlur?.(customEvent);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const handleItemSelect = (event: Event) => {
|
|
144
|
+
const customEvent = event as CustomEvent<AutocompleteItem>;
|
|
145
|
+
onItemSelect?.(customEvent);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const handleChipRemove = (event: Event) => {
|
|
149
|
+
const customEvent = event as CustomEvent<AutocompleteItem>;
|
|
150
|
+
onChipRemove?.(customEvent);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Add event listeners
|
|
154
|
+
if (onInputChange)
|
|
155
|
+
autocomplete.addEventListener("inputChange", handleInputChange);
|
|
156
|
+
if (onInputFocus)
|
|
157
|
+
autocomplete.addEventListener("inputFocus", handleInputFocus);
|
|
158
|
+
if (onInputBlur)
|
|
159
|
+
autocomplete.addEventListener("inputBlur", handleInputBlur);
|
|
160
|
+
if (onItemSelect)
|
|
161
|
+
autocomplete.addEventListener("itemSelect", handleItemSelect);
|
|
162
|
+
if (onChipRemove)
|
|
163
|
+
autocomplete.addEventListener("chipRemove", handleChipRemove);
|
|
164
|
+
|
|
165
|
+
return () => {
|
|
166
|
+
// Cleanup event listeners
|
|
167
|
+
if (onInputChange)
|
|
168
|
+
autocomplete.removeEventListener("inputChange", handleInputChange);
|
|
169
|
+
if (onInputFocus)
|
|
170
|
+
autocomplete.removeEventListener("inputFocus", handleInputFocus);
|
|
171
|
+
if (onInputBlur)
|
|
172
|
+
autocomplete.removeEventListener("inputBlur", handleInputBlur);
|
|
173
|
+
if (onItemSelect)
|
|
174
|
+
autocomplete.removeEventListener("itemSelect", handleItemSelect);
|
|
175
|
+
if (onChipRemove)
|
|
176
|
+
autocomplete.removeEventListener("chipRemove", handleChipRemove);
|
|
177
|
+
};
|
|
178
|
+
}, [onInputChange, onInputFocus, onInputBlur, onItemSelect, onChipRemove]);
|
|
179
|
+
|
|
180
|
+
return (
|
|
181
|
+
<ModusWcAutocomplete
|
|
182
|
+
ref={autocompleteRef}
|
|
183
|
+
bordered={bordered}
|
|
184
|
+
disabled={disabled}
|
|
185
|
+
multiSelect={multiSelect}
|
|
186
|
+
items={items}
|
|
187
|
+
value={value}
|
|
188
|
+
placeholder={placeholder}
|
|
189
|
+
label={label}
|
|
190
|
+
size={size}
|
|
191
|
+
debounceMs={debounceMs}
|
|
192
|
+
minChars={minChars}
|
|
193
|
+
leaveMenuOpen={leaveMenuOpen}
|
|
194
|
+
showSpinner={showSpinner}
|
|
195
|
+
noResults={noResults}
|
|
196
|
+
customClass={customClass}
|
|
197
|
+
readOnly={readOnly}
|
|
198
|
+
required={required}
|
|
199
|
+
inputId={inputId}
|
|
200
|
+
inputTabIndex={inputTabIndex}
|
|
201
|
+
name={name}
|
|
202
|
+
aria-label={ariaLabel}
|
|
203
|
+
>
|
|
204
|
+
{children}
|
|
205
|
+
</ModusWcAutocomplete>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ModusWcAvatar } from "@trimble-oss/moduswebcomponents-react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the ModusAvatar component.
|
|
5
|
+
*/
|
|
6
|
+
export interface ModusAvatarProps {
|
|
7
|
+
/** The alternative text for the avatar image. */
|
|
8
|
+
alt: string;
|
|
9
|
+
/** The source URL of the avatar image. */
|
|
10
|
+
imgSrc?: string;
|
|
11
|
+
/** Initials displayed when no image source is provided. */
|
|
12
|
+
initials?: string;
|
|
13
|
+
/** The shape of the avatar. */
|
|
14
|
+
shape?: "circle" | "square";
|
|
15
|
+
/** The size of the avatar. */
|
|
16
|
+
size?: "xs" | "sm" | "md" | "lg";
|
|
17
|
+
/** A custom CSS class to apply to the avatar. */
|
|
18
|
+
customClass?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Renders a Modus avatar component.
|
|
23
|
+
* @param {ModusAvatarProps} props - The component props.
|
|
24
|
+
* @param {string} props.alt - The alternative text for the avatar image.
|
|
25
|
+
* @param {string} [props.imgSrc=""] - The source URL of the avatar image.
|
|
26
|
+
* @param {string} [props.initials=""] - Initials displayed when no image source is provided.
|
|
27
|
+
* @param {'circle' | 'square'} [props.shape='circle'] - The shape of the avatar.
|
|
28
|
+
* @param {'xs' | 'sm' | 'md' | 'lg'} [props.size='md'] - The size of the avatar.
|
|
29
|
+
* @param {string} [props.customClass] - A custom CSS class to apply to the avatar.
|
|
30
|
+
* @returns {JSX.Element} The rendered avatar component.
|
|
31
|
+
*/
|
|
32
|
+
export default function ModusAvatar({
|
|
33
|
+
alt,
|
|
34
|
+
imgSrc = "",
|
|
35
|
+
initials = "",
|
|
36
|
+
shape = "circle",
|
|
37
|
+
size = "md",
|
|
38
|
+
customClass,
|
|
39
|
+
}: ModusAvatarProps) {
|
|
40
|
+
return (
|
|
41
|
+
<ModusWcAvatar
|
|
42
|
+
alt={alt}
|
|
43
|
+
imgSrc={imgSrc}
|
|
44
|
+
initials={initials}
|
|
45
|
+
shape={shape}
|
|
46
|
+
size={size}
|
|
47
|
+
customClass={customClass}
|
|
48
|
+
/>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { ModusWcBadge } from "@trimble-oss/moduswebcomponents-react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Available color tokens for the Modus badge component.
|
|
6
|
+
*/
|
|
7
|
+
export type ModusBadgeColor =
|
|
8
|
+
| "primary"
|
|
9
|
+
| "secondary"
|
|
10
|
+
| "tertiary"
|
|
11
|
+
| "high-contrast"
|
|
12
|
+
| "success"
|
|
13
|
+
| "warning"
|
|
14
|
+
| "danger";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Badge sizing tokens supported by the underlying web component.
|
|
18
|
+
*/
|
|
19
|
+
export type ModusBadgeSize = "sm" | "md" | "lg";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Render variants that control badge appearance.
|
|
23
|
+
*/
|
|
24
|
+
export type ModusBadgeVariant = "counter" | "filled" | "outlined" | "text";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Props for the ModusBadge component.
|
|
28
|
+
*/
|
|
29
|
+
export interface ModusBadgeProps {
|
|
30
|
+
/** The content to display inside the badge. */
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
/** The color of the badge. */
|
|
33
|
+
color?: ModusBadgeColor;
|
|
34
|
+
/** The variant of the badge. */
|
|
35
|
+
variant?: ModusBadgeVariant;
|
|
36
|
+
/** The size of the badge. */
|
|
37
|
+
size?: ModusBadgeSize;
|
|
38
|
+
/** A custom CSS class to apply to the badge. */
|
|
39
|
+
customClass?: string;
|
|
40
|
+
/** Accessible label describing the badge when used without text. */
|
|
41
|
+
ariaLabel?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Renders a Modus badge component.
|
|
46
|
+
*
|
|
47
|
+
* Consumers can use the strongly typed props and project arbitrary content inside the badge.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* <ModusBadge color="success" variant="filled">Ready</ModusBadge>
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @param {ModusBadgeProps} props - The component props.
|
|
55
|
+
* @param {ReactNode} props.children - The content to display inside the badge.
|
|
56
|
+
* @param {ModusBadgeColor} [props.color='primary'] - The color of the badge.
|
|
57
|
+
* @param {ModusBadgeVariant} [props.variant='filled'] - The variant of the badge.
|
|
58
|
+
* @param {ModusBadgeSize} [props.size='md'] - The size of the badge.
|
|
59
|
+
* @param {string} [props.customClass] - A custom CSS class to apply to the badge.
|
|
60
|
+
* @param {string} [props.ariaLabel] - Accessible label describing the badge when used without text.
|
|
61
|
+
* @returns {JSX.Element} The rendered badge component.
|
|
62
|
+
*/
|
|
63
|
+
export default function ModusBadge({
|
|
64
|
+
children,
|
|
65
|
+
color = "primary",
|
|
66
|
+
variant = "filled",
|
|
67
|
+
size = "md",
|
|
68
|
+
customClass,
|
|
69
|
+
ariaLabel,
|
|
70
|
+
}: ModusBadgeProps) {
|
|
71
|
+
return (
|
|
72
|
+
<ModusWcBadge
|
|
73
|
+
color={color}
|
|
74
|
+
variant={variant}
|
|
75
|
+
size={size}
|
|
76
|
+
customClass={customClass}
|
|
77
|
+
aria-label={ariaLabel}
|
|
78
|
+
>
|
|
79
|
+
{children}
|
|
80
|
+
</ModusWcBadge>
|
|
81
|
+
);
|
|
82
|
+
}
|