@getmicdrop/svelte-components 5.17.3 → 5.17.4

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 (327) hide show
  1. package/dist/calendar/AboutShow/AboutShow.svelte +187 -187
  2. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +780 -782
  3. package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
  4. package/dist/calendar/FAQs/FAQs.svelte +77 -77
  5. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +125 -126
  6. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
  7. package/dist/calendar/OrderSummary/OrderSummary.svelte +457 -457
  8. package/dist/calendar/PublicCard/PublicCard.svelte +155 -146
  9. package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
  10. package/dist/calendar/ShowCard/ShowCard.spec.js +1 -7
  11. package/dist/calendar/ShowCard/ShowCard.svelte +166 -157
  12. package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
  13. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +72 -61
  14. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts +2 -0
  15. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
  16. package/dist/components/Heading.svelte +60 -60
  17. package/dist/components/Layout/AppShell.svelte +104 -104
  18. package/dist/components/Layout/ContentSection.svelte +80 -80
  19. package/dist/components/Layout/Grid.svelte +4 -4
  20. package/dist/components/Layout/Heading.svelte +81 -81
  21. package/dist/components/Layout/PageContainer.svelte +69 -69
  22. package/dist/components/Layout/Responsive.svelte +75 -75
  23. package/dist/components/Layout/Section.svelte +80 -80
  24. package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
  25. package/dist/components/Layout/ShowOnMobile.svelte +37 -37
  26. package/dist/components/Layout/Sidebar.svelte +108 -108
  27. package/dist/components/Layout/Stack.spec.js +1 -1
  28. package/dist/components/Layout/Stack.svelte +6 -6
  29. package/dist/components/Layout/Text.svelte +87 -87
  30. package/dist/components/Layout/TwoColumn.svelte +108 -108
  31. package/dist/components/Text.svelte +53 -53
  32. package/dist/config.d.ts +102 -0
  33. package/dist/config.js +147 -1
  34. package/dist/constants/validation.js +91 -91
  35. package/dist/constants/validation.spec.js +64 -64
  36. package/dist/datetime/README.md +323 -0
  37. package/dist/datetime/__tests__/format.test.js +1 -1
  38. package/dist/datetime/__tests__/parse.test.js +1 -1
  39. package/dist/datetime/__tests__/timezone.test.js +1 -1
  40. package/dist/datetime/parse.js +1 -1
  41. package/dist/forms/createFormStore.svelte.js +0 -1
  42. package/dist/forms/createFormStore.svelte.spec.js +0 -1
  43. package/dist/index.js +57 -57
  44. package/dist/index.spec.js +369 -369
  45. package/dist/messages.d.ts +43 -0
  46. package/dist/messages.d.ts.map +1 -0
  47. package/dist/messages.js +57 -0
  48. package/dist/patterns/chat/ChatActivityNotice.svelte +41 -41
  49. package/dist/patterns/chat/ChatBubble.svelte +95 -95
  50. package/dist/patterns/chat/ChatContainer.svelte +46 -46
  51. package/dist/patterns/chat/ChatDateDivider.svelte +27 -27
  52. package/dist/patterns/chat/ChatInvitationBubble.svelte +37 -37
  53. package/dist/patterns/chat/ChatInvitationNotice.svelte +27 -27
  54. package/dist/patterns/chat/ChatMessageGroup.svelte +57 -57
  55. package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -46
  56. package/dist/patterns/chat/ChatStatusBadge.svelte +91 -91
  57. package/dist/patterns/chat/ChatStatusTransition.svelte +64 -64
  58. package/dist/patterns/chat/ChatTextBubble.svelte +41 -41
  59. package/dist/patterns/chat/index.js +22 -22
  60. package/dist/patterns/data/DataGrid.svelte +45 -45
  61. package/dist/patterns/data/DataList.svelte +24 -24
  62. package/dist/patterns/data/DataTable.svelte +36 -36
  63. package/dist/patterns/forms/FormActions.spec.js +95 -95
  64. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  65. package/dist/patterns/forms/FormActions.svelte +46 -46
  66. package/dist/patterns/forms/FormGrid.svelte +33 -33
  67. package/dist/patterns/forms/FormSection.svelte +32 -32
  68. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  69. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  70. package/dist/patterns/index.js +21 -21
  71. package/dist/patterns/layout/Sidebar.svelte +39 -39
  72. package/dist/patterns/layout/index.js +29 -29
  73. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  74. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  75. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  76. package/dist/patterns/navigation/Header.svelte +251 -251
  77. package/dist/patterns/page/PageHeader.svelte +18 -18
  78. package/dist/patterns/page/PageLayout.svelte +40 -40
  79. package/dist/patterns/page/PageLoader.spec.js +57 -57
  80. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  81. package/dist/patterns/page/PageLoader.svelte +24 -24
  82. package/dist/patterns/page/SectionHeader.svelte +29 -29
  83. package/dist/presets/badges.js +112 -112
  84. package/dist/presets/buttons.js +76 -76
  85. package/dist/presets/index.js +9 -9
  86. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  87. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  88. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  89. package/dist/primitives/Alert/Alert.spec.js +173 -173
  90. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  91. package/dist/primitives/Alert/Alert.svelte +27 -27
  92. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  93. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  94. package/dist/primitives/AvatarButton/AvatarButton.svelte +57 -57
  95. package/dist/primitives/Badges/Badge.spec.js +144 -144
  96. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  97. package/dist/primitives/Badges/Badge.svelte +99 -99
  98. package/dist/primitives/BottomSheet/BottomSheet.spec.js +238 -238
  99. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  100. package/dist/primitives/BottomSheet/BottomSheet.svelte +115 -115
  101. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -123
  102. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  103. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +99 -99
  104. package/dist/primitives/Button/Button.spec.js +225 -225
  105. package/dist/primitives/Button/Button.stories.svelte +76 -76
  106. package/dist/primitives/Button/Button.svelte +278 -278
  107. package/dist/primitives/Button/ButtonGroup.svelte +50 -50
  108. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  109. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  110. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  111. package/dist/primitives/Card.spec.js +49 -49
  112. package/dist/primitives/Card.stories.svelte +22 -22
  113. package/dist/primitives/Card.svelte +28 -28
  114. package/dist/primitives/CardAction/CardAction.svelte +68 -68
  115. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  116. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  117. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  118. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  119. package/dist/primitives/DarkModeToggle.svelte +136 -136
  120. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  121. package/dist/primitives/Drawer/Drawer.svelte +224 -224
  122. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  123. package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
  124. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  125. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  126. package/dist/primitives/Helper/Helper.svelte +33 -33
  127. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  128. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  129. package/dist/primitives/Icons/Availability.svelte +14 -14
  130. package/dist/primitives/Icons/Back.svelte +14 -14
  131. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  132. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  133. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  134. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  135. package/dist/primitives/Icons/Copy.svelte +15 -15
  136. package/dist/primitives/Icons/Cross.svelte +5 -5
  137. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  138. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  139. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  140. package/dist/primitives/Icons/Home.svelte +15 -15
  141. package/dist/primitives/Icons/Icon.spec.js +169 -169
  142. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  143. package/dist/primitives/Icons/Icon.svelte +52 -52
  144. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  145. package/dist/primitives/Icons/Info.svelte +7 -7
  146. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  147. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  148. package/dist/primitives/Icons/Message.svelte +15 -15
  149. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  150. package/dist/primitives/Icons/More.svelte +21 -21
  151. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  152. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  153. package/dist/primitives/Icons/Notification.svelte +14 -14
  154. package/dist/primitives/Icons/Payment.svelte +14 -14
  155. package/dist/primitives/Icons/Profile.svelte +21 -21
  156. package/dist/primitives/Icons/Reload.svelte +29 -29
  157. package/dist/primitives/Icons/Shows.svelte +21 -21
  158. package/dist/primitives/Icons/Signout.svelte +21 -21
  159. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  160. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  161. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  162. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  163. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  164. package/dist/primitives/Input/Input.spec.js +1237 -1235
  165. package/dist/primitives/Input/Input.stories.svelte +139 -139
  166. package/dist/primitives/Input/Input.svelte +431 -423
  167. package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
  168. package/dist/primitives/Input/Select.spec.js +632 -632
  169. package/dist/primitives/Input/Select.stories.svelte +112 -112
  170. package/dist/primitives/Input/Select.svelte +252 -252
  171. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  172. package/dist/primitives/Input/Textarea.svelte +105 -105
  173. package/dist/primitives/Label/Label.svelte +37 -37
  174. package/dist/primitives/LandingButton/LandingButton.svelte +92 -92
  175. package/dist/primitives/MenuItem/MenuItem.svelte +85 -85
  176. package/dist/primitives/Modal/Modal.spec.js +314 -314
  177. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  178. package/dist/primitives/Modal/Modal.svelte +181 -181
  179. package/dist/primitives/NavItem/NavItem.svelte +75 -75
  180. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  181. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  182. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  183. package/dist/primitives/Radio/Radio.svelte +67 -67
  184. package/dist/primitives/SearchResultItem/SearchResultItem.svelte +109 -109
  185. package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -55
  186. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  187. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  188. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  189. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  190. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  191. package/dist/primitives/Spinner/Spinner.spec.js +84 -84
  192. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  193. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  194. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  195. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  196. package/dist/primitives/Tabs/Tabs.svelte +137 -137
  197. package/dist/primitives/Toggle.spec.js +221 -221
  198. package/dist/primitives/Toggle.stories.svelte +92 -92
  199. package/dist/primitives/Toggle.svelte +141 -141
  200. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  201. package/dist/primitives/Typography/Typography.svelte +53 -53
  202. package/dist/primitives/ValidationError.spec.js +103 -103
  203. package/dist/primitives/ValidationError.stories.svelte +69 -69
  204. package/dist/primitives/ValidationError.svelte +29 -29
  205. package/dist/primitives/index.js +113 -113
  206. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  207. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  208. package/dist/recipes/CropImage/CropImage.svelte +241 -241
  209. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  210. package/dist/recipes/ImageUploader/ImageUploader.svelte +992 -992
  211. package/dist/recipes/SuperLogin/SuperLogin.spec.js +2 -2
  212. package/dist/recipes/SuperLogin/SuperLogin.svelte +1 -1
  213. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  214. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  215. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  216. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  217. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  218. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  219. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  220. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  221. package/dist/recipes/fields/FormField.svelte +58 -58
  222. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  223. package/dist/recipes/fields/SelectField.svelte +82 -82
  224. package/dist/recipes/fields/TextareaField.svelte +97 -97
  225. package/dist/recipes/fields/ToggleField.svelte +60 -60
  226. package/dist/recipes/fields/index.js +7 -7
  227. package/dist/recipes/inputs/MultiSelect.spec.js +263 -263
  228. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  229. package/dist/recipes/inputs/MultiSelect.svelte +283 -283
  230. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  231. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  232. package/dist/recipes/inputs/OTPInput.svelte +117 -117
  233. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  234. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +131 -131
  235. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  236. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +336 -336
  237. package/dist/recipes/inputs/Search.svelte +102 -102
  238. package/dist/recipes/inputs/index.js +7 -7
  239. package/dist/recipes/modals/AlertModal.svelte +130 -130
  240. package/dist/recipes/modals/ConfirmationModal.spec.js +396 -396
  241. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  242. package/dist/recipes/modals/ConfirmationModal.svelte +162 -162
  243. package/dist/recipes/modals/InputModal.svelte +182 -182
  244. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  245. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  246. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  247. package/dist/recipes/modals/StatusModal.svelte +206 -206
  248. package/dist/schemas/__tests__/auth.test.d.ts +2 -0
  249. package/dist/schemas/__tests__/auth.test.d.ts.map +1 -0
  250. package/dist/schemas/__tests__/auth.test.js +210 -0
  251. package/dist/schemas/__tests__/common.test.d.ts +2 -0
  252. package/dist/schemas/__tests__/common.test.d.ts.map +1 -0
  253. package/dist/schemas/__tests__/common.test.js +340 -0
  254. package/dist/schemas/__tests__/domain.test.d.ts +2 -0
  255. package/dist/schemas/__tests__/domain.test.d.ts.map +1 -0
  256. package/dist/schemas/__tests__/domain.test.js +293 -0
  257. package/dist/schemas/__tests__/order.test.d.ts +2 -0
  258. package/dist/schemas/__tests__/order.test.d.ts.map +1 -0
  259. package/dist/schemas/__tests__/order.test.js +349 -0
  260. package/dist/schemas/__tests__/user.test.d.ts +2 -0
  261. package/dist/schemas/__tests__/user.test.d.ts.map +1 -0
  262. package/dist/schemas/__tests__/user.test.js +325 -0
  263. package/dist/schemas/auth.d.ts +41 -0
  264. package/dist/schemas/auth.d.ts.map +1 -0
  265. package/dist/schemas/auth.js +69 -0
  266. package/dist/schemas/common.d.ts +43 -0
  267. package/dist/schemas/common.d.ts.map +1 -0
  268. package/dist/schemas/common.js +157 -0
  269. package/dist/schemas/event.d.ts +82 -0
  270. package/dist/schemas/event.d.ts.map +1 -0
  271. package/dist/schemas/event.js +58 -0
  272. package/dist/schemas/index.d.ts +10 -0
  273. package/dist/schemas/index.d.ts.map +1 -0
  274. package/dist/schemas/index.js +9 -0
  275. package/dist/schemas/order.d.ts +111 -0
  276. package/dist/schemas/order.d.ts.map +1 -0
  277. package/dist/schemas/order.js +73 -0
  278. package/dist/schemas/performer.d.ts +133 -0
  279. package/dist/schemas/performer.d.ts.map +1 -0
  280. package/dist/schemas/performer.js +73 -0
  281. package/dist/schemas/promo.d.ts +87 -0
  282. package/dist/schemas/promo.d.ts.map +1 -0
  283. package/dist/schemas/promo.js +98 -0
  284. package/dist/schemas/ticket.d.ts +104 -0
  285. package/dist/schemas/ticket.d.ts.map +1 -0
  286. package/dist/schemas/ticket.js +82 -0
  287. package/dist/schemas/user.d.ts +92 -0
  288. package/dist/schemas/user.d.ts.map +1 -0
  289. package/dist/schemas/user.js +53 -0
  290. package/dist/schemas/venue.d.ts +95 -0
  291. package/dist/schemas/venue.d.ts.map +1 -0
  292. package/dist/schemas/venue.js +52 -0
  293. package/dist/services/EventService.js +79 -79
  294. package/dist/services/EventService.spec.js +217 -217
  295. package/dist/services/ShowService.js +144 -144
  296. package/dist/services/ShowService.spec.js +345 -345
  297. package/dist/stores/auth.svelte.spec.js +1 -1
  298. package/dist/stores/toaster.js +13 -13
  299. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  300. package/dist/stories/ButtonAuditReview.svelte +427 -427
  301. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  302. package/dist/stories/PatternsGallery.svelte +206 -206
  303. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  304. package/dist/stories/PrimitivesGallery.svelte +756 -756
  305. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  306. package/dist/stories/RecipesGallery.svelte +454 -454
  307. package/dist/stories/button-audit-manifest.json +11186 -11186
  308. package/dist/tailwind/preset.cjs +82 -82
  309. package/dist/telemetry.js +402 -402
  310. package/dist/telemetry.server.js +212 -212
  311. package/dist/telemetry.server.spec.js +437 -437
  312. package/dist/telemetry.spec.js +1173 -1168
  313. package/dist/tokens/__tests__/sizing.test.js +2 -2
  314. package/dist/tokens/sizing.d.ts +5 -0
  315. package/dist/tokens/sizing.d.ts.map +1 -1
  316. package/dist/tokens/sizing.js +6 -0
  317. package/dist/tokens/tokens.css +87 -87
  318. package/dist/tokens/typography-base.css +163 -163
  319. package/dist/tokens/utilities.css +353 -353
  320. package/dist/utils/apiConfig.js +117 -117
  321. package/dist/utils/apiConfig.spec.js +219 -219
  322. package/dist/utils/greetings.js +187 -187
  323. package/dist/utils/haptic.spec.js +1 -1
  324. package/dist/utils/imageValidation.js +121 -121
  325. package/dist/utils/transitions.js +4 -4
  326. package/dist/utils/utils.js +693 -693
  327. package/package.json +292 -292
@@ -0,0 +1,323 @@
1
+ # DateTime Module
2
+
3
+ Centralized date/time handling for the MicDrop platform. This module eliminates timezone bugs by enforcing consistent patterns across the application.
4
+
5
+ ## Golden Rules
6
+
7
+ 1. **Backend is King** - All API requests send/receive UTC ISO strings (`2023-12-25T20:00:00Z`)
8
+ 2. **Display is Local** - All UI components receive UTC strings + Timezone ID
9
+ 3. **No `new Date()` in components** - Use these helpers instead
10
+ 4. **Timezone is always required** - Every function requires explicit timezone parameter
11
+
12
+ ## Quick Start
13
+
14
+ ```typescript
15
+ import * as datetime from '$lib/datetime';
16
+
17
+ // Get timezone from venue (throws if missing)
18
+ const tz = datetime.getVenueTimezone(venue);
19
+
20
+ // Format for display
21
+ const time = datetime.formatEventTime(event.startTime, tz); // "7:00 PM"
22
+ const date = datetime.formatEventDate(event.startTime, tz); // "Dec 25, 2023"
23
+ const full = datetime.formatEventDateTime(event.startTime, tz); // "Dec 25, 2023 at 7:00 PM"
24
+
25
+ // Parse form input to UTC for API
26
+ const utc = datetime.combineDateAndTime('2023-12-25', '19:00', tz);
27
+
28
+ // Parse API response for form
29
+ const { date, time } = datetime.parseDateTimeFromAPI(event.startTime, tz);
30
+ ```
31
+
32
+ ## Module Structure
33
+
34
+ ```
35
+ src/lib/datetime/
36
+ ├── index.ts # Clean exports
37
+ ├── types.ts # Type definitions
38
+ ├── constants.ts # Duration constants, format strings
39
+ ├── timezone.ts # Timezone utilities
40
+ ├── format.ts # Formatting functions
41
+ ├── parse.ts # Parsing functions
42
+ ├── __tests__/ # Comprehensive tests
43
+ │ ├── timezone.test.ts
44
+ │ ├── format.test.ts
45
+ │ ├── parse.test.ts
46
+ │ └── integration.test.ts
47
+ └── README.md # This file
48
+ ```
49
+
50
+ ## API Reference
51
+
52
+ ### Timezone Utilities
53
+
54
+ ```typescript
55
+ // Validate timezone
56
+ isValidTimezone('America/Los_Angeles'); // true
57
+ isValidTimezone('PST'); // false (abbreviations not valid)
58
+
59
+ // Get venue timezone (throws if missing)
60
+ const tz = getVenueTimezone(venue);
61
+
62
+ // Get user's browser timezone
63
+ const userTz = getUserTimezone();
64
+
65
+ // Get timezone offset string
66
+ getTimezoneOffset('America/Los_Angeles'); // "PST (UTC-8)"
67
+
68
+ // Normalize legacy timezone abbreviations
69
+ normalizeTimezone('PST'); // "America/Los_Angeles"
70
+
71
+ // Check if DST is active
72
+ isDST('America/Los_Angeles', new Date()); // true/false
73
+ ```
74
+
75
+ ### Format Functions
76
+
77
+ All format functions require timezone - no defaults!
78
+
79
+ ```typescript
80
+ // Time only
81
+ formatEventTime('2023-12-26T03:00:00Z', 'America/Los_Angeles');
82
+ // "7:00 PM"
83
+
84
+ // Date only
85
+ formatEventDate('2023-12-26T03:00:00Z', 'America/Los_Angeles');
86
+ // "Dec 25, 2023"
87
+
88
+ // Full datetime
89
+ formatEventDateTime('2023-12-26T03:00:00Z', 'America/Los_Angeles');
90
+ // "Dec 25, 2023 at 7:00 PM"
91
+
92
+ // Time range
93
+ formatTimeRange(startUtc, endUtc, 'America/Los_Angeles');
94
+ // "7:00 PM - 10:00 PM"
95
+
96
+ // Date range
97
+ formatDateRange(startUtc, endUtc, 'America/Los_Angeles');
98
+ // "Dec 25 - 27, 2023"
99
+
100
+ // Relative time
101
+ formatRelativeTime(utcIso, 'America/Los_Angeles');
102
+ // "2 hours ago" or "in 3 days"
103
+
104
+ // Date parts
105
+ getDateParts('2023-12-25T20:00:00Z', 'America/Los_Angeles');
106
+ // { day: 'Mon', month: 'Dec', date: 25, year: 2023 }
107
+
108
+ // Get hour (0-23)
109
+ getHourInTimezone('2023-12-25T20:00:00Z', 'America/Los_Angeles');
110
+ // 12
111
+
112
+ // Get date string
113
+ getDateInTimezone('2023-12-25T20:00:00Z', 'America/Los_Angeles');
114
+ // "2023-12-25"
115
+ ```
116
+
117
+ ### Parse Functions
118
+
119
+ ```typescript
120
+ // Local datetime to UTC
121
+ parseLocalToUTC('2023-12-25T19:00:00', 'America/Los_Angeles');
122
+ // "2023-12-26T03:00:00.000Z"
123
+
124
+ // UTC to local datetime
125
+ parseUTCToLocal('2023-12-26T03:00:00Z', 'America/Los_Angeles');
126
+ // "2023-12-25T19:00:00"
127
+
128
+ // Combine date and time
129
+ combineDateAndTime('2023-12-25', '19:00', 'America/Los_Angeles');
130
+ // "2023-12-26T03:00:00.000Z"
131
+
132
+ // Parse API response for form
133
+ parseDateTimeFromAPI('2023-12-26T03:00:00Z', 'America/Los_Angeles');
134
+ // { date: '2023-12-25', time: '19:00' }
135
+
136
+ // Start of day in UTC
137
+ parseStartOfDay('2023-12-25', 'America/Los_Angeles');
138
+ // "2023-12-25T08:00:00.000Z"
139
+
140
+ // End of day in UTC
141
+ parseEndOfDay('2023-12-25', 'America/Los_Angeles');
142
+ // "2023-12-26T07:59:59.000Z"
143
+ ```
144
+
145
+ ### Next-Day Time Handling
146
+
147
+ For overnight events (e.g., 10 PM - 2 AM):
148
+
149
+ ```typescript
150
+ // Check for next-day prefix
151
+ isNextDayTime('+1_02:00'); // true
152
+ isNextDayTime('14:00'); // false
153
+
154
+ // Strip prefix
155
+ stripNextDayPrefix('+1_02:00'); // '02:00'
156
+
157
+ // Convert to minutes
158
+ parseTimeToMinutes('22:00'); // 1320
159
+ parseTimeToMinutes('+1_02:00'); // 1560 (26 hours)
160
+
161
+ // Convert back
162
+ minutesToTimeString(1320); // '22:00'
163
+ minutesToTimeString(1560, true); // '+1_02:00'
164
+ ```
165
+
166
+ ### Constants
167
+
168
+ ```typescript
169
+ import {
170
+ DURATIONS,
171
+ DATE_FORMATS,
172
+ EVENT_DEFAULTS,
173
+ COMMON_US_TIMEZONES,
174
+ } from '$lib/datetime';
175
+
176
+ // Durations in milliseconds
177
+ DURATIONS.MINUTE; // 60000
178
+ DURATIONS.HOUR; // 3600000
179
+ DURATIONS.DAY; // 86400000
180
+
181
+ // Event defaults
182
+ EVENT_DEFAULTS.DEFAULT_DURATION_MINUTES; // 120
183
+ EVENT_DEFAULTS.MIN_DURATION_MINUTES; // 15
184
+ EVENT_DEFAULTS.DEFAULT_DOORS_BEFORE_MINUTES; // 30
185
+
186
+ // Common US timezones for selects
187
+ COMMON_US_TIMEZONES;
188
+ // [{ id: 'America/Los_Angeles', label: 'Pacific Time (PT)', abbr: 'PT' }, ...]
189
+ ```
190
+
191
+ ## Common Patterns
192
+
193
+ ### Event Form
194
+
195
+ ```typescript
196
+ // Populating form from API response
197
+ function populateForm(event: Event) {
198
+ const tz = datetime.getVenueTimezone(event.venue);
199
+ const start = datetime.parseDateTimeFromAPI(event.startTime, tz);
200
+ const end = datetime.parseDateTimeFromAPI(event.endTime, tz);
201
+
202
+ return {
203
+ date: start.date,
204
+ startTime: start.time,
205
+ endTime: end.time,
206
+ };
207
+ }
208
+
209
+ // Submitting form to API
210
+ function submitForm(form: FormData, venue: Venue) {
211
+ const tz = datetime.getVenueTimezone(venue);
212
+
213
+ return {
214
+ startTime: datetime.combineDateAndTime(form.date, form.startTime, tz),
215
+ endTime: datetime.combineDateAndTime(form.date, form.endTime, tz),
216
+ };
217
+ }
218
+ ```
219
+
220
+ ### Calendar Display
221
+
222
+ ```typescript
223
+ // Display events in venue timezone
224
+ function renderEvent(event: Event, venue: Venue) {
225
+ const tz = datetime.getVenueTimezone(venue);
226
+
227
+ return {
228
+ time: datetime.formatEventTime(event.startTime, tz),
229
+ date: datetime.formatEventDate(event.startTime, tz),
230
+ dateRange: datetime.formatTimeRange(event.startTime, event.endTime, tz),
231
+ dateParts: datetime.getDateParts(event.startTime, tz),
232
+ };
233
+ }
234
+ ```
235
+
236
+ ### Grouping Events by Date
237
+
238
+ ```typescript
239
+ function groupByDate(events: Event[], timezone: TimezoneId) {
240
+ const groups: Record<string, Event[]> = {};
241
+
242
+ for (const event of events) {
243
+ const dateKey = datetime.getDateInTimezone(event.startTime, timezone);
244
+ groups[dateKey] = groups[dateKey] || [];
245
+ groups[dateKey].push(event);
246
+ }
247
+
248
+ return groups;
249
+ }
250
+ ```
251
+
252
+ ## Error Handling
253
+
254
+ All functions throw `DateTimeError` for invalid inputs:
255
+
256
+ ```typescript
257
+ import { DateTimeError, DateTimeErrorCode } from '$lib/datetime';
258
+
259
+ try {
260
+ const tz = datetime.getVenueTimezone(venue);
261
+ } catch (e) {
262
+ if (e instanceof DateTimeError) {
263
+ console.error(e.code); // DateTimeErrorCode.MISSING_TIMEZONE
264
+ console.error(e.message); // "Venue timezone is required"
265
+ console.error(e.details); // { venue: {...} }
266
+ }
267
+ }
268
+ ```
269
+
270
+ Error codes:
271
+
272
+ - `INVALID_TIMEZONE` - Timezone string is not a valid IANA identifier
273
+ - `INVALID_ISO_STRING` - ISO date string is malformed
274
+ - `INVALID_DATE` - Date string is invalid
275
+ - `INVALID_TIME` - Time string is invalid
276
+ - `MISSING_TIMEZONE` - Required timezone is missing
277
+ - `PARSE_ERROR` - General parsing error
278
+
279
+ ## Migration from Legacy Code
280
+
281
+ ### From `src/lib/utils/timezone.js`
282
+
283
+ ```typescript
284
+ // Before
285
+ import { localToUTC, utcToLocal, formatForDisplay } from '$lib/utils/timezone';
286
+
287
+ // After
288
+ import {
289
+ parseLocalToUTC,
290
+ parseUTCToLocal,
291
+ formatEventDateTime,
292
+ } from '$lib/datetime';
293
+ ```
294
+
295
+ ### From `src/lib/utils/utils.js`
296
+
297
+ ```typescript
298
+ // Before
299
+ import { formatDateTime, formatTimeRange, getDay } from '$lib/utils/utils';
300
+
301
+ // After
302
+ import {
303
+ formatEventDateTime,
304
+ formatTimeRange,
305
+ formatDayOfWeek,
306
+ } from '$lib/datetime';
307
+ ```
308
+
309
+ ## Testing
310
+
311
+ Run tests:
312
+
313
+ ```bash
314
+ npm run test -- src/lib/datetime
315
+ ```
316
+
317
+ Run with coverage:
318
+
319
+ ```bash
320
+ npm run test:coverage -- src/lib/datetime
321
+ ```
322
+
323
+ Target: 100% coverage for this critical module.
@@ -1,6 +1,6 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
2
  import { formatCleanTimeRange, formatDateRange, formatDayOfWeek, formatEventDate, formatEventDateTime, formatEventTime, formatHour, formatMonth, formatNotificationTime, formatRelativeTime, formatTimeRange, getDateInTimezone, getDateParts, getHourInTimezone, isToday, } from '../format';
3
- import { DateTimeError, DateTimeErrorCode } from '../types';
3
+ import { DateTimeError } from '../types';
4
4
  describe('format utilities', () => {
5
5
  describe('formatEventTime', () => {
6
6
  it('formats time in specified timezone', () => {
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { combineDateAndTime, formatDateTimeForAPI, isNextDayTime, minutesToTimeString, parseDateTimeFromAPI, parseEndOfDay, parseLocalToUTC, parseStartOfDay, parseTimeToMinutes, parseUTCToLocal, stripNextDayPrefix, } from '../parse';
3
- import { DateTimeError, DateTimeErrorCode } from '../types';
3
+ import { DateTimeError } from '../types';
4
4
  describe('parse utilities', () => {
5
5
  describe('parseLocalToUTC', () => {
6
6
  it('converts local datetime to UTC', () => {
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
1
+ import { describe, expect, it } from 'vitest';
2
2
  import { getTimezoneDisplayName, getTimezoneOffset, getUserTimezone, getVenueTimezone, isDST, isValidTimezone, normalizeTimezone, getIANATimezone, isValidIANATimezone, getAllTimezones, formatTimezoneForDisplay, getTimezoneOptions, getCommonUSTimezoneOptions, } from '../timezone';
3
3
  import { DateTimeError, DateTimeErrorCode } from '../types';
4
4
  describe('timezone utilities', () => {
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module datetime/parse
8
8
  */
9
- import { format, parse } from 'date-fns';
9
+ import { format } from 'date-fns';
10
10
  import { fromZonedTime, toZonedTime } from 'date-fns-tz';
11
11
  import { DATE_FORMATS } from './constants';
12
12
  import { isValidTimezone } from './timezone';
@@ -7,7 +7,6 @@
7
7
  * - UI states (loading, saving, saved)
8
8
  * - Section-level validation for progressive forms
9
9
  */
10
- import { z } from 'zod';
11
10
  // ============================================================================
12
11
  // Implementation
13
12
  // ============================================================================
@@ -1,7 +1,6 @@
1
1
  import { describe, it, expect, vi, afterEach } from 'vitest';
2
2
  import { z } from 'zod';
3
3
  import { createFormStore } from './createFormStore.svelte';
4
- import { flushSync } from 'svelte';
5
4
  const testSchema = z.object({
6
5
  name: z.string().min(1, 'Name is required'),
7
6
  email: z.string().email('Invalid email'),
package/dist/index.js CHANGED
@@ -1,57 +1,57 @@
1
- // =============================================================================
2
- // PRIMITIVES - Pure visual components (Layer 1)
3
- // =============================================================================
4
-
5
- export * from './primitives/index.js';
6
-
7
- // =============================================================================
8
- // COMPONENTS - Semantic wrappers and layout components
9
- // =============================================================================
10
-
11
- export * from './components/index.js';
12
-
13
- // =============================================================================
14
- // RECIPES - Domain-agnostic compositions (Layer 2)
15
- // =============================================================================
16
-
17
- export * from './recipes/index.js';
18
-
19
- // =============================================================================
20
- // PATTERNS - Layout & flow components (Layer 3)
21
- // =============================================================================
22
-
23
- export * from './patterns/index.js';
24
-
25
- // =============================================================================
26
- // CALENDAR - Domain components (deferred migration to apps)
27
- // =============================================================================
28
-
29
- export * from './calendar/index.js';
30
-
31
- // =============================================================================
32
- // NON-COMPONENT EXPORTS
33
- // =============================================================================
34
-
35
- // Note: config.js and telemetry.js removed - they use import.meta.env which
36
- // is Vite-specific. Apps should define their own config/telemetry locally.
37
-
38
- // Constants
39
- export * from './constants/formOptions.js';
40
- export * from './constants/validation.js';
41
-
42
- // Presets - Domain-to-color mappings for migration
43
- export * from './presets/index.js';
44
-
45
- // Utils / Actions
46
- export { portal } from './utils/portal.js';
47
- export { safeSlide, bloom } from './utils/transitions.js';
48
- export { optimizeImage, supportsWebP, createImage } from './utils/imageOptimizer.js';
49
- export {
50
- triggerHaptic,
51
- isHapticAvailable,
52
- getHapticForButtonVariant,
53
- } from './utils/haptic.js';
54
- /** @typedef {import('./utils/haptic.js').HapticStyle} HapticStyle */
55
-
56
- // Design Tokens
57
- export { typography } from './tokens/typography.js';
1
+ // =============================================================================
2
+ // PRIMITIVES - Pure visual components (Layer 1)
3
+ // =============================================================================
4
+
5
+ export * from './primitives/index.js';
6
+
7
+ // =============================================================================
8
+ // COMPONENTS - Semantic wrappers and layout components
9
+ // =============================================================================
10
+
11
+ export * from './components/index.js';
12
+
13
+ // =============================================================================
14
+ // RECIPES - Domain-agnostic compositions (Layer 2)
15
+ // =============================================================================
16
+
17
+ export * from './recipes/index.js';
18
+
19
+ // =============================================================================
20
+ // PATTERNS - Layout & flow components (Layer 3)
21
+ // =============================================================================
22
+
23
+ export * from './patterns/index.js';
24
+
25
+ // =============================================================================
26
+ // CALENDAR - Domain components (deferred migration to apps)
27
+ // =============================================================================
28
+
29
+ export * from './calendar/index.js';
30
+
31
+ // =============================================================================
32
+ // NON-COMPONENT EXPORTS
33
+ // =============================================================================
34
+
35
+ // Note: config.js and telemetry.js removed - they use import.meta.env which
36
+ // is Vite-specific. Apps should define their own config/telemetry locally.
37
+
38
+ // Constants
39
+ export * from './constants/formOptions.js';
40
+ export * from './constants/validation.js';
41
+
42
+ // Presets - Domain-to-color mappings for migration
43
+ export * from './presets/index.js';
44
+
45
+ // Utils / Actions
46
+ export { portal } from './utils/portal.js';
47
+ export { safeSlide, bloom } from './utils/transitions.js';
48
+ export { optimizeImage, supportsWebP, createImage } from './utils/imageOptimizer.js';
49
+ export {
50
+ triggerHaptic,
51
+ isHapticAvailable,
52
+ getHapticForButtonVariant,
53
+ } from './utils/haptic.js';
54
+ /** @typedef {import('./utils/haptic.js').HapticStyle} HapticStyle */
55
+
56
+ // Design Tokens
57
+ export { typography } from './tokens/typography.js';