@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,151 @@
1
+ "use client";
2
+
3
+ import DemoExample from "../../components/DemoExample";
4
+ import DemoPage from "../../components/DemoPage";
5
+ import ModusTextInput from "../../components/ModusTextInput";
6
+
7
+ export default function TextInputDemoPage() {
8
+ return (
9
+ <DemoPage
10
+ title="Modus Text Input"
11
+ description="Text input components provide a way for users to enter text data. Use text inputs for names, emails, passwords, and any other text-based form data."
12
+ >
13
+ <DemoExample
14
+ title="Input Types"
15
+ description="Text inputs with different input types."
16
+ >
17
+ <div className="flex flex-col gap-6">
18
+ <div className="flex flex-col gap-2">
19
+ <ModusTextInput
20
+ inputId="text-type-input"
21
+ label="Text"
22
+ type="text"
23
+ placeholder="Enter text"
24
+ />
25
+ </div>
26
+
27
+ <div className="flex flex-col gap-2">
28
+ <ModusTextInput
29
+ inputId="email-type-input"
30
+ label="Email"
31
+ type="email"
32
+ placeholder="user@example.com"
33
+ />
34
+ </div>
35
+
36
+ <div className="flex flex-col gap-2">
37
+ <ModusTextInput
38
+ inputId="password-type-input"
39
+ label="Password"
40
+ type="password"
41
+ placeholder="Enter password"
42
+ />
43
+ </div>
44
+
45
+ <div className="flex flex-col gap-2">
46
+ <ModusTextInput
47
+ inputId="url-type-input"
48
+ label="URL"
49
+ type="url"
50
+ placeholder="https://example.com"
51
+ />
52
+ </div>
53
+
54
+ <div className="flex flex-col gap-2">
55
+ <ModusTextInput
56
+ inputId="tel-type-input"
57
+ label="Phone"
58
+ type="tel"
59
+ placeholder="+1 (555) 123-4567"
60
+ />
61
+ </div>
62
+ </div>
63
+ </DemoExample>
64
+
65
+ <DemoExample
66
+ title="Text Input Sizes"
67
+ description="Text inputs in different sizes."
68
+ >
69
+ <div className="flex flex-col gap-6">
70
+ <div className="flex flex-col gap-2">
71
+ <ModusTextInput
72
+ inputId="small-text-input"
73
+ label="Small"
74
+ placeholder="Enter text"
75
+ size="sm"
76
+ />
77
+ </div>
78
+
79
+ <div className="flex flex-col gap-2">
80
+ <ModusTextInput
81
+ inputId="medium-text-input"
82
+ label="Medium"
83
+ placeholder="Enter text"
84
+ size="md"
85
+ />
86
+ </div>
87
+
88
+ <div className="flex flex-col gap-2">
89
+ <ModusTextInput
90
+ inputId="large-text-input"
91
+ label="Large"
92
+ placeholder="Enter text"
93
+ size="lg"
94
+ />
95
+ </div>
96
+ </div>
97
+ </DemoExample>
98
+
99
+ <DemoExample
100
+ title="Text Input with Icons"
101
+ description="Text inputs with clear button or search icon."
102
+ >
103
+ <div className="flex flex-col gap-6">
104
+ <div className="flex flex-col gap-2">
105
+ <ModusTextInput
106
+ inputId="clear-input"
107
+ label="With Clear"
108
+ placeholder="Type to search..."
109
+ includeClear={true}
110
+ />
111
+ </div>
112
+
113
+ <div className="flex flex-col gap-2">
114
+ <ModusTextInput
115
+ inputId="search-input"
116
+ label="Search"
117
+ placeholder="Search..."
118
+ includeSearch={true}
119
+ />
120
+ </div>
121
+ </div>
122
+ </DemoExample>
123
+
124
+ <DemoExample
125
+ title="Required and Disabled States"
126
+ description="Text inputs in required and disabled states."
127
+ >
128
+ <div className="flex flex-col gap-6">
129
+ <div className="flex flex-col gap-2">
130
+ <ModusTextInput
131
+ inputId="required-input"
132
+ label="Required"
133
+ placeholder="This field is required"
134
+ required={true}
135
+ />
136
+ </div>
137
+
138
+ <div className="flex flex-col gap-2">
139
+ <ModusTextInput
140
+ inputId="disabled-input"
141
+ label="Disabled"
142
+ placeholder="Cannot edit"
143
+ disabled={true}
144
+ value="Disabled value"
145
+ />
146
+ </div>
147
+ </div>
148
+ </DemoExample>
149
+ </DemoPage>
150
+ );
151
+ }
@@ -0,0 +1,73 @@
1
+ "use client";
2
+
3
+ import DemoExample from "../../components/DemoExample";
4
+ import DemoPage from "../../components/DemoPage";
5
+ import ModusTextarea from "../../components/ModusTextarea";
6
+
7
+ export default function TextareaDemoPage() {
8
+ return (
9
+ <DemoPage
10
+ title="Modus Textarea"
11
+ description="Textareas support longer responses or feedback. Offer guidance on what to include and set an appropriate height."
12
+ >
13
+ <DemoExample
14
+ title="Customer feedback"
15
+ description="Use the default size for two to three sentence responses."
16
+ >
17
+ <ModusTextarea
18
+ label="Share feedback"
19
+ placeholder="Tell us what worked well and what can improve."
20
+ rows={4}
21
+ />
22
+ </DemoExample>
23
+ <DemoExample
24
+ title="Detailed notes"
25
+ description="Increase the height when expecting longer entries."
26
+ >
27
+ <ModusTextarea
28
+ label="Site visit notes"
29
+ rows={6}
30
+ feedback={{
31
+ level: "info",
32
+ message: "Include location details and follow-up actions.",
33
+ }}
34
+ />
35
+ </DemoExample>
36
+ <DemoExample
37
+ title="Feedback States"
38
+ description="Display validation feedback with info, success, and error states."
39
+ >
40
+ <div className="flex flex-col gap-6">
41
+ <ModusTextarea
42
+ label="Info feedback"
43
+ placeholder="Enter details..."
44
+ rows={3}
45
+ feedback={{
46
+ level: "info",
47
+ message: "This is helpful information about the field.",
48
+ }}
49
+ />
50
+ <ModusTextarea
51
+ label="Success feedback"
52
+ placeholder="Enter details..."
53
+ rows={3}
54
+ value="Valid input provided."
55
+ feedback={{
56
+ level: "success",
57
+ message: "Great! Your input looks good.",
58
+ }}
59
+ />
60
+ <ModusTextarea
61
+ label="Error feedback"
62
+ placeholder="Enter details..."
63
+ rows={3}
64
+ feedback={{
65
+ level: "error",
66
+ message: "This field is required. Please enter a value.",
67
+ }}
68
+ />
69
+ </div>
70
+ </DemoExample>
71
+ </DemoPage>
72
+ );
73
+ }
@@ -0,0 +1,26 @@
1
+ "use client";
2
+
3
+ import DemoExample from "../../components/DemoExample";
4
+ import DemoPage from "../../components/DemoPage";
5
+ import ModusThemeSwitcher from "../../components/ModusThemeSwitcher";
6
+
7
+ export default function ThemeSwitcherDemoPage() {
8
+ return (
9
+ <DemoPage
10
+ title="Modus Theme Switcher"
11
+ description="The theme switcher toggles between Modus light and dark modes. Place it in the header or settings where users expect personalization controls."
12
+ >
13
+ <DemoExample
14
+ title="Theme toggle"
15
+ description="Use the default configuration to respect system preferences and allow quick switching."
16
+ >
17
+ <div className="flex items-center gap-4">
18
+ <ModusThemeSwitcher ariaLabel="Switch theme" />
19
+ <div className="text-sm text-foreground opacity-80">
20
+ Toggle between light and dark experiences.
21
+ </div>
22
+ </div>
23
+ </DemoExample>
24
+ </DemoPage>
25
+ );
26
+ }
@@ -0,0 +1,148 @@
1
+ "use client";
2
+
3
+ import DemoExample from "../../components/DemoExample";
4
+ import DemoPage from "../../components/DemoPage";
5
+ import ModusTimeInput from "../../components/ModusTimeInput";
6
+
7
+ export default function TimeInputDemoPage() {
8
+ return (
9
+ <DemoPage
10
+ title="Modus Time Input"
11
+ description="Time input components allow users to enter or select a time value. Use time inputs for scheduling, appointments, or any scenario requiring time selection."
12
+ >
13
+ <DemoExample
14
+ title="Basic Time Input"
15
+ description="Simple time input with label."
16
+ >
17
+ <div className="flex flex-col gap-6">
18
+ <div className="flex flex-col gap-2">
19
+ <ModusTimeInput
20
+ inputId="start-time-input"
21
+ label="Start time"
22
+ value="09:00"
23
+ />
24
+ </div>
25
+
26
+ <div className="flex flex-col gap-2">
27
+ <ModusTimeInput
28
+ inputId="end-time-input"
29
+ label="End time"
30
+ value="17:00"
31
+ />
32
+ </div>
33
+ </div>
34
+ </DemoExample>
35
+
36
+ <DemoExample
37
+ title="Time Input Sizes"
38
+ description="Time inputs in different sizes."
39
+ >
40
+ <div className="flex flex-col gap-6">
41
+ <div className="flex flex-col gap-2">
42
+ <ModusTimeInput
43
+ inputId="small-time-input"
44
+ label="Small"
45
+ value="09:00"
46
+ size="sm"
47
+ />
48
+ </div>
49
+
50
+ <div className="flex flex-col gap-2">
51
+ <ModusTimeInput
52
+ inputId="medium-time-input"
53
+ label="Medium"
54
+ value="09:00"
55
+ size="md"
56
+ />
57
+ </div>
58
+
59
+ <div className="flex flex-col gap-2">
60
+ <ModusTimeInput
61
+ inputId="large-time-input"
62
+ label="Large"
63
+ value="09:00"
64
+ size="lg"
65
+ />
66
+ </div>
67
+ </div>
68
+ </DemoExample>
69
+
70
+ <DemoExample
71
+ title="Time Input with Seconds"
72
+ description="Time inputs displaying seconds."
73
+ >
74
+ <div className="flex flex-col gap-6">
75
+ <div className="flex flex-col gap-2">
76
+ <ModusTimeInput
77
+ inputId="seconds-time-input"
78
+ label="Time with Seconds"
79
+ value="09:30:45"
80
+ showSeconds={true}
81
+ />
82
+ </div>
83
+
84
+ <div className="flex flex-col gap-2">
85
+ <ModusTimeInput
86
+ inputId="seconds-default-time-input"
87
+ label="Default Format"
88
+ value="09:30"
89
+ showSeconds={false}
90
+ />
91
+ </div>
92
+ </div>
93
+ </DemoExample>
94
+
95
+ <DemoExample
96
+ title="Time Input with Constraints"
97
+ description="Time inputs with min and max values."
98
+ >
99
+ <div className="flex flex-col gap-6">
100
+ <div className="flex flex-col gap-2">
101
+ <ModusTimeInput
102
+ inputId="min-max-time-input"
103
+ label="Business Hours"
104
+ value="09:00"
105
+ min="09:00"
106
+ max="17:00"
107
+ />
108
+ </div>
109
+
110
+ <div className="flex flex-col gap-2">
111
+ <ModusTimeInput
112
+ inputId="afternoon-time-input"
113
+ label="Afternoon Hours"
114
+ value="14:00"
115
+ min="12:00"
116
+ max="18:00"
117
+ />
118
+ </div>
119
+ </div>
120
+ </DemoExample>
121
+
122
+ <DemoExample
123
+ title="Required and Disabled States"
124
+ description="Time inputs in required and disabled states."
125
+ >
126
+ <div className="flex flex-col gap-6">
127
+ <div className="flex flex-col gap-2">
128
+ <ModusTimeInput
129
+ inputId="required-time-input"
130
+ label="Required"
131
+ value="09:00"
132
+ required={true}
133
+ />
134
+ </div>
135
+
136
+ <div className="flex flex-col gap-2">
137
+ <ModusTimeInput
138
+ inputId="disabled-time-input"
139
+ label="Disabled"
140
+ value="09:00"
141
+ disabled={true}
142
+ />
143
+ </div>
144
+ </div>
145
+ </DemoExample>
146
+ </DemoPage>
147
+ );
148
+ }
@@ -0,0 +1,302 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import DemoExample from "../../components/DemoExample";
5
+ import DemoPage from "../../components/DemoPage";
6
+ import ModusToast from "../../components/ModusToast";
7
+ import { ModusWcButton } from "@trimble-oss/moduswebcomponents-react";
8
+ import type {
9
+ ModusToastItem,
10
+ ToastPosition,
11
+ ToastVariant,
12
+ } from "../../components/ModusToast";
13
+
14
+ export default function ToastDemoPage() {
15
+ const [toasts, setToasts] = useState<ModusToastItem[]>([]);
16
+
17
+ const addToast = (
18
+ variant: ToastVariant,
19
+ position: ToastPosition = "top-end",
20
+ title: string,
21
+ description: string,
22
+ ) => {
23
+ const id = `toast-${variant}-${Date.now()}`;
24
+ const newToast: ModusToastItem = {
25
+ id,
26
+ title,
27
+ description,
28
+ variant,
29
+ dismissible: true,
30
+ position,
31
+ delay: variant === "warning" ? null : 4000,
32
+ };
33
+ setToasts((prev) => [...prev, newToast]);
34
+ };
35
+
36
+ const removeToast = (toastId: string) => {
37
+ setToasts((prev) => prev.filter((toast) => toast.id !== toastId));
38
+ };
39
+
40
+ const clearAllToasts = () => {
41
+ setToasts([]);
42
+ };
43
+
44
+ return (
45
+ <DemoPage
46
+ title="Modus Toast"
47
+ description="Toasts deliver lightweight confirmations or alerts without disrupting workflow. Keep the message brief and allow dismissal."
48
+ >
49
+ <DemoExample
50
+ title="Interactive toast triggers"
51
+ description="Click the buttons below to trigger different toasts in various positions and variants."
52
+ >
53
+ <div className="space-y-6">
54
+ {/* Toast Variants */}
55
+ <div>
56
+ <div className="text-lg font-semibold text-foreground mb-4">
57
+ Toast Variants
58
+ </div>
59
+ <div className="flex flex-wrap gap-3">
60
+ <ModusWcButton
61
+ color="primary"
62
+ variant="filled"
63
+ onButtonClick={() =>
64
+ addToast(
65
+ "success",
66
+ "top-end",
67
+ "Success!",
68
+ "Your action completed successfully.",
69
+ )
70
+ }
71
+ >
72
+ Success Toast
73
+ </ModusWcButton>
74
+ <ModusWcButton
75
+ color="warning"
76
+ variant="filled"
77
+ onButtonClick={() =>
78
+ addToast(
79
+ "warning",
80
+ "top-end",
81
+ "Warning!",
82
+ "Please review your input.",
83
+ )
84
+ }
85
+ >
86
+ Warning Toast
87
+ </ModusWcButton>
88
+ <ModusWcButton
89
+ color="danger"
90
+ variant="filled"
91
+ onButtonClick={() =>
92
+ addToast(
93
+ "error",
94
+ "top-end",
95
+ "Error!",
96
+ "Something went wrong.",
97
+ )
98
+ }
99
+ >
100
+ Error Toast
101
+ </ModusWcButton>
102
+ <ModusWcButton
103
+ color="secondary"
104
+ variant="filled"
105
+ onButtonClick={() =>
106
+ addToast(
107
+ "info",
108
+ "top-end",
109
+ "Info",
110
+ "Here's some helpful information.",
111
+ )
112
+ }
113
+ >
114
+ Info Toast
115
+ </ModusWcButton>
116
+ </div>
117
+ </div>
118
+
119
+ {/* Toast Positions */}
120
+ <div>
121
+ <div className="text-lg font-semibold text-foreground mb-4">
122
+ Toast Positions
123
+ </div>
124
+ <div className="space-y-4">
125
+ {/* Top Positions */}
126
+ <div className="bg-card border border-border rounded-lg p-4">
127
+ <div className="text-sm font-medium text-muted-foreground mb-3">
128
+ Top
129
+ </div>
130
+ <div className="flex flex-wrap gap-3">
131
+ <ModusWcButton
132
+ color="secondary"
133
+ variant="outlined"
134
+ onButtonClick={() =>
135
+ addToast(
136
+ "info",
137
+ "top-start",
138
+ "Top Start",
139
+ "Toast in top-left corner",
140
+ )
141
+ }
142
+ >
143
+ Top Start
144
+ </ModusWcButton>
145
+ <ModusWcButton
146
+ color="secondary"
147
+ variant="outlined"
148
+ onButtonClick={() =>
149
+ addToast(
150
+ "info",
151
+ "top-center",
152
+ "Top Center",
153
+ "Toast in top-center",
154
+ )
155
+ }
156
+ >
157
+ Top Center
158
+ </ModusWcButton>
159
+ <ModusWcButton
160
+ color="secondary"
161
+ variant="outlined"
162
+ onButtonClick={() =>
163
+ addToast(
164
+ "info",
165
+ "top-end",
166
+ "Top End",
167
+ "Toast in top-right corner",
168
+ )
169
+ }
170
+ >
171
+ Top End
172
+ </ModusWcButton>
173
+ </div>
174
+ </div>
175
+
176
+ {/* Middle Positions */}
177
+ <div className="bg-card border border-border rounded-lg p-4">
178
+ <div className="text-sm font-medium text-muted-foreground mb-3">
179
+ Middle
180
+ </div>
181
+ <div className="flex flex-wrap gap-3">
182
+ <ModusWcButton
183
+ color="secondary"
184
+ variant="outlined"
185
+ onButtonClick={() =>
186
+ addToast(
187
+ "success",
188
+ "middle-start",
189
+ "Middle Start",
190
+ "Toast in middle-left",
191
+ )
192
+ }
193
+ >
194
+ Middle Start
195
+ </ModusWcButton>
196
+ <ModusWcButton
197
+ color="secondary"
198
+ variant="outlined"
199
+ onButtonClick={() =>
200
+ addToast(
201
+ "success",
202
+ "middle-center",
203
+ "Middle Center",
204
+ "Toast in center",
205
+ )
206
+ }
207
+ >
208
+ Middle Center
209
+ </ModusWcButton>
210
+ <ModusWcButton
211
+ color="secondary"
212
+ variant="outlined"
213
+ onButtonClick={() =>
214
+ addToast(
215
+ "success",
216
+ "middle-end",
217
+ "Middle End",
218
+ "Toast in middle-right",
219
+ )
220
+ }
221
+ >
222
+ Middle End
223
+ </ModusWcButton>
224
+ </div>
225
+ </div>
226
+
227
+ {/* Bottom Positions */}
228
+ <div className="bg-card border border-border rounded-lg p-4">
229
+ <div className="text-sm font-medium text-muted-foreground mb-3">
230
+ Bottom
231
+ </div>
232
+ <div className="flex flex-wrap gap-3">
233
+ <ModusWcButton
234
+ color="secondary"
235
+ variant="outlined"
236
+ onButtonClick={() =>
237
+ addToast(
238
+ "warning",
239
+ "bottom-start",
240
+ "Bottom Start",
241
+ "Toast in bottom-left",
242
+ )
243
+ }
244
+ >
245
+ Bottom Start
246
+ </ModusWcButton>
247
+ <ModusWcButton
248
+ color="secondary"
249
+ variant="outlined"
250
+ onButtonClick={() =>
251
+ addToast(
252
+ "warning",
253
+ "bottom-center",
254
+ "Bottom Center",
255
+ "Toast in bottom-center",
256
+ )
257
+ }
258
+ >
259
+ Bottom Center
260
+ </ModusWcButton>
261
+ <ModusWcButton
262
+ color="secondary"
263
+ variant="outlined"
264
+ onButtonClick={() =>
265
+ addToast(
266
+ "warning",
267
+ "bottom-end",
268
+ "Bottom End",
269
+ "Toast in bottom-right",
270
+ )
271
+ }
272
+ >
273
+ Bottom End
274
+ </ModusWcButton>
275
+ </div>
276
+ </div>
277
+ </div>
278
+ </div>
279
+
280
+ {/* Special Features */}
281
+ <div>
282
+ <div className="text-lg font-semibold text-foreground mb-4">
283
+ Special Features
284
+ </div>
285
+ <div className="flex flex-wrap gap-3">
286
+ <ModusWcButton
287
+ color="danger"
288
+ variant="outlined"
289
+ onButtonClick={clearAllToasts}
290
+ >
291
+ Clear All Toasts
292
+ </ModusWcButton>
293
+ </div>
294
+ </div>
295
+
296
+ {/* Toast Display */}
297
+ <ModusToast toasts={toasts} onDismiss={removeToast} />
298
+ </div>
299
+ </DemoExample>
300
+ </DemoPage>
301
+ );
302
+ }