@getmicdrop/svelte-components 5.17.0 → 5.17.3

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 (391) hide show
  1. package/dist/calendar/AboutShow/AboutShow.svelte +187 -187
  2. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
  3. package/dist/calendar/FAQs/FAQs.svelte +77 -77
  4. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
  5. package/dist/calendar/OrderSummary/OrderSummary.svelte +457 -457
  6. package/dist/calendar/PublicCard/PublicCard.svelte +146 -146
  7. package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
  8. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
  9. package/dist/components/Heading.spec.d.ts +2 -0
  10. package/dist/components/Heading.spec.d.ts.map +1 -0
  11. package/dist/components/Heading.spec.js +89 -0
  12. package/dist/components/Heading.svelte +60 -60
  13. package/dist/components/Layout/AppShell.svelte +104 -104
  14. package/dist/components/Layout/ContentSection.svelte +80 -80
  15. package/dist/components/Layout/Grid.svelte +4 -4
  16. package/dist/components/Layout/Heading.svelte +81 -81
  17. package/dist/components/Layout/PageContainer.svelte +69 -69
  18. package/dist/components/Layout/Responsive.svelte +75 -75
  19. package/dist/components/Layout/Section.svelte +80 -80
  20. package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
  21. package/dist/components/Layout/ShowOnMobile.svelte +37 -37
  22. package/dist/components/Layout/Sidebar.svelte +108 -108
  23. package/dist/components/Layout/Stack.spec.js +1 -1
  24. package/dist/components/Layout/Stack.svelte +6 -6
  25. package/dist/components/Layout/Text.svelte +87 -87
  26. package/dist/components/Layout/TwoColumn.svelte +108 -108
  27. package/dist/components/Layout/__tests__/AppShell.test.js +140 -0
  28. package/dist/components/Text.spec.d.ts +2 -0
  29. package/dist/components/Text.spec.d.ts.map +1 -0
  30. package/dist/components/Text.spec.js +89 -0
  31. package/dist/components/Text.svelte +53 -53
  32. package/dist/constants/validation.js +91 -91
  33. package/dist/constants/validation.spec.js +64 -64
  34. package/dist/datetime/__tests__/format.test.js +1 -1
  35. package/dist/datetime/__tests__/parse.test.js +1 -1
  36. package/dist/datetime/__tests__/timezone.test.js +1 -1
  37. package/dist/datetime/parse.js +1 -1
  38. package/dist/datetime/timezone.d.ts.map +1 -1
  39. package/dist/datetime/timezone.js +1 -2
  40. package/dist/forms/createFormStore.svelte.d.ts +1 -1
  41. package/dist/forms/createFormStore.svelte.d.ts.map +1 -1
  42. package/dist/forms/createFormStore.svelte.js +1 -0
  43. package/dist/forms/createFormStore.svelte.spec.d.ts +2 -0
  44. package/dist/forms/createFormStore.svelte.spec.d.ts.map +1 -0
  45. package/dist/forms/createFormStore.svelte.spec.js +388 -0
  46. package/dist/index.js +57 -57
  47. package/dist/index.spec.js +369 -369
  48. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts +2 -0
  49. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts.map +1 -0
  50. package/dist/patterns/chat/ChatActivityNotice.spec.js +59 -0
  51. package/dist/patterns/chat/ChatActivityNotice.svelte +41 -41
  52. package/dist/patterns/chat/ChatBubble.spec.d.ts +2 -0
  53. package/dist/patterns/chat/ChatBubble.spec.d.ts.map +1 -0
  54. package/dist/patterns/chat/ChatBubble.spec.js +91 -0
  55. package/dist/patterns/chat/ChatBubble.svelte +95 -95
  56. package/dist/patterns/chat/ChatContainer.spec.d.ts +2 -0
  57. package/dist/patterns/chat/ChatContainer.spec.d.ts.map +1 -0
  58. package/dist/patterns/chat/ChatContainer.spec.js +30 -0
  59. package/dist/patterns/chat/ChatContainer.svelte +46 -46
  60. package/dist/patterns/chat/ChatDateDivider.spec.d.ts +2 -0
  61. package/dist/patterns/chat/ChatDateDivider.spec.d.ts.map +1 -0
  62. package/dist/patterns/chat/ChatDateDivider.spec.js +30 -0
  63. package/dist/patterns/chat/ChatDateDivider.svelte +27 -27
  64. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts +2 -0
  65. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts.map +1 -0
  66. package/dist/patterns/chat/ChatInvitationBubble.spec.js +46 -0
  67. package/dist/patterns/chat/ChatInvitationBubble.svelte +37 -37
  68. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts +2 -0
  69. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts.map +1 -0
  70. package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -0
  71. package/dist/patterns/chat/ChatInvitationNotice.svelte +27 -27
  72. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts +2 -0
  73. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts.map +1 -0
  74. package/dist/patterns/chat/ChatMessageGroup.spec.js +58 -0
  75. package/dist/patterns/chat/ChatMessageGroup.svelte +57 -57
  76. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts +2 -0
  77. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts.map +1 -0
  78. package/dist/patterns/chat/ChatSlotUpdate.spec.js +65 -0
  79. package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -46
  80. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts +2 -0
  81. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts.map +1 -0
  82. package/dist/patterns/chat/ChatStatusBadge.spec.js +79 -0
  83. package/dist/patterns/chat/ChatStatusBadge.svelte +91 -91
  84. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts +2 -0
  85. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts.map +1 -0
  86. package/dist/patterns/chat/ChatStatusTransition.spec.js +81 -0
  87. package/dist/patterns/chat/ChatStatusTransition.svelte +64 -64
  88. package/dist/patterns/chat/ChatTextBubble.spec.d.ts +2 -0
  89. package/dist/patterns/chat/ChatTextBubble.spec.d.ts.map +1 -0
  90. package/dist/patterns/chat/ChatTextBubble.spec.js +35 -0
  91. package/dist/patterns/chat/ChatTextBubble.svelte +41 -41
  92. package/dist/patterns/chat/index.js +22 -22
  93. package/dist/patterns/data/DataGrid.svelte +45 -45
  94. package/dist/patterns/data/DataList.svelte +24 -24
  95. package/dist/patterns/data/DataTable.spec.js +61 -0
  96. package/dist/patterns/data/DataTable.svelte +36 -36
  97. package/dist/patterns/forms/FormActions.spec.js +95 -95
  98. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  99. package/dist/patterns/forms/FormActions.svelte +46 -46
  100. package/dist/patterns/forms/FormGrid.spec.js +34 -0
  101. package/dist/patterns/forms/FormGrid.svelte +33 -33
  102. package/dist/patterns/forms/FormSection.svelte +32 -32
  103. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  104. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  105. package/dist/patterns/index.js +21 -21
  106. package/dist/patterns/layout/Sidebar.spec.js +240 -1
  107. package/dist/patterns/layout/Sidebar.svelte +39 -39
  108. package/dist/patterns/layout/SidebarTestWrapper.svelte +34 -0
  109. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +23 -0
  110. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts.map +1 -0
  111. package/dist/patterns/layout/index.js +29 -29
  112. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  113. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  114. package/dist/patterns/navigation/Header.spec.js +123 -0
  115. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  116. package/dist/patterns/navigation/Header.svelte +251 -251
  117. package/dist/patterns/page/PageHeader.svelte +18 -18
  118. package/dist/patterns/page/PageLayout.svelte +40 -40
  119. package/dist/patterns/page/PageLoader.spec.js +57 -57
  120. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  121. package/dist/patterns/page/PageLoader.svelte +24 -24
  122. package/dist/patterns/page/SectionHeader.svelte +29 -29
  123. package/dist/presets/badges.js +112 -112
  124. package/dist/presets/buttons.js +76 -76
  125. package/dist/presets/index.js +9 -9
  126. package/dist/primitives/Accordion/Accordion.spec.js +112 -2
  127. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  128. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  129. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  130. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte +28 -0
  131. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts +7 -0
  132. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts.map +1 -0
  133. package/dist/primitives/Alert/Alert.spec.js +173 -173
  134. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  135. package/dist/primitives/Alert/Alert.svelte +27 -27
  136. package/dist/primitives/Avatar/Avatar.spec.js +23 -0
  137. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  138. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  139. package/dist/primitives/AvatarButton/AvatarButton.svelte +57 -57
  140. package/dist/primitives/Badges/Badge.spec.js +144 -144
  141. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  142. package/dist/primitives/Badges/Badge.svelte +99 -99
  143. package/dist/primitives/BottomSheet/BottomSheet.spec.js +238 -136
  144. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  145. package/dist/primitives/BottomSheet/BottomSheet.svelte +115 -115
  146. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte +20 -0
  147. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts +10 -0
  148. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts.map +1 -0
  149. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -123
  150. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  151. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +99 -99
  152. package/dist/primitives/Button/Button.spec.js +225 -225
  153. package/dist/primitives/Button/Button.stories.svelte +76 -76
  154. package/dist/primitives/Button/Button.svelte +278 -278
  155. package/dist/primitives/Button/ButtonGroup.spec.d.ts +2 -0
  156. package/dist/primitives/Button/ButtonGroup.spec.d.ts.map +1 -0
  157. package/dist/primitives/Button/ButtonGroup.spec.js +44 -0
  158. package/dist/primitives/Button/ButtonGroup.svelte +50 -50
  159. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  160. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  161. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  162. package/dist/primitives/Card.spec.js +49 -49
  163. package/dist/primitives/Card.stories.svelte +22 -22
  164. package/dist/primitives/Card.svelte +28 -28
  165. package/dist/primitives/CardAction/CardAction.svelte +68 -68
  166. package/dist/primitives/Checkbox/Checkbox.spec.js +32 -0
  167. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  168. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  169. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  170. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  171. package/dist/primitives/DarkModeToggle.svelte +136 -136
  172. package/dist/primitives/Drawer/Drawer.spec.js +437 -0
  173. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  174. package/dist/primitives/Drawer/Drawer.svelte +224 -224
  175. package/dist/primitives/Drawer/DrawerTestWrapper.svelte +86 -0
  176. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts +26 -0
  177. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts.map +1 -0
  178. package/dist/primitives/Dropdown/Dropdown.spec.js +116 -0
  179. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  180. package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
  181. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts +2 -0
  182. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts.map +1 -0
  183. package/dist/primitives/Dropdown/DropdownDivider.spec.js +30 -0
  184. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  185. package/dist/primitives/Dropdown/DropdownItem.spec.js +155 -1
  186. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  187. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte +43 -0
  188. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts +17 -0
  189. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts.map +1 -0
  190. package/dist/primitives/Helper/Helper.spec.d.ts +2 -0
  191. package/dist/primitives/Helper/Helper.spec.d.ts.map +1 -0
  192. package/dist/primitives/Helper/Helper.spec.js +57 -0
  193. package/dist/primitives/Helper/Helper.svelte +33 -33
  194. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  195. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  196. package/dist/primitives/Icons/Availability.svelte +14 -14
  197. package/dist/primitives/Icons/Back.svelte +14 -14
  198. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  199. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  200. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  201. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  202. package/dist/primitives/Icons/Copy.svelte +15 -15
  203. package/dist/primitives/Icons/Cross.svelte +5 -5
  204. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  205. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  206. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  207. package/dist/primitives/Icons/Home.svelte +15 -15
  208. package/dist/primitives/Icons/Icon.spec.js +169 -169
  209. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  210. package/dist/primitives/Icons/Icon.svelte +52 -52
  211. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  212. package/dist/primitives/Icons/Info.svelte +7 -7
  213. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  214. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  215. package/dist/primitives/Icons/Message.svelte +15 -15
  216. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  217. package/dist/primitives/Icons/More.svelte +21 -21
  218. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  219. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  220. package/dist/primitives/Icons/Notification.svelte +14 -14
  221. package/dist/primitives/Icons/Payment.svelte +14 -14
  222. package/dist/primitives/Icons/Profile.svelte +21 -21
  223. package/dist/primitives/Icons/Reload.svelte +29 -29
  224. package/dist/primitives/Icons/Shows.svelte +21 -21
  225. package/dist/primitives/Icons/Signout.svelte +21 -21
  226. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  227. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  228. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  229. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  230. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  231. package/dist/primitives/Input/Input.spec.js +1235 -573
  232. package/dist/primitives/Input/Input.stories.svelte +139 -139
  233. package/dist/primitives/Input/Input.svelte +423 -423
  234. package/dist/primitives/Input/Select.spec.js +632 -218
  235. package/dist/primitives/Input/Select.stories.svelte +112 -112
  236. package/dist/primitives/Input/Select.svelte +252 -252
  237. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  238. package/dist/primitives/Input/Textarea.svelte +105 -105
  239. package/dist/primitives/Label/Label.spec.js +9 -0
  240. package/dist/primitives/Label/Label.svelte +37 -37
  241. package/dist/primitives/LandingButton/LandingButton.spec.d.ts +2 -0
  242. package/dist/primitives/LandingButton/LandingButton.spec.d.ts.map +1 -0
  243. package/dist/primitives/LandingButton/LandingButton.spec.js +61 -0
  244. package/dist/primitives/LandingButton/LandingButton.svelte +92 -92
  245. package/dist/primitives/MenuItem/MenuItem.spec.d.ts +2 -0
  246. package/dist/primitives/MenuItem/MenuItem.spec.d.ts.map +1 -0
  247. package/dist/primitives/MenuItem/MenuItem.spec.js +130 -0
  248. package/dist/primitives/MenuItem/MenuItem.svelte +85 -85
  249. package/dist/primitives/Modal/Modal.spec.js +314 -99
  250. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  251. package/dist/primitives/Modal/Modal.svelte +181 -181
  252. package/dist/primitives/NavItem/NavItem.spec.d.ts +2 -0
  253. package/dist/primitives/NavItem/NavItem.spec.d.ts.map +1 -0
  254. package/dist/primitives/NavItem/NavItem.spec.js +97 -0
  255. package/dist/primitives/NavItem/NavItem.svelte +75 -75
  256. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  257. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  258. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  259. package/dist/primitives/Radio/Radio.svelte +67 -67
  260. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts +2 -0
  261. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts.map +1 -0
  262. package/dist/primitives/SearchResultItem/SearchResultItem.spec.js +78 -0
  263. package/dist/primitives/SearchResultItem/SearchResultItem.svelte +109 -109
  264. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts +2 -0
  265. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts.map +1 -0
  266. package/dist/primitives/SidebarToggle/SidebarToggle.spec.js +61 -0
  267. package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -55
  268. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  269. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  270. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  271. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  272. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  273. package/dist/primitives/Spinner/Spinner.spec.js +84 -71
  274. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  275. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  276. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  277. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  278. package/dist/primitives/Tabs/Tabs.svelte +137 -137
  279. package/dist/primitives/Toggle.spec.js +221 -146
  280. package/dist/primitives/Toggle.stories.svelte +92 -92
  281. package/dist/primitives/Toggle.svelte +141 -141
  282. package/dist/primitives/ToggleTestWrapper.svelte +30 -0
  283. package/dist/primitives/ToggleTestWrapper.svelte.d.ts +29 -0
  284. package/dist/primitives/ToggleTestWrapper.svelte.d.ts.map +1 -0
  285. package/dist/primitives/Tooltip/Tooltip.spec.d.ts +2 -0
  286. package/dist/primitives/Tooltip/Tooltip.spec.d.ts.map +1 -0
  287. package/dist/primitives/Tooltip/Tooltip.spec.js +126 -0
  288. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  289. package/dist/primitives/Typography/Typography.svelte +53 -53
  290. package/dist/primitives/ValidationError.spec.js +103 -103
  291. package/dist/primitives/ValidationError.stories.svelte +69 -69
  292. package/dist/primitives/ValidationError.svelte +29 -29
  293. package/dist/primitives/index.js +113 -113
  294. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  295. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  296. package/dist/recipes/CropImage/CropImage.svelte +241 -241
  297. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  298. package/dist/recipes/ImageUploader/ImageUploader.svelte +992 -992
  299. package/dist/recipes/SuperLogin/SuperLogin.spec.js +21 -21
  300. package/dist/recipes/SuperLogin/SuperLogin.svelte +4 -4
  301. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  302. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  303. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  304. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  305. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  306. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  307. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  308. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  309. package/dist/recipes/fields/FormField.svelte +58 -58
  310. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  311. package/dist/recipes/fields/SelectField.svelte +82 -82
  312. package/dist/recipes/fields/TextareaField.svelte +97 -97
  313. package/dist/recipes/fields/ToggleField.svelte +60 -60
  314. package/dist/recipes/fields/index.js +7 -7
  315. package/dist/recipes/inputs/MultiSelect.spec.js +263 -263
  316. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  317. package/dist/recipes/inputs/MultiSelect.svelte +283 -283
  318. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  319. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  320. package/dist/recipes/inputs/OTPInput.svelte +117 -117
  321. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  322. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +131 -131
  323. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +19 -19
  324. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  325. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +336 -339
  326. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
  327. package/dist/recipes/inputs/Search.spec.js +66 -2
  328. package/dist/recipes/inputs/Search.svelte +102 -102
  329. package/dist/recipes/inputs/index.js +7 -7
  330. package/dist/recipes/modals/AlertModal.svelte +130 -130
  331. package/dist/recipes/modals/ConfirmationModal.spec.js +396 -206
  332. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  333. package/dist/recipes/modals/ConfirmationModal.svelte +162 -162
  334. package/dist/recipes/modals/InputModal.svelte +182 -182
  335. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  336. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  337. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  338. package/dist/recipes/modals/StatusModal.svelte +206 -206
  339. package/dist/services/EventService.d.ts +1 -1
  340. package/dist/services/EventService.d.ts.map +1 -1
  341. package/dist/services/EventService.js +79 -75
  342. package/dist/services/EventService.spec.js +217 -217
  343. package/dist/services/ShowService.js +144 -143
  344. package/dist/services/ShowService.spec.js +345 -345
  345. package/dist/stores/auth.svelte.spec.d.ts +2 -0
  346. package/dist/stores/auth.svelte.spec.d.ts.map +1 -0
  347. package/dist/stores/auth.svelte.spec.js +112 -0
  348. package/dist/stores/formDataStore.svelte.spec.d.ts +2 -0
  349. package/dist/stores/formDataStore.svelte.spec.d.ts.map +1 -0
  350. package/dist/stores/formDataStore.svelte.spec.js +150 -0
  351. package/dist/stores/formSave.svelte.spec.d.ts +2 -0
  352. package/dist/stores/formSave.svelte.spec.d.ts.map +1 -0
  353. package/dist/stores/formSave.svelte.spec.js +196 -0
  354. package/dist/stores/navigation.spec.d.ts +2 -0
  355. package/dist/stores/navigation.spec.d.ts.map +1 -0
  356. package/dist/stores/navigation.spec.js +53 -0
  357. package/dist/stores/toaster.js +13 -13
  358. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  359. package/dist/stories/ButtonAuditReview.svelte +427 -427
  360. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  361. package/dist/stories/PatternsGallery.svelte +206 -206
  362. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  363. package/dist/stories/PrimitivesGallery.svelte +756 -756
  364. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  365. package/dist/stories/RecipesGallery.svelte +454 -454
  366. package/dist/stories/button-audit-manifest.json +11186 -11186
  367. package/dist/tailwind/preset.cjs +82 -82
  368. package/dist/telemetry.d.ts.map +1 -1
  369. package/dist/telemetry.js +402 -405
  370. package/dist/telemetry.server.js +212 -212
  371. package/dist/telemetry.server.spec.js +437 -438
  372. package/dist/telemetry.spec.js +1168 -1169
  373. package/dist/tokens/tokens.css +87 -87
  374. package/dist/tokens/typography-base.css +163 -163
  375. package/dist/tokens/utilities.css +353 -353
  376. package/dist/utils/apiConfig.js +117 -120
  377. package/dist/utils/apiConfig.spec.js +219 -219
  378. package/dist/utils/greetings.js +187 -187
  379. package/dist/utils/haptic.spec.d.ts +2 -0
  380. package/dist/utils/haptic.spec.d.ts.map +1 -0
  381. package/dist/utils/haptic.spec.js +153 -0
  382. package/dist/utils/imageOptimizer.spec.d.ts +2 -0
  383. package/dist/utils/imageOptimizer.spec.d.ts.map +1 -0
  384. package/dist/utils/imageOptimizer.spec.js +201 -0
  385. package/dist/utils/imageValidation.js +121 -121
  386. package/dist/utils/logger.spec.d.ts +2 -0
  387. package/dist/utils/logger.spec.d.ts.map +1 -0
  388. package/dist/utils/logger.spec.js +95 -0
  389. package/dist/utils/transitions.js +4 -4
  390. package/dist/utils/utils.js +693 -693
  391. package/package.json +292 -294
@@ -1,454 +1,454 @@
1
- <script lang="ts">
2
- // ============================================================================
3
- // RECIPES VISUAL GALLERY
4
- // Displays ALL recipe components (Layer 2) - Domain-agnostic compositions
5
- // ============================================================================
6
-
7
- // Feedback
8
- import EmptyState from '../recipes/feedback/EmptyState/EmptyState.svelte';
9
- import ErrorDisplay from '../recipes/feedback/ErrorDisplay.svelte';
10
- import StatusIndicator from '../recipes/feedback/StatusIndicator/StatusIndicator.svelte';
11
-
12
- // Inputs
13
- import MultiSelect from '../recipes/inputs/MultiSelect.svelte';
14
- import OTPInput from '../recipes/inputs/OTPInput.svelte';
15
- import PasswordInput from '../recipes/inputs/PasswordInput.svelte';
16
- import PasswordStrengthIndicator from '../recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte';
17
- import Search from '../recipes/inputs/Search.svelte';
18
-
19
- // Modals
20
- import AlertModal from '../recipes/modals/AlertModal.svelte';
21
- import ConfirmationModal from '../recipes/modals/ConfirmationModal.svelte';
22
- import InputModal from '../recipes/modals/InputModal.svelte';
23
- import StatusModal from '../recipes/modals/StatusModal.svelte';
24
-
25
- // Fields
26
- import CheckboxField from '../recipes/fields/CheckboxField.svelte';
27
- import FormField from '../recipes/fields/FormField.svelte';
28
- import RadioGroup from '../recipes/fields/RadioGroup.svelte';
29
- import SelectField from '../recipes/fields/SelectField.svelte';
30
- import TextareaField from '../recipes/fields/TextareaField.svelte';
31
- import ToggleField from '../recipes/fields/ToggleField.svelte';
32
-
33
- // Primitives for demos
34
- import Button from '../primitives/Button/Button.svelte';
35
- import Card from '../primitives/Card.svelte';
36
-
37
- // State
38
- let isDark = $state(false);
39
-
40
- // Modal states
41
- let showAlertModal = $state(false);
42
- let showConfirmModal = $state(false);
43
- let showInputModal = $state(false);
44
- let showStatusModal = $state(false);
45
- let statusModalType = $state<'success' | 'error' | 'loading'>('success');
46
-
47
- // Input states
48
- let otpValue = $state<string[]>(['', '', '', '', '', '']); // OTPInput expects string[]
49
- let passwordValue = $state('');
50
- let searchValue = $state('');
51
- let multiSelectValue = $state<string[]>([]);
52
-
53
- // Field states
54
- let checkboxChecked = $state(false);
55
- let toggleChecked = $state(false);
56
- let radioValue = $state('');
57
- let textareaValue = $state('');
58
- let selectFieldValue = $state('');
59
- let formFieldValue = $state('');
60
-
61
- function toggleDark() {
62
- isDark = !isDark;
63
- document.documentElement.classList.toggle('dark', isDark);
64
- }
65
-
66
- // Section styling
67
- const sectionClass = (dark: boolean) =>
68
- `rounded-xl p-6 ${dark ? 'bg-gray-800 border-gray-700' : 'bg-white border-gray-200'} border`;
69
-
70
- const headingClass = (dark: boolean) =>
71
- `text-xl font-semibold mb-1 ${dark ? 'text-white' : 'text-gray-900'}`;
72
-
73
- const subheadingClass = (dark: boolean) =>
74
- `text-sm mb-4 ${dark ? 'text-gray-400' : 'text-gray-500'}`;
75
-
76
- // Demo data - MultiSelect uses 'items' with {name, value} format
77
- const multiSelectItems = [
78
- { value: 'react', name: 'React' },
79
- { value: 'vue', name: 'Vue' },
80
- { value: 'svelte', name: 'Svelte' },
81
- { value: 'angular', name: 'Angular' },
82
- { value: 'solid', name: 'Solid' },
83
- ];
84
-
85
- // SelectField uses 'items' with {name, value} format
86
- const selectFieldItems = [
87
- { value: 'sm', name: 'Small' },
88
- { value: 'md', name: 'Medium' },
89
- { value: 'lg', name: 'Large' },
90
- { value: 'xl', name: 'Extra Large' },
91
- ];
92
-
93
- const radioOptions = [
94
- { value: 'daily', label: 'Daily', description: 'Get updates every day' },
95
- { value: 'weekly', label: 'Weekly', description: 'Get updates once a week' },
96
- { value: 'monthly', label: 'Monthly', description: 'Get updates once a month' },
97
- ];
98
- </script>
99
-
100
- <div class="min-h-screen p-6 space-y-8 {isDark ? 'bg-gray-900' : 'bg-gray-50'}">
101
- <!-- Header -->
102
- <div class="flex items-center justify-between mb-8">
103
- <div>
104
- <h1 class="text-3xl font-bold {isDark ? 'text-white' : 'text-gray-900'}">Recipes Gallery</h1>
105
- <p class="{isDark ? 'text-gray-400' : 'text-gray-600'}">Domain-agnostic compositions (Layer 2)</p>
106
- </div>
107
- <button
108
- onclick={toggleDark}
109
- class="px-4 py-2 rounded-lg font-medium {isDark ? 'bg-yellow-500 text-black' : 'bg-gray-800 text-white'}"
110
- >
111
- {isDark ? '☀️ Light' : '🌙 Dark'}
112
- </button>
113
- </div>
114
-
115
- <!-- ========== FEEDBACK COMPONENTS ========== -->
116
- <section class={sectionClass(isDark)}>
117
- <h2 class={headingClass(isDark)}>Feedback Components</h2>
118
- <p class={subheadingClass(isDark)}>EmptyState, ErrorDisplay, StatusIndicator</p>
119
-
120
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
121
- <Card>
122
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">EmptyState</p>
123
- <EmptyState
124
- title="No items yet"
125
- description="Get started by creating your first item"
126
- >
127
- <Button size="sm">Create Item</Button>
128
- </EmptyState>
129
- </Card>
130
-
131
- <Card>
132
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">ErrorDisplay</p>
133
- <ErrorDisplay
134
- title="Something went wrong"
135
- message="We couldn't load the data. Please try again."
136
- >
137
- <Button size="sm" variant="outline">Retry</Button>
138
- </ErrorDisplay>
139
- </Card>
140
- </div>
141
-
142
- <div class="mt-6">
143
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-3">StatusIndicator</p>
144
- <div class="flex flex-wrap gap-6">
145
- <div class="flex items-center gap-2">
146
- <StatusIndicator status="active" />
147
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Active</span>
148
- </div>
149
- <div class="flex items-center gap-2">
150
- <StatusIndicator status="pending" />
151
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Pending</span>
152
- </div>
153
- <div class="flex items-center gap-2">
154
- <StatusIndicator status="inactive" />
155
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Inactive</span>
156
- </div>
157
- <div class="flex items-center gap-2">
158
- <StatusIndicator status="error" />
159
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Error</span>
160
- </div>
161
- <div class="flex items-center gap-2">
162
- <StatusIndicator status="success" />
163
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Success</span>
164
- </div>
165
- </div>
166
- </div>
167
- </section>
168
-
169
- <!-- ========== FORM FIELDS ========== -->
170
- <section class={sectionClass(isDark)}>
171
- <h2 class={headingClass(isDark)}>Form Fields</h2>
172
- <p class={subheadingClass(isDark)}>Composed field components with labels, validation, and help text</p>
173
-
174
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
175
- <div>
176
- <FormField
177
- label="Full Name"
178
- hint="Enter your legal name"
179
- >
180
- {#snippet children({ id, error })}
181
- <input
182
- {id}
183
- type="text"
184
- placeholder="John Doe"
185
- bind:value={formFieldValue}
186
- class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-gray-50 dark:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-blue-500"
187
- />
188
- {/snippet}
189
- </FormField>
190
- </div>
191
-
192
- <div>
193
- <FormField
194
- label="Email (with error)"
195
- error="Please enter a valid email address"
196
- >
197
- {#snippet children({ id, error })}
198
- <input
199
- {id}
200
- type="email"
201
- placeholder="email@example.com"
202
- class="w-full px-3 py-2 border {error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} rounded-lg bg-gray-50 dark:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-blue-500"
203
- />
204
- {/snippet}
205
- </FormField>
206
- </div>
207
-
208
- <div>
209
- <SelectField
210
- label="Size"
211
- items={selectFieldItems}
212
- bind:value={selectFieldValue}
213
- placeholder="Choose a size"
214
- />
215
- </div>
216
-
217
- <div>
218
- <TextareaField
219
- label="Bio"
220
- placeholder="Tell us about yourself..."
221
- bind:value={textareaValue}
222
- hint="Maximum 500 characters"
223
- />
224
- </div>
225
- </div>
226
-
227
- <div class="mt-6 space-y-4">
228
- <CheckboxField
229
- label="I agree to the terms and conditions"
230
- description="You must agree to continue"
231
- bind:checked={checkboxChecked}
232
- />
233
-
234
- <ToggleField
235
- label="Enable notifications"
236
- description="Receive email updates about your account"
237
- bind:checked={toggleChecked}
238
- />
239
-
240
- <div class="max-w-md">
241
- <RadioGroup
242
- label="Update frequency"
243
- options={radioOptions}
244
- bind:value={radioValue}
245
- />
246
- </div>
247
- </div>
248
- </section>
249
-
250
- <!-- ========== SPECIAL INPUTS ========== -->
251
- <section class={sectionClass(isDark)}>
252
- <h2 class={headingClass(isDark)}>Special Inputs</h2>
253
- <p class={subheadingClass(isDark)}>Password, OTP, Search, MultiSelect</p>
254
-
255
- <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
256
- <div>
257
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordInput</p>
258
- <PasswordInput
259
- label="Password"
260
- placeholder="Enter password"
261
- bind:value={passwordValue}
262
- />
263
- </div>
264
-
265
- <div>
266
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordStrengthIndicator</p>
267
- <PasswordStrengthIndicator password={passwordValue} />
268
- </div>
269
-
270
- <div>
271
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">OTPInput (6 digits)</p>
272
- <OTPInput
273
- length={6}
274
- bind:value={otpValue}
275
- />
276
- <p class="text-sm text-gray-500 mt-2">Value: {otpValue || '(empty)'}</p>
277
- </div>
278
-
279
- <div>
280
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">Search</p>
281
- <Search
282
- placeholder="Search..."
283
- bind:value={searchValue}
284
- />
285
- </div>
286
-
287
- <div>
288
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">MultiSelect</p>
289
- <MultiSelect
290
- label="Frameworks"
291
- items={multiSelectItems}
292
- bind:value={multiSelectValue}
293
- placeholder="Select frameworks"
294
- />
295
- </div>
296
-
297
- </div>
298
- </section>
299
-
300
- <!-- ========== MODALS ========== -->
301
- <section class={sectionClass(isDark)}>
302
- <h2 class={headingClass(isDark)}>Modals</h2>
303
- <p class={subheadingClass(isDark)}>AlertModal, ConfirmationModal, InputModal, StatusModal</p>
304
-
305
- <div class="flex flex-wrap gap-4">
306
- <Button onclick={() => showAlertModal = true}>
307
- Open AlertModal
308
- </Button>
309
-
310
- <Button variant="alternative" onclick={() => showConfirmModal = true}>
311
- Open ConfirmationModal
312
- </Button>
313
-
314
- <Button variant="outline" onclick={() => showInputModal = true}>
315
- Open InputModal
316
- </Button>
317
-
318
- <Button variant="ghost" onclick={() => {
319
- statusModalType = 'success';
320
- showStatusModal = true;
321
- setTimeout(() => showStatusModal = false, 2000);
322
- }}>
323
- StatusModal (Success)
324
- </Button>
325
-
326
- <Button variant="ghost" onclick={() => {
327
- statusModalType = 'error';
328
- showStatusModal = true;
329
- setTimeout(() => showStatusModal = false, 2000);
330
- }}>
331
- StatusModal (Error)
332
- </Button>
333
-
334
- <Button variant="ghost" onclick={() => {
335
- statusModalType = 'loading';
336
- showStatusModal = true;
337
- setTimeout(() => showStatusModal = false, 2000);
338
- }}>
339
- StatusModal (Loading)
340
- </Button>
341
- </div>
342
- </section>
343
-
344
- <!-- AlertModal -->
345
- <AlertModal
346
- bind:open={showAlertModal}
347
- title="Alert"
348
- message="This is an alert message that requires your attention."
349
- buttonText="OK"
350
- onconfirm={() => showAlertModal = false}
351
- onclose={() => showAlertModal = false}
352
- />
353
-
354
- <!-- ConfirmationModal -->
355
- <ConfirmationModal
356
- bind:open={showConfirmModal}
357
- title="Confirm Action"
358
- description="Are you sure you want to proceed? This action cannot be undone."
359
- primaryButtonText="Yes, proceed"
360
- secondaryButtonText="Cancel"
361
- onconfirm={() => {
362
- showConfirmModal = false;
363
- console.log('Confirmed!');
364
- }}
365
- oncancel={() => showConfirmModal = false}
366
- onclose={() => showConfirmModal = false}
367
- />
368
-
369
- <!-- InputModal -->
370
- <InputModal
371
- bind:open={showInputModal}
372
- title="Enter Information"
373
- inputLabel="Name"
374
- inputPlaceholder="Enter your name"
375
- primaryButtonText="Submit"
376
- onconfirm={(detail: { value: string }) => {
377
- console.log('Submitted:', detail.value);
378
- showInputModal = false;
379
- }}
380
- oncancel={() => showInputModal = false}
381
- onclose={() => showInputModal = false}
382
- />
383
-
384
- <!-- StatusModal -->
385
- <StatusModal
386
- bind:open={showStatusModal}
387
- iconType={statusModalType}
388
- title={statusModalType === 'loading' ? 'Processing...' : statusModalType === 'success' ? 'Success!' : 'Error'}
389
- description={statusModalType === 'loading' ? 'Please wait...' : statusModalType === 'success' ? 'Operation completed successfully.' : 'Something went wrong.'}
390
- onconfirm={() => showStatusModal = false}
391
- onclose={() => showStatusModal = false}
392
- />
393
-
394
- <!-- ========== COMMON PATTERNS ========== -->
395
- <section class={sectionClass(isDark)}>
396
- <h2 class={headingClass(isDark)}>Common Recipe Patterns</h2>
397
- <p class={subheadingClass(isDark)}>How recipes compose together</p>
398
-
399
- <div class="space-y-6">
400
- <Card>
401
- <h4 class="font-medium mb-4">Registration Form Pattern</h4>
402
- <div class="space-y-4 max-w-md">
403
- <FormField label="Email">
404
- {#snippet children({ id })}
405
- <input
406
- {id}
407
- type="email"
408
- placeholder="email@example.com"
409
- class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-gray-50 dark:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-blue-500"
410
- />
411
- {/snippet}
412
- </FormField>
413
- <PasswordInput
414
- label="Password"
415
- placeholder="Create a password"
416
- bind:value={passwordValue}
417
- />
418
- <PasswordStrengthIndicator password={passwordValue} />
419
- <CheckboxField
420
- label="I agree to the Terms of Service"
421
- />
422
- <Button size="full">Create Account</Button>
423
- </div>
424
- </Card>
425
-
426
- <Card>
427
- <h4 class="font-medium mb-4">Settings Form Pattern</h4>
428
- <div class="space-y-4 max-w-md">
429
- <ToggleField
430
- label="Email notifications"
431
- description="Receive updates via email"
432
- />
433
- <ToggleField
434
- label="Push notifications"
435
- description="Receive mobile push notifications"
436
- />
437
- <SelectField
438
- label="Language"
439
- items={[
440
- { value: 'en', name: 'English' },
441
- { value: 'es', name: 'Spanish' },
442
- { value: 'fr', name: 'French' },
443
- ]}
444
- placeholder="Select language"
445
- />
446
- <div class="flex justify-end gap-2 pt-4">
447
- <Button variant="ghost">Cancel</Button>
448
- <Button>Save Changes</Button>
449
- </div>
450
- </div>
451
- </Card>
452
- </div>
453
- </section>
454
- </div>
1
+ <script lang="ts">
2
+ // ============================================================================
3
+ // RECIPES VISUAL GALLERY
4
+ // Displays ALL recipe components (Layer 2) - Domain-agnostic compositions
5
+ // ============================================================================
6
+
7
+ // Feedback
8
+ import EmptyState from '../recipes/feedback/EmptyState/EmptyState.svelte';
9
+ import ErrorDisplay from '../recipes/feedback/ErrorDisplay.svelte';
10
+ import StatusIndicator from '../recipes/feedback/StatusIndicator/StatusIndicator.svelte';
11
+
12
+ // Inputs
13
+ import MultiSelect from '../recipes/inputs/MultiSelect.svelte';
14
+ import OTPInput from '../recipes/inputs/OTPInput.svelte';
15
+ import PasswordInput from '../recipes/inputs/PasswordInput.svelte';
16
+ import PasswordStrengthIndicator from '../recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte';
17
+ import Search from '../recipes/inputs/Search.svelte';
18
+
19
+ // Modals
20
+ import AlertModal from '../recipes/modals/AlertModal.svelte';
21
+ import ConfirmationModal from '../recipes/modals/ConfirmationModal.svelte';
22
+ import InputModal from '../recipes/modals/InputModal.svelte';
23
+ import StatusModal from '../recipes/modals/StatusModal.svelte';
24
+
25
+ // Fields
26
+ import CheckboxField from '../recipes/fields/CheckboxField.svelte';
27
+ import FormField from '../recipes/fields/FormField.svelte';
28
+ import RadioGroup from '../recipes/fields/RadioGroup.svelte';
29
+ import SelectField from '../recipes/fields/SelectField.svelte';
30
+ import TextareaField from '../recipes/fields/TextareaField.svelte';
31
+ import ToggleField from '../recipes/fields/ToggleField.svelte';
32
+
33
+ // Primitives for demos
34
+ import Button from '../primitives/Button/Button.svelte';
35
+ import Card from '../primitives/Card.svelte';
36
+
37
+ // State
38
+ let isDark = $state(false);
39
+
40
+ // Modal states
41
+ let showAlertModal = $state(false);
42
+ let showConfirmModal = $state(false);
43
+ let showInputModal = $state(false);
44
+ let showStatusModal = $state(false);
45
+ let statusModalType = $state<'success' | 'error' | 'loading'>('success');
46
+
47
+ // Input states
48
+ let otpValue = $state<string[]>(['', '', '', '', '', '']); // OTPInput expects string[]
49
+ let passwordValue = $state('');
50
+ let searchValue = $state('');
51
+ let multiSelectValue = $state<string[]>([]);
52
+
53
+ // Field states
54
+ let checkboxChecked = $state(false);
55
+ let toggleChecked = $state(false);
56
+ let radioValue = $state('');
57
+ let textareaValue = $state('');
58
+ let selectFieldValue = $state('');
59
+ let formFieldValue = $state('');
60
+
61
+ function toggleDark() {
62
+ isDark = !isDark;
63
+ document.documentElement.classList.toggle('dark', isDark);
64
+ }
65
+
66
+ // Section styling
67
+ const sectionClass = (dark: boolean) =>
68
+ `rounded-xl p-6 ${dark ? 'bg-gray-800 border-gray-700' : 'bg-white border-gray-200'} border`;
69
+
70
+ const headingClass = (dark: boolean) =>
71
+ `text-xl font-semibold mb-1 ${dark ? 'text-white' : 'text-gray-900'}`;
72
+
73
+ const subheadingClass = (dark: boolean) =>
74
+ `text-sm mb-4 ${dark ? 'text-gray-400' : 'text-gray-500'}`;
75
+
76
+ // Demo data - MultiSelect uses 'items' with {name, value} format
77
+ const multiSelectItems = [
78
+ { value: 'react', name: 'React' },
79
+ { value: 'vue', name: 'Vue' },
80
+ { value: 'svelte', name: 'Svelte' },
81
+ { value: 'angular', name: 'Angular' },
82
+ { value: 'solid', name: 'Solid' },
83
+ ];
84
+
85
+ // SelectField uses 'items' with {name, value} format
86
+ const selectFieldItems = [
87
+ { value: 'sm', name: 'Small' },
88
+ { value: 'md', name: 'Medium' },
89
+ { value: 'lg', name: 'Large' },
90
+ { value: 'xl', name: 'Extra Large' },
91
+ ];
92
+
93
+ const radioOptions = [
94
+ { value: 'daily', label: 'Daily', description: 'Get updates every day' },
95
+ { value: 'weekly', label: 'Weekly', description: 'Get updates once a week' },
96
+ { value: 'monthly', label: 'Monthly', description: 'Get updates once a month' },
97
+ ];
98
+ </script>
99
+
100
+ <div class="min-h-screen p-6 space-y-8 {isDark ? 'bg-gray-900' : 'bg-gray-50'}">
101
+ <!-- Header -->
102
+ <div class="flex items-center justify-between mb-8">
103
+ <div>
104
+ <h1 class="text-3xl font-bold {isDark ? 'text-white' : 'text-gray-900'}">Recipes Gallery</h1>
105
+ <p class="{isDark ? 'text-gray-400' : 'text-gray-600'}">Domain-agnostic compositions (Layer 2)</p>
106
+ </div>
107
+ <button
108
+ onclick={toggleDark}
109
+ class="px-4 py-2 rounded-lg font-medium {isDark ? 'bg-yellow-500 text-black' : 'bg-gray-800 text-white'}"
110
+ >
111
+ {isDark ? '☀️ Light' : '🌙 Dark'}
112
+ </button>
113
+ </div>
114
+
115
+ <!-- ========== FEEDBACK COMPONENTS ========== -->
116
+ <section class={sectionClass(isDark)}>
117
+ <h2 class={headingClass(isDark)}>Feedback Components</h2>
118
+ <p class={subheadingClass(isDark)}>EmptyState, ErrorDisplay, StatusIndicator</p>
119
+
120
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
121
+ <Card>
122
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">EmptyState</p>
123
+ <EmptyState
124
+ title="No items yet"
125
+ description="Get started by creating your first item"
126
+ >
127
+ <Button size="sm">Create Item</Button>
128
+ </EmptyState>
129
+ </Card>
130
+
131
+ <Card>
132
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">ErrorDisplay</p>
133
+ <ErrorDisplay
134
+ title="Something went wrong"
135
+ message="We couldn't load the data. Please try again."
136
+ >
137
+ <Button size="sm" variant="outline">Retry</Button>
138
+ </ErrorDisplay>
139
+ </Card>
140
+ </div>
141
+
142
+ <div class="mt-6">
143
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-3">StatusIndicator</p>
144
+ <div class="flex flex-wrap gap-6">
145
+ <div class="flex items-center gap-2">
146
+ <StatusIndicator status="active" />
147
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Active</span>
148
+ </div>
149
+ <div class="flex items-center gap-2">
150
+ <StatusIndicator status="pending" />
151
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Pending</span>
152
+ </div>
153
+ <div class="flex items-center gap-2">
154
+ <StatusIndicator status="inactive" />
155
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Inactive</span>
156
+ </div>
157
+ <div class="flex items-center gap-2">
158
+ <StatusIndicator status="error" />
159
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Error</span>
160
+ </div>
161
+ <div class="flex items-center gap-2">
162
+ <StatusIndicator status="success" />
163
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Success</span>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </section>
168
+
169
+ <!-- ========== FORM FIELDS ========== -->
170
+ <section class={sectionClass(isDark)}>
171
+ <h2 class={headingClass(isDark)}>Form Fields</h2>
172
+ <p class={subheadingClass(isDark)}>Composed field components with labels, validation, and help text</p>
173
+
174
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
175
+ <div>
176
+ <FormField
177
+ label="Full Name"
178
+ hint="Enter your legal name"
179
+ >
180
+ {#snippet children({ id, error })}
181
+ <input
182
+ {id}
183
+ type="text"
184
+ placeholder="John Doe"
185
+ bind:value={formFieldValue}
186
+ class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-gray-50 dark:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-blue-500"
187
+ />
188
+ {/snippet}
189
+ </FormField>
190
+ </div>
191
+
192
+ <div>
193
+ <FormField
194
+ label="Email (with error)"
195
+ error="Please enter a valid email address"
196
+ >
197
+ {#snippet children({ id, error })}
198
+ <input
199
+ {id}
200
+ type="email"
201
+ placeholder="email@example.com"
202
+ class="w-full px-3 py-2 border {error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} rounded-lg bg-gray-50 dark:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-blue-500"
203
+ />
204
+ {/snippet}
205
+ </FormField>
206
+ </div>
207
+
208
+ <div>
209
+ <SelectField
210
+ label="Size"
211
+ items={selectFieldItems}
212
+ bind:value={selectFieldValue}
213
+ placeholder="Choose a size"
214
+ />
215
+ </div>
216
+
217
+ <div>
218
+ <TextareaField
219
+ label="Bio"
220
+ placeholder="Tell us about yourself..."
221
+ bind:value={textareaValue}
222
+ hint="Maximum 500 characters"
223
+ />
224
+ </div>
225
+ </div>
226
+
227
+ <div class="mt-6 space-y-4">
228
+ <CheckboxField
229
+ label="I agree to the terms and conditions"
230
+ description="You must agree to continue"
231
+ bind:checked={checkboxChecked}
232
+ />
233
+
234
+ <ToggleField
235
+ label="Enable notifications"
236
+ description="Receive email updates about your account"
237
+ bind:checked={toggleChecked}
238
+ />
239
+
240
+ <div class="max-w-md">
241
+ <RadioGroup
242
+ label="Update frequency"
243
+ options={radioOptions}
244
+ bind:value={radioValue}
245
+ />
246
+ </div>
247
+ </div>
248
+ </section>
249
+
250
+ <!-- ========== SPECIAL INPUTS ========== -->
251
+ <section class={sectionClass(isDark)}>
252
+ <h2 class={headingClass(isDark)}>Special Inputs</h2>
253
+ <p class={subheadingClass(isDark)}>Password, OTP, Search, MultiSelect</p>
254
+
255
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
256
+ <div>
257
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordInput</p>
258
+ <PasswordInput
259
+ label="Password"
260
+ placeholder="Enter password"
261
+ bind:value={passwordValue}
262
+ />
263
+ </div>
264
+
265
+ <div>
266
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordStrengthIndicator</p>
267
+ <PasswordStrengthIndicator password={passwordValue} />
268
+ </div>
269
+
270
+ <div>
271
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">OTPInput (6 digits)</p>
272
+ <OTPInput
273
+ length={6}
274
+ bind:value={otpValue}
275
+ />
276
+ <p class="text-sm text-gray-500 mt-2">Value: {otpValue || '(empty)'}</p>
277
+ </div>
278
+
279
+ <div>
280
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">Search</p>
281
+ <Search
282
+ placeholder="Search..."
283
+ bind:value={searchValue}
284
+ />
285
+ </div>
286
+
287
+ <div>
288
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">MultiSelect</p>
289
+ <MultiSelect
290
+ label="Frameworks"
291
+ items={multiSelectItems}
292
+ bind:value={multiSelectValue}
293
+ placeholder="Select frameworks"
294
+ />
295
+ </div>
296
+
297
+ </div>
298
+ </section>
299
+
300
+ <!-- ========== MODALS ========== -->
301
+ <section class={sectionClass(isDark)}>
302
+ <h2 class={headingClass(isDark)}>Modals</h2>
303
+ <p class={subheadingClass(isDark)}>AlertModal, ConfirmationModal, InputModal, StatusModal</p>
304
+
305
+ <div class="flex flex-wrap gap-4">
306
+ <Button onclick={() => showAlertModal = true}>
307
+ Open AlertModal
308
+ </Button>
309
+
310
+ <Button variant="alternative" onclick={() => showConfirmModal = true}>
311
+ Open ConfirmationModal
312
+ </Button>
313
+
314
+ <Button variant="outline" onclick={() => showInputModal = true}>
315
+ Open InputModal
316
+ </Button>
317
+
318
+ <Button variant="ghost" onclick={() => {
319
+ statusModalType = 'success';
320
+ showStatusModal = true;
321
+ setTimeout(() => showStatusModal = false, 2000);
322
+ }}>
323
+ StatusModal (Success)
324
+ </Button>
325
+
326
+ <Button variant="ghost" onclick={() => {
327
+ statusModalType = 'error';
328
+ showStatusModal = true;
329
+ setTimeout(() => showStatusModal = false, 2000);
330
+ }}>
331
+ StatusModal (Error)
332
+ </Button>
333
+
334
+ <Button variant="ghost" onclick={() => {
335
+ statusModalType = 'loading';
336
+ showStatusModal = true;
337
+ setTimeout(() => showStatusModal = false, 2000);
338
+ }}>
339
+ StatusModal (Loading)
340
+ </Button>
341
+ </div>
342
+ </section>
343
+
344
+ <!-- AlertModal -->
345
+ <AlertModal
346
+ bind:open={showAlertModal}
347
+ title="Alert"
348
+ message="This is an alert message that requires your attention."
349
+ buttonText="OK"
350
+ onconfirm={() => showAlertModal = false}
351
+ onclose={() => showAlertModal = false}
352
+ />
353
+
354
+ <!-- ConfirmationModal -->
355
+ <ConfirmationModal
356
+ bind:open={showConfirmModal}
357
+ title="Confirm Action"
358
+ description="Are you sure you want to proceed? This action cannot be undone."
359
+ primaryButtonText="Yes, proceed"
360
+ secondaryButtonText="Cancel"
361
+ onconfirm={() => {
362
+ showConfirmModal = false;
363
+ console.log('Confirmed!');
364
+ }}
365
+ oncancel={() => showConfirmModal = false}
366
+ onclose={() => showConfirmModal = false}
367
+ />
368
+
369
+ <!-- InputModal -->
370
+ <InputModal
371
+ bind:open={showInputModal}
372
+ title="Enter Information"
373
+ inputLabel="Name"
374
+ inputPlaceholder="Enter your name"
375
+ primaryButtonText="Submit"
376
+ onconfirm={(detail: { value: string }) => {
377
+ console.log('Submitted:', detail.value);
378
+ showInputModal = false;
379
+ }}
380
+ oncancel={() => showInputModal = false}
381
+ onclose={() => showInputModal = false}
382
+ />
383
+
384
+ <!-- StatusModal -->
385
+ <StatusModal
386
+ bind:open={showStatusModal}
387
+ iconType={statusModalType}
388
+ title={statusModalType === 'loading' ? 'Processing...' : statusModalType === 'success' ? 'Success!' : 'Error'}
389
+ description={statusModalType === 'loading' ? 'Please wait...' : statusModalType === 'success' ? 'Operation completed successfully.' : 'Something went wrong.'}
390
+ onconfirm={() => showStatusModal = false}
391
+ onclose={() => showStatusModal = false}
392
+ />
393
+
394
+ <!-- ========== COMMON PATTERNS ========== -->
395
+ <section class={sectionClass(isDark)}>
396
+ <h2 class={headingClass(isDark)}>Common Recipe Patterns</h2>
397
+ <p class={subheadingClass(isDark)}>How recipes compose together</p>
398
+
399
+ <div class="space-y-6">
400
+ <Card>
401
+ <h4 class="font-medium mb-4">Registration Form Pattern</h4>
402
+ <div class="space-y-4 max-w-md">
403
+ <FormField label="Email">
404
+ {#snippet children({ id })}
405
+ <input
406
+ {id}
407
+ type="email"
408
+ placeholder="email@example.com"
409
+ class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-gray-50 dark:bg-gray-700 focus:outline-hidden focus:ring-2 focus:ring-blue-500"
410
+ />
411
+ {/snippet}
412
+ </FormField>
413
+ <PasswordInput
414
+ label="Password"
415
+ placeholder="Create a password"
416
+ bind:value={passwordValue}
417
+ />
418
+ <PasswordStrengthIndicator password={passwordValue} />
419
+ <CheckboxField
420
+ label="I agree to the Terms of Service"
421
+ />
422
+ <Button size="full">Create Account</Button>
423
+ </div>
424
+ </Card>
425
+
426
+ <Card>
427
+ <h4 class="font-medium mb-4">Settings Form Pattern</h4>
428
+ <div class="space-y-4 max-w-md">
429
+ <ToggleField
430
+ label="Email notifications"
431
+ description="Receive updates via email"
432
+ />
433
+ <ToggleField
434
+ label="Push notifications"
435
+ description="Receive mobile push notifications"
436
+ />
437
+ <SelectField
438
+ label="Language"
439
+ items={[
440
+ { value: 'en', name: 'English' },
441
+ { value: 'es', name: 'Spanish' },
442
+ { value: 'fr', name: 'French' },
443
+ ]}
444
+ placeholder="Select language"
445
+ />
446
+ <div class="flex justify-end gap-2 pt-4">
447
+ <Button variant="ghost">Cancel</Button>
448
+ <Button>Save Changes</Button>
449
+ </div>
450
+ </div>
451
+ </Card>
452
+ </div>
453
+ </section>
454
+ </div>