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