@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,230 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { ModusWcNumberInput } from "@trimble-oss/moduswebcomponents-react";
|
|
4
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
5
|
+
|
|
6
|
+
// Type definitions for number input interfaces
|
|
7
|
+
interface InputFeedback {
|
|
8
|
+
level: "error" | "info" | "success" | "warning";
|
|
9
|
+
message?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Props for the ModusNumberInput component.
|
|
14
|
+
*/
|
|
15
|
+
interface ModusNumberInputProps {
|
|
16
|
+
/** The label for the number input. */
|
|
17
|
+
label?: string;
|
|
18
|
+
/** The placeholder text for the number input. */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/** The value of the number input. */
|
|
21
|
+
value?: string;
|
|
22
|
+
/** The name of the number input. */
|
|
23
|
+
name?: string;
|
|
24
|
+
/** The size of the number input. */
|
|
25
|
+
size?: 'sm' | 'md' | 'lg';
|
|
26
|
+
/** Whether the number input has a border. */
|
|
27
|
+
bordered?: boolean;
|
|
28
|
+
/** A custom CSS class to apply to the number input. */
|
|
29
|
+
customClass?: string;
|
|
30
|
+
/** The type of the number input. */
|
|
31
|
+
type?: 'number' | 'range';
|
|
32
|
+
/** The input mode for the number input. */
|
|
33
|
+
inputMode?: 'decimal' | 'numeric' | 'none';
|
|
34
|
+
/** Whether to enable autocomplete for the number input. */
|
|
35
|
+
autoComplete?: 'on' | 'off';
|
|
36
|
+
/** The minimum allowed value. */
|
|
37
|
+
min?: number;
|
|
38
|
+
/** The maximum allowed value. */
|
|
39
|
+
max?: number;
|
|
40
|
+
/** The step interval for the number input. */
|
|
41
|
+
step?: number;
|
|
42
|
+
/** Whether the number input is required. */
|
|
43
|
+
required?: boolean;
|
|
44
|
+
/** Whether the number input is disabled. */
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
/** Whether the number input is read-only. */
|
|
47
|
+
readOnly?: boolean;
|
|
48
|
+
/** The currency symbol to display. */
|
|
49
|
+
currencySymbol?: string;
|
|
50
|
+
/** Feedback to display for the number input. */
|
|
51
|
+
feedback?: InputFeedback;
|
|
52
|
+
/** The ID of the input element. */
|
|
53
|
+
inputId?: string;
|
|
54
|
+
/** The tab index of the input element. */
|
|
55
|
+
inputTabIndex?: number;
|
|
56
|
+
/** The ARIA label for the number input. */
|
|
57
|
+
ariaLabel?: string;
|
|
58
|
+
/** A callback function to handle input focus. */
|
|
59
|
+
onInputFocus?: (event: FocusEvent) => void;
|
|
60
|
+
/** A callback function to handle input blur. */
|
|
61
|
+
onInputBlur?: (event: FocusEvent) => void;
|
|
62
|
+
/** A callback function to handle input changes. */
|
|
63
|
+
onInputChange?: (value: string) => void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Renders a Modus number input component.
|
|
68
|
+
* @param {ModusNumberInputProps} props - The component props.
|
|
69
|
+
* @returns {JSX.Element} The rendered number input component.
|
|
70
|
+
*/
|
|
71
|
+
export default function ModusNumberInput({
|
|
72
|
+
label,
|
|
73
|
+
placeholder = '',
|
|
74
|
+
value = '',
|
|
75
|
+
name,
|
|
76
|
+
size = 'md',
|
|
77
|
+
bordered = true,
|
|
78
|
+
customClass,
|
|
79
|
+
type = 'number',
|
|
80
|
+
inputMode = 'numeric',
|
|
81
|
+
autoComplete,
|
|
82
|
+
min,
|
|
83
|
+
max,
|
|
84
|
+
step,
|
|
85
|
+
required = false,
|
|
86
|
+
disabled = false,
|
|
87
|
+
readOnly = false,
|
|
88
|
+
currencySymbol,
|
|
89
|
+
feedback,
|
|
90
|
+
inputId,
|
|
91
|
+
inputTabIndex,
|
|
92
|
+
ariaLabel,
|
|
93
|
+
onInputFocus,
|
|
94
|
+
onInputBlur,
|
|
95
|
+
onInputChange,
|
|
96
|
+
}: ModusNumberInputProps) {
|
|
97
|
+
const numberInputRef = useRef<HTMLElement>(null);
|
|
98
|
+
|
|
99
|
+
// Event handlers with useCallback for performance
|
|
100
|
+
const handleInputFocus = useCallback(
|
|
101
|
+
(event: Event) => {
|
|
102
|
+
const focusEvent = event as FocusEvent;
|
|
103
|
+
onInputFocus?.(focusEvent);
|
|
104
|
+
},
|
|
105
|
+
[onInputFocus]
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const handleInputBlur = useCallback(
|
|
109
|
+
(event: Event) => {
|
|
110
|
+
const focusEvent = event as FocusEvent;
|
|
111
|
+
onInputBlur?.(focusEvent);
|
|
112
|
+
},
|
|
113
|
+
[onInputBlur]
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const handleInputChange = useCallback(
|
|
117
|
+
(event: Event) => {
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
const customEvent = event as any;
|
|
120
|
+
onInputChange?.(
|
|
121
|
+
customEvent.detail?.value || customEvent.target?.value || ""
|
|
122
|
+
);
|
|
123
|
+
},
|
|
124
|
+
[onInputChange]
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// Set up event listeners when component mounts
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
const numberInput = numberInputRef.current;
|
|
130
|
+
if (!numberInput) return;
|
|
131
|
+
|
|
132
|
+
// Add event listeners
|
|
133
|
+
numberInput.addEventListener("inputFocus", handleInputFocus);
|
|
134
|
+
numberInput.addEventListener("inputBlur", handleInputBlur);
|
|
135
|
+
numberInput.addEventListener("inputChange", handleInputChange);
|
|
136
|
+
|
|
137
|
+
// Cleanup event listeners
|
|
138
|
+
return () => {
|
|
139
|
+
numberInput.removeEventListener("inputFocus", handleInputFocus);
|
|
140
|
+
numberInput.removeEventListener("inputBlur", handleInputBlur);
|
|
141
|
+
numberInput.removeEventListener("inputChange", handleInputChange);
|
|
142
|
+
};
|
|
143
|
+
}, [handleInputFocus, handleInputBlur, handleInputChange]);
|
|
144
|
+
|
|
145
|
+
// Update number input properties when props change
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
148
|
+
const numberInput = numberInputRef.current as any;
|
|
149
|
+
if (!numberInput) return;
|
|
150
|
+
|
|
151
|
+
// Update basic properties
|
|
152
|
+
numberInput.value = value;
|
|
153
|
+
numberInput.label = label;
|
|
154
|
+
numberInput.placeholder = placeholder;
|
|
155
|
+
numberInput.size = size;
|
|
156
|
+
numberInput.type = type;
|
|
157
|
+
numberInput.inputMode = inputMode;
|
|
158
|
+
numberInput.bordered = bordered;
|
|
159
|
+
numberInput.required = required;
|
|
160
|
+
numberInput.disabled = disabled;
|
|
161
|
+
numberInput.readOnly = readOnly;
|
|
162
|
+
|
|
163
|
+
// Update constraints
|
|
164
|
+
if (min !== undefined) {
|
|
165
|
+
numberInput.min = min;
|
|
166
|
+
}
|
|
167
|
+
if (max !== undefined) {
|
|
168
|
+
numberInput.max = max;
|
|
169
|
+
}
|
|
170
|
+
if (step !== undefined) {
|
|
171
|
+
numberInput.step = step;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Update currency symbol
|
|
175
|
+
if (currencySymbol) {
|
|
176
|
+
numberInput.currencySymbol = currencySymbol;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Update feedback
|
|
180
|
+
if (feedback) {
|
|
181
|
+
numberInput.feedback = feedback;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Update accessibility
|
|
185
|
+
if (inputId) {
|
|
186
|
+
numberInput.inputId = inputId;
|
|
187
|
+
}
|
|
188
|
+
if (inputTabIndex !== undefined) {
|
|
189
|
+
numberInput.inputTabIndex = inputTabIndex;
|
|
190
|
+
}
|
|
191
|
+
if (ariaLabel) {
|
|
192
|
+
numberInput.ariaLabel = ariaLabel;
|
|
193
|
+
}
|
|
194
|
+
if (autoComplete) {
|
|
195
|
+
numberInput.autoComplete = autoComplete;
|
|
196
|
+
}
|
|
197
|
+
if (name) {
|
|
198
|
+
numberInput.name = name;
|
|
199
|
+
}
|
|
200
|
+
}, [
|
|
201
|
+
value,
|
|
202
|
+
label,
|
|
203
|
+
placeholder,
|
|
204
|
+
size,
|
|
205
|
+
type,
|
|
206
|
+
inputMode,
|
|
207
|
+
bordered,
|
|
208
|
+
required,
|
|
209
|
+
disabled,
|
|
210
|
+
readOnly,
|
|
211
|
+
min,
|
|
212
|
+
max,
|
|
213
|
+
step,
|
|
214
|
+
currencySymbol,
|
|
215
|
+
feedback,
|
|
216
|
+
inputId,
|
|
217
|
+
inputTabIndex,
|
|
218
|
+
ariaLabel,
|
|
219
|
+
autoComplete,
|
|
220
|
+
name,
|
|
221
|
+
]);
|
|
222
|
+
|
|
223
|
+
return (
|
|
224
|
+
<ModusWcNumberInput
|
|
225
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
226
|
+
ref={numberInputRef as any}
|
|
227
|
+
custom-class={customClass}
|
|
228
|
+
/>
|
|
229
|
+
);
|
|
230
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { ModusWcPagination } from "@trimble-oss/moduswebcomponents-react";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Represents the ARIA labels for the pagination component.
|
|
8
|
+
*/
|
|
9
|
+
export interface AriaLabelValues {
|
|
10
|
+
/** The ARIA label for the first page button. */
|
|
11
|
+
firstPage?: string;
|
|
12
|
+
/** The ARIA label for the previous page button. */
|
|
13
|
+
previousPage?: string;
|
|
14
|
+
/** The ARIA label for a page button. */
|
|
15
|
+
page?: string;
|
|
16
|
+
/** The ARIA label for the next page button. */
|
|
17
|
+
nextPage?: string;
|
|
18
|
+
/** The ARIA label for the last page button. */
|
|
19
|
+
lastPage?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Props for the ModusPagination component.
|
|
24
|
+
*/
|
|
25
|
+
export interface ModusPaginationProps {
|
|
26
|
+
/** The ARIA label for the pagination component. */
|
|
27
|
+
ariaLabel?: string;
|
|
28
|
+
/** The ARIA labels for the pagination buttons. */
|
|
29
|
+
ariaLabelValues?: AriaLabelValues;
|
|
30
|
+
/** The total number of pages. */
|
|
31
|
+
count?: number;
|
|
32
|
+
/** A custom CSS class to apply to the pagination component. */
|
|
33
|
+
customClass?: string;
|
|
34
|
+
/** The text to display for the next page button. */
|
|
35
|
+
nextButtonText?: string;
|
|
36
|
+
/** The current page number. */
|
|
37
|
+
page?: number;
|
|
38
|
+
/** The text to display for the previous page button. */
|
|
39
|
+
prevButtonText?: string;
|
|
40
|
+
/** The size of the pagination component. */
|
|
41
|
+
size?: 'sm' | 'md' | 'lg';
|
|
42
|
+
/** A callback function to handle page changes. */
|
|
43
|
+
onPageChange?: (event: CustomEvent<{ newPage: number; prevPage: number }>) => void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Renders a Modus pagination component.
|
|
48
|
+
* @param {ModusPaginationProps} props - The component props.
|
|
49
|
+
* @returns {JSX.Element} The rendered pagination component.
|
|
50
|
+
*/
|
|
51
|
+
export default function ModusPagination({
|
|
52
|
+
ariaLabel,
|
|
53
|
+
ariaLabelValues,
|
|
54
|
+
count = 1,
|
|
55
|
+
customClass,
|
|
56
|
+
nextButtonText,
|
|
57
|
+
page = 1,
|
|
58
|
+
prevButtonText,
|
|
59
|
+
size = 'md',
|
|
60
|
+
onPageChange,
|
|
61
|
+
}: ModusPaginationProps) {
|
|
62
|
+
const paginationRef = useRef<HTMLModusWcPaginationElement>(null);
|
|
63
|
+
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
const pagination = paginationRef.current;
|
|
66
|
+
if (!pagination || !onPageChange) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const handlePageChange = (event: Event) => {
|
|
71
|
+
onPageChange(event as CustomEvent<{ newPage: number; prevPage: number }>);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
pagination.addEventListener("pageChange", handlePageChange);
|
|
75
|
+
|
|
76
|
+
return () => {
|
|
77
|
+
pagination.removeEventListener("pageChange", handlePageChange);
|
|
78
|
+
};
|
|
79
|
+
}, [onPageChange]);
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<ModusWcPagination
|
|
83
|
+
ref={paginationRef}
|
|
84
|
+
aria-label={ariaLabel}
|
|
85
|
+
ariaLabelValues={ariaLabelValues}
|
|
86
|
+
count={count}
|
|
87
|
+
custom-class={customClass}
|
|
88
|
+
nextButtonText={nextButtonText}
|
|
89
|
+
page={page}
|
|
90
|
+
prevButtonText={prevButtonText}
|
|
91
|
+
size={size}
|
|
92
|
+
/>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ModusWcPanel } from "@trimble-oss/moduswebcomponents-react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for the ModusPanel component.
|
|
6
|
+
*/
|
|
7
|
+
export interface ModusPanelProps {
|
|
8
|
+
/** Custom CSS class to apply to the outer panel container. */
|
|
9
|
+
customClass?: string;
|
|
10
|
+
/** Width of the panel (accepts any valid CSS width value). */
|
|
11
|
+
width?: string;
|
|
12
|
+
/** Height of the panel (accepts any valid CSS height value). */
|
|
13
|
+
height?: string;
|
|
14
|
+
/** Enable floating mode with elevated shadow for overlay/modal-like appearance. */
|
|
15
|
+
floating?: boolean;
|
|
16
|
+
/** Content for the panel header section (typically navigation or title). */
|
|
17
|
+
header?: ReactNode;
|
|
18
|
+
/** Main content area of the panel. */
|
|
19
|
+
body?: ReactNode;
|
|
20
|
+
/** Content for the panel footer section (typically actions or secondary navigation). */
|
|
21
|
+
footer?: ReactNode;
|
|
22
|
+
/** Alternative way to pass body content as children. */
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
/** The ARIA label for the panel. */
|
|
25
|
+
ariaLabel?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Renders a Modus panel component for organizing content in a structured layout.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // Basic panel with header, body, and footer
|
|
33
|
+
* <ModusPanel
|
|
34
|
+
* width="250px"
|
|
35
|
+
* height="500px"
|
|
36
|
+
* header={<div>Header Content</div>}
|
|
37
|
+
* body={<div>Main Content</div>}
|
|
38
|
+
* footer={<div>Footer Content</div>}
|
|
39
|
+
* />
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // Floating panel with elevated shadow
|
|
43
|
+
* <ModusPanel
|
|
44
|
+
* width="320px"
|
|
45
|
+
* height="auto"
|
|
46
|
+
* floating
|
|
47
|
+
* header={<div>Quick Actions</div>}
|
|
48
|
+
* body={
|
|
49
|
+
* <div>
|
|
50
|
+
* <ModusButton fullWidth>New Document</ModusButton>
|
|
51
|
+
* <ModusButton fullWidth>Upload File</ModusButton>
|
|
52
|
+
* </div>
|
|
53
|
+
* }
|
|
54
|
+
* />
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* // Body-only panel using children
|
|
58
|
+
* <ModusPanel width="250px" height="auto">
|
|
59
|
+
* <div>Content as children (placed in body slot)</div>
|
|
60
|
+
* </ModusPanel>
|
|
61
|
+
*
|
|
62
|
+
* @param {ModusPanelProps} props - The component props.
|
|
63
|
+
* @returns {JSX.Element} The rendered panel component.
|
|
64
|
+
*/
|
|
65
|
+
export default function ModusPanel({
|
|
66
|
+
customClass,
|
|
67
|
+
width = "350px",
|
|
68
|
+
height = "700px",
|
|
69
|
+
floating = false,
|
|
70
|
+
header,
|
|
71
|
+
body,
|
|
72
|
+
footer,
|
|
73
|
+
children,
|
|
74
|
+
ariaLabel,
|
|
75
|
+
}: ModusPanelProps) {
|
|
76
|
+
// If body is not provided but children are, use children as body content
|
|
77
|
+
const bodyContent = body || children;
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<ModusWcPanel
|
|
81
|
+
custom-class={customClass}
|
|
82
|
+
width={width}
|
|
83
|
+
height={height}
|
|
84
|
+
floating={floating}
|
|
85
|
+
aria-label={ariaLabel}
|
|
86
|
+
>
|
|
87
|
+
{header && <div slot="header">{header}</div>}
|
|
88
|
+
{bodyContent && <div slot="body">{bodyContent}</div>}
|
|
89
|
+
{footer && <div slot="footer">{footer}</div>}
|
|
90
|
+
</ModusWcPanel>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import type { ReactNode } from "react";
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
import { ModusWcProgress } from "@trimble-oss/moduswebcomponents-react";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Props for the ModusProgress component.
|
|
9
|
+
*/
|
|
10
|
+
interface ModusProgressProps {
|
|
11
|
+
/** The variant of the progress bar. */
|
|
12
|
+
variant?: 'default' | 'radial';
|
|
13
|
+
/** The current value of the progress bar. */
|
|
14
|
+
value?: number;
|
|
15
|
+
/** The maximum value of the progress bar. */
|
|
16
|
+
max?: number;
|
|
17
|
+
/** Whether the progress is indeterminate. */
|
|
18
|
+
indeterminate?: boolean;
|
|
19
|
+
/** The label for the progress bar. */
|
|
20
|
+
label?: string;
|
|
21
|
+
/** A custom CSS class to apply to the progress bar. */
|
|
22
|
+
customClass?: string;
|
|
23
|
+
/** The ARIA label for the progress bar. */
|
|
24
|
+
ariaLabel?: string;
|
|
25
|
+
/** The content to display inside the progress bar (for radial variant). */
|
|
26
|
+
children?: ReactNode;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Renders a Modus progress component.
|
|
31
|
+
* @param {ModusProgressProps} props - The component props.
|
|
32
|
+
* @returns {JSX.Element} The rendered progress component.
|
|
33
|
+
*/
|
|
34
|
+
export default function ModusProgress({
|
|
35
|
+
variant = 'default',
|
|
36
|
+
value = 0,
|
|
37
|
+
max = 100,
|
|
38
|
+
indeterminate = false,
|
|
39
|
+
label = '',
|
|
40
|
+
customClass = '',
|
|
41
|
+
ariaLabel = 'Progress status',
|
|
42
|
+
children,
|
|
43
|
+
}: ModusProgressProps) {
|
|
44
|
+
const normalizedValue = useMemo(() => {
|
|
45
|
+
if (indeterminate) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (max <= 0) {
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const clampedValue = Math.min(Math.max(value, 0), max);
|
|
54
|
+
return Number.isFinite(clampedValue) ? clampedValue : 0;
|
|
55
|
+
}, [indeterminate, max, value]);
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<ModusWcProgress
|
|
59
|
+
variant={variant}
|
|
60
|
+
value={normalizedValue}
|
|
61
|
+
max={max}
|
|
62
|
+
indeterminate={indeterminate}
|
|
63
|
+
label={label}
|
|
64
|
+
custom-class={customClass}
|
|
65
|
+
aria-label={ariaLabel}
|
|
66
|
+
>
|
|
67
|
+
{variant === "radial" ? children : null}
|
|
68
|
+
</ModusWcProgress>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import "@trimble-oss/moduswebcomponents-react/modus-wc-styles.css";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the ModusProvider component.
|
|
5
|
+
*/
|
|
6
|
+
interface ModusProviderProps {
|
|
7
|
+
/** The child components to render within the provider. */
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A provider component that applies Modus web component styles.
|
|
13
|
+
* @param {ModusProviderProps} props - The component props.
|
|
14
|
+
* @returns {JSX.Element} The rendered provider component.
|
|
15
|
+
*/
|
|
16
|
+
export default function ModusProvider({ children }: ModusProviderProps) {
|
|
17
|
+
return <>{children}</>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { ModusWcRadio } from "@trimble-oss/moduswebcomponents-react";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props for the ModusRadio component.
|
|
8
|
+
*/
|
|
9
|
+
export interface ModusRadioProps {
|
|
10
|
+
/** The label for the radio button. */
|
|
11
|
+
label?: string;
|
|
12
|
+
/** The value of the radio button. */
|
|
13
|
+
value?: boolean;
|
|
14
|
+
/** The name of the radio button group. */
|
|
15
|
+
name?: string;
|
|
16
|
+
/** The size of the radio button. */
|
|
17
|
+
size?: 'sm' | 'md' | 'lg';
|
|
18
|
+
/** Whether the radio button is required. */
|
|
19
|
+
required?: boolean;
|
|
20
|
+
/** Whether the radio button is disabled. */
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** The ID of the input element. */
|
|
23
|
+
inputId?: string;
|
|
24
|
+
/** The tab index of the input element. */
|
|
25
|
+
inputTabIndex?: number;
|
|
26
|
+
/** A custom CSS class to apply to the radio button. */
|
|
27
|
+
customClass?: string;
|
|
28
|
+
/** The ARIA label for the radio button. */
|
|
29
|
+
'aria-label'?: string;
|
|
30
|
+
/** A callback function to handle input changes. */
|
|
31
|
+
onInputChange?: (event: CustomEvent<InputEvent>) => void;
|
|
32
|
+
/** A callback function to handle input focus. */
|
|
33
|
+
onInputFocus?: (event: CustomEvent<FocusEvent>) => void;
|
|
34
|
+
/** A callback function to handle input blur. */
|
|
35
|
+
onInputBlur?: (event: CustomEvent<FocusEvent>) => void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Renders a Modus radio button component.
|
|
40
|
+
* @param {ModusRadioProps} props - The component props.
|
|
41
|
+
* @returns {JSX.Element} The rendered radio button component.
|
|
42
|
+
*/
|
|
43
|
+
export default function ModusRadio({
|
|
44
|
+
label,
|
|
45
|
+
value = false,
|
|
46
|
+
name = '',
|
|
47
|
+
size = 'md',
|
|
48
|
+
required = false,
|
|
49
|
+
disabled = false,
|
|
50
|
+
inputId,
|
|
51
|
+
inputTabIndex,
|
|
52
|
+
customClass,
|
|
53
|
+
'aria-label': ariaLabel,
|
|
54
|
+
onInputChange,
|
|
55
|
+
onInputFocus,
|
|
56
|
+
onInputBlur,
|
|
57
|
+
}: ModusRadioProps) {
|
|
58
|
+
const radioRef = useRef<HTMLModusWcRadioElement>(null);
|
|
59
|
+
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
const radio = radioRef.current;
|
|
62
|
+
if (!radio) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const handleChange = (event: Event) => {
|
|
67
|
+
onInputChange?.(event as CustomEvent<InputEvent>);
|
|
68
|
+
};
|
|
69
|
+
const handleFocus = (event: Event) => {
|
|
70
|
+
onInputFocus?.(event as CustomEvent<FocusEvent>);
|
|
71
|
+
};
|
|
72
|
+
const handleBlur = (event: Event) => {
|
|
73
|
+
onInputBlur?.(event as CustomEvent<FocusEvent>);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
if (onInputChange) {
|
|
77
|
+
radio.addEventListener("inputChange", handleChange);
|
|
78
|
+
}
|
|
79
|
+
if (onInputFocus) {
|
|
80
|
+
radio.addEventListener("inputFocus", handleFocus);
|
|
81
|
+
}
|
|
82
|
+
if (onInputBlur) {
|
|
83
|
+
radio.addEventListener("inputBlur", handleBlur);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return () => {
|
|
87
|
+
if (onInputChange) {
|
|
88
|
+
radio.removeEventListener("inputChange", handleChange);
|
|
89
|
+
}
|
|
90
|
+
if (onInputFocus) {
|
|
91
|
+
radio.removeEventListener("inputFocus", handleFocus);
|
|
92
|
+
}
|
|
93
|
+
if (onInputBlur) {
|
|
94
|
+
radio.removeEventListener("inputBlur", handleBlur);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}, [onInputChange, onInputFocus, onInputBlur]);
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<ModusWcRadio
|
|
101
|
+
ref={radioRef}
|
|
102
|
+
label={label}
|
|
103
|
+
value={value}
|
|
104
|
+
name={name}
|
|
105
|
+
size={size}
|
|
106
|
+
required={required}
|
|
107
|
+
disabled={disabled}
|
|
108
|
+
inputId={inputId}
|
|
109
|
+
inputTabIndex={inputTabIndex}
|
|
110
|
+
customClass={customClass}
|
|
111
|
+
aria-label={ariaLabel}
|
|
112
|
+
/>
|
|
113
|
+
);
|
|
114
|
+
}
|