@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,489 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import DemoExample from "../../components/DemoExample";
5
+ import DemoPage from "../../components/DemoPage";
6
+ import ModusTable, { type TableColumn } from "../../components/ModusTable";
7
+
8
+ // Basic team data
9
+ const teamColumns = [
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 = [
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 = [
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
+ {
44
+ id: "experience",
45
+ header: "Experience",
46
+ accessor: "experience",
47
+ sortable: true,
48
+ },
49
+ ];
50
+
51
+ const employeeData = [
52
+ {
53
+ id: "1",
54
+ name: "Sarah Johnson",
55
+ department: "Engineering",
56
+ salary: 95000,
57
+ experience: "5 years",
58
+ },
59
+ {
60
+ id: "2",
61
+ name: "Michael Chen",
62
+ department: "Marketing",
63
+ salary: 75000,
64
+ experience: "3 years",
65
+ },
66
+ {
67
+ id: "3",
68
+ name: "Emily Davis",
69
+ department: "Engineering",
70
+ salary: 110000,
71
+ experience: "8 years",
72
+ },
73
+ {
74
+ id: "4",
75
+ name: "David Wilson",
76
+ department: "Sales",
77
+ salary: 65000,
78
+ experience: "2 years",
79
+ },
80
+ {
81
+ id: "5",
82
+ name: "Lisa Brown",
83
+ department: "HR",
84
+ salary: 70000,
85
+ experience: "4 years",
86
+ },
87
+ ];
88
+
89
+ // Task data for editable example
90
+ const taskColumns: TableColumn[] = [
91
+ {
92
+ id: "id",
93
+ header: "ID",
94
+ accessor: "id",
95
+ width: "60px",
96
+ // No editor property - makes this column non-editable
97
+ },
98
+ {
99
+ id: "task",
100
+ header: "Task",
101
+ accessor: "task",
102
+ width: "40%",
103
+ editor: "custom",
104
+ customEditorRenderer: (
105
+ value: unknown,
106
+ onCommit: (value: unknown) => void
107
+ ) => {
108
+ const input = document.createElement("input");
109
+ input.type = "text";
110
+ input.value = String(value || "");
111
+ input.style.width = "100%";
112
+ input.style.border = "1px solid var(--border)";
113
+ input.style.padding = "4px 8px";
114
+ input.style.borderRadius = "4px";
115
+ input.style.fontSize = "14px";
116
+
117
+ // Auto-focus and select text
118
+ setTimeout(() => {
119
+ input.focus();
120
+ input.select();
121
+ }, 0);
122
+
123
+ // Commit on Enter or blur
124
+ const commitValue = () => {
125
+ onCommit(input.value);
126
+ };
127
+
128
+ input.addEventListener("keydown", (e) => {
129
+ if (e.key === "Enter") {
130
+ e.preventDefault();
131
+ commitValue();
132
+ }
133
+ if (e.key === "Escape") {
134
+ e.preventDefault();
135
+ onCommit(value); // Revert to original value
136
+ }
137
+ });
138
+
139
+ input.addEventListener("blur", commitValue);
140
+
141
+ return input;
142
+ },
143
+ },
144
+ {
145
+ id: "assignee",
146
+ header: "Assignee",
147
+ accessor: "assignee",
148
+ editor: "custom",
149
+ customEditorRenderer: (
150
+ value: unknown,
151
+ onCommit: (value: unknown) => void
152
+ ) => {
153
+ const input = document.createElement("input");
154
+ input.type = "text";
155
+ input.value = String(value || "");
156
+ input.style.width = "100%";
157
+ input.style.border = "1px solid var(--border)";
158
+ input.style.padding = "4px 8px";
159
+ input.style.borderRadius = "4px";
160
+ input.style.fontSize = "14px";
161
+
162
+ setTimeout(() => {
163
+ input.focus();
164
+ input.select();
165
+ }, 0);
166
+
167
+ const commitValue = () => {
168
+ onCommit(input.value);
169
+ };
170
+
171
+ input.addEventListener("keydown", (e) => {
172
+ if (e.key === "Enter") {
173
+ e.preventDefault();
174
+ commitValue();
175
+ }
176
+ if (e.key === "Escape") {
177
+ e.preventDefault();
178
+ onCommit(value);
179
+ }
180
+ });
181
+
182
+ input.addEventListener("blur", commitValue);
183
+
184
+ return input;
185
+ },
186
+ },
187
+ {
188
+ id: "priority",
189
+ header: "Priority",
190
+ accessor: "priority",
191
+ editor: "custom",
192
+ customEditorRenderer: (
193
+ value: unknown,
194
+ onCommit: (value: unknown) => void
195
+ ) => {
196
+ const select = document.createElement("select");
197
+ select.style.width = "100%";
198
+ select.style.border = "1px solid var(--border)";
199
+ select.style.padding = "4px 8px";
200
+ select.style.borderRadius = "4px";
201
+ select.style.fontSize = "14px";
202
+
203
+ const options = ["Low", "Medium", "High"];
204
+ options.forEach((option) => {
205
+ const optionElement = document.createElement("option");
206
+ optionElement.value = option;
207
+ optionElement.textContent = option;
208
+ optionElement.selected = option === value;
209
+ select.appendChild(optionElement);
210
+ });
211
+
212
+ setTimeout(() => {
213
+ select.focus();
214
+ }, 0);
215
+
216
+ const commitValue = () => {
217
+ onCommit(select.value);
218
+ };
219
+
220
+ select.addEventListener("change", commitValue);
221
+ select.addEventListener("keydown", (e) => {
222
+ if (e.key === "Enter") {
223
+ e.preventDefault();
224
+ commitValue();
225
+ }
226
+ if (e.key === "Escape") {
227
+ e.preventDefault();
228
+ onCommit(value);
229
+ }
230
+ });
231
+
232
+ select.addEventListener("blur", commitValue);
233
+
234
+ return select;
235
+ },
236
+ },
237
+ {
238
+ id: "status",
239
+ header: "Status",
240
+ accessor: "status",
241
+ editor: "custom",
242
+ customEditorRenderer: (
243
+ value: unknown,
244
+ onCommit: (value: unknown) => void
245
+ ) => {
246
+ const select = document.createElement("select");
247
+ select.style.width = "100%";
248
+ select.style.border = "1px solid var(--border)";
249
+ select.style.padding = "4px 8px";
250
+ select.style.borderRadius = "4px";
251
+ select.style.fontSize = "14px";
252
+
253
+ const options = ["Pending", "In Progress", "Completed", "Scheduled"];
254
+ options.forEach((option) => {
255
+ const optionElement = document.createElement("option");
256
+ optionElement.value = option;
257
+ optionElement.textContent = option;
258
+ optionElement.selected = option === value;
259
+ select.appendChild(optionElement);
260
+ });
261
+
262
+ setTimeout(() => {
263
+ select.focus();
264
+ }, 0);
265
+
266
+ const commitValue = () => {
267
+ onCommit(select.value);
268
+ };
269
+
270
+ select.addEventListener("change", commitValue);
271
+ select.addEventListener("keydown", (e) => {
272
+ if (e.key === "Enter") {
273
+ e.preventDefault();
274
+ commitValue();
275
+ }
276
+ if (e.key === "Escape") {
277
+ e.preventDefault();
278
+ onCommit(value);
279
+ }
280
+ });
281
+
282
+ select.addEventListener("blur", commitValue);
283
+
284
+ return select;
285
+ },
286
+ },
287
+ ];
288
+
289
+ const initialTaskData = [
290
+ {
291
+ id: "1",
292
+ task: "Design new dashboard",
293
+ assignee: "Alex Rivera",
294
+ priority: "High",
295
+ status: "In Progress",
296
+ },
297
+ {
298
+ id: "2",
299
+ task: "Update documentation",
300
+ assignee: "Brianna Lee",
301
+ priority: "Medium",
302
+ status: "Pending",
303
+ },
304
+ {
305
+ id: "3",
306
+ task: "Code review",
307
+ assignee: "Chris Patel",
308
+ priority: "High",
309
+ status: "Completed",
310
+ },
311
+ {
312
+ id: "4",
313
+ task: "User testing",
314
+ assignee: "Morgan Diaz",
315
+ priority: "Low",
316
+ status: "Scheduled",
317
+ },
318
+ ];
319
+
320
+ export default function TableDemoPage() {
321
+ const [selectedEmployees, setSelectedEmployees] = useState<string[]>([]);
322
+ const [currentPage, setCurrentPage] = useState(1);
323
+ const [taskData, setTaskData] = useState(initialTaskData);
324
+
325
+ const handleEmployeeSelection = (
326
+ event: CustomEvent<{ selectedRows: unknown[]; selectedRowIds: string[] }>
327
+ ) => {
328
+ setSelectedEmployees(event.detail.selectedRowIds);
329
+ };
330
+
331
+ const handlePaginationChange = (
332
+ event: CustomEvent<{ currentPage: number; pageSize: number }>
333
+ ) => {
334
+ setCurrentPage(event.detail.currentPage);
335
+ };
336
+
337
+ const handleCellEditStart = (
338
+ event: CustomEvent<{ rowIndex: number; colId: string }>
339
+ ) => {
340
+ console.log("Cell edit started:", event.detail);
341
+ };
342
+
343
+ const handleCellEditCommit = (
344
+ event: CustomEvent<{
345
+ rowIndex: number;
346
+ colId: string;
347
+ newValue: unknown;
348
+ updatedRow: unknown;
349
+ }>
350
+ ) => {
351
+ console.log("Cell edited:", event.detail);
352
+ const { rowIndex, colId, newValue, updatedRow } = event.detail;
353
+ console.log(`Row ${rowIndex}, Column ${colId} updated to:`, newValue);
354
+ console.log("Updated row:", updatedRow);
355
+
356
+ // Create new data array with the updated row (immutable update)
357
+ setTaskData((prevData) => {
358
+ const newData = [...prevData];
359
+ newData[rowIndex] = { ...newData[rowIndex], [colId]: newValue };
360
+ return newData;
361
+ });
362
+ };
363
+
364
+ return (
365
+ <DemoPage
366
+ title="Modus Table"
367
+ description="Tables structure datasets for scanning and comparison. Limit the number of columns and prioritize the most actionable information."
368
+ >
369
+ <DemoExample
370
+ title="Basic Table"
371
+ description="Comfortable density balances readability with information density."
372
+ >
373
+ <ModusTable
374
+ columns={teamColumns}
375
+ data={teamData}
376
+ density="comfortable"
377
+ zebra
378
+ hover
379
+ />
380
+ </DemoExample>
381
+
382
+ <DemoExample
383
+ title="Compact Density with Zebra Striping"
384
+ description="Compact density maximizes information density for data-heavy tables."
385
+ >
386
+ <ModusTable
387
+ columns={productColumns}
388
+ data={productData.slice(0, 8)}
389
+ density="compact"
390
+ zebra
391
+ hover={false}
392
+ />
393
+ </DemoExample>
394
+
395
+ <DemoExample
396
+ title="Paginated Table"
397
+ description="Pagination helps manage large datasets by showing a subset of rows with navigation controls."
398
+ >
399
+ <ModusTable
400
+ columns={productColumns}
401
+ data={productData}
402
+ paginated
403
+ currentPage={currentPage}
404
+ pageSizeOptions={[5, 10, 15, 20]}
405
+ showPageSizeSelector
406
+ onPaginationChange={handlePaginationChange}
407
+ density="comfortable"
408
+ zebra
409
+ />
410
+ </DemoExample>
411
+
412
+ <DemoExample
413
+ title="Multi-Select Table"
414
+ description="Enable row selection with checkboxes for bulk operations."
415
+ >
416
+ <ModusTable
417
+ columns={employeeColumns}
418
+ data={employeeData}
419
+ selectable="multi"
420
+ selectedRowIds={selectedEmployees}
421
+ onRowSelectionChange={handleEmployeeSelection}
422
+ density="comfortable"
423
+ hover
424
+ />
425
+ {selectedEmployees.length > 0 && (
426
+ <div className="mt-4 p-3 bg-muted rounded-lg">
427
+ <div className="text-sm text-muted-foreground">
428
+ Selected {selectedEmployees.length} employee(s):{" "}
429
+ {selectedEmployees.join(", ")}
430
+ </div>
431
+ </div>
432
+ )}
433
+ </DemoExample>
434
+
435
+ <DemoExample
436
+ title="Single Select Table"
437
+ description="Single selection mode uses radio buttons for choosing one row."
438
+ >
439
+ <ModusTable
440
+ columns={employeeColumns}
441
+ data={employeeData.slice(0, 4)}
442
+ selectable="single"
443
+ density="relaxed"
444
+ hover
445
+ />
446
+ </DemoExample>
447
+
448
+ <DemoExample
449
+ title="Editable Table"
450
+ description="Enable inline editing for data modification. Click on any cell to edit."
451
+ >
452
+ <ModusTable
453
+ columns={taskColumns}
454
+ data={taskData}
455
+ editable
456
+ onCellEditStart={handleCellEditStart}
457
+ onCellEditCommit={handleCellEditCommit}
458
+ density="relaxed"
459
+ hover
460
+ />
461
+ </DemoExample>
462
+
463
+ <DemoExample
464
+ title="Sortable Table"
465
+ description="All columns are sortable by default. Click headers to sort data."
466
+ >
467
+ <ModusTable
468
+ columns={employeeColumns}
469
+ data={employeeData}
470
+ sortable
471
+ density="comfortable"
472
+ zebra
473
+ />
474
+ </DemoExample>
475
+
476
+ <DemoExample
477
+ title="Relaxed Density"
478
+ description="Relaxed density provides more spacing for better readability."
479
+ >
480
+ <ModusTable
481
+ columns={teamColumns}
482
+ data={teamData}
483
+ density="relaxed"
484
+ hover
485
+ />
486
+ </DemoExample>
487
+ </DemoPage>
488
+ );
489
+ }
@@ -0,0 +1,187 @@
1
+ "use client";
2
+
3
+ import DemoExample from "../../components/DemoExample";
4
+ import DemoPage from "../../components/DemoPage";
5
+ import ModusTabs from "../../components/ModusTabs";
6
+
7
+ const overviewPanels = [
8
+ <div key="summary" className="text-sm text-foreground opacity-80">
9
+ Review highlights, key metrics, and quick actions for the current project.
10
+ </div>,
11
+ <div key="timeline" className="text-sm text-foreground opacity-80">
12
+ Explore recent updates in chronological order to stay informed.
13
+ </div>,
14
+ <div key="files" className="text-sm text-foreground opacity-80">
15
+ Access shared documents and media assets that support this initiative.
16
+ </div>,
17
+ ];
18
+
19
+ export default function TabsDemoPage() {
20
+ return (
21
+ <DemoPage
22
+ title="Modus Tabs"
23
+ description="Tabs organize content into logical sections without leaving the page. Keep labels short and related."
24
+ >
25
+ <DemoExample
26
+ title="Project tabs"
27
+ description="Bordered tabs pair well with dashboards and keep the content anchored."
28
+ >
29
+ <ModusTabs
30
+ tabs={[
31
+ { label: "Summary" },
32
+ { label: "Activity" },
33
+ { label: "Files" },
34
+ ]}
35
+ panels={overviewPanels}
36
+ />
37
+ </DemoExample>
38
+ <DemoExample
39
+ title="Compact tabs"
40
+ description="Use the small size when tabs sit inside cards or sidebars."
41
+ >
42
+ <ModusTabs
43
+ tabs={[{ label: "Plan" }, { label: "Deliver" }, { label: "Review" }]}
44
+ panels={[
45
+ <div key="plan" className="text-sm text-foreground opacity-80">
46
+ Outline the work and align on timelines.
47
+ </div>,
48
+ <div key="deliver" className="text-sm text-foreground opacity-80">
49
+ Track progress as each milestone is completed.
50
+ </div>,
51
+ <div key="review" className="text-sm text-foreground opacity-80">
52
+ Capture lessons learned and share with the team.
53
+ </div>,
54
+ ]}
55
+ size="sm"
56
+ tabStyle="boxed"
57
+ />
58
+ </DemoExample>
59
+
60
+ <DemoExample
61
+ title="Icon-only tabs"
62
+ description="Use icons without labels for compact navigation. Include aria-label for accessibility."
63
+ >
64
+ <ModusTabs
65
+ tabs={[
66
+ { icon: "dashboard" },
67
+ { icon: "bar_graph" },
68
+ { icon: "map" },
69
+ { icon: "notifications" },
70
+ ]}
71
+ panels={[
72
+ <div key="dashboard" className="text-sm text-foreground opacity-80">
73
+ Overview of your key metrics and recent activity.
74
+ </div>,
75
+ <div key="analytics" className="text-sm text-foreground opacity-80">
76
+ Detailed charts and performance insights.
77
+ </div>,
78
+ <div key="map" className="text-sm text-foreground opacity-80">
79
+ Geographic data and location-based information.
80
+ </div>,
81
+ <div
82
+ key="notifications"
83
+ className="text-sm text-foreground opacity-80"
84
+ >
85
+ View your latest notifications and alerts.
86
+ </div>,
87
+ ]}
88
+ size="sm"
89
+ tabStyle="bordered"
90
+ />
91
+ </DemoExample>
92
+
93
+ <DemoExample
94
+ title="Icon + Label tabs"
95
+ description="Combine icons with labels for clear navigation. Icons can be positioned left or right."
96
+ >
97
+ <ModusTabs
98
+ tabs={[
99
+ { icon: "dashboard", label: "Dashboard", iconPosition: "left" },
100
+ { icon: "bar_graph", label: "Analytics", iconPosition: "left" },
101
+ { icon: "settings", label: "Settings", iconPosition: "right" },
102
+ { icon: "help", label: "Help", iconPosition: "right" },
103
+ ]}
104
+ panels={[
105
+ <div key="dashboard" className="text-sm text-foreground opacity-80">
106
+ Overview of your key metrics and recent activity.
107
+ </div>,
108
+ <div key="analytics" className="text-sm text-foreground opacity-80">
109
+ Detailed charts and performance insights.
110
+ </div>,
111
+ <div key="settings" className="text-sm text-foreground opacity-80">
112
+ Configure your application settings and preferences.
113
+ </div>,
114
+ <div key="help" className="text-sm text-foreground opacity-80">
115
+ Find answers to common questions and get support.
116
+ </div>,
117
+ ]}
118
+ size="md"
119
+ tabStyle="bordered"
120
+ />
121
+ </DemoExample>
122
+
123
+ <DemoExample
124
+ title="Label-only tabs"
125
+ description="Text-only tabs work well for simple navigation without visual clutter."
126
+ >
127
+ <ModusTabs
128
+ tabs={[
129
+ { label: "Overview" },
130
+ { label: "Details" },
131
+ { label: "History" },
132
+ { label: "Settings" },
133
+ ]}
134
+ panels={[
135
+ <div key="overview" className="text-sm text-foreground opacity-80">
136
+ High-level summary of the current project status.
137
+ </div>,
138
+ <div key="details" className="text-sm text-foreground opacity-80">
139
+ Comprehensive information about all project aspects.
140
+ </div>,
141
+ <div key="history" className="text-sm text-foreground opacity-80">
142
+ Complete timeline of changes and updates.
143
+ </div>,
144
+ <div key="settings" className="text-sm text-foreground opacity-80">
145
+ Configuration options and preferences.
146
+ </div>,
147
+ ]}
148
+ size="lg"
149
+ tabStyle="boxed"
150
+ />
151
+ </DemoExample>
152
+
153
+ <DemoExample
154
+ title="Disabled tabs"
155
+ description="Disable tabs that are not currently available or relevant."
156
+ >
157
+ <ModusTabs
158
+ tabs={[
159
+ { label: "Active Tab", icon: "check" },
160
+ { label: "Disabled Tab", icon: "lock", disabled: true },
161
+ { label: "Another Active", icon: "star" },
162
+ { label: "Also Disabled", disabled: true },
163
+ ]}
164
+ panels={[
165
+ <div key="active" className="text-sm text-foreground opacity-80">
166
+ This tab is currently active and functional.
167
+ </div>,
168
+ <div key="disabled" className="text-sm text-foreground opacity-80">
169
+ This content is not accessible due to disabled tab.
170
+ </div>,
171
+ <div key="another" className="text-sm text-foreground opacity-80">
172
+ Another active tab with different content.
173
+ </div>,
174
+ <div
175
+ key="also-disabled"
176
+ className="text-sm text-foreground opacity-80"
177
+ >
178
+ This content is also not accessible.
179
+ </div>,
180
+ ]}
181
+ size="md"
182
+ tabStyle="bordered"
183
+ />
184
+ </DemoExample>
185
+ </DemoPage>
186
+ );
187
+ }