@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.
Files changed (450) hide show
  1. package/README.md +191 -0
  2. package/bin/create-trimble-app.js +9 -0
  3. package/package.json +67 -0
  4. package/src/cli.js +134 -0
  5. package/src/frameworks.js +28 -0
  6. package/src/scaffold.js +209 -0
  7. package/src/utils/file.js +47 -0
  8. package/src/utils/git.js +140 -0
  9. package/src/utils/install.js +25 -0
  10. package/src/utils/logger.js +124 -0
  11. package/templates/angular/.cursor/commands/remove-dev-content.md +394 -0
  12. package/templates/angular/.cursor/mcp.json +13 -0
  13. package/templates/angular/.cursor/rules/modus-angular-20.mdc +82 -0
  14. package/templates/angular/.cursor/rules/modus-angular-accordion-state-management-short.mdc +45 -0
  15. package/templates/angular/.cursor/rules/modus-angular-accordion-state-management.mdc +322 -0
  16. package/templates/angular/.cursor/rules/modus-angular-best-practices.mdc +472 -0
  17. package/templates/angular/.cursor/rules/modus-angular-border-usage-short.mdc +48 -0
  18. package/templates/angular/.cursor/rules/modus-angular-border-usage.mdc +286 -0
  19. package/templates/angular/.cursor/rules/modus-angular-button-group-usage-short.mdc +47 -0
  20. package/templates/angular/.cursor/rules/modus-angular-button-group-usage.mdc +263 -0
  21. package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion-short.mdc +36 -0
  22. package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion.mdc +92 -0
  23. package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing-short.mdc +34 -0
  24. package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing.mdc +185 -0
  25. package/templates/angular/.cursor/rules/modus-angular-color-usage-short.mdc +56 -0
  26. package/templates/angular/.cursor/rules/modus-angular-color-usage.mdc +208 -0
  27. package/templates/angular/.cursor/rules/modus-angular-components-reference.mdc +114 -0
  28. package/templates/angular/.cursor/rules/modus-angular-design-system.mdc +273 -0
  29. package/templates/angular/.cursor/rules/modus-angular-development-workflow-short.mdc +43 -0
  30. package/templates/angular/.cursor/rules/modus-angular-development-workflow.mdc +145 -0
  31. package/templates/angular/.cursor/rules/modus-angular-essentials.mdc +272 -0
  32. package/templates/angular/.cursor/rules/modus-angular-forms-validation-short.mdc +56 -0
  33. package/templates/angular/.cursor/rules/modus-angular-forms-validation.mdc +124 -0
  34. package/templates/angular/.cursor/rules/modus-angular-icon-names.mdc +70 -0
  35. package/templates/angular/.cursor/rules/modus-angular-icons-short.mdc +40 -0
  36. package/templates/angular/.cursor/rules/modus-angular-icons.mdc +137 -0
  37. package/templates/angular/.cursor/rules/modus-angular-implementation-guides-short.mdc +36 -0
  38. package/templates/angular/.cursor/rules/modus-angular-implementation-guides.mdc +301 -0
  39. package/templates/angular/.cursor/rules/modus-angular-integration-short.mdc +60 -0
  40. package/templates/angular/.cursor/rules/modus-angular-integration.mdc +1096 -0
  41. package/templates/angular/.cursor/rules/modus-angular-master.mdc +164 -0
  42. package/templates/angular/.cursor/rules/modus-angular-modal-usage-short.mdc +51 -0
  43. package/templates/angular/.cursor/rules/modus-angular-modal-usage.mdc +115 -0
  44. package/templates/angular/.cursor/rules/modus-angular-navbar-usage-short.mdc +49 -0
  45. package/templates/angular/.cursor/rules/modus-angular-navbar-usage.mdc +146 -0
  46. package/templates/angular/.cursor/rules/modus-angular-no-emojis.mdc +66 -0
  47. package/templates/angular/.cursor/rules/modus-angular-opacity-utilities-short.mdc +43 -0
  48. package/templates/angular/.cursor/rules/modus-angular-opacity-utilities.mdc +160 -0
  49. package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu-short.mdc +51 -0
  50. package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu.mdc +83 -0
  51. package/templates/angular/.cursor/rules/modus-angular-semantic-html-short.mdc +36 -0
  52. package/templates/angular/.cursor/rules/modus-angular-semantic-html.mdc +81 -0
  53. package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage-short.mdc +50 -0
  54. package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage.mdc +136 -0
  55. package/templates/angular/.cursor/rules/modus-angular-table-usage-short.mdc +52 -0
  56. package/templates/angular/.cursor/rules/modus-angular-table-usage.mdc +151 -0
  57. package/templates/angular/.cursor/rules/modus-angular-tailwind-usage-short.mdc +44 -0
  58. package/templates/angular/.cursor/rules/modus-angular-tailwind-usage.mdc +242 -0
  59. package/templates/angular/.cursor/rules/modus-angular-themes-short.mdc +54 -0
  60. package/templates/angular/.cursor/rules/modus-angular-themes.mdc +222 -0
  61. package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage-short.mdc +52 -0
  62. package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage.mdc +130 -0
  63. package/templates/angular/.cursor/rules/ux/gestalt-laws-detailed.mdc +514 -0
  64. package/templates/angular/.cursor/rules/ux/ux-ui-foundations.mdc +235 -0
  65. package/templates/angular/.cursor/skills/run-lint-checks/SKILL.md +169 -0
  66. package/templates/angular/.editorconfig +17 -0
  67. package/templates/angular/.github/dependabot.yml +19 -0
  68. package/templates/angular/.github/workflows/a11y-check.yml +135 -0
  69. package/templates/angular/.github/workflows/ci.yml +44 -0
  70. package/templates/angular/.husky/pre-commit +32 -0
  71. package/templates/angular/.postcssrc.json +5 -0
  72. package/templates/angular/.vscode/extensions.json +4 -0
  73. package/templates/angular/.vscode/launch.json +20 -0
  74. package/templates/angular/.vscode/tasks.json +42 -0
  75. package/templates/angular/CLAUDE.md +148 -0
  76. package/templates/angular/README.md +92 -0
  77. package/templates/angular/amplify.yml +25 -0
  78. package/templates/angular/angular.json +106 -0
  79. package/templates/angular/data/modusIcons.ts +861 -0
  80. package/templates/angular/package-lock.json +11030 -0
  81. package/templates/angular/package.json +66 -0
  82. package/templates/angular/public/angular-icon.svg +12 -0
  83. package/templates/angular/public/favicon.ico +0 -0
  84. package/templates/angular/public/modus-icons.css +49 -0
  85. package/templates/angular/public/vite.svg +1 -0
  86. package/templates/angular/scripts/README.md +410 -0
  87. package/templates/angular/scripts/check-border-violations.js +352 -0
  88. package/templates/angular/scripts/check-icon-names.js +402 -0
  89. package/templates/angular/scripts/check-inline-styles.js +292 -0
  90. package/templates/angular/scripts/check-modus-colors.js +282 -0
  91. package/templates/angular/scripts/check-modus-icons.js +263 -0
  92. package/templates/angular/scripts/check-opacity-utilities.js +426 -0
  93. package/templates/angular/scripts/check-semantic-html.js +452 -0
  94. package/templates/angular/scripts/check-typescript.js +109 -0
  95. package/templates/angular/src/app/app.config.ts +29 -0
  96. package/templates/angular/src/app/app.css +0 -0
  97. package/templates/angular/src/app/app.html +4 -0
  98. package/templates/angular/src/app/app.routes.ts +351 -0
  99. package/templates/angular/src/app/app.spec.ts +27 -0
  100. package/templates/angular/src/app/app.ts +47 -0
  101. package/templates/angular/src/app/components/README.md +77 -0
  102. package/templates/angular/src/app/components/index.ts +53 -0
  103. package/templates/angular/src/app/components/modus-accordion.component.ts +50 -0
  104. package/templates/angular/src/app/components/modus-alert.component.ts +133 -0
  105. package/templates/angular/src/app/components/modus-autocomplete.component.ts +262 -0
  106. package/templates/angular/src/app/components/modus-avatar.component.ts +75 -0
  107. package/templates/angular/src/app/components/modus-badge.component.ts +84 -0
  108. package/templates/angular/src/app/components/modus-breadcrumbs.component.ts +65 -0
  109. package/templates/angular/src/app/components/modus-button-group.component.ts +82 -0
  110. package/templates/angular/src/app/components/modus-button.component.ts +292 -0
  111. package/templates/angular/src/app/components/modus-card.component.ts +73 -0
  112. package/templates/angular/src/app/components/modus-checkbox.component.ts +117 -0
  113. package/templates/angular/src/app/components/modus-chip.component.ts +97 -0
  114. package/templates/angular/src/app/components/modus-collapse.component.ts +118 -0
  115. package/templates/angular/src/app/components/modus-date.component.ts +165 -0
  116. package/templates/angular/src/app/components/modus-dropdown-menu.component.ts +108 -0
  117. package/templates/angular/src/app/components/modus-file-dropzone.component.ts +121 -0
  118. package/templates/angular/src/app/components/modus-handle.component.ts +96 -0
  119. package/templates/angular/src/app/components/modus-icon.component.ts +81 -0
  120. package/templates/angular/src/app/components/modus-input-feedback.component.ts +54 -0
  121. package/templates/angular/src/app/components/modus-input-label.component.ts +62 -0
  122. package/templates/angular/src/app/components/modus-loader.component.ts +48 -0
  123. package/templates/angular/src/app/components/modus-logo.component.ts +115 -0
  124. package/templates/angular/src/app/components/modus-menu-item.component.ts +116 -0
  125. package/templates/angular/src/app/components/modus-menu.component.ts +58 -0
  126. package/templates/angular/src/app/components/modus-modal.component.ts +70 -0
  127. package/templates/angular/src/app/components/modus-navbar.component.ts +303 -0
  128. package/templates/angular/src/app/components/modus-number-input.component.ts +174 -0
  129. package/templates/angular/src/app/components/modus-pagination.component.ts +74 -0
  130. package/templates/angular/src/app/components/modus-panel.component.ts +61 -0
  131. package/templates/angular/src/app/components/modus-progress.component.ts +62 -0
  132. package/templates/angular/src/app/components/modus-radio.component.ts +102 -0
  133. package/templates/angular/src/app/components/modus-rating.component.ts +80 -0
  134. package/templates/angular/src/app/components/modus-select.component.ts +131 -0
  135. package/templates/angular/src/app/components/modus-side-navigation.component.ts +90 -0
  136. package/templates/angular/src/app/components/modus-skeleton.component.ts +54 -0
  137. package/templates/angular/src/app/components/modus-slider.component.ts +132 -0
  138. package/templates/angular/src/app/components/modus-stepper.component.ts +65 -0
  139. package/templates/angular/src/app/components/modus-switch.component.ts +118 -0
  140. package/templates/angular/src/app/components/modus-table.component.ts +204 -0
  141. package/templates/angular/src/app/components/modus-tabs.component.ts +82 -0
  142. package/templates/angular/src/app/components/modus-text-input.component.ts +221 -0
  143. package/templates/angular/src/app/components/modus-textarea.component.ts +168 -0
  144. package/templates/angular/src/app/components/modus-theme-switcher.component.ts +45 -0
  145. package/templates/angular/src/app/components/modus-time-input.component.ts +172 -0
  146. package/templates/angular/src/app/components/modus-toast.component.ts +63 -0
  147. package/templates/angular/src/app/components/modus-toolbar.component.ts +43 -0
  148. package/templates/angular/src/app/components/modus-tooltip.component.ts +83 -0
  149. package/templates/angular/src/app/components/modus-typography.component.ts +79 -0
  150. package/templates/angular/src/app/components/modus-utility-panel.component.ts +275 -0
  151. package/templates/angular/src/app/components/theme-demo.component.ts +1242 -0
  152. package/templates/angular/src/app/data/component-demos.ts +360 -0
  153. package/templates/angular/src/app/data/modus-icons.ts +806 -0
  154. package/templates/angular/src/app/demos/accordion/accordion-demo.component.ts +212 -0
  155. package/templates/angular/src/app/demos/alert/alert-demo.component.ts +108 -0
  156. package/templates/angular/src/app/demos/autocomplete/autocomplete-demo.component.ts +174 -0
  157. package/templates/angular/src/app/demos/avatar/avatar-demo.component.ts +149 -0
  158. package/templates/angular/src/app/demos/badge/badge-demo.component.ts +148 -0
  159. package/templates/angular/src/app/demos/breadcrumbs/breadcrumbs-demo.component.ts +96 -0
  160. package/templates/angular/src/app/demos/button/button-demo.component.ts +256 -0
  161. package/templates/angular/src/app/demos/button-group/button-group-demo.component.ts +215 -0
  162. package/templates/angular/src/app/demos/card/card-demo.component.ts +180 -0
  163. package/templates/angular/src/app/demos/checkbox/checkbox-demo.component.ts +71 -0
  164. package/templates/angular/src/app/demos/chip/chip-demo.component.ts +183 -0
  165. package/templates/angular/src/app/demos/date/date-demo.component.ts +193 -0
  166. package/templates/angular/src/app/demos/dropdown/dropdown-demo.component.ts +196 -0
  167. package/templates/angular/src/app/demos/file-dropzone/file-dropzone-demo.component.ts +176 -0
  168. package/templates/angular/src/app/demos/handle/handle-demo.component.ts +265 -0
  169. package/templates/angular/src/app/demos/icon/icon-demo.component.ts +65 -0
  170. package/templates/angular/src/app/demos/input-feedback/input-feedback-demo.component.ts +189 -0
  171. package/templates/angular/src/app/demos/input-label/input-label-demo.component.ts +330 -0
  172. package/templates/angular/src/app/demos/loader/loader-demo.component.ts +143 -0
  173. package/templates/angular/src/app/demos/logo/logo-demo.component.ts +191 -0
  174. package/templates/angular/src/app/demos/menu/menu-demo.component.ts +72 -0
  175. package/templates/angular/src/app/demos/modal/modal-demo.component.ts +278 -0
  176. package/templates/angular/src/app/demos/navbar/navbar-demo.component.ts +135 -0
  177. package/templates/angular/src/app/demos/number-input/number-input-demo.component.ts +175 -0
  178. package/templates/angular/src/app/demos/pagination/pagination-demo.component.ts +134 -0
  179. package/templates/angular/src/app/demos/panel/panel-demo.component.ts +235 -0
  180. package/templates/angular/src/app/demos/progress/progress-demo.component.ts +169 -0
  181. package/templates/angular/src/app/demos/radio/radio-demo.component.ts +161 -0
  182. package/templates/angular/src/app/demos/rating/rating-demo.component.ts +97 -0
  183. package/templates/angular/src/app/demos/select/select-demo.component.ts +107 -0
  184. package/templates/angular/src/app/demos/shared/demo-example-clean.component.ts +41 -0
  185. package/templates/angular/src/app/demos/shared/demo-example.component.ts +42 -0
  186. package/templates/angular/src/app/demos/shared/demo-page.component.ts +97 -0
  187. package/templates/angular/src/app/demos/shared/index.ts +3 -0
  188. package/templates/angular/src/app/demos/side-navigation/side-navigation-demo.component.ts +524 -0
  189. package/templates/angular/src/app/demos/skeleton/skeleton-demo.component.ts +112 -0
  190. package/templates/angular/src/app/demos/slider/slider-demo.component.ts +76 -0
  191. package/templates/angular/src/app/demos/stepper/stepper-demo.component.ts +79 -0
  192. package/templates/angular/src/app/demos/switch/switch-demo.component.ts +113 -0
  193. package/templates/angular/src/app/demos/table/table-demo.component.ts +405 -0
  194. package/templates/angular/src/app/demos/tabs/tabs-demo.component.ts +318 -0
  195. package/templates/angular/src/app/demos/text-input/text-input-demo.component.ts +160 -0
  196. package/templates/angular/src/app/demos/textarea/textarea-demo.component.ts +95 -0
  197. package/templates/angular/src/app/demos/theme-switcher/theme-switcher-demo.component.ts +38 -0
  198. package/templates/angular/src/app/demos/time-input/time-input-demo.component.ts +130 -0
  199. package/templates/angular/src/app/demos/toast/toast-demo.component.ts +258 -0
  200. package/templates/angular/src/app/demos/toolbar/toolbar-demo.component.ts +54 -0
  201. package/templates/angular/src/app/demos/tooltip/tooltip-demo.component.ts +163 -0
  202. package/templates/angular/src/app/demos/utility-panel/utility-panel-demo.component.ts +197 -0
  203. package/templates/angular/src/app/dev/dev-config.ts +119 -0
  204. package/templates/angular/src/app/dev/dev-panel/dev-panel.component.ts +215 -0
  205. package/templates/angular/src/app/dev/dev-panel.service.ts +63 -0
  206. package/templates/angular/src/app/dev/index.ts +8 -0
  207. package/templates/angular/src/app/dev/theme-switcher-dropdown/theme-switcher-dropdown.component.ts +134 -0
  208. package/templates/angular/src/app/dev-pages/color-palette/color-palette.component.ts +229 -0
  209. package/templates/angular/src/app/dev-pages/components-gallery/components-gallery.component.ts +486 -0
  210. package/templates/angular/src/app/dev-pages/icons/icons.component.ts +149 -0
  211. package/templates/angular/src/app/pages/home/home.component.ts +251 -0
  212. package/templates/angular/src/app/services/README.md +57 -0
  213. package/templates/angular/src/app/services/theme.service.ts +163 -0
  214. package/templates/angular/src/environments/environment.development.ts +8 -0
  215. package/templates/angular/src/environments/environment.ts +8 -0
  216. package/templates/angular/src/index.html +14 -0
  217. package/templates/angular/src/main.ts +6 -0
  218. package/templates/angular/src/styles.css +1328 -0
  219. package/templates/angular/tsconfig.app.json +15 -0
  220. package/templates/angular/tsconfig.json +35 -0
  221. package/templates/angular/tsconfig.spec.json +14 -0
  222. package/templates/config.json +23 -0
  223. package/templates/react/.cursor/commands/remove-dev-content.md +311 -0
  224. package/templates/react/.cursor/mcp.json +13 -0
  225. package/templates/react/.cursor/rules/README.md +240 -0
  226. package/templates/react/.cursor/rules/border-usage-guidelines-short.mdc +22 -0
  227. package/templates/react/.cursor/rules/border-usage-guidelines.mdc +380 -0
  228. package/templates/react/.cursor/rules/chrome-devtools-testing-react-short.mdc +23 -0
  229. package/templates/react/.cursor/rules/development-workflow-react-short.mdc +23 -0
  230. package/templates/react/.cursor/rules/development-workflow-react.mdc +292 -0
  231. package/templates/react/.cursor/rules/implementation-guides-react-short.mdc +23 -0
  232. package/templates/react/.cursor/rules/implementation-guides-react.mdc +446 -0
  233. package/templates/react/.cursor/rules/modus-accordion-state-management-react-short.mdc +23 -0
  234. package/templates/react/.cursor/rules/modus-accordion-state-management-react.mdc +445 -0
  235. package/templates/react/.cursor/rules/modus-button-group-usage-react-short.mdc +23 -0
  236. package/templates/react/.cursor/rules/modus-button-group-usage-react.mdc +117 -0
  237. package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react-short.mdc +23 -0
  238. package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react.mdc +492 -0
  239. package/templates/react/.cursor/rules/modus-color-usage-react-short.mdc +23 -0
  240. package/templates/react/.cursor/rules/modus-color-usage-react.mdc +420 -0
  241. package/templates/react/.cursor/rules/modus-components-reference.mdc +366 -0
  242. package/templates/react/.cursor/rules/modus-icon-names.mdc +63 -0
  243. package/templates/react/.cursor/rules/modus-icons-react-short.mdc +24 -0
  244. package/templates/react/.cursor/rules/modus-icons-react.mdc +402 -0
  245. package/templates/react/.cursor/rules/modus-modal-implementation-react-short.mdc +23 -0
  246. package/templates/react/.cursor/rules/modus-modal-implementation-react.mdc +831 -0
  247. package/templates/react/.cursor/rules/modus-navbar-side-navigation-react-short.mdc +23 -0
  248. package/templates/react/.cursor/rules/modus-navbar-side-navigation-react.mdc +247 -0
  249. package/templates/react/.cursor/rules/modus-no-emojis-react-short.mdc +23 -0
  250. package/templates/react/.cursor/rules/modus-opacity-utilities-react-short.mdc +70 -0
  251. package/templates/react/.cursor/rules/modus-opacity-utilities-react.mdc +208 -0
  252. package/templates/react/.cursor/rules/modus-react-best-practices-short.mdc +23 -0
  253. package/templates/react/.cursor/rules/modus-react-best-practices.mdc +508 -0
  254. package/templates/react/.cursor/rules/modus-react-essentials.mdc +209 -0
  255. package/templates/react/.cursor/rules/modus-react-integration-short.mdc +23 -0
  256. package/templates/react/.cursor/rules/modus-react-integration.mdc +509 -0
  257. package/templates/react/.cursor/rules/modus-react-key-warnings-short.mdc +23 -0
  258. package/templates/react/.cursor/rules/modus-react-key-warnings.mdc +805 -0
  259. package/templates/react/.cursor/rules/modus-react-master.mdc +160 -0
  260. package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react-short.mdc +23 -0
  261. package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react.mdc +442 -0
  262. package/templates/react/.cursor/rules/modus-semantic-html-react-short.mdc +23 -0
  263. package/templates/react/.cursor/rules/modus-semantic-html-react.mdc +427 -0
  264. package/templates/react/.cursor/rules/modus-tailwind-usage-react-short.mdc +23 -0
  265. package/templates/react/.cursor/rules/modus-tailwind-usage-react.mdc +642 -0
  266. package/templates/react/.cursor/rules/modus-themes-react-short.mdc +23 -0
  267. package/templates/react/.cursor/rules/modus-themes-react.mdc +506 -0
  268. package/templates/react/.cursor/rules/ux/gestalt-laws-detailed.mdc +456 -0
  269. package/templates/react/.cursor/rules/ux/ux-ui-foundations.mdc +211 -0
  270. package/templates/react/.cursor/skills/create-modus-form-component/SKILL.md +518 -0
  271. package/templates/react/.cursor/skills/create-modus-wrapper-component/SKILL.md +252 -0
  272. package/templates/react/.cursor/skills/fix-modus-component-event-issues/SKILL.md +345 -0
  273. package/templates/react/.cursor/skills/handle-modus-checkbox-value-bug/SKILL.md +202 -0
  274. package/templates/react/.cursor/skills/implement-modus-modal-with-refs/SKILL.md +386 -0
  275. package/templates/react/.cursor/skills/integrate-modus-icons/SKILL.md +300 -0
  276. package/templates/react/.cursor/skills/run-lint-checks/SKILL.md +235 -0
  277. package/templates/react/.cursor/skills/set-up-modus-event-listeners/SKILL.md +284 -0
  278. package/templates/react/.cursor/skills/style-modus-components-with-tailwind/SKILL.md +382 -0
  279. package/templates/react/.env.development +3 -0
  280. package/templates/react/.env.production +3 -0
  281. package/templates/react/.github/CODEOWNERS +28 -0
  282. package/templates/react/.github/ISSUE_TEMPLATE/bug_report.yml +176 -0
  283. package/templates/react/.github/ISSUE_TEMPLATE/config.yml +20 -0
  284. package/templates/react/.github/ISSUE_TEMPLATE/documentation.yml +115 -0
  285. package/templates/react/.github/ISSUE_TEMPLATE/feature_request.yml +171 -0
  286. package/templates/react/.github/ISSUE_TEMPLATE/question.yml +139 -0
  287. package/templates/react/.github/copilot-instructions.md +80 -0
  288. package/templates/react/.github/instructions/components.instructions.md +82 -0
  289. package/templates/react/.github/instructions/demos.instructions.md +82 -0
  290. package/templates/react/.github/instructions/pages.instructions.md +76 -0
  291. package/templates/react/.github/instructions/styles.instructions.md +77 -0
  292. package/templates/react/.github/instructions/typescript.instructions.md +101 -0
  293. package/templates/react/.github/pull_request_template.md +188 -0
  294. package/templates/react/.github/workflows/ci.yml +43 -0
  295. package/templates/react/.github/workflows/claude-code-review.yml +44 -0
  296. package/templates/react/.github/workflows/claude.yml +50 -0
  297. package/templates/react/.husky/pre-commit +28 -0
  298. package/templates/react/.vscode/extensions.json +8 -0
  299. package/templates/react/CLAUDE.md +119 -0
  300. package/templates/react/CODE_OF_CONDUCT.md +79 -0
  301. package/templates/react/CONTRIBUTING.md +65 -0
  302. package/templates/react/LICENSE +21 -0
  303. package/templates/react/README.md +728 -0
  304. package/templates/react/SECURITY.md +50 -0
  305. package/templates/react/eslint.config.js +23 -0
  306. package/templates/react/index.html +13 -0
  307. package/templates/react/package-lock.json +5209 -0
  308. package/templates/react/package.json +49 -0
  309. package/templates/react/postcss.config.js +6 -0
  310. package/templates/react/public/react.svg +1 -0
  311. package/templates/react/public/vite.svg +1 -0
  312. package/templates/react/readme_assets/getting_started_header.png +0 -0
  313. package/templates/react/readme_assets/hero.png +0 -0
  314. package/templates/react/readme_assets/modus_comp.png +0 -0
  315. package/templates/react/readme_assets/modus_figma_mcp.png +0 -0
  316. package/templates/react/readme_assets/teaser_comp.gif +0 -0
  317. package/templates/react/scripts/README.md +343 -0
  318. package/templates/react/scripts/check-border-violations.js +483 -0
  319. package/templates/react/scripts/check-icon-names.js +486 -0
  320. package/templates/react/scripts/check-inline-styles.js +364 -0
  321. package/templates/react/scripts/check-modus-colors.js +247 -0
  322. package/templates/react/scripts/check-modus-icons.js +256 -0
  323. package/templates/react/scripts/check-opacity-utilities.js +481 -0
  324. package/templates/react/scripts/check-semantic-html.js +476 -0
  325. package/templates/react/scripts/check-typescript.js +109 -0
  326. package/templates/react/src/App.css +42 -0
  327. package/templates/react/src/App.tsx +54 -0
  328. package/templates/react/src/assets/react.svg +1 -0
  329. package/templates/react/src/components/DemoExample.tsx +61 -0
  330. package/templates/react/src/components/DemoPage.tsx +81 -0
  331. package/templates/react/src/components/ModusAccordion.tsx +89 -0
  332. package/templates/react/src/components/ModusAlert.tsx +85 -0
  333. package/templates/react/src/components/ModusAutocomplete.tsx +207 -0
  334. package/templates/react/src/components/ModusAvatar.tsx +50 -0
  335. package/templates/react/src/components/ModusBadge.tsx +82 -0
  336. package/templates/react/src/components/ModusBreadcrumbs.tsx +75 -0
  337. package/templates/react/src/components/ModusButton.tsx +244 -0
  338. package/templates/react/src/components/ModusButtonGroup.tsx +91 -0
  339. package/templates/react/src/components/ModusCard.tsx +70 -0
  340. package/templates/react/src/components/ModusCheckbox.tsx +168 -0
  341. package/templates/react/src/components/ModusChip.tsx +93 -0
  342. package/templates/react/src/components/ModusDate.tsx +154 -0
  343. package/templates/react/src/components/ModusDropdownMenu.tsx +148 -0
  344. package/templates/react/src/components/ModusFileDropzone.tsx +140 -0
  345. package/templates/react/src/components/ModusHandle.tsx +101 -0
  346. package/templates/react/src/components/ModusIcon.tsx +49 -0
  347. package/templates/react/src/components/ModusInputFeedback.tsx +52 -0
  348. package/templates/react/src/components/ModusInputLabel.tsx +50 -0
  349. package/templates/react/src/components/ModusLoader.tsx +42 -0
  350. package/templates/react/src/components/ModusLogo.tsx +102 -0
  351. package/templates/react/src/components/ModusMenu.tsx +119 -0
  352. package/templates/react/src/components/ModusMenuItem.tsx +86 -0
  353. package/templates/react/src/components/ModusModal.tsx +145 -0
  354. package/templates/react/src/components/ModusNavbar.tsx +504 -0
  355. package/templates/react/src/components/ModusNumberInput.tsx +230 -0
  356. package/templates/react/src/components/ModusPagination.tsx +94 -0
  357. package/templates/react/src/components/ModusPanel.tsx +92 -0
  358. package/templates/react/src/components/ModusProgress.tsx +70 -0
  359. package/templates/react/src/components/ModusProvider.tsx +18 -0
  360. package/templates/react/src/components/ModusRadio.tsx +114 -0
  361. package/templates/react/src/components/ModusRating.tsx +108 -0
  362. package/templates/react/src/components/ModusSelect.tsx +171 -0
  363. package/templates/react/src/components/ModusSideNavigation.tsx +149 -0
  364. package/templates/react/src/components/ModusSkeleton.tsx +42 -0
  365. package/templates/react/src/components/ModusSlider.tsx +128 -0
  366. package/templates/react/src/components/ModusStepper.tsx +85 -0
  367. package/templates/react/src/components/ModusSwitch.tsx +130 -0
  368. package/templates/react/src/components/ModusTable.tsx +309 -0
  369. package/templates/react/src/components/ModusTabs.tsx +114 -0
  370. package/templates/react/src/components/ModusTextInput.tsx +179 -0
  371. package/templates/react/src/components/ModusTextarea.tsx +164 -0
  372. package/templates/react/src/components/ModusThemeSwitcher.tsx +58 -0
  373. package/templates/react/src/components/ModusTimeInput.tsx +176 -0
  374. package/templates/react/src/components/ModusToast.tsx +207 -0
  375. package/templates/react/src/components/ModusToolbar.tsx +70 -0
  376. package/templates/react/src/components/ModusTooltip.tsx +97 -0
  377. package/templates/react/src/components/ModusUtilityPanel.tsx +198 -0
  378. package/templates/react/src/components/ThemeSwitcherDropdown.tsx +117 -0
  379. package/templates/react/src/components/ThemeToggleSimple.tsx +157 -0
  380. package/templates/react/src/config/routes.ts +196 -0
  381. package/templates/react/src/contexts/ThemeContext.tsx +81 -0
  382. package/templates/react/src/contexts/ThemeContextData.tsx +89 -0
  383. package/templates/react/src/data/modusIcons.ts +865 -0
  384. package/templates/react/src/demos/accordion-demo/page.tsx +236 -0
  385. package/templates/react/src/demos/alert-demo/page.tsx +94 -0
  386. package/templates/react/src/demos/autocomplete-demo/page.tsx +166 -0
  387. package/templates/react/src/demos/avatar-demo/page.tsx +135 -0
  388. package/templates/react/src/demos/badge-demo/page.tsx +174 -0
  389. package/templates/react/src/demos/breadcrumbs-demo/page.tsx +88 -0
  390. package/templates/react/src/demos/button-demo/page.tsx +261 -0
  391. package/templates/react/src/demos/button-group-demo/page.tsx +231 -0
  392. package/templates/react/src/demos/card-demo/page.tsx +241 -0
  393. package/templates/react/src/demos/checkbox-demo/page.tsx +79 -0
  394. package/templates/react/src/demos/chip-demo/page.tsx +197 -0
  395. package/templates/react/src/demos/date-demo/page.tsx +179 -0
  396. package/templates/react/src/demos/dropdown-demo/page.tsx +150 -0
  397. package/templates/react/src/demos/file-dropzone-demo/page.tsx +186 -0
  398. package/templates/react/src/demos/handle-demo/page.tsx +313 -0
  399. package/templates/react/src/demos/icon-demo/page.tsx +72 -0
  400. package/templates/react/src/demos/input-feedback-demo/page.tsx +202 -0
  401. package/templates/react/src/demos/input-label-demo/page.tsx +392 -0
  402. package/templates/react/src/demos/loader-demo/page.tsx +138 -0
  403. package/templates/react/src/demos/logo-demo/page.tsx +292 -0
  404. package/templates/react/src/demos/menu-demo/page.tsx +70 -0
  405. package/templates/react/src/demos/modal-demo/page.tsx +332 -0
  406. package/templates/react/src/demos/navbar-demo/page.tsx +141 -0
  407. package/templates/react/src/demos/number-input-demo/page.tsx +180 -0
  408. package/templates/react/src/demos/pagination-demo/page.tsx +147 -0
  409. package/templates/react/src/demos/panel-demo/page.tsx +376 -0
  410. package/templates/react/src/demos/progress-demo/page.tsx +185 -0
  411. package/templates/react/src/demos/radio-demo/page.tsx +242 -0
  412. package/templates/react/src/demos/rating-demo/page.tsx +97 -0
  413. package/templates/react/src/demos/select-demo/page.tsx +111 -0
  414. package/templates/react/src/demos/side-navigation-demo/page.tsx +775 -0
  415. package/templates/react/src/demos/skeleton-demo/page.tsx +107 -0
  416. package/templates/react/src/demos/slider-demo/page.tsx +78 -0
  417. package/templates/react/src/demos/stepper-demo/page.tsx +86 -0
  418. package/templates/react/src/demos/switch-demo/page.tsx +146 -0
  419. package/templates/react/src/demos/table-demo/page.tsx +489 -0
  420. package/templates/react/src/demos/tabs-demo/page.tsx +187 -0
  421. package/templates/react/src/demos/text-input-demo/page.tsx +151 -0
  422. package/templates/react/src/demos/textarea-demo/page.tsx +73 -0
  423. package/templates/react/src/demos/theme-switcher-demo/page.tsx +26 -0
  424. package/templates/react/src/demos/time-input-demo/page.tsx +148 -0
  425. package/templates/react/src/demos/toast-demo/page.tsx +302 -0
  426. package/templates/react/src/demos/toolbar-demo/page.tsx +49 -0
  427. package/templates/react/src/demos/tooltip-demo/page.tsx +209 -0
  428. package/templates/react/src/demos/typography-test/page.tsx +28 -0
  429. package/templates/react/src/demos/utility-panel-demo/page.tsx +197 -0
  430. package/templates/react/src/dev/DevPanel.tsx +219 -0
  431. package/templates/react/src/dev/DevPanelContext.ts +14 -0
  432. package/templates/react/src/dev/DevPanelProvider.tsx +63 -0
  433. package/templates/react/src/dev/DevRoutes.tsx +98 -0
  434. package/templates/react/src/dev/config.ts +127 -0
  435. package/templates/react/src/dev/index.ts +8 -0
  436. package/templates/react/src/dev/useDevPanel.ts +17 -0
  437. package/templates/react/src/dev-pages/ColorPalettePage.tsx +347 -0
  438. package/templates/react/src/dev-pages/ComponentsGalleryPage.tsx +489 -0
  439. package/templates/react/src/dev-pages/IconsPage.tsx +137 -0
  440. package/templates/react/src/dev-pages/index.ts +3 -0
  441. package/templates/react/src/hooks/useTheme.ts +15 -0
  442. package/templates/react/src/index.css +635 -0
  443. package/templates/react/src/main.tsx +14 -0
  444. package/templates/react/src/pages/HomePage.tsx +283 -0
  445. package/templates/react/src/vite-env.d.ts +9 -0
  446. package/templates/react/tailwind.config.js +58 -0
  447. package/templates/react/tsconfig.app.json +27 -0
  448. package/templates/react/tsconfig.json +7 -0
  449. package/templates/react/tsconfig.node.json +25 -0
  450. package/templates/react/vite.config.ts +18 -0
@@ -0,0 +1,118 @@
1
+ import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ModusWcSwitch } from '@trimble-oss/moduswebcomponents-angular';
4
+ import type { Components, ModusSize } from '@trimble-oss/moduswebcomponents';
5
+
6
+ /**
7
+ * Props supported by the {@link ModusSwitchComponent}.
8
+ */
9
+ export interface ModusSwitchProps {
10
+ /** Custom CSS class applied to the switch element. */
11
+ className?: Components.ModusWcSwitch['customClass'];
12
+ /** Disables the switch. */
13
+ disabled?: Components.ModusWcSwitch['disabled'];
14
+ /** Indeterminate visual state for tri-state switches. */
15
+ indeterminate?: Components.ModusWcSwitch['indeterminate'];
16
+ /** Identifier applied to the switch input element. */
17
+ inputId?: Components.ModusWcSwitch['inputId'];
18
+ /** Tab index applied to the switch input. */
19
+ inputTabIndex?: Components.ModusWcSwitch['inputTabIndex'];
20
+ /** Optional label rendered alongside the switch. */
21
+ label?: Components.ModusWcSwitch['label'];
22
+ /** Name attribute submitted in forms. */
23
+ name?: Components.ModusWcSwitch['name'];
24
+ /** Marks the switch as required. */
25
+ required?: Components.ModusWcSwitch['required'];
26
+ /** Size token controlling switch dimensions. */
27
+ size?: ModusSize;
28
+ /** Bound value indicating whether the switch is selected. */
29
+ value?: Components.ModusWcSwitch['value'];
30
+ }
31
+
32
+ /**
33
+ * Angular wrapper for the Modus switch web component.
34
+ *
35
+ * @example
36
+ * ```html
37
+ * <modus-switch
38
+ * label="Enable notifications"
39
+ * [value]="enabled()"
40
+ * (inputChange)="enabled.set($event.target.checked)"
41
+ * />
42
+ * ```
43
+ */
44
+ @Component({
45
+ selector: 'modus-switch',
46
+ imports: [CommonModule, ModusWcSwitch],
47
+ changeDetection: ChangeDetectionStrategy.OnPush,
48
+ template: `
49
+ <modus-wc-switch
50
+ [customClass]="className()"
51
+ [disabled]="disabled()"
52
+ [indeterminate]="indeterminate()"
53
+ [inputId]="inputId()"
54
+ [inputTabIndex]="inputTabIndex()"
55
+ [label]="label()"
56
+ [name]="name()"
57
+ [required]="required()"
58
+ [size]="size()"
59
+ [value]="value()"
60
+ (inputBlur)="handleBlur($event)"
61
+ (inputChange)="handleChange($event)"
62
+ (inputFocus)="handleFocus($event)"
63
+ />
64
+ `,
65
+ })
66
+ export class ModusSwitchComponent {
67
+ /** Custom CSS class applied to the switch element. */
68
+ readonly className = input<string | undefined>();
69
+
70
+ /** Disables the switch. */
71
+ readonly disabled = input<boolean | undefined>(false);
72
+
73
+ /** Indeterminate visual state for tri-state switches. */
74
+ readonly indeterminate = input<boolean | undefined>(false);
75
+
76
+ /** Identifier applied to the switch input element. */
77
+ readonly inputId = input<string | undefined>();
78
+
79
+ /** Tab index applied to the switch input. */
80
+ readonly inputTabIndex = input<number | undefined>();
81
+
82
+ /** Optional label rendered alongside the switch. */
83
+ readonly label = input<string | undefined>();
84
+
85
+ /** Name attribute submitted in forms. */
86
+ readonly name = input<string>('');
87
+
88
+ /** Marks the switch as required. */
89
+ readonly required = input<boolean | undefined>(false);
90
+
91
+ /** Size token controlling switch dimensions. */
92
+ readonly size = input<ModusSize | undefined>('md');
93
+
94
+ /** Bound value indicating whether the switch is selected. */
95
+ readonly value = input<boolean | undefined>(false);
96
+
97
+ /** Emits when the switch loses focus. */
98
+ readonly inputBlur = output<FocusEvent>();
99
+
100
+ /** Emits when the switch value changes. */
101
+ readonly inputChange = output<InputEvent>();
102
+
103
+ /** Emits when the switch gains focus. */
104
+ readonly inputFocus = output<FocusEvent>();
105
+
106
+ handleBlur(event: CustomEvent<FocusEvent>): void {
107
+ this.inputBlur.emit(event.detail);
108
+ }
109
+
110
+ handleChange(event: CustomEvent<InputEvent>): void {
111
+ this.inputChange.emit(event.detail);
112
+ }
113
+
114
+ handleFocus(event: CustomEvent<FocusEvent>): void {
115
+ this.inputFocus.emit(event.detail);
116
+ }
117
+ }
118
+
@@ -0,0 +1,204 @@
1
+ import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ModusWcTable } from '@trimble-oss/moduswebcomponents-angular';
4
+ import type {
5
+ Components,
6
+ Density,
7
+ ITableColumn,
8
+ IPaginationChangeEventDetail,
9
+ } from '@trimble-oss/moduswebcomponents';
10
+ import type { SortingState, RowSelectionState } from '@tanstack/table-core';
11
+
12
+ /**
13
+ * Props supported by the {@link ModusTableComponent}.
14
+ */
15
+ export interface ModusTableProps {
16
+ /** Enable cell editing. Either a boolean (all rows) or a predicate per row. */
17
+ editable?: Components.ModusWcTable['editable'];
18
+ /** An array of column definitions. */
19
+ columns: ITableColumn[];
20
+ /** Custom CSS class applied to the table element. */
21
+ className?: Components.ModusWcTable['customClass'];
22
+ /** An array of data objects. */
23
+ data: Record<string, unknown>[];
24
+ /** The density of the table. */
25
+ density?: Density;
26
+ /** Enable hover effect on table rows. */
27
+ hover?: Components.ModusWcTable['hover'];
28
+ /** The current page number in pagination (1-based index). */
29
+ currentPage?: Components.ModusWcTable['currentPage'];
30
+ /** Enable pagination for the table. */
31
+ paginated?: Components.ModusWcTable['paginated'];
32
+ /** Available options for the number of rows per page. */
33
+ pageSizeOptions?: Components.ModusWcTable['pageSizeOptions'];
34
+ /** Show/hide the page size selector in pagination. */
35
+ showPageSizeSelector?: Components.ModusWcTable['showPageSizeSelector'];
36
+ /** Enable sorting functionality for sortable columns. */
37
+ sortable?: Components.ModusWcTable['sortable'];
38
+ /** Row selection mode. */
39
+ selectable?: Components.ModusWcTable['selectable'];
40
+ /** Array of selected row IDs. */
41
+ selectedRowIds?: Components.ModusWcTable['selectedRowIds'];
42
+ /** Zebra striped tables differentiate rows by styling them in an alternating fashion. */
43
+ zebra?: Components.ModusWcTable['zebra'];
44
+ /** Accessibility caption for the table. */
45
+ caption?: Components.ModusWcTable['caption'];
46
+ }
47
+
48
+ /**
49
+ * Angular wrapper for the Modus table web component.
50
+ *
51
+ * A powerful table component with sorting, pagination, row selection, and cell editing capabilities.
52
+ *
53
+ * @example
54
+ * ```html
55
+ * <modus-table
56
+ * [columns]="tableColumns"
57
+ * [data]="tableData"
58
+ * [paginated]="true"
59
+ * [sortable]="true"
60
+ * (rowClick)="handleRowClick($event)"
61
+ * (sortChange)="handleSortChange($event)"
62
+ * />
63
+ * ```
64
+ */
65
+ @Component({
66
+ selector: 'modus-table',
67
+ imports: [CommonModule, ModusWcTable],
68
+ changeDetection: ChangeDetectionStrategy.OnPush,
69
+ template: `
70
+ <modus-wc-table
71
+ [editable]="editable()"
72
+ [columns]="columns()"
73
+ [customClass]="className()"
74
+ [data]="data()"
75
+ [density]="density()"
76
+ [hover]="hover()"
77
+ [currentPage]="currentPage()"
78
+ [paginated]="paginated()"
79
+ [pageSizeOptions]="pageSizeOptions()"
80
+ [showPageSizeSelector]="showPageSizeSelector()"
81
+ [sortable]="sortable()"
82
+ [selectable]="selectable()"
83
+ [selectedRowIds]="selectedRowIds()"
84
+ [zebra]="zebra()"
85
+ [caption]="caption()"
86
+ (cellEditStart)="handleCellEditStart($event)"
87
+ (cellEditCommit)="handleCellEditCommit($event)"
88
+ (rowClick)="handleRowClick($event)"
89
+ (sortChange)="handleSortChange($event)"
90
+ (paginationChange)="handlePaginationChange($event)"
91
+ (rowSelectionChange)="handleRowSelectionChange($event)"
92
+ />
93
+ `,
94
+ })
95
+ export class ModusTableComponent {
96
+ /** Enable cell editing. Either a boolean (all rows) or a predicate per row. */
97
+ readonly editable = input<boolean | ((row: Record<string, unknown>) => boolean) | undefined>(
98
+ false
99
+ );
100
+
101
+ /** An array of column definitions. */
102
+ readonly columns = input.required<ITableColumn[]>();
103
+
104
+ /** Custom CSS class applied to the table element. */
105
+ readonly className = input<string | undefined>();
106
+
107
+ /** An array of data objects. */
108
+ readonly data = input.required<Record<string, unknown>[]>();
109
+
110
+ /** The density of the table. */
111
+ readonly density = input<Density | undefined>('comfortable');
112
+
113
+ /** Enable hover effect on table rows. */
114
+ readonly hover = input<boolean | undefined>(true);
115
+
116
+ /** The current page number in pagination (1-based index). */
117
+ readonly currentPage = input<number>(1);
118
+
119
+ /** Enable pagination for the table. */
120
+ readonly paginated = input<boolean | undefined>(false);
121
+
122
+ /** Available options for the number of rows per page. */
123
+ readonly pageSizeOptions = input<number[] | undefined>([5, 10, 15]);
124
+
125
+ /** Show/hide the page size selector in pagination. */
126
+ readonly showPageSizeSelector = input<boolean | undefined>(true);
127
+
128
+ /** Enable sorting functionality for sortable columns. */
129
+ readonly sortable = input<boolean | undefined>(true);
130
+
131
+ /** Row selection mode. */
132
+ readonly selectable = input<'none' | 'single' | 'multi' | undefined>('none');
133
+
134
+ /** Array of selected row IDs. */
135
+ readonly selectedRowIds = input<string[] | undefined>();
136
+
137
+ /** Zebra striped tables differentiate rows by styling them in an alternating fashion. */
138
+ readonly zebra = input<boolean | undefined>(false);
139
+
140
+ /** Accessibility caption for the table. */
141
+ readonly caption = input<string | undefined>();
142
+
143
+ /** Emits when cell editing starts. */
144
+ readonly cellEditStart = output<{ rowIndex: number; colId: string }>();
145
+
146
+ /** Emits when cell editing is committed with the new value. */
147
+ readonly cellEditCommit = output<{
148
+ rowIndex: number;
149
+ colId: string;
150
+ newValue: unknown;
151
+ updatedRow: Record<string, unknown>;
152
+ }>();
153
+
154
+ /** Emits when a row is clicked. */
155
+ readonly rowClick = output<{ row: Record<string, unknown>; index: number }>();
156
+
157
+ /** Emits when sorting changes with the new sorting state. */
158
+ readonly sortChange = output<SortingState>();
159
+
160
+ /** Emits when pagination changes with the new pagination state. */
161
+ readonly paginationChange = output<IPaginationChangeEventDetail>();
162
+
163
+ /** Emits when row selection changes with the selected rows and their IDs. */
164
+ readonly rowSelectionChange = output<{
165
+ selectedRows: Record<string, unknown>[];
166
+ selectedRowIds: string[];
167
+ }>();
168
+
169
+ handleCellEditStart(event: CustomEvent<{ rowIndex: number; colId: string }>): void {
170
+ this.cellEditStart.emit(event.detail);
171
+ }
172
+
173
+ handleCellEditCommit(
174
+ event: CustomEvent<{
175
+ rowIndex: number;
176
+ colId: string;
177
+ newValue: unknown;
178
+ updatedRow: Record<string, unknown>;
179
+ }>
180
+ ): void {
181
+ this.cellEditCommit.emit(event.detail);
182
+ }
183
+
184
+ handleRowClick(event: CustomEvent<{ row: Record<string, unknown>; index: number }>): void {
185
+ this.rowClick.emit(event.detail);
186
+ }
187
+
188
+ handleSortChange(event: CustomEvent<SortingState>): void {
189
+ this.sortChange.emit(event.detail);
190
+ }
191
+
192
+ handlePaginationChange(event: CustomEvent<IPaginationChangeEventDetail>): void {
193
+ this.paginationChange.emit(event.detail);
194
+ }
195
+
196
+ handleRowSelectionChange(
197
+ event: CustomEvent<{
198
+ selectedRows: Record<string, unknown>[];
199
+ selectedRowIds: string[];
200
+ }>
201
+ ): void {
202
+ this.rowSelectionChange.emit(event.detail);
203
+ }
204
+ }
@@ -0,0 +1,82 @@
1
+ import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ModusWcTabs } from '@trimble-oss/moduswebcomponents-angular';
4
+ import type { Components, ITab, ModusSize } from '@trimble-oss/moduswebcomponents';
5
+
6
+ /**
7
+ * Props supported by the {@link ModusTabsComponent}.
8
+ */
9
+ export interface ModusTabsProps {
10
+ /** Current active tab index. */
11
+ activeTabIndex?: Components.ModusWcTabs['activeTabIndex'];
12
+ /** Custom CSS class applied to the tabs container. */
13
+ className?: Components.ModusWcTabs['customClass'];
14
+ /** Tab size token. */
15
+ size?: ModusSize;
16
+ /** Tabs to display. */
17
+ tabs: ITab[];
18
+ /** Additional styling for the tabs. */
19
+ tabStyle?: Components.ModusWcTabs['tabStyle'];
20
+ }
21
+
22
+ /**
23
+ * Angular wrapper for the Modus tabs web component.
24
+ *
25
+ * The tabs component supports projecting tab content using named slots:
26
+ * - `tab-0`, `tab-1`, etc. for tab panel content
27
+ * - Custom slot names defined in tab `slotName` property
28
+ *
29
+ * @example
30
+ * ```html
31
+ * <modus-tabs
32
+ * [tabs]="tabItems"
33
+ * [activeTabIndex]="activeTab()"
34
+ * (tabChange)="handleTabChange($event)"
35
+ * >
36
+ * <div slot="tab-0">First tab content</div>
37
+ * <div slot="tab-1">Second tab content</div>
38
+ * </modus-tabs>
39
+ * ```
40
+ */
41
+ @Component({
42
+ selector: 'modus-tabs',
43
+ imports: [CommonModule, ModusWcTabs],
44
+ changeDetection: ChangeDetectionStrategy.OnPush,
45
+ template: `
46
+ <modus-wc-tabs
47
+ [activeTabIndex]="activeTabIndex()"
48
+ [customClass]="className()"
49
+ [size]="size()"
50
+ [tabs]="tabs()"
51
+ [tabStyle]="tabStyle()"
52
+ (tabChange)="handleTabChange($event)"
53
+ >
54
+ <ng-content />
55
+ </modus-wc-tabs>
56
+ `,
57
+ })
58
+ export class ModusTabsComponent {
59
+ /** Current active tab index. */
60
+ readonly activeTabIndex = input<number>(0);
61
+
62
+ /** Custom CSS class applied to the tabs container. */
63
+ readonly className = input<string | undefined>();
64
+
65
+ /** Tab size token. */
66
+ readonly size = input<ModusSize | undefined>('md');
67
+
68
+ /** Tabs to display. */
69
+ readonly tabs = input.required<ITab[]>();
70
+
71
+ /** Additional styling for the tabs. */
72
+ readonly tabStyle = input<'boxed' | 'bordered' | 'lifted' | 'none' | undefined>('bordered');
73
+
74
+ /** Emits when a tab is switched. */
75
+ readonly tabChange = output<{ previousTab: number; newTab: number }>();
76
+
77
+ /** Handles tab change events from the Modus Tabs Web Component. */
78
+ handleTabChange(event: CustomEvent<{ previousTab: number; newTab: number }>): void {
79
+ this.tabChange.emit(event.detail);
80
+ }
81
+ }
82
+
@@ -0,0 +1,221 @@
1
+ import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ModusWcTextInput } from '@trimble-oss/moduswebcomponents-angular';
4
+ import type {
5
+ AutocompleteTypes,
6
+ Components,
7
+ IInputFeedbackProp,
8
+ ModusSize,
9
+ TextFieldTypes,
10
+ } from '@trimble-oss/moduswebcomponents';
11
+
12
+ /**
13
+ * Props supported by the {@link ModusTextInputComponent}.
14
+ */
15
+ export interface ModusTextInputProps {
16
+ /** Controls automatic capitalization in inputted text. */
17
+ autoCapitalize?: Components.ModusWcTextInput['autoCapitalize'];
18
+ /** Hint for form autofill feature. */
19
+ autoComplete?: AutocompleteTypes;
20
+ /** Controls automatic correction in inputted text. */
21
+ autoCorrect?: Components.ModusWcTextInput['autoCorrect'];
22
+ /** Indicates that the input should have a border. */
23
+ bordered?: Components.ModusWcTextInput['bordered'];
24
+ /** Aria label for the clear icon button. */
25
+ clearAriaLabel?: Components.ModusWcTextInput['clearAriaLabel'];
26
+ /** Custom CSS class applied to the input. */
27
+ className?: Components.ModusWcTextInput['customClass'];
28
+ /** Disables the input. */
29
+ disabled?: Components.ModusWcTextInput['disabled'];
30
+ /** A hint to the browser for which enter key to display. */
31
+ enterkeyhint?: Components.ModusWcTextInput['enterkeyhint'];
32
+ /** Feedback configuration rendered below the input. */
33
+ feedback?: IInputFeedbackProp;
34
+ /** Show the clear button within the input field. */
35
+ includeClear?: Components.ModusWcTextInput['includeClear'];
36
+ /** Show the search icon within the input field. */
37
+ includeSearch?: Components.ModusWcTextInput['includeSearch'];
38
+ /** Identifier applied to the input element. */
39
+ inputId?: Components.ModusWcTextInput['inputId'];
40
+ /** Tab index applied to the input. */
41
+ inputTabIndex?: Components.ModusWcTextInput['inputTabIndex'];
42
+ /** Hint for mobile keyboard type. */
43
+ inputMode?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
44
+ /** Label text displayed above the input. */
45
+ label?: Components.ModusWcTextInput['label'];
46
+ /** Maximum length (number of characters) of value. */
47
+ maxLength?: Components.ModusWcTextInput['maxLength'];
48
+ /** Minimum length (number of characters) of value. */
49
+ minLength?: Components.ModusWcTextInput['minLength'];
50
+ /** Name attribute submitted in forms. */
51
+ name?: Components.ModusWcTextInput['name'];
52
+ /** Pattern the value must match to be valid. */
53
+ pattern?: Components.ModusWcTextInput['pattern'];
54
+ /** Placeholder text displayed when empty. */
55
+ placeholder?: Components.ModusWcTextInput['placeholder'];
56
+ /** Prevents editing when true. */
57
+ readOnly?: Components.ModusWcTextInput['readOnly'];
58
+ /** Marks the field as required. */
59
+ required?: Components.ModusWcTextInput['required'];
60
+ /** Control size token. */
61
+ size?: ModusSize;
62
+ /** Type of form control. */
63
+ type?: TextFieldTypes;
64
+ /** Current input value. */
65
+ value?: Components.ModusWcTextInput['value'];
66
+ }
67
+
68
+ /**
69
+ * Angular wrapper for the Modus text input web component.
70
+ *
71
+ * @example
72
+ * ```html
73
+ * <modus-text-input
74
+ * label="Email"
75
+ * type="email"
76
+ * [value]="email()"
77
+ * (inputChange)="email.set($event.target.value)"
78
+ * />
79
+ * ```
80
+ */
81
+ @Component({
82
+ selector: 'modus-text-input',
83
+ imports: [CommonModule, ModusWcTextInput],
84
+ changeDetection: ChangeDetectionStrategy.OnPush,
85
+ template: `
86
+ <modus-wc-text-input
87
+ [autoCapitalize]="autoCapitalize()"
88
+ [autoComplete]="autoComplete()"
89
+ [autoCorrect]="autoCorrect()"
90
+ [bordered]="bordered()"
91
+ [clearAriaLabel]="clearAriaLabel()"
92
+ [customClass]="className()"
93
+ [disabled]="disabled()"
94
+ [enterkeyhint]="enterkeyhint()"
95
+ [feedback]="feedback()"
96
+ [includeClear]="includeClear()"
97
+ [includeSearch]="includeSearch()"
98
+ [inputId]="inputId()"
99
+ [inputTabIndex]="inputTabIndex()"
100
+ [attr.inputmode]="inputMode()"
101
+ [label]="label()"
102
+ [maxLength]="maxLength()"
103
+ [minLength]="minLength()"
104
+ [name]="name()"
105
+ [pattern]="pattern()"
106
+ [placeholder]="placeholder()"
107
+ [readOnly]="readOnly()"
108
+ [required]="required()"
109
+ [size]="size()"
110
+ [type]="type()"
111
+ [value]="value()"
112
+ (inputBlur)="handleBlur($event)"
113
+ (inputChange)="handleChange($event)"
114
+ (inputFocus)="handleFocus($event)"
115
+ >
116
+ <ng-content select="[slot='custom-icon']" slot="custom-icon" />
117
+ </modus-wc-text-input>
118
+ `,
119
+ })
120
+ export class ModusTextInputComponent {
121
+ /** Controls automatic capitalization in inputted text. */
122
+ readonly autoCapitalize = input<
123
+ 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters' | undefined
124
+ >();
125
+
126
+ /** Hint for form autofill feature. */
127
+ readonly autoComplete = input<AutocompleteTypes | undefined>();
128
+
129
+ /** Controls automatic correction in inputted text. */
130
+ readonly autoCorrect = input<'on' | 'off' | undefined>();
131
+
132
+ /** Indicates that the input should have a border. */
133
+ readonly bordered = input<boolean | undefined>(true);
134
+
135
+ /** Aria label for the clear icon button. */
136
+ readonly clearAriaLabel = input<string | undefined>('Clear text');
137
+
138
+ /** Custom CSS class applied to the input. */
139
+ readonly className = input<string | undefined>();
140
+
141
+ /** Disables the input. */
142
+ readonly disabled = input<boolean | undefined>(false);
143
+
144
+ /** A hint to the browser for which enter key to display. */
145
+ readonly enterkeyhint = input<
146
+ 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send' | undefined
147
+ >();
148
+
149
+ /** Feedback configuration rendered below the input. */
150
+ readonly feedback = input<IInputFeedbackProp | undefined>();
151
+
152
+ /** Show the clear button within the input field. */
153
+ readonly includeClear = input<boolean | undefined>(false);
154
+
155
+ /** Show the search icon within the input field. */
156
+ readonly includeSearch = input<boolean | undefined>(false);
157
+
158
+ /** Identifier applied to the input element. */
159
+ readonly inputId = input<string | undefined>();
160
+
161
+ /** Tab index applied to the input. */
162
+ readonly inputTabIndex = input<number | undefined>();
163
+
164
+ /** Hint for mobile keyboard type. */
165
+ readonly inputMode = input<'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url' | undefined>('text');
166
+
167
+ /** Label text displayed above the input. */
168
+ readonly label = input<string | undefined>();
169
+
170
+ /** Maximum length (number of characters) of value. */
171
+ readonly maxLength = input<number | undefined>();
172
+
173
+ /** Minimum length (number of characters) of value. */
174
+ readonly minLength = input<number | undefined>();
175
+
176
+ /** Name attribute submitted in forms. */
177
+ readonly name = input<string | undefined>();
178
+
179
+ /** Pattern the value must match to be valid. */
180
+ readonly pattern = input<string | undefined>();
181
+
182
+ /** Placeholder text displayed when empty. */
183
+ readonly placeholder = input<string>('');
184
+
185
+ /** Prevents editing when true. */
186
+ readonly readOnly = input<boolean | undefined>(false);
187
+
188
+ /** Marks the field as required. */
189
+ readonly required = input<boolean | undefined>(false);
190
+
191
+ /** Control size token. */
192
+ readonly size = input<ModusSize | undefined>('md');
193
+
194
+ /** Type of form control. */
195
+ readonly type = input<TextFieldTypes>('text');
196
+
197
+ /** Current input value. */
198
+ readonly value = input<string>('');
199
+
200
+ /** Emits when the input loses focus. */
201
+ readonly inputBlur = output<FocusEvent>();
202
+
203
+ /** Emits when the value changes. */
204
+ readonly inputChange = output<InputEvent>();
205
+
206
+ /** Emits when the input gains focus. */
207
+ readonly inputFocus = output<FocusEvent>();
208
+
209
+ handleBlur(event: CustomEvent<FocusEvent>): void {
210
+ this.inputBlur.emit(event.detail);
211
+ }
212
+
213
+ handleChange(event: CustomEvent<InputEvent>): void {
214
+ this.inputChange.emit(event.detail);
215
+ }
216
+
217
+ handleFocus(event: CustomEvent<FocusEvent>): void {
218
+ this.inputFocus.emit(event.detail);
219
+ }
220
+ }
221
+