@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,318 @@
1
+ import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DemoPageComponent } from '../shared/demo-page.component';
4
+ import { DemoExampleComponent } from '../shared/demo-example.component';
5
+ import { ModusTabsComponent } from '../../components/modus-tabs.component';
6
+ import type { ITab } from '@trimble-oss/moduswebcomponents';
7
+
8
+ /**
9
+ * Demo page showcasing the Modus Tabs component.
10
+ *
11
+ * Demonstrates all tabs features including:
12
+ * - Basic bordered tabs for dashboards
13
+ * - Compact boxed tabs for cards and sidebars
14
+ * - Icon-only tabs for compact navigation
15
+ * - Icon + Label combinations
16
+ * - Label-only tabs
17
+ * - Disabled tabs
18
+ * - Interactive tab switching with state tracking
19
+ */
20
+ @Component({
21
+ selector: 'app-tabs-demo-page',
22
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusTabsComponent],
23
+ changeDetection: ChangeDetectionStrategy.OnPush,
24
+ template: `
25
+ <demo-page
26
+ title="Modus Tabs"
27
+ description="Tabs organize content into logical sections without leaving the page. Keep labels short and related."
28
+ >
29
+ <!-- Project Tabs (Bordered) -->
30
+ <demo-example
31
+ title="Project tabs"
32
+ description="Bordered tabs pair well with dashboards and keep the content anchored."
33
+ >
34
+ <modus-tabs
35
+ [tabs]="projectTabs"
36
+ [activeTabIndex]="projectActiveTab()"
37
+ tabStyle="bordered"
38
+ size="md"
39
+ (tabChange)="handleProjectTabChange($event)"
40
+ >
41
+ <div slot="tab-0" class="text-sm text-foreground-80 py-2">
42
+ Review highlights, key metrics, and quick actions for the current project.
43
+ </div>
44
+ <div slot="tab-1" class="text-sm text-foreground-80 py-2">
45
+ Explore recent updates in chronological order to stay informed.
46
+ </div>
47
+ <div slot="tab-2" class="text-sm text-foreground-80 py-2">
48
+ Access shared documents and media assets that support this initiative.
49
+ </div>
50
+ </modus-tabs>
51
+ </demo-example>
52
+
53
+ <!-- Compact Tabs (Boxed) -->
54
+ <demo-example
55
+ title="Compact tabs"
56
+ description="Use the small size when tabs sit inside cards or sidebars."
57
+ >
58
+ <modus-tabs
59
+ [tabs]="compactTabs"
60
+ [activeTabIndex]="compactActiveTab()"
61
+ tabStyle="boxed"
62
+ size="sm"
63
+ (tabChange)="handleCompactTabChange($event)"
64
+ >
65
+ <div slot="tab-0" class="text-sm text-foreground-80 py-2">
66
+ Outline the work and align on timelines.
67
+ </div>
68
+ <div slot="tab-1" class="text-sm text-foreground-80 py-2">
69
+ Track progress as each milestone is completed.
70
+ </div>
71
+ <div slot="tab-2" class="text-sm text-foreground-80 py-2">
72
+ Capture lessons learned and share with the team.
73
+ </div>
74
+ </modus-tabs>
75
+ </demo-example>
76
+
77
+ <!-- Icon-only Tabs -->
78
+ <demo-example
79
+ title="Icon-only tabs"
80
+ description="Use icons without labels for compact navigation. Include aria-label for accessibility."
81
+ >
82
+ <modus-tabs
83
+ [tabs]="iconOnlyTabs"
84
+ [activeTabIndex]="iconOnlyActiveTab()"
85
+ tabStyle="bordered"
86
+ size="sm"
87
+ (tabChange)="handleIconOnlyTabChange($event)"
88
+ >
89
+ <div slot="tab-0" class="text-sm text-foreground-80 py-2">
90
+ Overview of your key metrics and recent activity.
91
+ </div>
92
+ <div slot="tab-1" class="text-sm text-foreground-80 py-2">
93
+ Detailed charts and performance insights.
94
+ </div>
95
+ <div slot="tab-2" class="text-sm text-foreground-80 py-2">
96
+ Geographic data and location-based information.
97
+ </div>
98
+ <div slot="tab-3" class="text-sm text-foreground-80 py-2">
99
+ View your latest notifications and alerts.
100
+ </div>
101
+ </modus-tabs>
102
+ </demo-example>
103
+
104
+ <!-- Icon + Label Tabs -->
105
+ <demo-example
106
+ title="Icon + Label tabs"
107
+ description="Combine icons with labels for clear navigation. Icons can be positioned left or right."
108
+ >
109
+ <modus-tabs
110
+ [tabs]="iconLabelTabs"
111
+ [activeTabIndex]="iconLabelActiveTab()"
112
+ tabStyle="bordered"
113
+ size="md"
114
+ (tabChange)="handleIconLabelTabChange($event)"
115
+ >
116
+ <div slot="tab-0" class="text-sm text-foreground-80 py-2">
117
+ Overview of your key metrics and recent activity.
118
+ </div>
119
+ <div slot="tab-1" class="text-sm text-foreground-80 py-2">
120
+ Detailed charts and performance insights.
121
+ </div>
122
+ <div slot="tab-2" class="text-sm text-foreground-80 py-2">
123
+ Configure your application settings and preferences.
124
+ </div>
125
+ <div slot="tab-3" class="text-sm text-foreground-80 py-2">
126
+ Find answers to common questions and get support.
127
+ </div>
128
+ </modus-tabs>
129
+ </demo-example>
130
+
131
+ <!-- Label-only Tabs -->
132
+ <demo-example
133
+ title="Label-only tabs"
134
+ description="Text-only tabs work well for simple navigation without visual clutter."
135
+ >
136
+ <modus-tabs
137
+ [tabs]="labelOnlyTabs"
138
+ [activeTabIndex]="labelOnlyActiveTab()"
139
+ tabStyle="boxed"
140
+ size="lg"
141
+ (tabChange)="handleLabelOnlyTabChange($event)"
142
+ >
143
+ <div slot="tab-0" class="text-sm text-foreground-80 py-2">
144
+ High-level summary of the current project status.
145
+ </div>
146
+ <div slot="tab-1" class="text-sm text-foreground-80 py-2">
147
+ Comprehensive information about all project aspects.
148
+ </div>
149
+ <div slot="tab-2" class="text-sm text-foreground-80 py-2">
150
+ Complete timeline of changes and updates.
151
+ </div>
152
+ <div slot="tab-3" class="text-sm text-foreground-80 py-2">
153
+ Configuration options and preferences.
154
+ </div>
155
+ </modus-tabs>
156
+ </demo-example>
157
+
158
+ <!-- Disabled Tabs -->
159
+ <demo-example
160
+ title="Disabled tabs"
161
+ description="Disable tabs that are not currently available or relevant."
162
+ >
163
+ <modus-tabs
164
+ [tabs]="disabledTabs"
165
+ [activeTabIndex]="disabledActiveTab()"
166
+ tabStyle="bordered"
167
+ size="md"
168
+ (tabChange)="handleDisabledTabChange($event)"
169
+ >
170
+ <div slot="tab-0" class="text-sm text-foreground-80 py-2">
171
+ This tab is currently active and functional.
172
+ </div>
173
+ <div slot="tab-1" class="text-sm text-foreground-80 py-2">
174
+ This content is not accessible due to disabled tab.
175
+ </div>
176
+ <div slot="tab-2" class="text-sm text-foreground-80 py-2">
177
+ Another active tab with different content.
178
+ </div>
179
+ <div slot="tab-3" class="text-sm text-foreground-80 py-2">
180
+ This content is also not accessible.
181
+ </div>
182
+ </modus-tabs>
183
+ </demo-example>
184
+
185
+ <!-- Interactive Example -->
186
+ <demo-example
187
+ title="Interactive example"
188
+ description="Switch tabs to see the event handling and state tracking in action."
189
+ >
190
+ <modus-tabs
191
+ [tabs]="interactiveTabs"
192
+ [activeTabIndex]="interactiveActiveTab()"
193
+ tabStyle="bordered"
194
+ size="md"
195
+ (tabChange)="handleInteractiveTabChange($event)"
196
+ >
197
+ <div slot="tab-0" class="text-sm text-foreground-80 py-2">
198
+ <div class="flex flex-col gap-2">
199
+ <div class="font-medium">Home Content</div>
200
+ <div>Welcome to the home section. Navigate between tabs to explore.</div>
201
+ </div>
202
+ </div>
203
+ <div slot="tab-1" class="text-sm text-foreground-80 py-2">
204
+ <div class="flex flex-col gap-2">
205
+ <div class="font-medium">Profile Content</div>
206
+ <div>View and manage your profile settings here.</div>
207
+ </div>
208
+ </div>
209
+ <div slot="tab-2" class="text-sm text-foreground-80 py-2">
210
+ <div class="flex flex-col gap-2">
211
+ <div class="font-medium">Messages Content</div>
212
+ <div>Check your recent messages and notifications.</div>
213
+ </div>
214
+ </div>
215
+ </modus-tabs>
216
+
217
+ @if (tabChangeCount() > 0) {
218
+ <div class="mt-4 p-4 rounded-lg bg-muted text-muted-foreground">
219
+ <div class="font-semibold mb-2">Tab Change Event</div>
220
+ <div class="text-sm">Total tab switches: {{ tabChangeCount() }}</div>
221
+ @if (lastTabChange()) {
222
+ <div class="text-xs mt-1 text-muted-foreground">
223
+ Last change: Tab {{ lastTabChange()!.previousTab }} to Tab
224
+ {{ lastTabChange()!.newTab }}
225
+ </div>
226
+ }
227
+ </div>
228
+ }
229
+ </demo-example>
230
+ </demo-page>
231
+ `,
232
+ })
233
+ export class TabsDemoPageComponent {
234
+ // Project tabs data
235
+ readonly projectTabs: ITab[] = [{ label: 'Summary' }, { label: 'Activity' }, { label: 'Files' }];
236
+ readonly projectActiveTab = signal(0);
237
+
238
+ // Compact tabs data
239
+ readonly compactTabs: ITab[] = [{ label: 'Plan' }, { label: 'Deliver' }, { label: 'Review' }];
240
+ readonly compactActiveTab = signal(0);
241
+
242
+ // Icon-only tabs data
243
+ readonly iconOnlyTabs: ITab[] = [
244
+ { icon: 'dashboard' },
245
+ { icon: 'bar_graph' },
246
+ { icon: 'map' },
247
+ { icon: 'notifications' },
248
+ ];
249
+ readonly iconOnlyActiveTab = signal(0);
250
+
251
+ // Icon + Label tabs data
252
+ readonly iconLabelTabs: ITab[] = [
253
+ { icon: 'dashboard', label: 'Dashboard', iconPosition: 'left' },
254
+ { icon: 'bar_graph', label: 'Analytics', iconPosition: 'left' },
255
+ { icon: 'settings', label: 'Settings', iconPosition: 'right' },
256
+ { icon: 'help', label: 'Help', iconPosition: 'right' },
257
+ ];
258
+ readonly iconLabelActiveTab = signal(0);
259
+
260
+ // Label-only tabs data
261
+ readonly labelOnlyTabs: ITab[] = [
262
+ { label: 'Overview' },
263
+ { label: 'Details' },
264
+ { label: 'History' },
265
+ { label: 'Settings' },
266
+ ];
267
+ readonly labelOnlyActiveTab = signal(0);
268
+
269
+ // Disabled tabs data
270
+ readonly disabledTabs: ITab[] = [
271
+ { label: 'Active Tab', icon: 'check' },
272
+ { label: 'Disabled Tab', icon: 'lock', disabled: true },
273
+ { label: 'Another Active', icon: 'star' },
274
+ { label: 'Also Disabled', disabled: true },
275
+ ];
276
+ readonly disabledActiveTab = signal(0);
277
+
278
+ // Interactive tabs data
279
+ readonly interactiveTabs: ITab[] = [
280
+ { label: 'Home', icon: 'house' },
281
+ { label: 'Profile', icon: 'user' },
282
+ { label: 'Messages', icon: 'email' },
283
+ ];
284
+ readonly interactiveActiveTab = signal(0);
285
+ readonly tabChangeCount = signal(0);
286
+ readonly lastTabChange = signal<{ previousTab: number; newTab: number } | null>(null);
287
+
288
+ // Tab change handlers
289
+ handleProjectTabChange(event: { previousTab: number; newTab: number }): void {
290
+ this.projectActiveTab.set(event.newTab);
291
+ }
292
+
293
+ handleCompactTabChange(event: { previousTab: number; newTab: number }): void {
294
+ this.compactActiveTab.set(event.newTab);
295
+ }
296
+
297
+ handleIconOnlyTabChange(event: { previousTab: number; newTab: number }): void {
298
+ this.iconOnlyActiveTab.set(event.newTab);
299
+ }
300
+
301
+ handleIconLabelTabChange(event: { previousTab: number; newTab: number }): void {
302
+ this.iconLabelActiveTab.set(event.newTab);
303
+ }
304
+
305
+ handleLabelOnlyTabChange(event: { previousTab: number; newTab: number }): void {
306
+ this.labelOnlyActiveTab.set(event.newTab);
307
+ }
308
+
309
+ handleDisabledTabChange(event: { previousTab: number; newTab: number }): void {
310
+ this.disabledActiveTab.set(event.newTab);
311
+ }
312
+
313
+ handleInteractiveTabChange(event: { previousTab: number; newTab: number }): void {
314
+ this.interactiveActiveTab.set(event.newTab);
315
+ this.tabChangeCount.update((count) => count + 1);
316
+ this.lastTabChange.set(event);
317
+ }
318
+ }
@@ -0,0 +1,160 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DemoPageComponent } from '../shared/demo-page.component';
4
+ import { DemoExampleComponent } from '../shared/demo-example.component';
5
+ import { ModusTextInputComponent } from '../../components/modus-text-input.component';
6
+
7
+ /**
8
+ * Demo page showcasing the Modus Text Input component.
9
+ *
10
+ * Demonstrates text input features including:
11
+ * - Basic text input
12
+ * - Input types (email, password, etc.)
13
+ * - Sizes
14
+ * - With clear button
15
+ * - With search icon
16
+ * - Interactive examples
17
+ */
18
+ @Component({
19
+ selector: 'app-text-input-demo-page',
20
+ standalone: true,
21
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusTextInputComponent],
22
+ template: `
23
+ <demo-page
24
+ title="Modus Text Input"
25
+ description="Text input components provide a way for users to enter text data. Use text inputs for names, emails, passwords, and any other text-based form data."
26
+ >
27
+ <demo-example title="Input Types" description="Text inputs with different input types.">
28
+ <div class="flex flex-col gap-6">
29
+ <div class="flex flex-col gap-2">
30
+ <modus-text-input
31
+ inputId="text-type-input"
32
+ label="Text"
33
+ type="text"
34
+ placeholder="Enter text"
35
+ />
36
+ </div>
37
+
38
+ <div class="flex flex-col gap-2">
39
+ <modus-text-input
40
+ inputId="email-type-input"
41
+ label="Email"
42
+ type="email"
43
+ placeholder="user@example.com"
44
+ />
45
+ </div>
46
+
47
+ <div class="flex flex-col gap-2">
48
+ <modus-text-input
49
+ inputId="password-type-input"
50
+ label="Password"
51
+ type="password"
52
+ placeholder="Enter password"
53
+ />
54
+ </div>
55
+
56
+ <div class="flex flex-col gap-2">
57
+ <modus-text-input
58
+ inputId="url-type-input"
59
+ label="URL"
60
+ type="url"
61
+ placeholder="https://example.com"
62
+ />
63
+ </div>
64
+
65
+ <div class="flex flex-col gap-2">
66
+ <modus-text-input
67
+ inputId="tel-type-input"
68
+ label="Phone"
69
+ type="tel"
70
+ placeholder="+1 (555) 123-4567"
71
+ />
72
+ </div>
73
+ </div>
74
+ </demo-example>
75
+
76
+ <demo-example title="Text Input Sizes" description="Text inputs in different sizes.">
77
+ <div class="flex flex-col gap-6">
78
+ <div class="flex flex-col gap-2">
79
+ <modus-text-input
80
+ inputId="small-text-input"
81
+ label="Small"
82
+ placeholder="Enter text"
83
+ size="sm"
84
+ />
85
+ </div>
86
+
87
+ <div class="flex flex-col gap-2">
88
+ <modus-text-input
89
+ inputId="medium-text-input"
90
+ label="Medium"
91
+ placeholder="Enter text"
92
+ size="md"
93
+ />
94
+ </div>
95
+
96
+ <div class="flex flex-col gap-2">
97
+ <modus-text-input
98
+ inputId="large-text-input"
99
+ label="Large"
100
+ placeholder="Enter text"
101
+ size="lg"
102
+ />
103
+ </div>
104
+ </div>
105
+ </demo-example>
106
+
107
+ <demo-example
108
+ title="Text Input with Icons"
109
+ description="Text inputs with clear button or search icon."
110
+ >
111
+ <div class="flex flex-col gap-6">
112
+ <div class="flex flex-col gap-2">
113
+ <modus-text-input
114
+ inputId="clear-input"
115
+ label="With Clear"
116
+ placeholder="Type to search..."
117
+ [includeClear]="true"
118
+ />
119
+ </div>
120
+
121
+ <div class="flex flex-col gap-2">
122
+ <modus-text-input
123
+ inputId="search-input"
124
+ label="Search"
125
+ placeholder="Search..."
126
+ [includeSearch]="true"
127
+ />
128
+ </div>
129
+ </div>
130
+ </demo-example>
131
+
132
+ <demo-example
133
+ title="Required and Disabled States"
134
+ description="Text inputs in required and disabled states."
135
+ >
136
+ <div class="flex flex-col gap-6">
137
+ <div class="flex flex-col gap-2">
138
+ <modus-text-input
139
+ inputId="required-input"
140
+ label="Required"
141
+ placeholder="This field is required"
142
+ [required]="true"
143
+ />
144
+ </div>
145
+
146
+ <div class="flex flex-col gap-2">
147
+ <modus-text-input
148
+ inputId="disabled-input"
149
+ label="Disabled"
150
+ placeholder="Cannot edit"
151
+ [disabled]="true"
152
+ value="Disabled value"
153
+ />
154
+ </div>
155
+ </div>
156
+ </demo-example>
157
+ </demo-page>
158
+ `,
159
+ })
160
+ export class TextInputDemoPageComponent {}
@@ -0,0 +1,95 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { DemoPageComponent } from '../shared/demo-page.component';
3
+ import { DemoExampleComponent } from '../shared/demo-example.component';
4
+ import { ModusTextareaComponent } from '../../components/modus-textarea.component';
5
+ import type { IInputFeedbackProp } from '@trimble-oss/moduswebcomponents';
6
+
7
+ /**
8
+ * Demo page showcasing the Modus Textarea component.
9
+ *
10
+ * Demonstrates textarea features including:
11
+ * - Customer feedback (default size)
12
+ * - Detailed notes (increased height with info feedback)
13
+ * - Feedback states (info, success, error)
14
+ */
15
+ @Component({
16
+ selector: 'app-textarea-demo-page',
17
+ imports: [DemoPageComponent, DemoExampleComponent, ModusTextareaComponent],
18
+ changeDetection: ChangeDetectionStrategy.OnPush,
19
+ template: `
20
+ <demo-page
21
+ title="Modus Textarea"
22
+ description="Textareas support longer responses or feedback. Offer guidance on what to include and set an appropriate height."
23
+ >
24
+ <!-- Customer Feedback Example (from React) -->
25
+ <demo-example
26
+ title="Customer Feedback"
27
+ description="Use the default size for two to three sentence responses."
28
+ >
29
+ <modus-textarea
30
+ label="Share feedback"
31
+ placeholder="Tell us what worked well and what can improve."
32
+ [rows]="4"
33
+ />
34
+ </demo-example>
35
+
36
+ <!-- Detailed Notes Example (from React) -->
37
+ <demo-example
38
+ title="Detailed Notes"
39
+ description="Increase the height when expecting longer entries."
40
+ >
41
+ <modus-textarea label="Site visit notes" [rows]="6" [feedback]="siteVisitFeedback" />
42
+ </demo-example>
43
+
44
+ <!-- Feedback States -->
45
+ <demo-example
46
+ title="Feedback States"
47
+ description="Display validation feedback with info, success, and error states."
48
+ >
49
+ <div class="flex flex-col gap-6">
50
+ <modus-textarea
51
+ label="Info feedback"
52
+ placeholder="Enter details..."
53
+ [rows]="3"
54
+ [feedback]="infoFeedback"
55
+ />
56
+ <modus-textarea
57
+ label="Success feedback"
58
+ placeholder="Enter details..."
59
+ [rows]="3"
60
+ value="Valid input provided."
61
+ [feedback]="successFeedback"
62
+ />
63
+ <modus-textarea
64
+ label="Error feedback"
65
+ placeholder="Enter details..."
66
+ [rows]="3"
67
+ [feedback]="errorFeedback"
68
+ />
69
+ </div>
70
+ </demo-example>
71
+ </demo-page>
72
+ `,
73
+ })
74
+ export class TextareaDemoPageComponent {
75
+ // Feedback configurations
76
+ readonly siteVisitFeedback: IInputFeedbackProp = {
77
+ level: 'info',
78
+ message: 'Include location details and follow-up actions.',
79
+ };
80
+
81
+ readonly infoFeedback: IInputFeedbackProp = {
82
+ level: 'info',
83
+ message: 'This is helpful information about the field.',
84
+ };
85
+
86
+ readonly successFeedback: IInputFeedbackProp = {
87
+ level: 'success',
88
+ message: 'Great! Your input looks good.',
89
+ };
90
+
91
+ readonly errorFeedback: IInputFeedbackProp = {
92
+ level: 'error',
93
+ message: 'This field is required. Please enter a value.',
94
+ };
95
+ }
@@ -0,0 +1,38 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DemoPageComponent } from '../shared/demo-page.component';
4
+ import { DemoExampleComponent } from '../shared/demo-example.component';
5
+ import { ModusThemeSwitcherComponent } from '../../components/modus-theme-switcher.component';
6
+
7
+ /**
8
+ * Demo page showcasing the Modus Theme Switcher component.
9
+ *
10
+ * Demonstrates theme switching functionality including:
11
+ * - Basic theme toggle between light and dark modes
12
+ * - System preference detection
13
+ * - Theme change event handling
14
+ */
15
+ @Component({
16
+ selector: 'app-theme-switcher-demo-page',
17
+ standalone: true,
18
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusThemeSwitcherComponent],
19
+ changeDetection: ChangeDetectionStrategy.OnPush,
20
+ template: `
21
+ <demo-page
22
+ title="Modus Theme Switcher"
23
+ description="The theme switcher toggles between Modus light and dark modes. Place it in the header or settings where users expect personalization controls."
24
+ [showBackButton]="false"
25
+ >
26
+ <demo-example
27
+ title="Theme toggle"
28
+ description="Use the default configuration to respect system preferences and allow quick switching."
29
+ >
30
+ <div class="flex items-center gap-4">
31
+ <modus-theme-switcher [ariaLabel]="'Switch theme'" />
32
+ <div class="text-sm text-foreground-80">Toggle between light and dark experiences.</div>
33
+ </div>
34
+ </demo-example>
35
+ </demo-page>
36
+ `,
37
+ })
38
+ export class ThemeSwitcherDemoPageComponent {}