@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,330 @@
1
+ import { Component, computed, signal } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
4
+ import { DemoPageComponent } from '../shared/demo-page.component';
5
+ import { DemoExampleComponent } from '../shared/demo-example.component';
6
+ import { ModusInputLabelComponent } from '../../components/modus-input-label.component';
7
+ import { ModusTextInputComponent } from '../../components/modus-text-input.component';
8
+ import { ModusCheckboxComponent } from '../../components/modus-checkbox.component';
9
+ import { ModusRadioComponent } from '../../components/modus-radio.component';
10
+ import { ModusDateComponent } from '../../components/modus-date.component';
11
+ import { ModusNumberInputComponent } from '../../components/modus-number-input.component';
12
+ import { ModusInputFeedbackComponent } from '../../components/modus-input-feedback.component';
13
+ import type { IInputFeedbackProp } from '@trimble-oss/moduswebcomponents';
14
+
15
+ /**
16
+ * Demo page showcasing the Modus Input Label component.
17
+ *
18
+ * Demonstrates input label features including:
19
+ * - Basic labels
20
+ * - Required labels
21
+ * - Labels with different form controls
22
+ * - Label sizes
23
+ * - Label accessibility
24
+ */
25
+ @Component({
26
+ selector: 'app-input-label-demo-page',
27
+ standalone: true,
28
+ imports: [
29
+ CommonModule,
30
+ ReactiveFormsModule,
31
+ DemoPageComponent,
32
+ DemoExampleComponent,
33
+ ModusInputLabelComponent,
34
+ ModusTextInputComponent,
35
+ ModusCheckboxComponent,
36
+ ModusRadioComponent,
37
+ ModusDateComponent,
38
+ ModusNumberInputComponent,
39
+ ModusInputFeedbackComponent,
40
+ ],
41
+ template: `
42
+ <demo-page
43
+ title="Modus Input Label"
44
+ description="Input labels provide clear identification for form controls. Always use labels to make forms accessible and user-friendly."
45
+ >
46
+ <demo-example title="Basic Label" description="Simple label for form inputs.">
47
+ <div class="flex flex-col gap-2">
48
+ <modus-input-label forId="basic-input" labelText="Email Address" />
49
+ <modus-text-input inputId="basic-input" placeholder="user@example.com" />
50
+ </div>
51
+ </demo-example>
52
+
53
+ <demo-example
54
+ title="Required Label"
55
+ description="Labels with required indicator for mandatory fields."
56
+ >
57
+ <div class="flex flex-col gap-6">
58
+ <div class="flex flex-col gap-2">
59
+ <modus-input-label forId="required-input" labelText="First Name" [required]="true" />
60
+ <modus-text-input
61
+ inputId="required-input"
62
+ placeholder="Enter first name"
63
+ [required]="true"
64
+ />
65
+ </div>
66
+
67
+ <div class="flex flex-col gap-2">
68
+ <modus-input-label forId="required-email" labelText="Email" [required]="true" />
69
+ <modus-text-input
70
+ inputId="required-email"
71
+ type="email"
72
+ placeholder="user@example.com"
73
+ [required]="true"
74
+ />
75
+ </div>
76
+ </div>
77
+ </demo-example>
78
+
79
+ <demo-example
80
+ title="Labels with Different Form Controls"
81
+ description="Input labels work with various form control types."
82
+ >
83
+ <div class="flex flex-col gap-6">
84
+ <div class="flex flex-col gap-2">
85
+ <modus-input-label forId="checkbox-input" labelText="Accept Terms" [required]="true" />
86
+ <modus-checkbox
87
+ inputId="checkbox-input"
88
+ label="I agree to the terms and conditions"
89
+ [required]="true"
90
+ />
91
+ </div>
92
+
93
+ <div class="flex flex-col gap-2">
94
+ <modus-input-label forId="radio-input" labelText="Select Option" />
95
+ <div class="flex flex-col gap-2">
96
+ <modus-radio
97
+ inputId="radio-input"
98
+ label="Option A"
99
+ name="radio-demo"
100
+ [value]="true"
101
+ />
102
+ <modus-radio
103
+ inputId="radio-input-b"
104
+ label="Option B"
105
+ name="radio-demo"
106
+ [value]="false"
107
+ />
108
+ </div>
109
+ </div>
110
+
111
+ <div class="flex flex-col gap-2">
112
+ <modus-date inputId="date-input" label="Pick a date" />
113
+ </div>
114
+
115
+ <div class="flex flex-col gap-2">
116
+ <modus-number-input
117
+ inputId="number-input"
118
+ label="Quantity"
119
+ placeholder="0"
120
+ [step]="1"
121
+ />
122
+ </div>
123
+ </div>
124
+ </demo-example>
125
+
126
+ <demo-example title="Label Sizes" description="Input labels in different sizes.">
127
+ <div class="flex flex-col gap-6">
128
+ <div class="flex flex-col gap-2">
129
+ <modus-input-label forId="small-label" labelText="Small Label" size="sm" />
130
+ <modus-text-input inputId="small-label" placeholder="Enter text" size="sm" />
131
+ </div>
132
+
133
+ <div class="flex flex-col gap-2">
134
+ <modus-input-label forId="medium-label" labelText="Medium Label (Default)" size="md" />
135
+ <modus-text-input inputId="medium-label" placeholder="Enter text" size="md" />
136
+ </div>
137
+
138
+ <div class="flex flex-col gap-2">
139
+ <modus-input-label forId="large-label" labelText="Large Label" size="lg" />
140
+ <modus-text-input inputId="large-label" placeholder="Enter text" size="lg" />
141
+ </div>
142
+ </div>
143
+ </demo-example>
144
+
145
+ <demo-example
146
+ title="Real-World Form Example"
147
+ description="Complete form example with proper labels and validation feedback."
148
+ >
149
+ <div class="flex flex-col gap-6 p-6 rounded-lg bg-card border-default">
150
+ <div class="flex flex-col gap-2">
151
+ <modus-input-label forId="form-first-name" labelText="First Name" [required]="true" />
152
+ <modus-text-input
153
+ inputId="form-first-name"
154
+ placeholder="Enter first name"
155
+ [required]="true"
156
+ [value]="form.controls.firstName.value ?? ''"
157
+ [feedback]="firstNameFeedback()"
158
+ (inputChange)="handleFirstNameChange($event)"
159
+ (inputBlur)="handleFirstNameBlur()"
160
+ />
161
+ </div>
162
+
163
+ <div class="flex flex-col gap-2">
164
+ <modus-input-label forId="form-last-name" labelText="Last Name" [required]="true" />
165
+ <modus-text-input
166
+ inputId="form-last-name"
167
+ placeholder="Enter last name"
168
+ [required]="true"
169
+ [value]="form.controls.lastName.value ?? ''"
170
+ [feedback]="lastNameFeedback()"
171
+ (inputChange)="handleLastNameChange($event)"
172
+ (inputBlur)="handleLastNameBlur()"
173
+ />
174
+ </div>
175
+
176
+ <div class="flex flex-col gap-2">
177
+ <modus-input-label forId="form-email" labelText="Email Address" [required]="true" />
178
+ <modus-text-input
179
+ inputId="form-email"
180
+ type="email"
181
+ placeholder="user@example.com"
182
+ [required]="true"
183
+ [value]="form.controls.email.value ?? ''"
184
+ [feedback]="emailFeedback()"
185
+ (inputChange)="handleEmailChange($event)"
186
+ (inputBlur)="handleEmailBlur()"
187
+ />
188
+ </div>
189
+
190
+ <div class="flex flex-col gap-2">
191
+ <modus-input-label forId="form-checkbox" labelText="Agreement" [required]="true" />
192
+ <modus-checkbox
193
+ inputId="form-checkbox"
194
+ label="I agree to the terms and conditions"
195
+ [required]="true"
196
+ [value]="form.controls.agreement.value ?? false"
197
+ (inputChange)="handleAgreementChange($event)"
198
+ (inputBlur)="handleAgreementBlur()"
199
+ />
200
+ @if (agreementFeedback()) {
201
+ <modus-input-feedback
202
+ [level]="agreementFeedback()!.level"
203
+ [message]="agreementFeedback()!.message"
204
+ />
205
+ }
206
+ </div>
207
+ </div>
208
+ </demo-example>
209
+ </demo-page>
210
+ `,
211
+ })
212
+ export class InputLabelDemoPageComponent {
213
+ private readonly fb = new FormBuilder();
214
+
215
+ readonly form = this.fb.group({
216
+ firstName: ['', [Validators.required, Validators.minLength(2)]],
217
+ lastName: ['', [Validators.required, Validators.minLength(2)]],
218
+ email: ['', [Validators.required, Validators.email]],
219
+ agreement: [false, Validators.requiredTrue],
220
+ });
221
+
222
+ // Track touched state for each field
223
+ readonly touchedFields = signal<Set<string>>(new Set());
224
+
225
+ // Computed feedback for firstName
226
+ readonly firstNameFeedback = computed<IInputFeedbackProp | undefined>(() => {
227
+ const control = this.form.controls.firstName;
228
+ const isTouched = this.touchedFields().has('firstName');
229
+ if (!isTouched || !control.errors) return undefined;
230
+
231
+ if (control.errors['required']) {
232
+ return { level: 'error', message: 'First name is required.' };
233
+ }
234
+ if (control.errors['minlength']) {
235
+ return { level: 'error', message: 'First name must be at least 2 characters.' };
236
+ }
237
+ return undefined;
238
+ });
239
+
240
+ // Computed feedback for lastName
241
+ readonly lastNameFeedback = computed<IInputFeedbackProp | undefined>(() => {
242
+ const control = this.form.controls.lastName;
243
+ const isTouched = this.touchedFields().has('lastName');
244
+ if (!isTouched || !control.errors) return undefined;
245
+
246
+ if (control.errors['required']) {
247
+ return { level: 'error', message: 'Last name is required.' };
248
+ }
249
+ if (control.errors['minlength']) {
250
+ return { level: 'error', message: 'Last name must be at least 2 characters.' };
251
+ }
252
+ return undefined;
253
+ });
254
+
255
+ // Computed feedback for email
256
+ readonly emailFeedback = computed<IInputFeedbackProp | undefined>(() => {
257
+ const control = this.form.controls.email;
258
+ const isTouched = this.touchedFields().has('email');
259
+ if (!isTouched || !control.errors) return undefined;
260
+
261
+ if (control.errors['required']) {
262
+ return { level: 'error', message: 'Email address is required.' };
263
+ }
264
+ if (control.errors['email']) {
265
+ return { level: 'error', message: 'Please enter a valid email address.' };
266
+ }
267
+ return undefined;
268
+ });
269
+
270
+ // Computed feedback for agreement checkbox
271
+ readonly agreementFeedback = computed<IInputFeedbackProp | undefined>(() => {
272
+ const control = this.form.controls.agreement;
273
+ const isTouched = this.touchedFields().has('agreement');
274
+ if (!isTouched || !control.errors) return undefined;
275
+
276
+ if (control.errors['required']) {
277
+ return { level: 'error', message: 'You must agree to the terms and conditions.' };
278
+ }
279
+ return undefined;
280
+ });
281
+
282
+ handleFirstNameChange(event: InputEvent): void {
283
+ const target = event.target as HTMLInputElement;
284
+ this.form.controls.firstName.setValue(target.value);
285
+ this.markFieldTouched('firstName');
286
+ }
287
+
288
+ handleFirstNameBlur(): void {
289
+ this.markFieldTouched('firstName');
290
+ }
291
+
292
+ handleLastNameChange(event: InputEvent): void {
293
+ const target = event.target as HTMLInputElement;
294
+ this.form.controls.lastName.setValue(target.value);
295
+ this.markFieldTouched('lastName');
296
+ }
297
+
298
+ handleLastNameBlur(): void {
299
+ this.markFieldTouched('lastName');
300
+ }
301
+
302
+ handleEmailChange(event: InputEvent): void {
303
+ const target = event.target as HTMLInputElement;
304
+ this.form.controls.email.setValue(target.value);
305
+ this.markFieldTouched('email');
306
+ }
307
+
308
+ handleEmailBlur(): void {
309
+ this.markFieldTouched('email');
310
+ }
311
+
312
+ handleAgreementChange(event: InputEvent): void {
313
+ const target = event.target as HTMLInputElement;
314
+ const checked = target.type === 'checkbox' ? target.checked : Boolean(target.value);
315
+ this.form.controls.agreement.setValue(checked);
316
+ this.markFieldTouched('agreement');
317
+ }
318
+
319
+ handleAgreementBlur(): void {
320
+ this.markFieldTouched('agreement');
321
+ }
322
+
323
+ private markFieldTouched(fieldName: string): void {
324
+ this.touchedFields.update((fields) => {
325
+ const newFields = new Set(fields);
326
+ newFields.add(fieldName);
327
+ return newFields;
328
+ });
329
+ }
330
+ }
@@ -0,0 +1,143 @@
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 { ModusLoaderComponent } from '../../components/modus-loader.component';
6
+
7
+ /**
8
+ * Demo page showcasing the Modus Loader component.
9
+ *
10
+ * Demonstrates loader features including:
11
+ * - All six loader variants (spinner, ball, bars, dots, infinity, ring)
12
+ * - Color options with theme-aware colors
13
+ * - Size options (xs, sm, md, lg)
14
+ * - Usage examples in real application contexts
15
+ */
16
+ @Component({
17
+ selector: 'app-loader-demo-page',
18
+ standalone: true,
19
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusLoaderComponent],
20
+ template: `
21
+ <demo-page
22
+ title="Modus Loader"
23
+ description="Loaders communicate that content is on the way. Select a variant that fits the space and avoid pairing multiple animations together."
24
+ >
25
+ <demo-example
26
+ title="All Variants"
27
+ description="Six different animation styles to choose from based on your use case."
28
+ >
29
+ <div class="grid grid-cols-2 md:grid-cols-3 gap-6">
30
+ <div class="flex flex-col items-center gap-2">
31
+ <modus-loader variant="spinner" size="md" />
32
+ <div class="text-sm text-foreground-80">Spinner</div>
33
+ </div>
34
+ <div class="flex flex-col items-center gap-2">
35
+ <modus-loader variant="ball" size="md" />
36
+ <div class="text-sm text-foreground-80">Ball</div>
37
+ </div>
38
+ <div class="flex flex-col items-center gap-2">
39
+ <modus-loader variant="bars" size="md" />
40
+ <div class="text-sm text-foreground-80">Bars</div>
41
+ </div>
42
+ <div class="flex flex-col items-center gap-2">
43
+ <modus-loader variant="dots" size="md" />
44
+ <div class="text-sm text-foreground-80">Dots</div>
45
+ </div>
46
+ <div class="flex flex-col items-center gap-2">
47
+ <modus-loader variant="infinity" size="md" />
48
+ <div class="text-sm text-foreground-80">Infinity</div>
49
+ </div>
50
+ <div class="flex flex-col items-center gap-2">
51
+ <modus-loader variant="ring" size="md" />
52
+ <div class="text-sm text-foreground-80">Ring</div>
53
+ </div>
54
+ </div>
55
+ </demo-example>
56
+
57
+ <demo-example
58
+ title="Color Options"
59
+ description="Theme-aware colors that automatically adapt to light and dark themes."
60
+ >
61
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-6">
62
+ <div class="flex flex-col items-center gap-2">
63
+ <modus-loader variant="spinner" color="primary" size="md" />
64
+ <div class="text-sm text-foreground-80">Primary</div>
65
+ </div>
66
+ <div class="flex flex-col items-center gap-2">
67
+ <modus-loader variant="spinner" color="secondary" size="md" />
68
+ <div class="text-sm text-foreground-80">Secondary</div>
69
+ </div>
70
+ <div class="flex flex-col items-center gap-2">
71
+ <modus-loader variant="spinner" color="accent" size="md" />
72
+ <div class="text-sm text-foreground-80">Accent</div>
73
+ </div>
74
+ <div class="flex flex-col items-center gap-2">
75
+ <modus-loader variant="spinner" color="success" size="md" />
76
+ <div class="text-sm text-foreground-80">Success</div>
77
+ </div>
78
+ <div class="flex flex-col items-center gap-2">
79
+ <modus-loader variant="spinner" color="warning" size="md" />
80
+ <div class="text-sm text-foreground-80">Warning</div>
81
+ </div>
82
+ <div class="flex flex-col items-center gap-2">
83
+ <modus-loader variant="spinner" color="error" size="md" />
84
+ <div class="text-sm text-foreground-80">Error</div>
85
+ </div>
86
+ <div class="flex flex-col items-center gap-2">
87
+ <modus-loader variant="spinner" color="info" size="md" />
88
+ <div class="text-sm text-foreground-80">Info</div>
89
+ </div>
90
+ </div>
91
+ </demo-example>
92
+
93
+ <demo-example
94
+ title="Size Options"
95
+ description="Four size tokens from extra small to large for different contexts."
96
+ >
97
+ <div class="flex items-center justify-center gap-8">
98
+ <div class="flex flex-col items-center gap-2">
99
+ <modus-loader variant="spinner" size="xs" />
100
+ <div class="text-sm text-foreground-80">XS (16px)</div>
101
+ </div>
102
+ <div class="flex flex-col items-center gap-2">
103
+ <modus-loader variant="spinner" size="sm" />
104
+ <div class="text-sm text-foreground-80">SM (20px)</div>
105
+ </div>
106
+ <div class="flex flex-col items-center gap-2">
107
+ <modus-loader variant="spinner" size="md" />
108
+ <div class="text-sm text-foreground-80">MD (24px)</div>
109
+ </div>
110
+ <div class="flex flex-col items-center gap-2">
111
+ <modus-loader variant="spinner" size="lg" />
112
+ <div class="text-sm text-foreground-80">LG (32px)</div>
113
+ </div>
114
+ </div>
115
+ </demo-example>
116
+
117
+ <demo-example
118
+ title="Usage Examples"
119
+ description="Common patterns for using loaders in real applications."
120
+ >
121
+ <div class="flex flex-col gap-6">
122
+ <div class="flex items-center gap-3">
123
+ <modus-loader variant="spinner" size="md" />
124
+ <div class="text-sm text-foreground-80">Syncing records…</div>
125
+ </div>
126
+ <div class="flex items-center gap-2">
127
+ <modus-loader variant="dots" size="sm" color="secondary" />
128
+ <div class="text-sm text-foreground-80">Preparing report</div>
129
+ </div>
130
+ <div class="flex items-center gap-3">
131
+ <modus-loader variant="bars" size="sm" color="success" />
132
+ <div class="text-sm text-foreground-80">Upload complete</div>
133
+ </div>
134
+ <div class="flex items-center gap-3">
135
+ <modus-loader variant="ring" size="lg" color="warning" />
136
+ <div class="text-lg text-foreground">Processing large dataset…</div>
137
+ </div>
138
+ </div>
139
+ </demo-example>
140
+ </demo-page>
141
+ `,
142
+ })
143
+ export class LoaderDemoPageComponent {}
@@ -0,0 +1,191 @@
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 { ModusLogoComponent, LogoName } from '../../components/modus-logo.component';
6
+
7
+ /**
8
+ * Demo page showcasing the Modus Logo component.
9
+ *
10
+ * Demonstrates logo features including:
11
+ * - Trimble product logos (19 logos)
12
+ * - Viewpoint product logos (17 logos)
13
+ * - Full logos vs emblem (icon-only) variants
14
+ * - Custom sizing with Tailwind classes
15
+ * - Theme awareness (automatic light/dark switching)
16
+ */
17
+ @Component({
18
+ selector: 'app-logo-demo-page',
19
+ standalone: true,
20
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusLogoComponent],
21
+ template: `
22
+ <demo-page
23
+ title="Modus Logo"
24
+ description="Display Trimble and Viewpoint product logos with consistent branding. Logos automatically switch between light and dark variants based on the current theme."
25
+ >
26
+ <demo-example
27
+ title="Trimble Product Logos"
28
+ description="Official Trimble product logos. Logos contain embedded brand colors and should not be modified."
29
+ >
30
+ <div class="grid grid-cols-2 gap-8">
31
+ @for (logo of trimbleLogos; track logo.name) {
32
+ <div
33
+ class="flex flex-col items-center gap-4 p-6 bg-muted rounded-lg"
34
+ >
35
+ <div class="h-20 flex items-center justify-center">
36
+ <modus-logo [name]="logo.name" customClass="max-h-20 max-w-64" />
37
+ </div>
38
+ <div class="text-sm text-muted-foreground text-center">{{ logo.display }}</div>
39
+ <code class="text-xs bg-background px-2 py-1 rounded">{{ logo.name }}</code>
40
+ </div>
41
+ }
42
+ </div>
43
+ </demo-example>
44
+
45
+ <demo-example
46
+ title="Viewpoint Product Logos"
47
+ description="Official Viewpoint product logos with proper brand colors."
48
+ >
49
+ <div class="grid grid-cols-2 gap-8">
50
+ @for (logo of viewpointLogos; track logo.name) {
51
+ <div
52
+ class="flex flex-col items-center gap-4 p-6 bg-muted rounded-lg"
53
+ >
54
+ <div class="h-20 flex items-center justify-center">
55
+ <modus-logo [name]="logo.name" customClass="max-h-20 max-w-64" />
56
+ </div>
57
+ <div class="text-sm text-muted-foreground text-center">{{ logo.display }}</div>
58
+ <code class="text-xs bg-background px-2 py-1 rounded">{{ logo.name }}</code>
59
+ </div>
60
+ }
61
+ </div>
62
+ </demo-example>
63
+
64
+ <demo-example
65
+ title="Emblem Variants"
66
+ description="Icon-only versions of logos for compact spaces like favicons, app icons, or navigation."
67
+ >
68
+ <div class="flex flex-wrap items-center gap-8">
69
+ @for (logo of featuredLogos; track logo.name) {
70
+ <div class="flex flex-col items-center gap-2">
71
+ <div
72
+ class="w-16 h-16 flex items-center justify-center bg-card rounded-lg border-default"
73
+ >
74
+ <modus-logo [name]="logo.name" [emblem]="true" customClass="w-10 h-10" />
75
+ </div>
76
+ <div class="text-xs text-foreground-60">{{ logo.display }}</div>
77
+ </div>
78
+ }
79
+ </div>
80
+ </demo-example>
81
+
82
+ <demo-example
83
+ title="Size Variations"
84
+ description="Control logo size using Tailwind CSS classes via the customClass prop."
85
+ >
86
+ <div class="flex flex-wrap items-end gap-8">
87
+ <div class="flex flex-col items-center gap-2">
88
+ <modus-logo name="trimble" customClass="h-6 w-auto" />
89
+ <div class="text-xs text-foreground-60">Small (h-6)</div>
90
+ </div>
91
+ <div class="flex flex-col items-center gap-2">
92
+ <modus-logo name="trimble" customClass="h-10 w-auto" />
93
+ <div class="text-xs text-foreground-60">Medium (h-10)</div>
94
+ </div>
95
+ <div class="flex flex-col items-center gap-2">
96
+ <modus-logo name="trimble" customClass="h-16 w-auto" />
97
+ <div class="text-xs text-foreground-60">Large (h-16)</div>
98
+ </div>
99
+ <div class="flex flex-col items-center gap-2">
100
+ <modus-logo name="trimble" customClass="h-24 w-auto" />
101
+ <div class="text-xs text-foreground-60">Extra Large (h-24)</div>
102
+ </div>
103
+ </div>
104
+ </demo-example>
105
+
106
+ <demo-example
107
+ title="Theme Awareness"
108
+ description="Logos automatically switch between light and dark variants based on the data-theme attribute. Try switching themes to see the change."
109
+ >
110
+ <div class="flex flex-wrap items-center gap-8">
111
+ <div class="flex flex-col items-center gap-3 p-6 bg-card rounded-lg border-default">
112
+ <modus-logo name="trimble" customClass="h-12 w-auto" />
113
+ <div class="text-sm text-foreground-60">Trimble</div>
114
+ </div>
115
+ <div class="flex flex-col items-center gap-3 p-6 bg-card rounded-lg border-default">
116
+ <modus-logo name="connect" customClass="h-12 w-auto" />
117
+ <div class="text-sm text-foreground-60">Trimble Connect</div>
118
+ </div>
119
+ <div class="flex flex-col items-center gap-3 p-6 bg-card rounded-lg border-default">
120
+ <modus-logo name="viewpoint" customClass="h-12 w-auto" />
121
+ <div class="text-sm text-foreground-60">Viewpoint</div>
122
+ </div>
123
+ </div>
124
+ <div class="mt-4 p-4 bg-muted rounded-lg">
125
+ <div class="text-sm text-foreground-80">
126
+ <div class="font-semibold mb-1">How it works</div>
127
+ <div>
128
+ The logo component observes the data-theme attribute on the HTML element and
129
+ automatically loads the appropriate light or dark SVG variant. No additional
130
+ configuration is required.
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </demo-example>
135
+ </demo-page>
136
+ `,
137
+ })
138
+ export class LogoDemoPageComponent {
139
+ /** Trimble product logos (19 logos) */
140
+ readonly trimbleLogos: { name: LogoName; display: string }[] = [
141
+ { name: 'trimble', display: 'Trimble' },
142
+ { name: 'siteworks', display: 'Siteworks' },
143
+ { name: 'earthworks', display: 'Earthworks' },
144
+ { name: 'financials', display: 'Financials' },
145
+ { name: 'worksmanager', display: 'WorksManager' },
146
+ { name: 'connect', display: 'Connect' },
147
+ { name: 'unity_construct', display: 'Unity Construct' },
148
+ { name: 'trade_servicelive', display: 'Trade ServiceLive' },
149
+ { name: 'buildable', display: 'Buildable' },
150
+ { name: 'livecount', display: 'LiveCount' },
151
+ { name: 'supplier_xchange', display: 'Supplier Xchange' },
152
+ { name: 'app_xchange', display: 'App Xchange' },
153
+ { name: 'trimble_unity', display: 'Trimble Unity' },
154
+ { name: 'sketchup', display: 'SketchUp' },
155
+ { name: 'pc_miler', display: 'PC Miler' },
156
+ { name: 'copilot', display: 'CoPilot' },
157
+ { name: 'trimble_pay', display: 'Trimble Pay' },
158
+ { name: 'projectsight', display: 'ProjectSight' },
159
+ { name: 'demand_planning', display: 'Demand Planning' },
160
+ ];
161
+
162
+ /** Viewpoint product logos (17 logos) */
163
+ readonly viewpointLogos: { name: LogoName; display: string }[] = [
164
+ { name: 'viewpoint', display: 'Viewpoint' },
165
+ { name: 'viewpoint_analytics', display: 'Analytics' },
166
+ { name: 'viewpoint_epayments', display: 'ePayments' },
167
+ { name: 'viewpoint_estimating', display: 'Estimating' },
168
+ { name: 'viewpoint_field_management', display: 'Field Management' },
169
+ { name: 'viewpoint_field_time', display: 'Field Time' },
170
+ { name: 'viewpoint_financial_controls', display: 'Financial Controls' },
171
+ { name: 'viewpoint_hr_management', display: 'HR Management' },
172
+ { name: 'viewpoint_jobpac_connect', display: 'Jobpac Connect' },
173
+ { name: 'viewpoint_procontractor', display: 'ProContractor' },
174
+ { name: 'viewpoint_spectrum', display: 'Spectrum' },
175
+ { name: 'viewpoint_team', display: 'Team' },
176
+ { name: 'viewpoint_vista', display: 'Vista' },
177
+ { name: 'viewpoint_spectrum_service_tech', display: 'Spectrum Service Tech' },
178
+ { name: 'viewpoint_for_projects', display: 'For Projects' },
179
+ { name: 'viewpoint_vista_field_service', display: 'Vista Field Service' },
180
+ { name: 'viewpoint_field_view', display: 'Field View' },
181
+ ];
182
+
183
+ /** Featured logos for emblem demonstration */
184
+ readonly featuredLogos: { name: LogoName; display: string }[] = [
185
+ { name: 'trimble', display: 'Trimble' },
186
+ { name: 'connect', display: 'Connect' },
187
+ { name: 'sketchup', display: 'SketchUp' },
188
+ { name: 'viewpoint', display: 'Viewpoint' },
189
+ { name: 'viewpoint_vista', display: 'Vista' },
190
+ ];
191
+ }