@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,76 @@
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 { ModusSliderComponent } from '../../components/modus-slider.component';
6
+
7
+ /**
8
+ * Demo page showcasing the Modus Slider component.
9
+ *
10
+ * Demonstrates slider features including:
11
+ * - Basic slider
12
+ * - Sizes
13
+ */
14
+ @Component({
15
+ selector: 'app-slider-demo-page',
16
+ standalone: true,
17
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusSliderComponent],
18
+ template: `
19
+ <demo-page
20
+ title="Modus Slider"
21
+ description="Slider components allow users to select a numeric value by dragging a handle along a track. Use sliders for volume, brightness, or any continuous numeric input."
22
+ >
23
+ <demo-example title="Basic Slider" description="Simple slider with default range.">
24
+ <div class="flex flex-col gap-6">
25
+ <div class="flex flex-col gap-2">
26
+ <modus-slider
27
+ inputId="volume-slider"
28
+ label="Volume"
29
+ [min]="0"
30
+ [max]="100"
31
+ [value]="50"
32
+ />
33
+ </div>
34
+ </div>
35
+ </demo-example>
36
+
37
+ <demo-example title="Slider Sizes" description="Sliders in different sizes.">
38
+ <div class="flex flex-col gap-6">
39
+ <div class="flex flex-col gap-2">
40
+ <modus-slider
41
+ inputId="small-slider"
42
+ label="Small"
43
+ [min]="0"
44
+ [max]="100"
45
+ [value]="50"
46
+ size="sm"
47
+ />
48
+ </div>
49
+
50
+ <div class="flex flex-col gap-2">
51
+ <modus-slider
52
+ inputId="medium-slider"
53
+ label="Medium"
54
+ [min]="0"
55
+ [max]="100"
56
+ [value]="50"
57
+ size="md"
58
+ />
59
+ </div>
60
+
61
+ <div class="flex flex-col gap-2">
62
+ <modus-slider
63
+ inputId="large-slider"
64
+ label="Large"
65
+ [min]="0"
66
+ [max]="100"
67
+ [value]="50"
68
+ size="lg"
69
+ />
70
+ </div>
71
+ </div>
72
+ </demo-example>
73
+ </demo-page>
74
+ `,
75
+ })
76
+ export class SliderDemoPageComponent {}
@@ -0,0 +1,79 @@
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 { ModusStepperComponent, IStepperItem } from '../../components/modus-stepper.component';
6
+
7
+ /**
8
+ * Demo page showcasing the Modus Stepper component.
9
+ *
10
+ * Demonstrates stepper features including:
11
+ * - Horizontal stepper
12
+ * - Vertical stepper
13
+ * - Step colors
14
+ * - Custom content
15
+ */
16
+ @Component({
17
+ selector: 'app-stepper-demo-page',
18
+ standalone: true,
19
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusStepperComponent],
20
+ template: `
21
+ <demo-page
22
+ title="Modus Stepper"
23
+ description="Stepper components display a list of steps in a process or workflow. Use steppers to guide users through multi-step forms, wizards, or sequential processes."
24
+ >
25
+ <demo-example title="Horizontal Stepper" description="Stepper displayed horizontally.">
26
+ <div class="flex flex-col gap-6">
27
+ <modus-stepper [steps]="horizontalSteps" orientation="horizontal" />
28
+ </div>
29
+ </demo-example>
30
+
31
+ <demo-example title="Vertical Stepper" description="Stepper displayed vertically.">
32
+ <div class="flex flex-col gap-6">
33
+ <modus-stepper [steps]="verticalSteps" orientation="vertical" />
34
+ </div>
35
+ </demo-example>
36
+
37
+ <demo-example title="Stepper with Colors" description="Steps with different color themes.">
38
+ <div class="flex flex-col gap-6">
39
+ <modus-stepper [steps]="coloredSteps" orientation="horizontal" />
40
+ </div>
41
+ </demo-example>
42
+
43
+ <demo-example
44
+ title="Stepper with Custom Content"
45
+ description="Steps with custom content in indicators."
46
+ >
47
+ <div class="flex flex-col gap-6">
48
+ <modus-stepper [steps]="customContentSteps" orientation="horizontal" />
49
+ </div>
50
+ </demo-example>
51
+ </demo-page>
52
+ `,
53
+ })
54
+ export class StepperDemoPageComponent {
55
+ readonly horizontalSteps: IStepperItem[] = [
56
+ { label: 'Step 1', color: 'primary' },
57
+ { label: 'Step 2', color: 'info' },
58
+ { label: 'Step 3' },
59
+ ];
60
+
61
+ readonly verticalSteps: IStepperItem[] = [
62
+ { label: 'Setup', color: 'success' },
63
+ { label: 'Configure', color: 'warning' },
64
+ { label: 'Deploy', color: 'error' },
65
+ ];
66
+
67
+ readonly coloredSteps: IStepperItem[] = [
68
+ { label: 'Primary', color: 'primary' },
69
+ { label: 'Success', color: 'success' },
70
+ { label: 'Warning', color: 'warning' },
71
+ { label: 'Error', color: 'error' },
72
+ ];
73
+
74
+ readonly customContentSteps: IStepperItem[] = [
75
+ { label: 'Step 1', content: '1' },
76
+ { label: 'Step 2', content: '✓' },
77
+ { label: 'Step 3', content: '3' },
78
+ ];
79
+ }
@@ -0,0 +1,113 @@
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 { ModusSwitchComponent } from '../../components/modus-switch.component';
6
+ import { ModusInputLabelComponent } from '../../components/modus-input-label.component';
7
+
8
+ /**
9
+ * Demo page showcasing the Modus Switch component.
10
+ *
11
+ * Demonstrates switch features including:
12
+ * - Basic switch
13
+ * - Sizes
14
+ * - Required fields
15
+ * - Disabled state
16
+ */
17
+ @Component({
18
+ selector: 'app-switch-demo-page',
19
+ standalone: true,
20
+ imports: [
21
+ CommonModule,
22
+ DemoPageComponent,
23
+ DemoExampleComponent,
24
+ ModusSwitchComponent,
25
+ ModusInputLabelComponent,
26
+ ],
27
+ template: `
28
+ <demo-page
29
+ title="Modus Switch"
30
+ description="Switch components allow users to toggle between on and off states. Use switches for binary settings like enabling/disabling features or turning notifications on/off."
31
+ >
32
+ <demo-example title="Basic Switch" description="Simple switch toggle controls.">
33
+ <div class="flex flex-col gap-6">
34
+ <div class="flex flex-col gap-2">
35
+ <modus-input-label forId="notifications-switch" labelText="Notifications" />
36
+ <modus-switch
37
+ inputId="notifications-switch"
38
+ label="Enable notifications"
39
+ [value]="true"
40
+ />
41
+ </div>
42
+
43
+ <div class="flex flex-col gap-2">
44
+ <modus-input-label forId="dark-mode-switch" labelText="Dark Mode" />
45
+ <modus-switch inputId="dark-mode-switch" label="Dark mode" [value]="false" />
46
+ </div>
47
+ </div>
48
+ </demo-example>
49
+
50
+ <demo-example title="Switch Sizes" description="Switches in different sizes.">
51
+ <div class="flex flex-col gap-6">
52
+ <div class="flex flex-col gap-2">
53
+ <modus-input-label forId="small-switch" labelText="Small" />
54
+ <modus-switch inputId="small-switch" label="Small switch" size="sm" [value]="true" />
55
+ </div>
56
+
57
+ <div class="flex flex-col gap-2">
58
+ <modus-input-label forId="medium-switch" labelText="Medium (Default)" />
59
+ <modus-switch inputId="medium-switch" label="Medium switch" size="md" [value]="true" />
60
+ </div>
61
+
62
+ <div class="flex flex-col gap-2">
63
+ <modus-input-label forId="large-switch" labelText="Large" />
64
+ <modus-switch inputId="large-switch" label="Large switch" size="lg" [value]="true" />
65
+ </div>
66
+ </div>
67
+ </demo-example>
68
+
69
+ <demo-example title="Required Switch" description="Switches marked as required fields.">
70
+ <div class="flex flex-col gap-6">
71
+ <div class="flex flex-col gap-2">
72
+ <modus-input-label
73
+ forId="required-switch"
74
+ labelText="Terms Agreement"
75
+ [required]="true"
76
+ />
77
+ <modus-switch
78
+ inputId="required-switch"
79
+ label="I agree to the terms and conditions"
80
+ [required]="true"
81
+ [value]="false"
82
+ />
83
+ </div>
84
+ </div>
85
+ </demo-example>
86
+
87
+ <demo-example title="Disabled Switch" description="Switches in disabled state.">
88
+ <div class="flex flex-col gap-6">
89
+ <div class="flex flex-col gap-2">
90
+ <modus-input-label forId="disabled-on-switch" labelText="Disabled (On)" />
91
+ <modus-switch
92
+ inputId="disabled-on-switch"
93
+ label="Disabled switch (on)"
94
+ [disabled]="true"
95
+ [value]="true"
96
+ />
97
+ </div>
98
+
99
+ <div class="flex flex-col gap-2">
100
+ <modus-input-label forId="disabled-off-switch" labelText="Disabled (Off)" />
101
+ <modus-switch
102
+ inputId="disabled-off-switch"
103
+ label="Disabled switch (off)"
104
+ [disabled]="true"
105
+ [value]="false"
106
+ />
107
+ </div>
108
+ </div>
109
+ </demo-example>
110
+ </demo-page>
111
+ `,
112
+ })
113
+ export class SwitchDemoPageComponent {}
@@ -0,0 +1,405 @@
1
+ import { Component, signal } 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 { ModusTableComponent } from '../../components/modus-table.component';
6
+ import type { ITableColumn, IPaginationChangeEventDetail } from '@trimble-oss/moduswebcomponents';
7
+
8
+ // Basic team data
9
+ const teamColumns: ITableColumn[] = [
10
+ { id: 'name', header: 'Name', accessor: 'name', width: '40%' },
11
+ { id: 'role', header: 'Role', accessor: 'role' },
12
+ { id: 'status', header: 'Status', accessor: 'status' },
13
+ ];
14
+
15
+ const teamData = [
16
+ { id: '1', name: 'Alex Rivera', role: 'Project Lead', status: 'Active' },
17
+ { id: '2', name: 'Brianna Lee', role: 'UX Researcher', status: 'In review' },
18
+ { id: '3', name: 'Chris Patel', role: 'Developer', status: 'Active' },
19
+ { id: '4', name: 'Morgan Diaz', role: 'Analyst', status: 'Blocked' },
20
+ ];
21
+
22
+ // Product inventory data for pagination example
23
+ const productColumns: ITableColumn[] = [
24
+ { id: 'product', header: 'Product', accessor: 'product', width: '50%' },
25
+ { id: 'category', header: 'Category', accessor: 'category' },
26
+ { id: 'price', header: 'Price', accessor: 'price', sortable: true },
27
+ { id: 'stock', header: 'Stock', accessor: 'stock', sortable: true },
28
+ ];
29
+
30
+ const productData = Array.from({ length: 25 }, (_, i) => ({
31
+ id: `p${i + 1}`,
32
+ product: `Product ${i + 1}`,
33
+ category: ['Electronics', 'Clothing', 'Books', 'Home', 'Sports'][i % 5],
34
+ price: (i + 1) * 10,
35
+ stock: Math.floor(Math.random() * 100) + 1,
36
+ }));
37
+
38
+ // Employee data for selection example
39
+ const employeeColumns: ITableColumn[] = [
40
+ { id: 'name', header: 'Name', accessor: 'name', width: '30%' },
41
+ { id: 'department', header: 'Department', accessor: 'department' },
42
+ { id: 'salary', header: 'Salary', accessor: 'salary', sortable: true },
43
+ { id: 'experience', header: 'Experience', accessor: 'experience', sortable: true },
44
+ ];
45
+
46
+ const employeeData = [
47
+ {
48
+ id: '1',
49
+ name: 'Sarah Johnson',
50
+ department: 'Engineering',
51
+ salary: 95000,
52
+ experience: '5 years',
53
+ },
54
+ { id: '2', name: 'Michael Chen', department: 'Marketing', salary: 75000, experience: '3 years' },
55
+ {
56
+ id: '3',
57
+ name: 'Emily Davis',
58
+ department: 'Engineering',
59
+ salary: 110000,
60
+ experience: '8 years',
61
+ },
62
+ { id: '4', name: 'David Wilson', department: 'Sales', salary: 65000, experience: '2 years' },
63
+ { id: '5', name: 'Lisa Brown', department: 'HR', salary: 70000, experience: '4 years' },
64
+ ];
65
+
66
+ // Helper function to create a text input editor
67
+ function createTextEditor(value: unknown, onCommit: (value: unknown) => void): HTMLElement {
68
+ const input = document.createElement('input');
69
+ input.type = 'text';
70
+ input.value = String(value || '');
71
+ input.style.width = '100%';
72
+ input.style.border = '1px solid var(--border)';
73
+ input.style.padding = '4px 8px';
74
+ input.style.borderRadius = '4px';
75
+ input.style.fontSize = '14px';
76
+ input.style.backgroundColor = 'var(--background)';
77
+ input.style.color = 'var(--foreground)';
78
+
79
+ // Auto-focus and select text
80
+ setTimeout(() => {
81
+ input.focus();
82
+ input.select();
83
+ }, 0);
84
+
85
+ // Commit on Enter or blur
86
+ const commitValue = () => {
87
+ onCommit(input.value);
88
+ };
89
+
90
+ input.addEventListener('keydown', (e) => {
91
+ if (e.key === 'Enter') {
92
+ e.preventDefault();
93
+ commitValue();
94
+ }
95
+ if (e.key === 'Escape') {
96
+ e.preventDefault();
97
+ onCommit(value); // Revert to original value
98
+ }
99
+ });
100
+
101
+ input.addEventListener('blur', commitValue);
102
+
103
+ return input;
104
+ }
105
+
106
+ // Helper function to create a select dropdown editor
107
+ function createSelectEditor(
108
+ value: unknown,
109
+ onCommit: (value: unknown) => void,
110
+ options: string[],
111
+ ): HTMLElement {
112
+ const select = document.createElement('select');
113
+ select.style.width = '100%';
114
+ select.style.border = '1px solid var(--border)';
115
+ select.style.padding = '4px 8px';
116
+ select.style.borderRadius = '4px';
117
+ select.style.fontSize = '14px';
118
+ select.style.backgroundColor = 'var(--background)';
119
+ select.style.color = 'var(--foreground)';
120
+
121
+ options.forEach((option) => {
122
+ const optionElement = document.createElement('option');
123
+ optionElement.value = option;
124
+ optionElement.textContent = option;
125
+ optionElement.selected = option === value;
126
+ select.appendChild(optionElement);
127
+ });
128
+
129
+ setTimeout(() => {
130
+ select.focus();
131
+ }, 0);
132
+
133
+ const commitValue = () => {
134
+ onCommit(select.value);
135
+ };
136
+
137
+ select.addEventListener('change', commitValue);
138
+ select.addEventListener('keydown', (e) => {
139
+ if (e.key === 'Enter') {
140
+ e.preventDefault();
141
+ commitValue();
142
+ }
143
+ if (e.key === 'Escape') {
144
+ e.preventDefault();
145
+ onCommit(value);
146
+ }
147
+ });
148
+
149
+ select.addEventListener('blur', commitValue);
150
+
151
+ return select;
152
+ }
153
+
154
+ // Task data for editable example
155
+ const taskColumns: ITableColumn[] = [
156
+ {
157
+ id: 'id',
158
+ header: 'ID',
159
+ accessor: 'id',
160
+ width: '60px',
161
+ // No editor property - makes this column non-editable
162
+ },
163
+ {
164
+ id: 'task',
165
+ header: 'Task',
166
+ accessor: 'task',
167
+ width: '40%',
168
+ editor: 'custom',
169
+ customEditorRenderer: (value: unknown, onCommit: (value: unknown) => void) =>
170
+ createTextEditor(value, onCommit),
171
+ },
172
+ {
173
+ id: 'assignee',
174
+ header: 'Assignee',
175
+ accessor: 'assignee',
176
+ editor: 'custom',
177
+ customEditorRenderer: (value: unknown, onCommit: (value: unknown) => void) =>
178
+ createTextEditor(value, onCommit),
179
+ },
180
+ {
181
+ id: 'priority',
182
+ header: 'Priority',
183
+ accessor: 'priority',
184
+ editor: 'custom',
185
+ customEditorRenderer: (value: unknown, onCommit: (value: unknown) => void) =>
186
+ createSelectEditor(value, onCommit, ['Low', 'Medium', 'High']),
187
+ },
188
+ {
189
+ id: 'status',
190
+ header: 'Status',
191
+ accessor: 'status',
192
+ editor: 'custom',
193
+ customEditorRenderer: (value: unknown, onCommit: (value: unknown) => void) =>
194
+ createSelectEditor(value, onCommit, ['Pending', 'In Progress', 'Completed', 'Scheduled']),
195
+ },
196
+ ];
197
+
198
+ const initialTaskData = [
199
+ {
200
+ id: '1',
201
+ task: 'Design new dashboard',
202
+ assignee: 'Alex Rivera',
203
+ priority: 'High',
204
+ status: 'In Progress',
205
+ },
206
+ {
207
+ id: '2',
208
+ task: 'Update documentation',
209
+ assignee: 'Brianna Lee',
210
+ priority: 'Medium',
211
+ status: 'Pending',
212
+ },
213
+ { id: '3', task: 'Code review', assignee: 'Chris Patel', priority: 'High', status: 'Completed' },
214
+ { id: '4', task: 'User testing', assignee: 'Morgan Diaz', priority: 'Low', status: 'Scheduled' },
215
+ ];
216
+
217
+ /**
218
+ * Demo page showcasing the Modus Table component.
219
+ *
220
+ * Demonstrates table features including:
221
+ * - Basic table with comfortable density
222
+ * - Compact density with zebra striping
223
+ * - Paginated tables with navigation
224
+ * - Multi-select and single-select modes
225
+ * - Editable cells with inline editing
226
+ * - Sortable columns
227
+ * - Relaxed density for better readability
228
+ */
229
+ @Component({
230
+ selector: 'app-table-demo-page',
231
+ standalone: true,
232
+ imports: [CommonModule, DemoPageComponent, DemoExampleComponent, ModusTableComponent],
233
+ template: `
234
+ <demo-page
235
+ title="Modus Table"
236
+ description="Tables structure datasets for scanning and comparison. Limit the number of columns and prioritize the most actionable information."
237
+ >
238
+ <demo-example
239
+ title="Basic Table"
240
+ description="Comfortable density balances readability with information density."
241
+ >
242
+ <modus-table
243
+ [columns]="teamColumns"
244
+ [data]="teamData"
245
+ density="comfortable"
246
+ [zebra]="true"
247
+ [hover]="true"
248
+ />
249
+ </demo-example>
250
+
251
+ <demo-example
252
+ title="Compact Density with Zebra Striping"
253
+ description="Compact density maximizes information density for data-heavy tables."
254
+ >
255
+ <modus-table
256
+ [columns]="productColumns"
257
+ [data]="productDataSlice"
258
+ density="compact"
259
+ [zebra]="true"
260
+ [hover]="false"
261
+ />
262
+ </demo-example>
263
+
264
+ <demo-example
265
+ title="Paginated Table"
266
+ description="Pagination helps manage large datasets by showing a subset of rows with navigation controls."
267
+ >
268
+ <modus-table
269
+ [columns]="productColumns"
270
+ [data]="productData"
271
+ [paginated]="true"
272
+ [currentPage]="currentPage()"
273
+ [pageSizeOptions]="[5, 10, 15, 20]"
274
+ [showPageSizeSelector]="true"
275
+ (paginationChange)="handlePaginationChange($event)"
276
+ density="comfortable"
277
+ [zebra]="true"
278
+ />
279
+ </demo-example>
280
+
281
+ <demo-example
282
+ title="Multi-Select Table"
283
+ description="Enable row selection with checkboxes for bulk operations."
284
+ >
285
+ <modus-table
286
+ [columns]="employeeColumns"
287
+ [data]="employeeData"
288
+ selectable="multi"
289
+ [selectedRowIds]="selectedEmployees()"
290
+ (rowSelectionChange)="handleEmployeeSelection($event)"
291
+ density="comfortable"
292
+ [hover]="true"
293
+ />
294
+ @if (selectedEmployees().length > 0) {
295
+ <div class="mt-4 p-3 bg-muted rounded-lg">
296
+ <div class="text-sm text-muted-foreground">
297
+ Selected {{ selectedEmployees().length }} employee(s):
298
+ {{ selectedEmployees().join(', ') }}
299
+ </div>
300
+ </div>
301
+ }
302
+ </demo-example>
303
+
304
+ <demo-example
305
+ title="Single Select Table"
306
+ description="Single selection mode uses radio buttons for choosing one row."
307
+ >
308
+ <modus-table
309
+ [columns]="employeeColumns"
310
+ [data]="employeeDataSlice"
311
+ selectable="single"
312
+ density="relaxed"
313
+ [hover]="true"
314
+ />
315
+ </demo-example>
316
+
317
+ <demo-example
318
+ title="Editable Table"
319
+ description="Enable inline editing for data modification. Click on any cell to edit."
320
+ >
321
+ <modus-table
322
+ [columns]="taskColumns"
323
+ [data]="taskData()"
324
+ [editable]="true"
325
+ (cellEditStart)="handleCellEditStart($event)"
326
+ (cellEditCommit)="handleCellEditCommit($event)"
327
+ density="relaxed"
328
+ [hover]="true"
329
+ />
330
+ </demo-example>
331
+
332
+ <demo-example
333
+ title="Sortable Table"
334
+ description="All columns are sortable by default. Click headers to sort data."
335
+ >
336
+ <modus-table
337
+ [columns]="employeeColumns"
338
+ [data]="employeeData"
339
+ [sortable]="true"
340
+ density="comfortable"
341
+ [zebra]="true"
342
+ />
343
+ </demo-example>
344
+
345
+ <demo-example
346
+ title="Relaxed Density"
347
+ description="Relaxed density provides more spacing for better readability."
348
+ >
349
+ <modus-table [columns]="teamColumns" [data]="teamData" density="relaxed" [hover]="true" />
350
+ </demo-example>
351
+ </demo-page>
352
+ `,
353
+ })
354
+ export class TableDemoPageComponent {
355
+ // Column definitions
356
+ readonly teamColumns = teamColumns;
357
+ readonly productColumns = productColumns;
358
+ readonly employeeColumns = employeeColumns;
359
+ readonly taskColumns = taskColumns;
360
+
361
+ // Data sets
362
+ readonly teamData = teamData;
363
+ readonly productData = productData;
364
+ readonly productDataSlice = productData.slice(0, 8);
365
+ readonly employeeData = employeeData;
366
+ readonly employeeDataSlice = employeeData.slice(0, 4);
367
+
368
+ // State management
369
+ readonly selectedEmployees = signal<string[]>([]);
370
+ readonly currentPage = signal<number>(1);
371
+ readonly taskData = signal<Record<string, unknown>[]>([...initialTaskData]);
372
+
373
+ handleEmployeeSelection(event: {
374
+ selectedRows: Record<string, unknown>[];
375
+ selectedRowIds: string[];
376
+ }): void {
377
+ this.selectedEmployees.set(event.selectedRowIds);
378
+ }
379
+
380
+ handlePaginationChange(event: IPaginationChangeEventDetail): void {
381
+ this.currentPage.set(event.currentPage);
382
+ }
383
+
384
+ handleCellEditStart(event: { rowIndex: number; colId: string }): void {
385
+ console.log('Cell edit started:', event);
386
+ }
387
+
388
+ handleCellEditCommit(event: {
389
+ rowIndex: number;
390
+ colId: string;
391
+ newValue: unknown;
392
+ updatedRow: Record<string, unknown>;
393
+ }): void {
394
+ console.log('Cell edited:', event);
395
+ const { rowIndex, colId, newValue } = event;
396
+ console.log(`Row ${rowIndex}, Column ${colId} updated to:`, newValue);
397
+
398
+ // Create new data array with the updated row (immutable update)
399
+ this.taskData.update((prevData) => {
400
+ const newData = [...prevData];
401
+ newData[rowIndex] = { ...newData[rowIndex], [colId]: newValue };
402
+ return newData;
403
+ });
404
+ }
405
+ }