@devalok/shilp-sutra 0.49.2 → 0.49.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 (315) hide show
  1. package/dist/_chunks/badge-group.js.map +1 -1
  2. package/dist/_chunks/block-shell.js.map +1 -1
  3. package/dist/_chunks/chart-container.js.map +1 -1
  4. package/dist/_chunks/chat.js.map +1 -1
  5. package/dist/_chunks/colors.js.map +1 -1
  6. package/dist/_chunks/document-preview.js.map +1 -1
  7. package/dist/_chunks/emoji-suggestion.js.map +1 -1
  8. package/dist/_chunks/emoji.js +2 -2
  9. package/dist/_chunks/emoji.js.map +1 -1
  10. package/dist/_chunks/field-state.js.map +1 -1
  11. package/dist/_chunks/grid-lines.js.map +1 -1
  12. package/dist/_chunks/image-preview.js.map +1 -1
  13. package/dist/_chunks/keybinding.js.map +1 -1
  14. package/dist/_chunks/link-context.js.map +1 -1
  15. package/dist/_chunks/mention-suggestion.js.map +1 -1
  16. package/dist/_chunks/motion-provider.js.map +1 -1
  17. package/dist/_chunks/normalize-icon.js.map +1 -1
  18. package/dist/_chunks/oauth-button.js.map +1 -1
  19. package/dist/_chunks/popover.js.map +1 -1
  20. package/dist/_chunks/primitives.js +1129 -1162
  21. package/dist/_chunks/primitives.js.map +1 -1
  22. package/dist/_chunks/shared.js.map +1 -1
  23. package/dist/_chunks/success.js.map +1 -1
  24. package/dist/_chunks/tiptap.js +4283 -3460
  25. package/dist/_chunks/tiptap.js.map +1 -1
  26. package/dist/_chunks/tooltip.js.map +1 -1
  27. package/dist/_chunks/tree-view.js +1 -1
  28. package/dist/_chunks/tree-view.js.map +1 -1
  29. package/dist/_chunks/use-calendar.js.map +1 -1
  30. package/dist/_chunks/use-controllable-open.js.map +1 -1
  31. package/dist/_chunks/vendor-client.js +86 -59
  32. package/dist/_chunks/vendor-client.js.map +1 -1
  33. package/dist/_chunks/vendor-utils.js +555 -513
  34. package/dist/_chunks/vendor-utils.js.map +1 -1
  35. package/dist/ai/ai-command-provider.d.ts +1 -1
  36. package/dist/ai/ai-command-provider.d.ts.map +1 -1
  37. package/dist/ai/ai-command-provider.js.map +1 -1
  38. package/dist/ai/block-renderer.js.map +1 -1
  39. package/dist/ai/blocks/block-shell.d.ts +1 -1
  40. package/dist/ai/blocks/block-shell.d.ts.map +1 -1
  41. package/dist/ai/blocks/block-table.d.ts +1 -1
  42. package/dist/ai/blocks/block-table.d.ts.map +1 -1
  43. package/dist/ai/blocks/confirm.d.ts +1 -1
  44. package/dist/ai/blocks/confirm.d.ts.map +1 -1
  45. package/dist/ai/blocks/divider.d.ts +1 -1
  46. package/dist/ai/blocks/divider.d.ts.map +1 -1
  47. package/dist/ai/blocks/error.d.ts +1 -1
  48. package/dist/ai/blocks/error.d.ts.map +1 -1
  49. package/dist/ai/blocks/error.js.map +1 -1
  50. package/dist/ai/blocks/info.d.ts +1 -1
  51. package/dist/ai/blocks/info.d.ts.map +1 -1
  52. package/dist/ai/blocks/loading.d.ts +1 -1
  53. package/dist/ai/blocks/loading.d.ts.map +1 -1
  54. package/dist/ai/blocks/stat-row.d.ts +1 -1
  55. package/dist/ai/blocks/stat-row.d.ts.map +1 -1
  56. package/dist/ai/blocks/success.d.ts +1 -1
  57. package/dist/ai/blocks/success.d.ts.map +1 -1
  58. package/dist/ai/blocks/text.d.ts +1 -1
  59. package/dist/ai/blocks/text.d.ts.map +1 -1
  60. package/dist/ai/blocks/text.js.map +1 -1
  61. package/dist/ai/command-bar.js.map +1 -1
  62. package/dist/ai/conversation.js.map +1 -1
  63. package/dist/ai/devadoot-icon.d.ts +1 -1
  64. package/dist/ai/devadoot-icon.d.ts.map +1 -1
  65. package/dist/ai/index.js.map +1 -1
  66. package/dist/composed/activity-feed.js.map +1 -1
  67. package/dist/composed/avatar-group.js.map +1 -1
  68. package/dist/composed/bulk-action-bar.js.map +1 -1
  69. package/dist/composed/command-palette.js.map +1 -1
  70. package/dist/composed/confirm-dialog.js.map +1 -1
  71. package/dist/composed/content-card.js.map +1 -1
  72. package/dist/composed/date-picker/index.js.map +1 -1
  73. package/dist/composed/deadline-indicator.js.map +1 -1
  74. package/dist/composed/emoji-picker.d.ts +2 -2
  75. package/dist/composed/emoji-picker.d.ts.map +1 -1
  76. package/dist/composed/emoji-picker.js.map +1 -1
  77. package/dist/composed/empty-state.js.map +1 -1
  78. package/dist/composed/error-boundary.d.ts +1 -1
  79. package/dist/composed/error-boundary.js.map +1 -1
  80. package/dist/composed/extensions/emoji-node.js.map +1 -1
  81. package/dist/composed/file-preview/audio-preview.d.ts +2 -1
  82. package/dist/composed/file-preview/audio-preview.d.ts.map +1 -1
  83. package/dist/composed/file-preview/document-preview.d.ts +2 -1
  84. package/dist/composed/file-preview/document-preview.d.ts.map +1 -1
  85. package/dist/composed/file-preview/embed-preview.d.ts +2 -1
  86. package/dist/composed/file-preview/embed-preview.d.ts.map +1 -1
  87. package/dist/composed/file-preview/image-preview.d.ts +2 -1
  88. package/dist/composed/file-preview/image-preview.d.ts.map +1 -1
  89. package/dist/composed/file-preview/shared.d.ts +5 -5
  90. package/dist/composed/file-preview/shared.d.ts.map +1 -1
  91. package/dist/composed/file-preview/video-preview.d.ts +2 -1
  92. package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
  93. package/dist/composed/file-preview.d.ts +1 -1
  94. package/dist/composed/file-preview.d.ts.map +1 -1
  95. package/dist/composed/file-preview.js.map +1 -1
  96. package/dist/composed/filter-bar.d.ts +2 -2
  97. package/dist/composed/filter-bar.d.ts.map +1 -1
  98. package/dist/composed/filter-bar.js.map +1 -1
  99. package/dist/composed/form-section.js.map +1 -1
  100. package/dist/composed/global-loading.js.map +1 -1
  101. package/dist/composed/inline-edit.js.map +1 -1
  102. package/dist/composed/lib/string-utils.js.map +1 -1
  103. package/dist/composed/loading-skeleton.js.map +1 -1
  104. package/dist/composed/markdown-viewer.js.map +1 -1
  105. package/dist/composed/master-detail.d.ts +3 -3
  106. package/dist/composed/master-detail.d.ts.map +1 -1
  107. package/dist/composed/master-detail.js.map +1 -1
  108. package/dist/composed/member-picker.js.map +1 -1
  109. package/dist/composed/multi-select-popover.js.map +1 -1
  110. package/dist/composed/page-header.js.map +1 -1
  111. package/dist/composed/page-skeletons.js.map +1 -1
  112. package/dist/composed/priority-indicator.js.map +1 -1
  113. package/dist/composed/responsive-modal.js +8 -4
  114. package/dist/composed/responsive-modal.js.map +1 -1
  115. package/dist/composed/rich-chat-input/attachment-strip.d.ts +2 -1
  116. package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
  117. package/dist/composed/rich-chat-input/chat-toolbar.d.ts +17 -17
  118. package/dist/composed/rich-chat-input/chat-toolbar.d.ts.map +1 -1
  119. package/dist/composed/rich-chat-input/recording-overlay.d.ts +2 -1
  120. package/dist/composed/rich-chat-input/recording-overlay.d.ts.map +1 -1
  121. package/dist/composed/rich-chat-input/reply-banner.d.ts +2 -1
  122. package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
  123. package/dist/composed/rich-chat-input/schedule-send.d.ts +4 -3
  124. package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
  125. package/dist/composed/rich-chat-input.js +2 -1
  126. package/dist/composed/rich-chat-input.js.map +1 -1
  127. package/dist/composed/rich-text-editor.js +2 -1
  128. package/dist/composed/rich-text-editor.js.map +1 -1
  129. package/dist/composed/schedule-view.js.map +1 -1
  130. package/dist/composed/simple-tooltip.js.map +1 -1
  131. package/dist/composed/status-badge.js.map +1 -1
  132. package/dist/hooks/use-color-mode.js +2 -1
  133. package/dist/hooks/use-color-mode.js.map +1 -1
  134. package/dist/hooks/use-mobile.js.map +1 -1
  135. package/dist/hooks/use-touch-device.js.map +1 -1
  136. package/dist/hooks/use-viewport-height.js.map +1 -1
  137. package/dist/motion/index.js.map +1 -1
  138. package/dist/motion/motion-provider.d.ts +1 -1
  139. package/dist/motion/motion-provider.d.ts.map +1 -1
  140. package/dist/motion/primitives-index.js.map +1 -1
  141. package/dist/primitives/_internal/react-dismissable-layer.d.ts.map +1 -1
  142. package/dist/primitives/_internal/react-focus-scope.d.ts.map +1 -1
  143. package/dist/shell/app-command-palette.js.map +1 -1
  144. package/dist/shell/bottom-navbar.js.map +1 -1
  145. package/dist/shell/command-registry.d.ts +1 -1
  146. package/dist/shell/command-registry.d.ts.map +1 -1
  147. package/dist/shell/command-registry.js.map +1 -1
  148. package/dist/shell/notification-center.js.map +1 -1
  149. package/dist/shell/notification-preferences.js.map +1 -1
  150. package/dist/shell/sidebar.js.map +1 -1
  151. package/dist/shell/top-bar.js.map +1 -1
  152. package/dist/ui/accordion.js.map +1 -1
  153. package/dist/ui/alert-dialog.js.map +1 -1
  154. package/dist/ui/alert.js.map +1 -1
  155. package/dist/ui/aspect-ratio.js.map +1 -1
  156. package/dist/ui/autocomplete.js.map +1 -1
  157. package/dist/ui/avatar.d.ts +1 -1
  158. package/dist/ui/avatar.js.map +1 -1
  159. package/dist/ui/badge-group.d.ts +1 -1
  160. package/dist/ui/badge-group.d.ts.map +1 -1
  161. package/dist/ui/badge-indicator.d.ts +1 -1
  162. package/dist/ui/badge-indicator.d.ts.map +1 -1
  163. package/dist/ui/badge-indicator.js.map +1 -1
  164. package/dist/ui/banner.js.map +1 -1
  165. package/dist/ui/breadcrumb.d.ts +2 -2
  166. package/dist/ui/breadcrumb.js.map +1 -1
  167. package/dist/ui/button-group.js.map +1 -1
  168. package/dist/ui/button-processing.d.ts +2 -1
  169. package/dist/ui/button-processing.d.ts.map +1 -1
  170. package/dist/ui/button-processing.js.map +1 -1
  171. package/dist/ui/button.js.map +1 -1
  172. package/dist/ui/card.js +1 -1
  173. package/dist/ui/card.js.map +1 -1
  174. package/dist/ui/charts/_internal/axes.d.ts +2 -1
  175. package/dist/ui/charts/_internal/axes.d.ts.map +1 -1
  176. package/dist/ui/charts/_internal/grid-lines.d.ts +2 -1
  177. package/dist/ui/charts/_internal/grid-lines.d.ts.map +1 -1
  178. package/dist/ui/charts/_internal/legend.d.ts +2 -1
  179. package/dist/ui/charts/_internal/legend.d.ts.map +1 -1
  180. package/dist/ui/charts/_internal/tooltip.d.ts +1 -1
  181. package/dist/ui/charts/_internal/tooltip.d.ts.map +1 -1
  182. package/dist/ui/charts/area-chart.js.map +1 -1
  183. package/dist/ui/charts/bar-chart.js.map +1 -1
  184. package/dist/ui/charts/gauge-chart.js.map +1 -1
  185. package/dist/ui/charts/line-chart.js.map +1 -1
  186. package/dist/ui/charts/pie-chart.js.map +1 -1
  187. package/dist/ui/charts/radar-chart.js.map +1 -1
  188. package/dist/ui/charts/sparkline.js +2 -2
  189. package/dist/ui/charts/sparkline.js.map +1 -1
  190. package/dist/ui/chat/date-separator.d.ts +2 -1
  191. package/dist/ui/chat/date-separator.d.ts.map +1 -1
  192. package/dist/ui/chat/message.d.ts +8 -8
  193. package/dist/ui/chat/message.d.ts.map +1 -1
  194. package/dist/ui/chat/typing-indicator.d.ts +2 -1
  195. package/dist/ui/chat/typing-indicator.d.ts.map +1 -1
  196. package/dist/ui/chat/unread-separator.d.ts +2 -1
  197. package/dist/ui/chat/unread-separator.d.ts.map +1 -1
  198. package/dist/ui/checkbox.js.map +1 -1
  199. package/dist/ui/code.js.map +1 -1
  200. package/dist/ui/collapsible.js.map +1 -1
  201. package/dist/ui/color-input.js.map +1 -1
  202. package/dist/ui/color-swatch.js.map +1 -1
  203. package/dist/ui/combobox.js +15 -6
  204. package/dist/ui/combobox.js.map +1 -1
  205. package/dist/ui/container.js.map +1 -1
  206. package/dist/ui/context-menu.d.ts +2 -2
  207. package/dist/ui/context-menu.js.map +1 -1
  208. package/dist/ui/data-table-body.d.ts +1 -1
  209. package/dist/ui/data-table-body.d.ts.map +1 -1
  210. package/dist/ui/data-table-body.js +1 -1
  211. package/dist/ui/data-table-body.js.map +1 -1
  212. package/dist/ui/data-table-bulk-actions.d.ts +2 -1
  213. package/dist/ui/data-table-bulk-actions.d.ts.map +1 -1
  214. package/dist/ui/data-table-bulk-actions.js.map +1 -1
  215. package/dist/ui/data-table-card.d.ts +1 -1
  216. package/dist/ui/data-table-card.d.ts.map +1 -1
  217. package/dist/ui/data-table-card.js.map +1 -1
  218. package/dist/ui/data-table-context.d.ts +1 -1
  219. package/dist/ui/data-table-context.d.ts.map +1 -1
  220. package/dist/ui/data-table-context.js.map +1 -1
  221. package/dist/ui/data-table-header.d.ts +2 -1
  222. package/dist/ui/data-table-header.d.ts.map +1 -1
  223. package/dist/ui/data-table-header.js.map +1 -1
  224. package/dist/ui/data-table-pagination.d.ts +2 -1
  225. package/dist/ui/data-table-pagination.d.ts.map +1 -1
  226. package/dist/ui/data-table-pagination.js.map +1 -1
  227. package/dist/ui/data-table-toolbar.d.ts +1 -1
  228. package/dist/ui/data-table-toolbar.d.ts.map +1 -1
  229. package/dist/ui/data-table-toolbar.js.map +1 -1
  230. package/dist/ui/data-table.d.ts +1 -1
  231. package/dist/ui/data-table.d.ts.map +1 -1
  232. package/dist/ui/data-table.js.map +1 -1
  233. package/dist/ui/devalok-grain.d.ts +2 -1
  234. package/dist/ui/devalok-grain.d.ts.map +1 -1
  235. package/dist/ui/devalok-grain.js.map +1 -1
  236. package/dist/ui/dialog.js.map +1 -1
  237. package/dist/ui/dot.js +1 -1
  238. package/dist/ui/dot.js.map +1 -1
  239. package/dist/ui/dropdown-menu.d.ts +1 -1
  240. package/dist/ui/dropdown-menu.js.map +1 -1
  241. package/dist/ui/file-upload.js.map +1 -1
  242. package/dist/ui/form.js.map +1 -1
  243. package/dist/ui/hover-card.js.map +1 -1
  244. package/dist/ui/icon-button.js.map +1 -1
  245. package/dist/ui/icon-context.d.ts +1 -1
  246. package/dist/ui/icon-context.d.ts.map +1 -1
  247. package/dist/ui/icon-context.js.map +1 -1
  248. package/dist/ui/icon-group.js.map +1 -1
  249. package/dist/ui/icon.js.map +1 -1
  250. package/dist/ui/index.js.map +1 -1
  251. package/dist/ui/input-otp.js.map +1 -1
  252. package/dist/ui/input.js.map +1 -1
  253. package/dist/ui/label.js.map +1 -1
  254. package/dist/ui/lib/bottom-sheet.d.ts +1 -1
  255. package/dist/ui/lib/bottom-sheet.d.ts.map +1 -1
  256. package/dist/ui/lib/date-utils.js.map +1 -1
  257. package/dist/ui/lib/link-context.d.ts +1 -1
  258. package/dist/ui/lib/link-context.d.ts.map +1 -1
  259. package/dist/ui/lib/motion.js.map +1 -1
  260. package/dist/ui/lib/utils.js.map +1 -1
  261. package/dist/ui/link.js.map +1 -1
  262. package/dist/ui/menubar.d.ts +1 -1
  263. package/dist/ui/menubar.js.map +1 -1
  264. package/dist/ui/navigation-menu.js +14 -9
  265. package/dist/ui/navigation-menu.js.map +1 -1
  266. package/dist/ui/number-input.js.map +1 -1
  267. package/dist/ui/pagination.js.map +1 -1
  268. package/dist/ui/progress-ring.js.map +1 -1
  269. package/dist/ui/progress.js.map +1 -1
  270. package/dist/ui/radio.js.map +1 -1
  271. package/dist/ui/search-input.js.map +1 -1
  272. package/dist/ui/segmented-control.js.map +1 -1
  273. package/dist/ui/select.js.map +1 -1
  274. package/dist/ui/separator.js.map +1 -1
  275. package/dist/ui/sheet.js.map +1 -1
  276. package/dist/ui/sidebar.js +1 -1
  277. package/dist/ui/sidebar.js.map +1 -1
  278. package/dist/ui/skeleton.js.map +1 -1
  279. package/dist/ui/slider.js.map +1 -1
  280. package/dist/ui/spinner.js.map +1 -1
  281. package/dist/ui/split-button.js.map +1 -1
  282. package/dist/ui/stack.js.map +1 -1
  283. package/dist/ui/stat-card.js.map +1 -1
  284. package/dist/ui/stat-flash.d.ts +2 -1
  285. package/dist/ui/stat-flash.d.ts.map +1 -1
  286. package/dist/ui/stat-flash.js +1 -1
  287. package/dist/ui/stat-flash.js.map +1 -1
  288. package/dist/ui/stepper.d.ts +1 -1
  289. package/dist/ui/stepper.d.ts.map +1 -1
  290. package/dist/ui/stepper.js +1 -1
  291. package/dist/ui/stepper.js.map +1 -1
  292. package/dist/ui/surface.js.map +1 -1
  293. package/dist/ui/switch.d.ts +1 -1
  294. package/dist/ui/switch.js.map +1 -1
  295. package/dist/ui/table-row-link.js.map +1 -1
  296. package/dist/ui/table.js.map +1 -1
  297. package/dist/ui/tabs.js.map +1 -1
  298. package/dist/ui/text.js.map +1 -1
  299. package/dist/ui/textarea.js.map +1 -1
  300. package/dist/ui/toast-registry.js.map +1 -1
  301. package/dist/ui/toast.d.ts +4 -4
  302. package/dist/ui/toast.d.ts.map +1 -1
  303. package/dist/ui/toast.js +5 -3
  304. package/dist/ui/toast.js.map +1 -1
  305. package/dist/ui/toaster.js.map +1 -1
  306. package/dist/ui/toggle-group.js.map +1 -1
  307. package/dist/ui/toggle.js.map +1 -1
  308. package/dist/ui/tooltip.js.map +1 -1
  309. package/dist/ui/truncated-text.js.map +1 -1
  310. package/dist/ui/visually-hidden.js.map +1 -1
  311. package/llms.txt +1 -1
  312. package/mcp-manifest.json +1 -1
  313. package/package.json +21 -21
  314. package/skill/SKILL.md +1 -1
  315. package/skill/references/components.md +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/composed/date-picker/month-picker.tsx","../../../src/composed/date-picker/year-picker.tsx","../../../src/composed/date-picker/date-picker.tsx","../../../src/composed/date-picker/presets.tsx","../../../src/composed/date-picker/date-range-picker.tsx","../../../src/composed/date-picker/date-time-picker.tsx","../../../src/composed/date-picker/time-picker.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../ui/lib/utils'\n\nconst MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n]\n\nexport interface MonthPickerProps extends React.ComponentPropsWithoutRef<'div'> {\n currentYear: number\n selectedMonth?: number // 0-11\n onMonthSelect: (month: number) => void\n minDate?: Date\n maxDate?: Date\n}\n\nexport const MonthPicker = React.forwardRef<HTMLDivElement, MonthPickerProps>(\n function MonthPicker({\n currentYear,\n selectedMonth,\n onMonthSelect,\n minDate,\n maxDate,\n className,\n ...props\n}, ref) {\n const COLS = 4\n const [focusedIndex, setFocusedIndex] = React.useState(selectedMonth ?? 0)\n const buttonRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n const isMonthDisabled = (index: number) =>\n (minDate != null &&\n (currentYear < minDate.getFullYear() ||\n (currentYear === minDate.getFullYear() && index < minDate.getMonth()))) ||\n (maxDate != null &&\n (currentYear > maxDate.getFullYear() ||\n (currentYear === maxDate.getFullYear() && index > maxDate.getMonth())))\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n let next = focusedIndex\n switch (e.key) {\n case 'ArrowRight': next = Math.min(11, focusedIndex + 1); break\n case 'ArrowLeft': next = Math.max(0, focusedIndex - 1); break\n case 'ArrowDown': next = Math.min(11, focusedIndex + COLS); break\n case 'ArrowUp': next = Math.max(0, focusedIndex - COLS); break\n case 'Home': next = 0; break\n case 'End': next = 11; break\n default: return\n }\n e.preventDefault()\n // Skip disabled months\n while (next !== focusedIndex && isMonthDisabled(next)) {\n next += (e.key === 'ArrowLeft' || e.key === 'ArrowUp') ? -1 : 1\n if (next < 0 || next > 11) return\n }\n setFocusedIndex(next)\n buttonRefs.current[next]?.focus()\n }\n\n return (\n <div ref={ref} {...props} className={cn(\"w-[252px]\", className)}>\n <div className=\"text-center pb-ds-04 text-ds-md font-semibold text-surface-fg\">\n {currentYear}\n </div>\n <div role=\"grid\" aria-label=\"Month picker\" tabIndex={-1} onKeyDown={handleKeyDown}>\n {[0, 1, 2].map((rowIdx) => (\n <div key={rowIdx} role=\"row\" className=\"grid grid-cols-4 gap-ds-02 mb-ds-02 last:mb-0\">\n {MONTHS.slice(rowIdx * COLS, rowIdx * COLS + COLS).map((label, colIdx) => {\n const index = rowIdx * COLS + colIdx\n const isSelected = index === selectedMonth\n const isDisabled = isMonthDisabled(index)\n\n return (\n <button\n key={label}\n ref={(el) => { buttonRefs.current[index] = el }}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={index === focusedIndex ? 0 : -1}\n disabled={isDisabled || false}\n onClick={() => !isDisabled && onMonthSelect(index)}\n className={cn(\n 'h-ds-sm-plus rounded-control text-ds-md transition-colors focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n isDisabled && 'opacity-action-disabled pointer-events-none cursor-not-allowed',\n isSelected &&\n 'bg-accent-9 text-accent-fg',\n !isSelected &&\n !isDisabled &&\n 'hover:bg-surface-raised-hover text-surface-fg',\n )}\n >\n {label}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n},\n)\n\nMonthPicker.displayName = 'MonthPicker'\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../ui/lib/utils'\n\nexport interface YearPickerProps extends React.ComponentPropsWithoutRef<'div'> {\n currentYear: number\n selectedYear?: number\n onYearSelect: (year: number) => void\n minDate?: Date\n maxDate?: Date\n}\n\nexport const YearPicker = React.forwardRef<HTMLDivElement, YearPickerProps>(\n function YearPicker({\n currentYear,\n selectedYear,\n onYearSelect,\n minDate,\n maxDate,\n className,\n ...props\n}, ref) {\n const COLS = 3\n const startYear = Math.floor(currentYear / 10) * 10\n const years = Array.from({ length: 12 }, (_, i) => startYear + i)\n const [focusedIndex, setFocusedIndex] = React.useState(() => {\n const sel = years.indexOf(selectedYear ?? currentYear)\n return sel >= 0 ? sel : 0\n })\n const buttonRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n const isYearDisabled = (year: number) =>\n (minDate != null && year < minDate.getFullYear()) ||\n (maxDate != null && year > maxDate.getFullYear())\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n let next = focusedIndex\n switch (e.key) {\n case 'ArrowRight': next = Math.min(11, focusedIndex + 1); break\n case 'ArrowLeft': next = Math.max(0, focusedIndex - 1); break\n case 'ArrowDown': next = Math.min(11, focusedIndex + COLS); break\n case 'ArrowUp': next = Math.max(0, focusedIndex - COLS); break\n case 'Home': next = 0; break\n case 'End': next = 11; break\n default: return\n }\n e.preventDefault()\n while (next !== focusedIndex && isYearDisabled(years[next])) {\n next += (e.key === 'ArrowLeft' || e.key === 'ArrowUp') ? -1 : 1\n if (next < 0 || next > 11) return\n }\n setFocusedIndex(next)\n buttonRefs.current[next]?.focus()\n }\n\n return (\n <div ref={ref} {...props} className={cn(\"w-[252px]\", className)}>\n <div className=\"text-center pb-ds-04 text-ds-md font-semibold text-surface-fg\">\n {startYear} &ndash; {startYear + 11}\n </div>\n <div role=\"grid\" aria-label=\"Year picker\" tabIndex={-1} onKeyDown={handleKeyDown}>\n {[0, 1, 2, 3].map((rowIdx) => (\n <div key={rowIdx} role=\"row\" className=\"grid grid-cols-3 gap-ds-02 mb-ds-02 last:mb-0\">\n {years.slice(rowIdx * COLS, rowIdx * COLS + COLS).map((year) => {\n const index = years.indexOf(year)\n const isSelected = year === selectedYear\n const isDisabled = isYearDisabled(year)\n\n return (\n <button\n key={year}\n ref={(el) => { buttonRefs.current[index] = el }}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={index === focusedIndex ? 0 : -1}\n disabled={isDisabled || false}\n onClick={() => !isDisabled && onYearSelect(year)}\n className={cn(\n 'h-ds-sm-plus rounded-control text-ds-md transition-colors focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n isDisabled && 'opacity-action-disabled pointer-events-none cursor-not-allowed',\n isSelected &&\n 'bg-accent-9 text-accent-fg',\n !isSelected &&\n !isDisabled &&\n 'hover:bg-surface-raised-hover text-surface-fg',\n )}\n >\n {year}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n},\n)\n\nYearPicker.displayName = 'YearPicker'\n","'use client'\n\nimport { IconCalendarEvent } from '@tabler/icons-react'\nimport { format, setMonth, setYear } from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\nimport { CalendarGrid } from './calendar-grid'\nimport { MonthPicker } from './month-picker'\nimport { YearPicker } from './year-picker'\n\ntype CalendarView = 'days' | 'months' | 'years'\n\n/**\n * A popover-based date picker with day/month/year drill-down views.\n * Supports min/max date constraints and arbitrary date disabling.\n */\nexport interface DatePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange' | 'value'> {\n /** Currently selected date (controlled). */\n value?: Date | null\n /** Called when a date is selected. Receives null if cleared. */\n onChange?: (date: Date | null) => void\n placeholder?: string\n /** date-fns format string for the trigger display. @default 'MMM d, yyyy' */\n formatStr?: string\n /** Earliest selectable date. */\n minDate?: Date\n /** Latest selectable date. */\n maxDate?: Date\n /** Predicate to disable specific dates (return true to disable). */\n disabledDates?: (date: Date) => boolean\n className?: string\n}\n\nconst DatePicker = React.forwardRef<HTMLButtonElement, DatePickerProps>(\n function DatePicker(\n {\n value,\n onChange,\n placeholder = 'Pick a date',\n className,\n formatStr = 'MMM d, yyyy',\n minDate,\n maxDate,\n disabledDates,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(\n value ?? new Date(),\n )\n const [view, setView] = React.useState<CalendarView>('days')\n\n // Reset view when popover closes\n React.useEffect(() => {\n if (!open) setView('days')\n }, [open])\n\n const handleSelect = (date: Date) => {\n onChange?.(date)\n setOpen(false)\n }\n\n const handleHeaderClick = () => {\n setView((prev) => (prev === 'days' ? 'months' : 'years'))\n }\n\n const handleMonthSelect = (month: number) => {\n setCurrentMonth((prev) => setMonth(prev, month))\n setView('days')\n }\n\n const handleYearSelect = (year: number) => {\n setCurrentMonth((prev) => setYear(prev, year))\n setView('months')\n }\n\n const renderView = () => {\n switch (view) {\n case 'years':\n return (\n <YearPicker\n currentYear={currentMonth.getFullYear()}\n selectedYear={value?.getFullYear()}\n onYearSelect={handleYearSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n case 'months':\n return (\n <MonthPicker\n currentYear={currentMonth.getFullYear()}\n selectedMonth={value?.getMonth()}\n onMonthSelect={handleMonthSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n default:\n return (\n <CalendarGrid\n currentMonth={currentMonth}\n selected={value}\n onSelect={handleSelect}\n onMonthChange={setCurrentMonth}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n }\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={value ? `Change date, ${format(value, formatStr)}` : placeholder}\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n className,\n )}\n >\n <Icon icon={IconCalendarEvent} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n value\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {value ? format(value, formatStr) : placeholder}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n {renderView()}\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nDatePicker.displayName = 'DatePicker'\n\nexport { DatePicker }\n","'use client'\n\nimport {\n endOfDay,\n endOfMonth,\n startOfDay,\n startOfMonth,\n startOfYear,\n subDays,\n subMonths,\n} from 'date-fns'\nimport * as React from 'react'\n\nimport { cn } from '../../ui/lib/utils'\n\nexport type PresetKey =\n | 'today'\n | 'yesterday'\n | 'last7days'\n | 'last30days'\n | 'thisMonth'\n | 'lastMonth'\n | 'thisYear'\n\nexport interface PresetsProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'onSelect'> {\n presets: PresetKey[]\n onSelect: (start: Date, end: Date) => void\n className?: string\n}\n\ninterface PresetDefinition {\n label: string\n getRange: () => { start: Date; end: Date }\n}\n\nconst PRESET_MAP: Record<PresetKey, PresetDefinition> = {\n today: {\n label: 'Today',\n getRange: () => {\n const now = new Date()\n return { start: startOfDay(now), end: endOfDay(now) }\n },\n },\n yesterday: {\n label: 'Yesterday',\n getRange: () => {\n const yesterday = subDays(new Date(), 1)\n return { start: startOfDay(yesterday), end: endOfDay(yesterday) }\n },\n },\n last7days: {\n label: 'Last 7 days',\n getRange: () => {\n const now = new Date()\n return { start: startOfDay(subDays(now, 6)), end: endOfDay(now) }\n },\n },\n last30days: {\n label: 'Last 30 days',\n getRange: () => {\n const now = new Date()\n return { start: startOfDay(subDays(now, 29)), end: endOfDay(now) }\n },\n },\n thisMonth: {\n label: 'This month',\n getRange: () => {\n const now = new Date()\n return { start: startOfMonth(now), end: endOfMonth(now) }\n },\n },\n lastMonth: {\n label: 'Last month',\n getRange: () => {\n const now = new Date()\n const last = subMonths(now, 1)\n return { start: startOfMonth(last), end: endOfMonth(last) }\n },\n },\n thisYear: {\n label: 'This year',\n getRange: () => {\n const now = new Date()\n return { start: startOfYear(now), end: endOfDay(now) }\n },\n },\n}\n\nexport const Presets = React.forwardRef<HTMLDivElement, PresetsProps>(\n function Presets({ presets, onSelect, className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn('flex flex-col gap-ds-01', className)}>\n {presets.map((key) => {\n const preset = PRESET_MAP[key]\n if (!preset) return null\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => {\n const { start, end } = preset.getRange()\n onSelect(start, end)\n }}\n className={cn(\n 'h-ds-sm w-full rounded-control px-ds-03 text-left text-ds-sm',\n 'text-surface-fg transition-colors',\n 'hover:bg-surface-raised-hover',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9',\n )}\n >\n {preset.label}\n </button>\n )\n })}\n </div>\n )\n},\n)\n\nPresets.displayName = 'Presets'\n","'use client'\n\nimport { IconCalendarEvent } from '@tabler/icons-react'\nimport { addMonths,format, isAfter, isBefore, setMonth, setYear } from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\nimport { CalendarGrid } from './calendar-grid'\nimport { MonthPicker } from './month-picker'\nimport type { PresetKey } from './presets'\nimport { Presets } from './presets'\nimport { YearPicker } from './year-picker'\n\ntype CalendarView = 'days' | 'months' | 'years'\n\nexport interface DateRangePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange'> {\n startDate?: Date | null\n endDate?: Date | null\n onChange?: (range: { start: Date | null; end: Date | null }) => void\n placeholder?: string\n className?: string\n formatStr?: string\n minDate?: Date\n maxDate?: Date\n disabledDates?: (date: Date) => boolean\n /** Show a presets sidebar with quick date range selections */\n presets?: PresetKey[]\n /** Number of calendar months to display side by side (default: 1) */\n numberOfMonths?: number\n}\n\nconst DateRangePicker = React.forwardRef<HTMLButtonElement, DateRangePickerProps>(\n function DateRangePicker(\n {\n startDate,\n endDate,\n onChange,\n placeholder = 'Pick a date range',\n className,\n formatStr = 'MMM d, yyyy',\n minDate,\n maxDate,\n disabledDates,\n presets,\n numberOfMonths = 1,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(\n startDate ?? new Date(),\n )\n const [rangeStart, setRangeStart] = React.useState<Date | null>(\n startDate ?? null,\n )\n const [rangeEnd, setRangeEnd] = React.useState<Date | null>(\n endDate ?? null,\n )\n const [hoverDate, setHoverDate] = React.useState<Date | null>(null)\n const [view, setView] = React.useState<CalendarView>('days')\n\n const monthCount = Math.max(1, numberOfMonths)\n\n React.useEffect(() => {\n setRangeStart(startDate ?? null)\n setRangeEnd(endDate ?? null)\n }, [startDate, endDate])\n\n // Reset view when popover closes\n React.useEffect(() => {\n if (!open) setView('days')\n }, [open])\n\n const handleSelect = (date: Date) => {\n if (!rangeStart || (rangeStart && rangeEnd)) {\n setRangeStart(date)\n setRangeEnd(null)\n } else {\n const start = isBefore(date, rangeStart) ? date : rangeStart\n const end = isAfter(date, rangeStart) ? date : rangeStart\n setRangeStart(start)\n setRangeEnd(end)\n onChange?.({ start, end })\n setOpen(false)\n }\n }\n\n const handlePresetSelect = (start: Date, end: Date) => {\n setRangeStart(start)\n setRangeEnd(end)\n onChange?.({ start, end })\n setOpen(false)\n }\n\n const handleHeaderClick = () => {\n setView((prev) => (prev === 'days' ? 'months' : 'years'))\n }\n\n const handleMonthSelect = (month: number) => {\n setCurrentMonth((prev) => setMonth(prev, month))\n setView('days')\n }\n\n const handleYearSelect = (year: number) => {\n setCurrentMonth((prev) => setYear(prev, year))\n setView('months')\n }\n\n const displayText = () => {\n if (rangeStart && rangeEnd) {\n return `${format(rangeStart, formatStr)} - ${format(rangeEnd, formatStr)}`\n }\n return placeholder\n }\n\n const renderCalendarGrids = () => {\n if (monthCount === 1) {\n return (\n <CalendarGrid\n currentMonth={currentMonth}\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n hoverDate={hoverDate}\n onSelect={handleSelect}\n onHover={setHoverDate}\n onMonthChange={setCurrentMonth}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n }\n\n return (\n <div className=\"flex flex-row gap-ds-04\">\n {Array.from({ length: monthCount }, (_, i) => (\n <CalendarGrid\n key={i}\n currentMonth={addMonths(currentMonth, i)}\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n hoverDate={hoverDate}\n onSelect={handleSelect}\n onHover={setHoverDate}\n onMonthChange={(date) => {\n // Adjust so the first grid stays in sync\n setCurrentMonth(addMonths(date, -i))\n }}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n hidePrevNav={i > 0}\n hideNextNav={i < monthCount - 1}\n />\n ))}\n </div>\n )\n }\n\n const renderView = () => {\n switch (view) {\n case 'years':\n return (\n <YearPicker\n currentYear={currentMonth.getFullYear()}\n selectedYear={rangeStart?.getFullYear()}\n onYearSelect={handleYearSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n case 'months':\n return (\n <MonthPicker\n currentYear={currentMonth.getFullYear()}\n selectedMonth={rangeStart?.getMonth()}\n onMonthSelect={handleMonthSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n default:\n return renderCalendarGrids()\n }\n }\n\n const hasPresets = presets && presets.length > 0\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={rangeStart && rangeEnd ? `Change date range, ${displayText()}` : placeholder}\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n className,\n )}\n >\n <Icon icon={IconCalendarEvent} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n rangeStart && rangeEnd\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {displayText()}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n {hasPresets ? (\n <div className=\"flex flex-row gap-ds-04\">\n <div className=\"min-w-[140px] border-r border-surface-border-strong pr-ds-04\">\n <Presets presets={presets} onSelect={handlePresetSelect} />\n </div>\n <div>{renderView()}</div>\n </div>\n ) : (\n renderView()\n )}\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nDateRangePicker.displayName = 'DateRangePicker'\n\nexport { DateRangePicker }\n","'use client'\n\nimport { IconCalendarClock } from '@tabler/icons-react'\nimport {\n format,\n setHours,\n setMinutes,\n setMonth,\n setYear,\n} from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\nimport { CalendarGrid } from './calendar-grid'\nimport { MonthPicker } from './month-picker'\nimport { YearPicker } from './year-picker'\n\ntype CalendarView = 'days' | 'months' | 'years'\n\nexport interface DateTimePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange' | 'value'> {\n /** The currently selected date and time. */\n value?: Date | null\n /** Callback fired when the date/time changes. */\n onChange?: (date: Date | null) => void\n /** Earliest selectable date. */\n minDate?: Date\n /** Latest selectable date. */\n maxDate?: Date\n /** Function to disable specific dates. */\n disabledDates?: (date: Date) => boolean\n /** Display format for the time portion: 12-hour with AM/PM or 24-hour. */\n timeFormat?: '12h' | '24h'\n /** Step interval for the minute selector. */\n minuteStep?: number\n /** Placeholder text when no value is set. */\n placeholder?: string\n /** Additional class names for the trigger button. */\n className?: string\n}\n\nfunction padTwo(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nfunction generateRange(start: number, end: number, step: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i += step) {\n result.push(i)\n }\n return result\n}\n\nconst DateTimePicker = React.forwardRef<HTMLButtonElement, DateTimePickerProps>(\n function DateTimePicker(\n {\n value,\n onChange,\n minDate,\n maxDate,\n disabledDates,\n timeFormat = '12h',\n minuteStep = 1,\n placeholder = 'Pick date & time',\n className,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(value ?? new Date())\n const [view, setView] = React.useState<CalendarView>('days')\n\n // Reset view when popover closes\n React.useEffect(() => {\n if (!open) setView('days')\n }, [open])\n\n // Derive time parts\n const hours24 = value ? value.getHours() : 0\n const minutes = value ? value.getMinutes() : 0\n const ampm: 'AM' | 'PM' = hours24 >= 12 ? 'PM' : 'AM'\n const hours12 = hours24 === 0 ? 12 : hours24 > 12 ? hours24 - 12 : hours24\n\n const hoursRange =\n timeFormat === '12h' ? generateRange(1, 12, 1) : generateRange(0, 23, 1)\n const minutesRange = generateRange(0, 59, minuteStep)\n\n const selectedHour = timeFormat === '12h' ? hours12 : hours24\n\n // --- Calendar view handlers ---\n\n const handleDateSelect = (date: Date) => {\n // Merge with existing time part (or default to current time parts)\n let merged = setHours(date, value ? value.getHours() : hours24)\n merged = setMinutes(merged, value ? value.getMinutes() : minutes)\n onChange?.(merged)\n }\n\n const handleHeaderClick = () => {\n setView((prev) => (prev === 'days' ? 'months' : 'years'))\n }\n\n const handleMonthSelect = (month: number) => {\n setCurrentMonth((prev) => setMonth(prev, month))\n setView('days')\n }\n\n const handleYearSelect = (year: number) => {\n setCurrentMonth((prev) => setYear(prev, year))\n setView('months')\n }\n\n // --- Time handlers ---\n\n const handleHourChange = (hour: number) => {\n const base = value ? new Date(value) : new Date()\n let h = hour\n\n if (timeFormat === '12h') {\n const currentAmPm = value ? ampm : 'AM'\n if (currentAmPm === 'AM') {\n h = hour === 12 ? 0 : hour\n } else {\n h = hour === 12 ? 12 : hour + 12\n }\n }\n\n const updated = setHours(base, h)\n onChange?.(updated)\n }\n\n const handleMinuteChange = (minute: number) => {\n const base = value ? new Date(value) : new Date()\n const updated = setMinutes(base, minute)\n onChange?.(updated)\n }\n\n const handleAmPmToggle = (period: 'AM' | 'PM') => {\n const base = value ? new Date(value) : new Date()\n const currentH = base.getHours()\n let newH: number\n\n if (period === 'AM') {\n newH = currentH >= 12 ? currentH - 12 : currentH\n } else {\n newH = currentH < 12 ? currentH + 12 : currentH\n }\n\n onChange?.(setHours(base, newH))\n }\n\n // --- Display text ---\n\n const displayText = React.useMemo(() => {\n if (!value) return null\n const fmt =\n timeFormat === '12h' ? 'MMM d, yyyy h:mm a' : 'MMM d, yyyy HH:mm'\n return format(value, fmt)\n }, [value, timeFormat])\n\n // --- Render calendar view ---\n\n const renderView = () => {\n switch (view) {\n case 'years':\n return (\n <YearPicker\n currentYear={currentMonth.getFullYear()}\n selectedYear={value?.getFullYear()}\n onYearSelect={handleYearSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n case 'months':\n return (\n <MonthPicker\n currentYear={currentMonth.getFullYear()}\n selectedMonth={value?.getMonth()}\n onMonthSelect={handleMonthSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n default:\n return (\n <CalendarGrid\n currentMonth={currentMonth}\n selected={value}\n onSelect={handleDateSelect}\n onMonthChange={setCurrentMonth}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n }\n }\n\n // Compact time selector styles\n const selectBase =\n 'h-ds-sm rounded-control border border-surface-border-strong bg-surface-overlay px-ds-02 text-ds-md text-surface-fg transition-colors duration-fast-01 ease-productive-standard hover:border-surface-border-strong focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 cursor-pointer appearance-none'\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n className,\n )}\n aria-label={displayText ? `Selected: ${displayText}` : placeholder}\n >\n <Icon icon={IconCalendarClock} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n displayText\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {displayText ?? placeholder}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n <div className=\"flex flex-col gap-ds-04\">\n {/* Calendar portion */}\n {renderView()}\n\n {/* Time selection row */}\n {view === 'days' && (\n <div className=\"flex items-center gap-ds-02 border-t border-surface-border-strong pt-ds-04\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Time\n </span>\n\n {/* Hour select */}\n <select\n value={selectedHour ?? ''}\n onChange={(e) => handleHourChange(Number(e.target.value))}\n className={selectBase}\n aria-label=\"Hour\"\n >\n {!value && <option value=\"\">--</option>}\n {hoursRange.map((h) => (\n <option key={h} value={h}>\n {timeFormat === '24h' ? padTwo(h) : h}\n </option>\n ))}\n </select>\n\n <span className=\"text-ds-md font-semibold text-surface-fg-subtle\">\n :\n </span>\n\n {/* Minute select */}\n <select\n value={value ? minutes : ''}\n onChange={(e) => handleMinuteChange(Number(e.target.value))}\n className={selectBase}\n aria-label=\"Minute\"\n >\n {!value && <option value=\"\">--</option>}\n {minutesRange.map((m) => (\n <option key={m} value={m}>\n {padTwo(m)}\n </option>\n ))}\n </select>\n\n {/* AM/PM toggle for 12h */}\n {timeFormat === '12h' && (\n <select\n value={value ? ampm : ''}\n onChange={(e) =>\n handleAmPmToggle(e.target.value as 'AM' | 'PM')\n }\n className={selectBase}\n aria-label=\"AM or PM\"\n >\n {!value && <option value=\"\">--</option>}\n <option value=\"AM\">AM</option>\n <option value=\"PM\">PM</option>\n </select>\n )}\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nDateTimePicker.displayName = 'DateTimePicker'\n\nexport { DateTimePicker }\n","'use client'\n\nimport { IconClock } from '@tabler/icons-react'\nimport { format, setHours, setMinutes, setSeconds } from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\n\nexport interface TimePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange' | 'value'> {\n /** The currently selected time (as a Date object). */\n value?: Date | null\n /** Callback fired when the time changes. */\n onChange?: (date: Date) => void\n /** Display format: 12-hour with AM/PM or 24-hour. */\n format?: '12h' | '24h'\n /** Step interval for minutes column. */\n minuteStep?: number\n /** Step interval for seconds column. */\n secondStep?: number\n /** Whether to show the seconds column. */\n showSeconds?: boolean\n /** Placeholder text when no value is set. */\n placeholder?: string\n /** Additional class names for the trigger button. */\n className?: string\n /** Whether the picker is disabled. */\n disabled?: boolean\n}\n\nfunction generateRange(start: number, end: number, step: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i += step) {\n result.push(i)\n }\n return result\n}\n\nfunction padTwo(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nconst TimePicker = React.forwardRef<HTMLButtonElement, TimePickerProps>(\n function TimePicker(\n {\n value,\n onChange,\n format: timeFormat = '12h',\n minuteStep = 1,\n secondStep = 1,\n showSeconds = false,\n placeholder = 'Pick a time',\n className,\n disabled = false,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n\n // Derive display parts from value\n const hours24 = value ? value.getHours() : null\n const minutes = value ? value.getMinutes() : null\n const seconds = value ? value.getSeconds() : null\n const ampm = hours24 !== null ? (hours24 >= 12 ? 'PM' : 'AM') : null\n\n // For 12h display, convert 24h to 12h\n const hours12 =\n hours24 !== null\n ? hours24 === 0\n ? 12\n : hours24 > 12\n ? hours24 - 12\n : hours24\n : null\n\n const hoursRange =\n timeFormat === '12h' ? generateRange(1, 12, 1) : generateRange(0, 23, 1)\n const minutesRange = generateRange(0, 59, minuteStep)\n const secondsRange = generateRange(0, 59, secondStep)\n\n const createOrUpdateDate = (\n overrides: { hours?: number; minutes?: number; seconds?: number; ampm?: 'AM' | 'PM' },\n ): Date => {\n const base = value ? new Date(value) : new Date()\n\n let h = overrides.hours ?? base.getHours()\n const m = overrides.minutes ?? base.getMinutes()\n const s = overrides.seconds ?? base.getSeconds()\n\n // If we're in 12h mode, we need to convert the 12h value to 24h\n if (timeFormat === '12h' && overrides.hours !== undefined) {\n const currentAmPm = overrides.ampm ?? ampm ?? 'AM'\n if (currentAmPm === 'AM') {\n h = overrides.hours === 12 ? 0 : overrides.hours\n } else {\n h = overrides.hours === 12 ? 12 : overrides.hours + 12\n }\n }\n\n let result = setHours(base, h)\n result = setMinutes(result, m)\n result = setSeconds(result, s)\n return result\n }\n\n const handleHourSelect = (hour: number) => {\n const updated = createOrUpdateDate({ hours: hour })\n onChange?.(updated)\n }\n\n const handleMinuteSelect = (minute: number) => {\n const updated = createOrUpdateDate({ minutes: minute })\n onChange?.(updated)\n }\n\n const handleSecondSelect = (second: number) => {\n const updated = createOrUpdateDate({ seconds: second })\n onChange?.(updated)\n }\n\n const handleAmPmToggle = (period: 'AM' | 'PM') => {\n if (!value) {\n // Create a date with 12:00 in the chosen period\n const h = period === 'AM' ? 0 : 12\n let d = new Date()\n d = setHours(d, h)\n d = setMinutes(d, 0)\n d = setSeconds(d, 0)\n onChange?.(d)\n return\n }\n\n const currentH = value.getHours()\n let newH: number\n\n if (period === 'AM') {\n newH = currentH >= 12 ? currentH - 12 : currentH\n } else {\n newH = currentH < 12 ? currentH + 12 : currentH\n }\n\n onChange?.(setHours(new Date(value), newH))\n }\n\n // Format display string\n const displayText = React.useMemo(() => {\n if (!value) return null\n if (timeFormat === '12h') {\n const fmt = showSeconds ? 'h:mm:ss a' : 'h:mm a'\n return format(value, fmt)\n }\n const fmt = showSeconds ? 'HH:mm:ss' : 'HH:mm'\n return format(value, fmt)\n }, [value, timeFormat, showSeconds])\n\n const selectedHour = timeFormat === '12h' ? hours12 : hours24\n\n const columnClass =\n 'flex flex-col gap-ds-01 overflow-y-auto max-h-[200px] px-ds-01'\n\n const itemBase =\n 'flex h-ds-sm w-full items-center justify-center rounded-control text-ds-md transition-colors duration-fast-01 ease-productive-standard cursor-pointer'\n const itemSelected =\n 'bg-accent-9 text-accent-fg'\n const itemDefault =\n 'text-surface-fg hover:bg-surface-raised-hover'\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n disabled && 'opacity-action-disabled pointer-events-none',\n className,\n )}\n aria-label={displayText ? `Selected time: ${displayText}` : placeholder}\n >\n <Icon icon={IconClock} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n displayText\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {displayText ?? placeholder}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n <div className=\"flex gap-ds-03\" role=\"group\" aria-label=\"Time picker\">\n {/* Hours column */}\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Hr\n </span>\n <div className={cn(columnClass, 'min-w-ds-09')}>\n {hoursRange.map((h) => (\n <button\n key={h}\n type=\"button\"\n onClick={() => handleHourSelect(h)}\n className={cn(\n itemBase,\n selectedHour === h ? itemSelected : itemDefault,\n )}\n aria-label={`${h} hours`}\n aria-selected={selectedHour === h || undefined}\n >\n {timeFormat === '24h' ? padTwo(h) : h}\n </button>\n ))}\n </div>\n </div>\n\n {/* Minutes column */}\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Min\n </span>\n <div className={cn(columnClass, 'min-w-ds-09')}>\n {minutesRange.map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => handleMinuteSelect(m)}\n className={cn(\n itemBase,\n minutes === m ? itemSelected : itemDefault,\n )}\n aria-label={`${padTwo(m)} minutes`}\n aria-selected={minutes === m || undefined}\n >\n {padTwo(m)}\n </button>\n ))}\n </div>\n </div>\n\n {/* Seconds column */}\n {showSeconds && (\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Sec\n </span>\n <div className={cn(columnClass, 'min-w-ds-09')}>\n {secondsRange.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => handleSecondSelect(s)}\n className={cn(\n itemBase,\n seconds === s ? itemSelected : itemDefault,\n )}\n aria-label={`${padTwo(s)} seconds`}\n aria-selected={seconds === s || undefined}\n >\n {padTwo(s)}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* AM/PM toggle for 12h format */}\n {timeFormat === '12h' && (\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n &nbsp;\n </span>\n <div className=\"flex flex-col gap-ds-01 px-ds-01\">\n {(['AM', 'PM'] as const).map((period) => (\n <button\n key={period}\n type=\"button\"\n onClick={() => handleAmPmToggle(period)}\n className={cn(\n itemBase,\n 'min-w-[44px] font-semibold',\n ampm === period ? itemSelected : itemDefault,\n )}\n aria-label={period}\n aria-selected={ampm === period || undefined}\n >\n {period}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nTimePicker.displayName = 'TimePicker'\n\nexport { TimePicker }\n"],"mappings":";;;;;;;;;AAMA,IAAM,IAAS;CACb;CAAO;CAAO;CAAO;CAAO;CAAO;CACnC;CAAO;CAAO;CAAO;CAAO;CAAO;CACpC,EAUY,IAAc,EAAM,WAC/B,SAAqB,EACrB,gBACA,kBACA,kBACA,YACA,YACA,cACA,GAAG,KACF,GAAK;CACN,IACM,CAAC,GAAc,KAAmB,EAAM,SAAS,KAAiB,EAAE,EACpE,IAAa,EAAM,OAAqC,EAAE,CAAC,EAE3D,KAAmB,MACtB,KAAW,SACT,IAAc,EAAQ,aAAa,IACjC,MAAgB,EAAQ,aAAa,IAAI,IAAQ,EAAQ,UAAU,KACvE,KAAW,SACT,IAAc,EAAQ,aAAa,IACjC,MAAgB,EAAQ,aAAa,IAAI,IAAQ,EAAQ,UAAU,GAEpE,KAAiB,MAA2B;EAChD,IAAI,IAAO;AACX,UAAQ,EAAE,KAAV;GACE,KAAK;AAAc,QAAO,KAAK,IAAI,IAAI,IAAe,EAAE;AAAE;GAC1D,KAAK;AAAa,QAAO,KAAK,IAAI,GAAG,IAAe,EAAE;AAAE;GACxD,KAAK;AAAa,QAAO,KAAK,IAAI,IAAI,IAAe,EAAK;AAAE;GAC5D,KAAK;AAAW,QAAO,KAAK,IAAI,GAAG,IAAe,EAAK;AAAE;GACzD,KAAK;AAAQ,QAAO;AAAG;GACvB,KAAK;AAAO,QAAO;AAAI;GACvB,QAAS;;AAIX,OAFA,EAAE,gBAAgB,EAEX,MAAS,KAAgB,EAAgB,EAAK,EAEnD,KADA,KAAS,EAAE,QAAQ,eAAe,EAAE,QAAQ,YAAa,KAAK,GAC1D,IAAO,KAAK,IAAO,GAAI;AAG7B,EADA,EAAgB,EAAK,EACrB,EAAW,QAAQ,IAAO,OAAO;;AAGnC,QACE,kBAAC,OAAD;EAAU;EAAK,GAAI;EAAO,WAAW,EAAG,aAAa,EAAU;YAA/D,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ;GACG,CAAA,EACN,kBAAC,OAAD;GAAK,MAAK;GAAO,cAAW;GAAe,UAAU;GAAI,WAAW;aACjE;IAAC;IAAG;IAAG;IAAE,CAAC,KAAK,MACd,kBAAC,OAAD;IAAkB,MAAK;IAAM,WAAU;cACpC,EAAO,MAAM,IAAS,GAAM,IAAS,IAAO,EAAK,CAAC,KAAK,GAAO,MAAW;KACxE,IAAM,IAAQ,IAAS,IAAO,GACxB,IAAa,MAAU,GACvB,IAAa,EAAgB,EAAM;AAEzC,YACE,kBAAC,UAAD;MAEE,MAAM,MAAO;AAAE,SAAW,QAAQ,KAAS;;MAC3C,MAAK;MACL,MAAK;MACL,UAAU,MAAU,IAAe,IAAI;MACvC,UAAU,KAAc;MACxB,eAAe,CAAC,KAAc,EAAc,EAAM;MAClD,WAAW,EACT,0IACA,KAAc,kEACd,KACE,8BACF,CAAC,KACC,CAAC,KACD,gDACH;gBAEA;MACM,EAlBF,EAkBE;MAEX;IACE,EA7BI,EA6BJ,CACN;GACE,CAAA,CACF;;EAGT;AAED,EAAY,cAAc;;;AC5F1B,IAAa,IAAa,EAAM,WAC9B,SAAoB,EACpB,gBACA,iBACA,iBACA,YACA,YACA,cACA,GAAG,KACF,GAAK;CACN,IACM,IAAY,KAAK,MAAM,IAAc,GAAG,GAAG,IAC3C,IAAQ,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,GAAG,MAAM,IAAY,EAAE,EAC3D,CAAC,GAAc,KAAmB,EAAM,eAAe;EAC3D,IAAM,IAAM,EAAM,QAAQ,KAAgB,EAAY;AACtD,SAAO,KAAO,IAAI,IAAM;GACxB,EACI,IAAa,EAAM,OAAqC,EAAE,CAAC,EAE3D,KAAkB,MACrB,KAAW,QAAQ,IAAO,EAAQ,aAAa,IAC/C,KAAW,QAAQ,IAAO,EAAQ,aAAa,EAE5C,KAAiB,MAA2B;EAChD,IAAI,IAAO;AACX,UAAQ,EAAE,KAAV;GACE,KAAK;AAAc,QAAO,KAAK,IAAI,IAAI,IAAe,EAAE;AAAE;GAC1D,KAAK;AAAa,QAAO,KAAK,IAAI,GAAG,IAAe,EAAE;AAAE;GACxD,KAAK;AAAa,QAAO,KAAK,IAAI,IAAI,IAAe,EAAK;AAAE;GAC5D,KAAK;AAAW,QAAO,KAAK,IAAI,GAAG,IAAe,EAAK;AAAE;GACzD,KAAK;AAAQ,QAAO;AAAG;GACvB,KAAK;AAAO,QAAO;AAAI;GACvB,QAAS;;AAGX,OADA,EAAE,gBAAgB,EACX,MAAS,KAAgB,EAAe,EAAM,GAAM,EAEzD,KADA,KAAS,EAAE,QAAQ,eAAe,EAAE,QAAQ,YAAa,KAAK,GAC1D,IAAO,KAAK,IAAO,GAAI;AAG7B,EADA,EAAgB,EAAK,EACrB,EAAW,QAAQ,IAAO,OAAO;;AAGnC,QACE,kBAAC,OAAD;EAAU;EAAK,GAAI;EAAO,WAAW,EAAG,aAAa,EAAU;YAA/D,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACG;IAAU;IAAU,IAAY;IAC7B;MACN,kBAAC,OAAD;GAAK,MAAK;GAAO,cAAW;GAAc,UAAU;GAAI,WAAW;aAChE;IAAC;IAAG;IAAG;IAAG;IAAE,CAAC,KAAK,MACjB,kBAAC,OAAD;IAAkB,MAAK;IAAM,WAAU;cACpC,EAAM,MAAM,IAAS,GAAM,IAAS,IAAO,EAAK,CAAC,KAAK,MAAS;KAC9D,IAAM,IAAQ,EAAM,QAAQ,EAAK,EAC3B,IAAa,MAAS,GACtB,IAAa,EAAe,EAAK;AAEvC,YACE,kBAAC,UAAD;MAEE,MAAM,MAAO;AAAE,SAAW,QAAQ,KAAS;;MAC3C,MAAK;MACL,MAAK;MACL,UAAU,MAAU,IAAe,IAAI;MACvC,UAAU,KAAc;MACxB,eAAe,CAAC,KAAc,EAAa,EAAK;MAChD,WAAW,EACT,0IACA,KAAc,kEACd,KACE,8BACF,CAAC,KACC,CAAC,KACD,gDACH;gBAEA;MACM,EAlBF,EAkBE;MAEX;IACE,EA7BI,EA6BJ,CACN;GACE,CAAA,CACF;;EAGT;AAED,EAAW,cAAc;;;AC7DzB,IAAM,IAAa,EAAM,WACvB,SACE,EACE,UACA,aACA,iBAAc,eACd,cACA,eAAY,eACZ,YACA,YACA,kBACA,GAAG,KAEL,GACA;CACF,IAAM,CAAC,GAAM,KAAW,EAAM,SAAS,GAAM,EACvC,CAAC,GAAc,KAAmB,EAAM,SAC5C,qBAAS,IAAI,MAAM,CACpB,EACK,CAAC,GAAM,KAAW,EAAM,SAAuB,OAAO;AAG5D,GAAM,gBAAgB;AACpB,EAAK,KAAM,EAAQ,OAAO;IACzB,CAAC,EAAK,CAAC;CAEV,IAAM,KAAgB,MAAe;AAEnC,EADA,IAAW,EAAK,EAChB,EAAQ,GAAM;IAGV,UAA0B;AAC9B,KAAS,MAAU,MAAS,SAAS,WAAW,QAAS;IAGrD,KAAqB,MAAkB;AAE3C,EADA,GAAiB,MAAS,EAAS,GAAM,EAAM,CAAC,EAChD,EAAQ,OAAO;IAGX,KAAoB,MAAiB;AAEzC,EADA,GAAiB,MAAS,EAAQ,GAAM,EAAK,CAAC,EAC9C,EAAQ,SAAS;IAGb,UAAmB;AACvB,UAAQ,GAAR;GACE,KAAK,QACH,QACE,kBAAC,GAAD;IACE,aAAa,EAAa,aAAa;IACvC,cAAc,GAAO,aAAa;IAClC,cAAc;IACL;IACA;IACT,CAAA;GAEN,KAAK,SACH,QACE,kBAAC,GAAD;IACE,aAAa,EAAa,aAAa;IACvC,eAAe,GAAO,UAAU;IAChC,eAAe;IACN;IACA;IACT,CAAA;GAEN,QACE,QACE,kBAAC,GAAD;IACgB;IACd,UAAU;IACV,UAAU;IACV,eAAe;IACf,eAAe;IACA;IACN;IACA;IACT,CAAA;;;AAKV,QACE,kBAAC,GAAD;EAAe;EAAM,cAAc;YAAnC,CACE,kBAAC,GAAD;GAAgB,SAAA;aACd,kBAAC,UAAD;IACO;IACL,MAAK;IACL,cAAY,IAAQ,gBAAgB,EAAO,GAAO,EAAU,KAAK;IACjE,GAAI;IACJ,WAAW,EACT,yMACA,sCACA,6GACA,EACD;cAVH,CAYE,kBAAC,GAAD;KAAM,MAAM;KAAmB,MAAK;KAAK,QAAO;KAAQ,WAAU;KAA2B,CAAA,EAC7F,kBAAC,QAAD;KACE,WAAW,EACT,cACA,IACI,oBACA,yBACL;eAEA,IAAQ,EAAO,GAAO,EAAU,GAAG;KAC/B,CAAA,CACA;;GACM,CAAA,EACjB,kBAAC,GAAD;GACE,WAAU;GACV,OAAM;GACN,YAAY;aAEX,GAAY;GACE,CAAA,CACT;;EAGb;AAED,EAAW,cAAc;;;AChIzB,IAAM,IAAkD;CACtD,OAAO;EACL,OAAO;EACP,gBAAgB;GACd,IAAM,oBAAM,IAAI,MAAM;AACtB,UAAO;IAAE,OAAO,EAAW,EAAI;IAAE,KAAK,EAAS,EAAI;IAAE;;EAExD;CACD,WAAW;EACT,OAAO;EACP,gBAAgB;GACd,IAAM,IAAY,kBAAQ,IAAI,MAAM,EAAE,EAAE;AACxC,UAAO;IAAE,OAAO,EAAW,EAAU;IAAE,KAAK,EAAS,EAAU;IAAE;;EAEpE;CACD,WAAW;EACT,OAAO;EACP,gBAAgB;GACd,IAAM,oBAAM,IAAI,MAAM;AACtB,UAAO;IAAE,OAAO,EAAW,EAAQ,GAAK,EAAE,CAAC;IAAE,KAAK,EAAS,EAAI;IAAE;;EAEpE;CACD,YAAY;EACV,OAAO;EACP,gBAAgB;GACd,IAAM,oBAAM,IAAI,MAAM;AACtB,UAAO;IAAE,OAAO,EAAW,EAAQ,GAAK,GAAG,CAAC;IAAE,KAAK,EAAS,EAAI;IAAE;;EAErE;CACD,WAAW;EACT,OAAO;EACP,gBAAgB;GACd,IAAM,oBAAM,IAAI,MAAM;AACtB,UAAO;IAAE,OAAO,EAAa,EAAI;IAAE,KAAK,EAAW,EAAI;IAAE;;EAE5D;CACD,WAAW;EACT,OAAO;EACP,gBAAgB;GAEd,IAAM,IAAO,kBADD,IAAI,MAAM,EACM,EAAE;AAC9B,UAAO;IAAE,OAAO,EAAa,EAAK;IAAE,KAAK,EAAW,EAAK;IAAE;;EAE9D;CACD,UAAU;EACR,OAAO;EACP,gBAAgB;GACd,IAAM,oBAAM,IAAI,MAAM;AACtB,UAAO;IAAE,OAAO,EAAY,EAAI;IAAE,KAAK,EAAS,EAAI;IAAE;;EAEzD;CACF,EAEY,IAAU,EAAM,WAC3B,SAAiB,EAAE,YAAS,aAAU,cAAW,GAAG,KAAS,GAAK;AAClE,QACE,kBAAC,OAAD;EAAU;EAAK,GAAI;EAAO,WAAW,EAAG,2BAA2B,EAAU;YAC1E,EAAQ,KAAK,MAAQ;GACpB,IAAM,IAAS,EAAW;AAE1B,UADK,IAEH,kBAAC,UAAD;IAEE,MAAK;IACL,eAAe;KACb,IAAM,EAAE,UAAO,WAAQ,EAAO,UAAU;AACxC,OAAS,GAAO,EAAI;;IAEtB,WAAW,EACT,gEACA,qCACA,iCACA,gFACD;cAEA,EAAO;IACD,EAdF,EAcE,GAjBS;IAmBpB;EACE,CAAA;EAGT;AAED,EAAQ,cAAc;;;AClFtB,IAAM,IAAkB,EAAM,WAC5B,SACE,EACE,cACA,YACA,aACA,iBAAc,qBACd,cACA,eAAY,eACZ,YACA,YACA,kBACA,YACA,oBAAiB,GACjB,GAAG,KAEL,GACA;CACF,IAAM,CAAC,GAAM,KAAW,EAAM,SAAS,GAAM,EACvC,CAAC,GAAc,KAAmB,EAAM,SAC5C,qBAAa,IAAI,MAAM,CACxB,EACK,CAAC,GAAY,KAAiB,EAAM,SACxC,KAAa,KACd,EACK,CAAC,GAAU,KAAe,EAAM,SACpC,KAAW,KACZ,EACK,CAAC,GAAW,KAAgB,EAAM,SAAsB,KAAK,EAC7D,CAAC,GAAM,KAAW,EAAM,SAAuB,OAAO,EAEtD,IAAa,KAAK,IAAI,GAAG,EAAe;AAQ9C,CANA,EAAM,gBAAgB;AAEpB,EADA,EAAc,KAAa,KAAK,EAChC,EAAY,KAAW,KAAK;IAC3B,CAAC,GAAW,EAAQ,CAAC,EAGxB,EAAM,gBAAgB;AACpB,EAAK,KAAM,EAAQ,OAAO;IACzB,CAAC,EAAK,CAAC;CAEV,IAAM,KAAgB,MAAe;AACnC,MAAI,CAAC,KAAe,KAAc,EAEhC,CADA,EAAc,EAAK,EACnB,EAAY,KAAK;OACZ;GACL,IAAM,IAAQ,EAAS,GAAM,EAAW,GAAG,IAAO,GAC5C,IAAM,EAAQ,GAAM,EAAW,GAAG,IAAO;AAI/C,GAHA,EAAc,EAAM,EACpB,EAAY,EAAI,EAChB,IAAW;IAAE;IAAO;IAAK,CAAC,EAC1B,EAAQ,GAAM;;IAIZ,KAAsB,GAAa,MAAc;AAIrD,EAHA,EAAc,EAAM,EACpB,EAAY,EAAI,EAChB,IAAW;GAAE;GAAO;GAAK,CAAC,EAC1B,EAAQ,GAAM;IAGV,UAA0B;AAC9B,KAAS,MAAU,MAAS,SAAS,WAAW,QAAS;IAGrD,KAAqB,MAAkB;AAE3C,EADA,GAAiB,MAAS,EAAS,GAAM,EAAM,CAAC,EAChD,EAAQ,OAAO;IAGX,KAAoB,MAAiB;AAEzC,EADA,GAAiB,MAAS,EAAQ,GAAM,EAAK,CAAC,EAC9C,EAAQ,SAAS;IAGb,UACA,KAAc,IACT,GAAG,EAAO,GAAY,EAAU,CAAC,KAAK,EAAO,GAAU,EAAU,KAEnE,GAGH,UACA,MAAe,IAEf,kBAAC,GAAD;EACgB;EACF;EACF;EACC;EACX,UAAU;EACV,SAAS;EACT,eAAe;EACf,eAAe;EACA;EACN;EACA;EACT,CAAA,GAKJ,kBAAC,OAAD;EAAK,WAAU;YACZ,MAAM,KAAK,EAAE,QAAQ,GAAY,GAAG,GAAG,MACtC,kBAAC,GAAD;GAEE,cAAc,EAAU,GAAc,EAAE;GAC5B;GACF;GACC;GACX,UAAU;GACV,SAAS;GACT,gBAAgB,MAAS;AAEvB,MAAgB,EAAU,GAAM,CAAC,EAAE,CAAC;;GAEtC,eAAe;GACA;GACN;GACA;GACT,aAAa,IAAI;GACjB,aAAa,IAAI,IAAa;GAC9B,EAjBK,EAiBL,CACF;EACE,CAAA,EAIJ,UAAmB;AACvB,UAAQ,GAAR;GACE,KAAK,QACH,QACE,kBAAC,GAAD;IACE,aAAa,EAAa,aAAa;IACvC,cAAc,GAAY,aAAa;IACvC,cAAc;IACL;IACA;IACT,CAAA;GAEN,KAAK,SACH,QACE,kBAAC,GAAD;IACE,aAAa,EAAa,aAAa;IACvC,eAAe,GAAY,UAAU;IACrC,eAAe;IACN;IACA;IACT,CAAA;GAEN,QACE,QAAO,GAAqB;;IAI5B,IAAa,KAAW,EAAQ,SAAS;AAE/C,QACE,kBAAC,GAAD;EAAe;EAAM,cAAc;YAAnC,CACE,kBAAC,GAAD;GAAgB,SAAA;aACd,kBAAC,UAAD;IACO;IACL,MAAK;IACL,cAAY,KAAc,IAAW,sBAAsB,GAAa,KAAK;IAC7E,GAAI;IACJ,WAAW,EACT,yMACA,sCACA,6GACA,EACD;cAVH,CAYE,kBAAC,GAAD;KAAM,MAAM;KAAmB,MAAK;KAAK,QAAO;KAAQ,WAAU;KAA2B,CAAA,EAC7F,kBAAC,QAAD;KACE,WAAW,EACT,cACA,KAAc,IACV,oBACA,yBACL;eAEA,GAAa;KACT,CAAA,CACA;;GACM,CAAA,EACjB,kBAAC,GAAD;GACE,WAAU;GACV,OAAM;GACN,YAAY;aAEX,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAkB;MAAS,UAAU;MAAsB,CAAA;KACvD,CAAA,EACN,kBAAC,OAAD,EAAA,UAAM,GAAY,EAAO,CAAA,CACrB;QAEN,GAAY;GAEC,CAAA,CACT;;EAGb;AAED,EAAgB,cAAc;;;ACxM9B,SAAS,EAAO,GAAmB;AACjC,QAAO,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI;;AAGtC,SAAS,EAAc,GAAe,GAAa,GAAwB;CACzE,IAAM,IAAmB,EAAE;AAC3B,MAAK,IAAI,IAAI,GAAO,KAAK,GAAK,KAAK,EACjC,GAAO,KAAK,EAAE;AAEhB,QAAO;;AAGT,IAAM,IAAiB,EAAM,WAC3B,SACE,EACE,UACA,aACA,YACA,YACA,kBACA,gBAAa,OACb,gBAAa,GACb,iBAAc,oBACd,cACA,GAAG,KAEL,GACA;CACF,IAAM,CAAC,GAAM,KAAW,EAAM,SAAS,GAAM,EACvC,CAAC,GAAc,KAAmB,EAAM,SAAS,qBAAS,IAAI,MAAM,CAAC,EACrE,CAAC,GAAM,KAAW,EAAM,SAAuB,OAAO;AAG5D,GAAM,gBAAgB;AACpB,EAAK,KAAM,EAAQ,OAAO;IACzB,CAAC,EAAK,CAAC;CAGV,IAAM,IAAU,IAAQ,EAAM,UAAU,GAAG,GACrC,IAAU,IAAQ,EAAM,YAAY,GAAG,GACvC,IAAoB,KAAW,KAAK,OAAO,MAC3C,IAAU,MAAY,IAAI,KAAK,IAAU,KAAK,IAAU,KAAK,GAE7D,IACJ,MAAe,QAAQ,EAAc,GAAG,IAAI,EAAE,GAAG,EAAc,GAAG,IAAI,EAAE,EACpE,IAAe,EAAc,GAAG,IAAI,EAAW,EAE/C,IAAe,MAAe,QAAQ,IAAU,GAIhD,KAAoB,MAAe;EAEvC,IAAI,IAAS,EAAS,GAAM,IAAQ,EAAM,UAAU,GAAG,EAAQ;AAE/D,EADA,IAAS,EAAW,GAAQ,IAAQ,EAAM,YAAY,GAAG,EAAQ,EACjE,IAAW,EAAO;IAGd,UAA0B;AAC9B,KAAS,MAAU,MAAS,SAAS,WAAW,QAAS;IAGrD,KAAqB,MAAkB;AAE3C,EADA,GAAiB,MAAS,EAAS,GAAM,EAAM,CAAC,EAChD,EAAQ,OAAO;IAGX,KAAoB,MAAiB;AAEzC,EADA,GAAiB,MAAS,EAAQ,GAAM,EAAK,CAAC,EAC9C,EAAQ,SAAS;IAKb,KAAoB,MAAiB;EACzC,IAAM,IAAO,IAAQ,IAAI,KAAK,EAAM,mBAAG,IAAI,MAAM,EAC7C,IAAI;AAER,EAAI,MAAe,UAEjB,AAGE,KAJkB,IAAQ,IAAO,UACf,OACd,MAAS,KAAK,IAAI,IAElB,MAAS,KAAK,KAAK,IAAO;EAIlC,IAAM,IAAU,EAAS,GAAM,EAAE;AACjC,MAAW,EAAQ;IAGf,KAAsB,MAAmB;EAE7C,IAAM,IAAU,EADH,IAAQ,IAAI,KAAK,EAAM,mBAAG,IAAI,MAAM,EAChB,EAAO;AACxC,MAAW,EAAQ;IAGf,KAAoB,MAAwB;EAChD,IAAM,IAAO,IAAQ,IAAI,KAAK,EAAM,mBAAG,IAAI,MAAM,EAC3C,IAAW,EAAK,UAAU,EAC5B;AAQJ,EANA,AAGE,IAHE,MAAW,OACN,KAAY,KAAK,IAAW,KAAK,IAEjC,IAAW,KAAK,IAAW,KAAK,GAGzC,IAAW,EAAS,GAAM,EAAK,CAAC;IAK5B,IAAc,EAAM,cACnB,IAGE,EAAO,GADZ,MAAe,QAAQ,uBAAuB,oBACvB,GAHN,MAIlB,CAAC,GAAO,EAAW,CAAC,EAIjB,UAAmB;AACvB,UAAQ,GAAR;GACE,KAAK,QACH,QACE,kBAAC,GAAD;IACE,aAAa,EAAa,aAAa;IACvC,cAAc,GAAO,aAAa;IAClC,cAAc;IACL;IACA;IACT,CAAA;GAEN,KAAK,SACH,QACE,kBAAC,GAAD;IACE,aAAa,EAAa,aAAa;IACvC,eAAe,GAAO,UAAU;IAChC,eAAe;IACN;IACA;IACT,CAAA;GAEN,QACE,QACE,kBAAC,GAAD;IACgB;IACd,UAAU;IACV,UAAU;IACV,eAAe;IACf,eAAe;IACA;IACN;IACA;IACT,CAAA;;IAMJ,IACJ;AAEF,QACE,kBAAC,GAAD;EAAe;EAAM,cAAc;YAAnC,CACE,kBAAC,GAAD;GAAgB,SAAA;aACd,kBAAC,UAAD;IACO;IACL,MAAK;IACL,GAAI;IACJ,WAAW,EACT,yMACA,sCACA,6GACA,EACD;IACD,cAAY,IAAc,aAAa,MAAgB;cAVzD,CAYE,kBAAC,GAAD;KAAM,MAAM;KAAmB,MAAK;KAAK,QAAO;KAAQ,WAAU;KAA2B,CAAA,EAC7F,kBAAC,QAAD;KACE,WAAW,EACT,cACA,IACI,oBACA,yBACL;eAEA,KAAe;KACX,CAAA,CACA;;GACM,CAAA,EACjB,kBAAC,GAAD;GACE,WAAU;GACV,OAAM;GACN,YAAY;aAEZ,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEG,GAAY,EAGZ,MAAS,UACR,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,QAAD;OAAM,WAAU;iBAA2E;OAEpF,CAAA;MAGP,kBAAC,UAAD;OACE,OAAO,KAAgB;OACvB,WAAW,MAAM,EAAiB,OAAO,EAAE,OAAO,MAAM,CAAC;OACzD,WAAW;OACX,cAAW;iBAJb,CAMG,CAAC,KAAS,kBAAC,UAAD;QAAQ,OAAM;kBAAG;QAAW,CAAA,EACtC,EAAW,KAAK,MACf,kBAAC,UAAD;QAAgB,OAAO;kBACpB,MAAe,QAAQ,EAAO,EAAE,GAAG;QAC7B,EAFI,EAEJ,CACT,CACK;;MAET,kBAAC,QAAD;OAAM,WAAU;iBAAkD;OAE3D,CAAA;MAGP,kBAAC,UAAD;OACE,OAAO,IAAQ,IAAU;OACzB,WAAW,MAAM,EAAmB,OAAO,EAAE,OAAO,MAAM,CAAC;OAC3D,WAAW;OACX,cAAW;iBAJb,CAMG,CAAC,KAAS,kBAAC,UAAD;QAAQ,OAAM;kBAAG;QAAW,CAAA,EACtC,EAAa,KAAK,MACjB,kBAAC,UAAD;QAAgB,OAAO;kBACpB,EAAO,EAAE;QACH,EAFI,EAEJ,CACT,CACK;;MAGR,MAAe,SACd,kBAAC,UAAD;OACE,OAAO,IAAQ,IAAO;OACtB,WAAW,MACT,EAAiB,EAAE,OAAO,MAAqB;OAEjD,WAAW;OACX,cAAW;iBANb;QAQG,CAAC,KAAS,kBAAC,UAAD;SAAQ,OAAM;mBAAG;SAAW,CAAA;QACvC,kBAAC,UAAD;SAAQ,OAAM;mBAAK;SAAW,CAAA;QAC9B,kBAAC,UAAD;SAAQ,OAAM;mBAAK;SAAW,CAAA;QACvB;;MAEP;OAEJ;;GACS,CAAA,CACT;;EAGb;AAED,EAAe,cAAc;;;ACrR7B,SAAS,EAAc,GAAe,GAAa,GAAwB;CACzE,IAAM,IAAmB,EAAE;AAC3B,MAAK,IAAI,IAAI,GAAO,KAAK,GAAK,KAAK,EACjC,GAAO,KAAK,EAAE;AAEhB,QAAO;;AAGT,SAAS,EAAO,GAAmB;AACjC,QAAO,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI;;AAGtC,IAAM,IAAa,EAAM,WACvB,SACE,EACE,UACA,aACA,QAAQ,IAAa,OACrB,gBAAa,GACb,gBAAa,GACb,iBAAc,IACd,iBAAc,eACd,cACA,cAAW,IACX,GAAG,KAEL,GACA;CACF,IAAM,CAAC,GAAM,KAAW,EAAM,SAAS,GAAM,EAGvC,IAAU,IAAQ,EAAM,UAAU,GAAG,MACrC,IAAU,IAAQ,EAAM,YAAY,GAAG,MACvC,IAAU,IAAQ,EAAM,YAAY,GAAG,MACvC,IAAO,MAAY,OAAuC,OAA/B,KAAW,KAAK,OAAO,MAGlD,IACJ,MAAY,OAMR,OALA,MAAY,IACV,KACA,IAAU,KACR,IAAU,KACV,GAGJ,IACJ,MAAe,QAAQ,EAAc,GAAG,IAAI,EAAE,GAAG,EAAc,GAAG,IAAI,EAAE,EACpE,IAAe,EAAc,GAAG,IAAI,EAAW,EAC/C,IAAe,EAAc,GAAG,IAAI,EAAW,EAE/C,KACJ,MACS;EACT,IAAM,IAAO,IAAQ,IAAI,KAAK,EAAM,mBAAG,IAAI,MAAM,EAE7C,IAAI,EAAU,SAAS,EAAK,UAAU,EACpC,IAAI,EAAU,WAAW,EAAK,YAAY,EAC1C,IAAI,EAAU,WAAW,EAAK,YAAY;AAGhD,EAAI,MAAe,SAAS,EAAU,UAAU,KAAA,MAE9C,AAGE,KAJkB,EAAU,QAAQ,KAAQ,UAC1B,OACd,EAAU,UAAU,KAAK,IAAI,EAAU,QAEvC,EAAU,UAAU,KAAK,KAAK,EAAU,QAAQ;EAIxD,IAAI,IAAS,EAAS,GAAM,EAAE;AAG9B,SAFA,IAAS,EAAW,GAAQ,EAAE,EAC9B,IAAS,EAAW,GAAQ,EAAE,EACvB;IAGH,KAAoB,MAAiB;EACzC,IAAM,IAAU,EAAmB,EAAE,OAAO,GAAM,CAAC;AACnD,MAAW,EAAQ;IAGf,KAAsB,MAAmB;EAC7C,IAAM,IAAU,EAAmB,EAAE,SAAS,GAAQ,CAAC;AACvD,MAAW,EAAQ;IAGf,KAAsB,MAAmB;EAC7C,IAAM,IAAU,EAAmB,EAAE,SAAS,GAAQ,CAAC;AACvD,MAAW,EAAQ;IAGf,KAAoB,MAAwB;AAChD,MAAI,CAAC,GAAO;GAEV,IAAM,IAAI,MAAW,OAAO,IAAI,IAC5B,oBAAI,IAAI,MAAM;AAIlB,GAHA,IAAI,EAAS,GAAG,EAAE,EAClB,IAAI,EAAW,GAAG,EAAE,EACpB,IAAI,EAAW,GAAG,EAAE,EACpB,IAAW,EAAE;AACb;;EAGF,IAAM,IAAW,EAAM,UAAU,EAC7B;AAQJ,EANA,AAGE,IAHE,MAAW,OACN,KAAY,KAAK,IAAW,KAAK,IAEjC,IAAW,KAAK,IAAW,KAAK,GAGzC,IAAW,EAAS,IAAI,KAAK,EAAM,EAAE,EAAK,CAAC;IAIvC,IAAc,EAAM,cACnB,IACD,MAAe,QAEV,EAAO,GADF,IAAc,cAAc,SACf,GAGpB,EAAO,GADF,IAAc,aAAa,QACd,GANN,MAOlB;EAAC;EAAO;EAAY;EAAY,CAAC,EAE9B,IAAe,MAAe,QAAQ,IAAU,GAEhD,IACJ,kEAEI,IACJ,yJACI,IACJ,8BACI,IACJ;AAEF,QACE,kBAAC,GAAD;EAAe;EAAM,cAAc;YAAnC,CACE,kBAAC,GAAD;GAAgB,SAAA;aACd,kBAAC,UAAD;IACO;IACL,MAAK;IACK;IACV,GAAI;IACJ,WAAW,EACT,yMACA,sCACA,6GACA,KAAY,+CACZ,EACD;IACD,cAAY,IAAc,kBAAkB,MAAgB;cAZ9D,CAcE,kBAAC,GAAD;KAAM,MAAM;KAAW,MAAK;KAAK,QAAO;KAAQ,WAAU;KAA2B,CAAA,EACrF,kBAAC,QAAD;KACE,WAAW,EACT,cACA,IACI,oBACA,yBACL;eAEA,KAAe;KACX,CAAA,CACA;;GACM,CAAA,EACjB,kBAAC,GAAD;GACE,WAAU;GACV,OAAM;GACN,YAAY;aAEZ,kBAAC,OAAD;IAAK,WAAU;IAAiB,MAAK;IAAQ,cAAW;cAAxD;KAEE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAA2E;OAEpF,CAAA,EACP,kBAAC,OAAD;OAAK,WAAW,EAAG,GAAa,cAAc;iBAC3C,EAAW,KAAK,MACf,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAiB,EAAE;QAClC,WAAW,EACT,GACA,MAAiB,IAAI,IAAe,EACrC;QACD,cAAY,GAAG,EAAE;QACjB,iBAAe,MAAiB,KAAK,KAAA;kBAEpC,MAAe,QAAQ,EAAO,EAAE,GAAG;QAC7B,EAXF,EAWE,CACT;OACE,CAAA,CACF;;KAGN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAA2E;OAEpF,CAAA,EACP,kBAAC,OAAD;OAAK,WAAW,EAAG,GAAa,cAAc;iBAC3C,EAAa,KAAK,MACjB,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAmB,EAAE;QACpC,WAAW,EACT,GACA,MAAY,IAAI,IAAe,EAChC;QACD,cAAY,GAAG,EAAO,EAAE,CAAC;QACzB,iBAAe,MAAY,KAAK,KAAA;kBAE/B,EAAO,EAAE;QACH,EAXF,EAWE,CACT;OACE,CAAA,CACF;;KAGL,KACC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAA2E;OAEpF,CAAA,EACP,kBAAC,OAAD;OAAK,WAAW,EAAG,GAAa,cAAc;iBAC3C,EAAa,KAAK,MACjB,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAmB,EAAE;QACpC,WAAW,EACT,GACA,MAAY,IAAI,IAAe,EAChC;QACD,cAAY,GAAG,EAAO,EAAE,CAAC;QACzB,iBAAe,MAAY,KAAK,KAAA;kBAE/B,EAAO,EAAE;QACH,EAXF,EAWE,CACT;OACE,CAAA,CACF;;KAIP,MAAe,SACd,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAA2E;OAEpF,CAAA,EACP,kBAAC,OAAD;OAAK,WAAU;iBACX,CAAC,MAAM,KAAK,CAAW,KAAK,MAC5B,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAiB,EAAO;QACvC,WAAW,EACT,GACA,8BACA,MAAS,IAAS,IAAe,EAClC;QACD,cAAY;QACZ,iBAAe,MAAS,KAAU,KAAA;kBAEjC;QACM,EAZF,EAYE,CACT;OACE,CAAA,CACF;;KAEJ;;GACS,CAAA,CACT;;EAGb;AAED,EAAW,cAAc"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/composed/date-picker/month-picker.tsx","../../../src/composed/date-picker/year-picker.tsx","../../../src/composed/date-picker/date-picker.tsx","../../../src/composed/date-picker/presets.tsx","../../../src/composed/date-picker/date-range-picker.tsx","../../../src/composed/date-picker/date-time-picker.tsx","../../../src/composed/date-picker/time-picker.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../ui/lib/utils'\n\nconst MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n]\n\nexport interface MonthPickerProps extends React.ComponentPropsWithoutRef<'div'> {\n currentYear: number\n selectedMonth?: number // 0-11\n onMonthSelect: (month: number) => void\n minDate?: Date\n maxDate?: Date\n}\n\nexport const MonthPicker = React.forwardRef<HTMLDivElement, MonthPickerProps>(\n function MonthPicker({\n currentYear,\n selectedMonth,\n onMonthSelect,\n minDate,\n maxDate,\n className,\n ...props\n}, ref) {\n const COLS = 4\n const [focusedIndex, setFocusedIndex] = React.useState(selectedMonth ?? 0)\n const buttonRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n const isMonthDisabled = (index: number) =>\n (minDate != null &&\n (currentYear < minDate.getFullYear() ||\n (currentYear === minDate.getFullYear() && index < minDate.getMonth()))) ||\n (maxDate != null &&\n (currentYear > maxDate.getFullYear() ||\n (currentYear === maxDate.getFullYear() && index > maxDate.getMonth())))\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n let next = focusedIndex\n switch (e.key) {\n case 'ArrowRight': next = Math.min(11, focusedIndex + 1); break\n case 'ArrowLeft': next = Math.max(0, focusedIndex - 1); break\n case 'ArrowDown': next = Math.min(11, focusedIndex + COLS); break\n case 'ArrowUp': next = Math.max(0, focusedIndex - COLS); break\n case 'Home': next = 0; break\n case 'End': next = 11; break\n default: return\n }\n e.preventDefault()\n // Skip disabled months\n while (next !== focusedIndex && isMonthDisabled(next)) {\n next += (e.key === 'ArrowLeft' || e.key === 'ArrowUp') ? -1 : 1\n if (next < 0 || next > 11) return\n }\n setFocusedIndex(next)\n buttonRefs.current[next]?.focus()\n }\n\n return (\n <div ref={ref} {...props} className={cn(\"w-[252px]\", className)}>\n <div className=\"text-center pb-ds-04 text-ds-md font-semibold text-surface-fg\">\n {currentYear}\n </div>\n <div role=\"grid\" aria-label=\"Month picker\" tabIndex={-1} onKeyDown={handleKeyDown}>\n {[0, 1, 2].map((rowIdx) => (\n <div key={rowIdx} role=\"row\" className=\"grid grid-cols-4 gap-ds-02 mb-ds-02 last:mb-0\">\n {MONTHS.slice(rowIdx * COLS, rowIdx * COLS + COLS).map((label, colIdx) => {\n const index = rowIdx * COLS + colIdx\n const isSelected = index === selectedMonth\n const isDisabled = isMonthDisabled(index)\n\n return (\n <button\n key={label}\n ref={(el) => { buttonRefs.current[index] = el }}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={index === focusedIndex ? 0 : -1}\n disabled={isDisabled || false}\n onClick={() => !isDisabled && onMonthSelect(index)}\n className={cn(\n 'h-ds-sm-plus rounded-control text-ds-md transition-colors focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n isDisabled && 'opacity-action-disabled pointer-events-none cursor-not-allowed',\n isSelected &&\n 'bg-accent-9 text-accent-fg',\n !isSelected &&\n !isDisabled &&\n 'hover:bg-surface-raised-hover text-surface-fg',\n )}\n >\n {label}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n},\n)\n\nMonthPicker.displayName = 'MonthPicker'\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../ui/lib/utils'\n\nexport interface YearPickerProps extends React.ComponentPropsWithoutRef<'div'> {\n currentYear: number\n selectedYear?: number\n onYearSelect: (year: number) => void\n minDate?: Date\n maxDate?: Date\n}\n\nexport const YearPicker = React.forwardRef<HTMLDivElement, YearPickerProps>(\n function YearPicker({\n currentYear,\n selectedYear,\n onYearSelect,\n minDate,\n maxDate,\n className,\n ...props\n}, ref) {\n const COLS = 3\n const startYear = Math.floor(currentYear / 10) * 10\n const years = Array.from({ length: 12 }, (_, i) => startYear + i)\n const [focusedIndex, setFocusedIndex] = React.useState(() => {\n const sel = years.indexOf(selectedYear ?? currentYear)\n return sel >= 0 ? sel : 0\n })\n const buttonRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n const isYearDisabled = (year: number) =>\n (minDate != null && year < minDate.getFullYear()) ||\n (maxDate != null && year > maxDate.getFullYear())\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n let next = focusedIndex\n switch (e.key) {\n case 'ArrowRight': next = Math.min(11, focusedIndex + 1); break\n case 'ArrowLeft': next = Math.max(0, focusedIndex - 1); break\n case 'ArrowDown': next = Math.min(11, focusedIndex + COLS); break\n case 'ArrowUp': next = Math.max(0, focusedIndex - COLS); break\n case 'Home': next = 0; break\n case 'End': next = 11; break\n default: return\n }\n e.preventDefault()\n while (next !== focusedIndex && isYearDisabled(years[next])) {\n next += (e.key === 'ArrowLeft' || e.key === 'ArrowUp') ? -1 : 1\n if (next < 0 || next > 11) return\n }\n setFocusedIndex(next)\n buttonRefs.current[next]?.focus()\n }\n\n return (\n <div ref={ref} {...props} className={cn(\"w-[252px]\", className)}>\n <div className=\"text-center pb-ds-04 text-ds-md font-semibold text-surface-fg\">\n {startYear} &ndash; {startYear + 11}\n </div>\n <div role=\"grid\" aria-label=\"Year picker\" tabIndex={-1} onKeyDown={handleKeyDown}>\n {[0, 1, 2, 3].map((rowIdx) => (\n <div key={rowIdx} role=\"row\" className=\"grid grid-cols-3 gap-ds-02 mb-ds-02 last:mb-0\">\n {years.slice(rowIdx * COLS, rowIdx * COLS + COLS).map((year) => {\n const index = years.indexOf(year)\n const isSelected = year === selectedYear\n const isDisabled = isYearDisabled(year)\n\n return (\n <button\n key={year}\n ref={(el) => { buttonRefs.current[index] = el }}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={index === focusedIndex ? 0 : -1}\n disabled={isDisabled || false}\n onClick={() => !isDisabled && onYearSelect(year)}\n className={cn(\n 'h-ds-sm-plus rounded-control text-ds-md transition-colors focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n isDisabled && 'opacity-action-disabled pointer-events-none cursor-not-allowed',\n isSelected &&\n 'bg-accent-9 text-accent-fg',\n !isSelected &&\n !isDisabled &&\n 'hover:bg-surface-raised-hover text-surface-fg',\n )}\n >\n {year}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n},\n)\n\nYearPicker.displayName = 'YearPicker'\n","'use client'\n\nimport { IconCalendarEvent } from '@tabler/icons-react'\nimport { format, setMonth, setYear } from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\nimport { CalendarGrid } from './calendar-grid'\nimport { MonthPicker } from './month-picker'\nimport { YearPicker } from './year-picker'\n\ntype CalendarView = 'days' | 'months' | 'years'\n\n/**\n * A popover-based date picker with day/month/year drill-down views.\n * Supports min/max date constraints and arbitrary date disabling.\n */\nexport interface DatePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange' | 'value'> {\n /** Currently selected date (controlled). */\n value?: Date | null\n /** Called when a date is selected. Receives null if cleared. */\n onChange?: (date: Date | null) => void\n placeholder?: string\n /** date-fns format string for the trigger display. @default 'MMM d, yyyy' */\n formatStr?: string\n /** Earliest selectable date. */\n minDate?: Date\n /** Latest selectable date. */\n maxDate?: Date\n /** Predicate to disable specific dates (return true to disable). */\n disabledDates?: (date: Date) => boolean\n className?: string\n}\n\nconst DatePicker = React.forwardRef<HTMLButtonElement, DatePickerProps>(\n function DatePicker(\n {\n value,\n onChange,\n placeholder = 'Pick a date',\n className,\n formatStr = 'MMM d, yyyy',\n minDate,\n maxDate,\n disabledDates,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(\n value ?? new Date(),\n )\n const [view, setView] = React.useState<CalendarView>('days')\n\n // Reset view when popover closes\n React.useEffect(() => {\n if (!open) setView('days')\n }, [open])\n\n const handleSelect = (date: Date) => {\n onChange?.(date)\n setOpen(false)\n }\n\n const handleHeaderClick = () => {\n setView((prev) => (prev === 'days' ? 'months' : 'years'))\n }\n\n const handleMonthSelect = (month: number) => {\n setCurrentMonth((prev) => setMonth(prev, month))\n setView('days')\n }\n\n const handleYearSelect = (year: number) => {\n setCurrentMonth((prev) => setYear(prev, year))\n setView('months')\n }\n\n const renderView = () => {\n switch (view) {\n case 'years':\n return (\n <YearPicker\n currentYear={currentMonth.getFullYear()}\n selectedYear={value?.getFullYear()}\n onYearSelect={handleYearSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n case 'months':\n return (\n <MonthPicker\n currentYear={currentMonth.getFullYear()}\n selectedMonth={value?.getMonth()}\n onMonthSelect={handleMonthSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n default:\n return (\n <CalendarGrid\n currentMonth={currentMonth}\n selected={value}\n onSelect={handleSelect}\n onMonthChange={setCurrentMonth}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n }\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={value ? `Change date, ${format(value, formatStr)}` : placeholder}\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n className,\n )}\n >\n <Icon icon={IconCalendarEvent} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n value\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {value ? format(value, formatStr) : placeholder}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n {renderView()}\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nDatePicker.displayName = 'DatePicker'\n\nexport { DatePicker }\n","'use client'\n\nimport {\n endOfDay,\n endOfMonth,\n startOfDay,\n startOfMonth,\n startOfYear,\n subDays,\n subMonths,\n} from 'date-fns'\nimport * as React from 'react'\n\nimport { cn } from '../../ui/lib/utils'\n\nexport type PresetKey =\n | 'today'\n | 'yesterday'\n | 'last7days'\n | 'last30days'\n | 'thisMonth'\n | 'lastMonth'\n | 'thisYear'\n\nexport interface PresetsProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'onSelect'> {\n presets: PresetKey[]\n onSelect: (start: Date, end: Date) => void\n className?: string\n}\n\ninterface PresetDefinition {\n label: string\n getRange: () => { start: Date; end: Date }\n}\n\nconst PRESET_MAP: Record<PresetKey, PresetDefinition> = {\n today: {\n label: 'Today',\n getRange: () => {\n const now = new Date()\n return { start: startOfDay(now), end: endOfDay(now) }\n },\n },\n yesterday: {\n label: 'Yesterday',\n getRange: () => {\n const yesterday = subDays(new Date(), 1)\n return { start: startOfDay(yesterday), end: endOfDay(yesterday) }\n },\n },\n last7days: {\n label: 'Last 7 days',\n getRange: () => {\n const now = new Date()\n return { start: startOfDay(subDays(now, 6)), end: endOfDay(now) }\n },\n },\n last30days: {\n label: 'Last 30 days',\n getRange: () => {\n const now = new Date()\n return { start: startOfDay(subDays(now, 29)), end: endOfDay(now) }\n },\n },\n thisMonth: {\n label: 'This month',\n getRange: () => {\n const now = new Date()\n return { start: startOfMonth(now), end: endOfMonth(now) }\n },\n },\n lastMonth: {\n label: 'Last month',\n getRange: () => {\n const now = new Date()\n const last = subMonths(now, 1)\n return { start: startOfMonth(last), end: endOfMonth(last) }\n },\n },\n thisYear: {\n label: 'This year',\n getRange: () => {\n const now = new Date()\n return { start: startOfYear(now), end: endOfDay(now) }\n },\n },\n}\n\nexport const Presets = React.forwardRef<HTMLDivElement, PresetsProps>(\n function Presets({ presets, onSelect, className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn('flex flex-col gap-ds-01', className)}>\n {presets.map((key) => {\n const preset = PRESET_MAP[key]\n if (!preset) return null\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => {\n const { start, end } = preset.getRange()\n onSelect(start, end)\n }}\n className={cn(\n 'h-ds-sm w-full rounded-control px-ds-03 text-left text-ds-sm',\n 'text-surface-fg transition-colors',\n 'hover:bg-surface-raised-hover',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9',\n )}\n >\n {preset.label}\n </button>\n )\n })}\n </div>\n )\n},\n)\n\nPresets.displayName = 'Presets'\n","'use client'\n\nimport { IconCalendarEvent } from '@tabler/icons-react'\nimport { addMonths,format, isAfter, isBefore, setMonth, setYear } from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\nimport { CalendarGrid } from './calendar-grid'\nimport { MonthPicker } from './month-picker'\nimport type { PresetKey } from './presets'\nimport { Presets } from './presets'\nimport { YearPicker } from './year-picker'\n\ntype CalendarView = 'days' | 'months' | 'years'\n\nexport interface DateRangePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange'> {\n startDate?: Date | null\n endDate?: Date | null\n onChange?: (range: { start: Date | null; end: Date | null }) => void\n placeholder?: string\n className?: string\n formatStr?: string\n minDate?: Date\n maxDate?: Date\n disabledDates?: (date: Date) => boolean\n /** Show a presets sidebar with quick date range selections */\n presets?: PresetKey[]\n /** Number of calendar months to display side by side (default: 1) */\n numberOfMonths?: number\n}\n\nconst DateRangePicker = React.forwardRef<HTMLButtonElement, DateRangePickerProps>(\n function DateRangePicker(\n {\n startDate,\n endDate,\n onChange,\n placeholder = 'Pick a date range',\n className,\n formatStr = 'MMM d, yyyy',\n minDate,\n maxDate,\n disabledDates,\n presets,\n numberOfMonths = 1,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(\n startDate ?? new Date(),\n )\n const [rangeStart, setRangeStart] = React.useState<Date | null>(\n startDate ?? null,\n )\n const [rangeEnd, setRangeEnd] = React.useState<Date | null>(\n endDate ?? null,\n )\n const [hoverDate, setHoverDate] = React.useState<Date | null>(null)\n const [view, setView] = React.useState<CalendarView>('days')\n\n const monthCount = Math.max(1, numberOfMonths)\n\n React.useEffect(() => {\n setRangeStart(startDate ?? null)\n setRangeEnd(endDate ?? null)\n }, [startDate, endDate])\n\n // Reset view when popover closes\n React.useEffect(() => {\n if (!open) setView('days')\n }, [open])\n\n const handleSelect = (date: Date) => {\n if (!rangeStart || (rangeStart && rangeEnd)) {\n setRangeStart(date)\n setRangeEnd(null)\n } else {\n const start = isBefore(date, rangeStart) ? date : rangeStart\n const end = isAfter(date, rangeStart) ? date : rangeStart\n setRangeStart(start)\n setRangeEnd(end)\n onChange?.({ start, end })\n setOpen(false)\n }\n }\n\n const handlePresetSelect = (start: Date, end: Date) => {\n setRangeStart(start)\n setRangeEnd(end)\n onChange?.({ start, end })\n setOpen(false)\n }\n\n const handleHeaderClick = () => {\n setView((prev) => (prev === 'days' ? 'months' : 'years'))\n }\n\n const handleMonthSelect = (month: number) => {\n setCurrentMonth((prev) => setMonth(prev, month))\n setView('days')\n }\n\n const handleYearSelect = (year: number) => {\n setCurrentMonth((prev) => setYear(prev, year))\n setView('months')\n }\n\n const displayText = () => {\n if (rangeStart && rangeEnd) {\n return `${format(rangeStart, formatStr)} - ${format(rangeEnd, formatStr)}`\n }\n return placeholder\n }\n\n const renderCalendarGrids = () => {\n if (monthCount === 1) {\n return (\n <CalendarGrid\n currentMonth={currentMonth}\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n hoverDate={hoverDate}\n onSelect={handleSelect}\n onHover={setHoverDate}\n onMonthChange={setCurrentMonth}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n }\n\n return (\n <div className=\"flex flex-row gap-ds-04\">\n {Array.from({ length: monthCount }, (_, i) => (\n <CalendarGrid\n key={i}\n currentMonth={addMonths(currentMonth, i)}\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n hoverDate={hoverDate}\n onSelect={handleSelect}\n onHover={setHoverDate}\n onMonthChange={(date) => {\n // Adjust so the first grid stays in sync\n setCurrentMonth(addMonths(date, -i))\n }}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n hidePrevNav={i > 0}\n hideNextNav={i < monthCount - 1}\n />\n ))}\n </div>\n )\n }\n\n const renderView = () => {\n switch (view) {\n case 'years':\n return (\n <YearPicker\n currentYear={currentMonth.getFullYear()}\n selectedYear={rangeStart?.getFullYear()}\n onYearSelect={handleYearSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n case 'months':\n return (\n <MonthPicker\n currentYear={currentMonth.getFullYear()}\n selectedMonth={rangeStart?.getMonth()}\n onMonthSelect={handleMonthSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n default:\n return renderCalendarGrids()\n }\n }\n\n const hasPresets = presets && presets.length > 0\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={rangeStart && rangeEnd ? `Change date range, ${displayText()}` : placeholder}\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n className,\n )}\n >\n <Icon icon={IconCalendarEvent} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n rangeStart && rangeEnd\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {displayText()}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n {hasPresets ? (\n <div className=\"flex flex-row gap-ds-04\">\n <div className=\"min-w-[140px] border-r border-surface-border-strong pr-ds-04\">\n <Presets presets={presets} onSelect={handlePresetSelect} />\n </div>\n <div>{renderView()}</div>\n </div>\n ) : (\n renderView()\n )}\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nDateRangePicker.displayName = 'DateRangePicker'\n\nexport { DateRangePicker }\n","'use client'\n\nimport { IconCalendarClock } from '@tabler/icons-react'\nimport {\n format,\n setHours,\n setMinutes,\n setMonth,\n setYear,\n} from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\nimport { CalendarGrid } from './calendar-grid'\nimport { MonthPicker } from './month-picker'\nimport { YearPicker } from './year-picker'\n\ntype CalendarView = 'days' | 'months' | 'years'\n\nexport interface DateTimePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange' | 'value'> {\n /** The currently selected date and time. */\n value?: Date | null\n /** Callback fired when the date/time changes. */\n onChange?: (date: Date | null) => void\n /** Earliest selectable date. */\n minDate?: Date\n /** Latest selectable date. */\n maxDate?: Date\n /** Function to disable specific dates. */\n disabledDates?: (date: Date) => boolean\n /** Display format for the time portion: 12-hour with AM/PM or 24-hour. */\n timeFormat?: '12h' | '24h'\n /** Step interval for the minute selector. */\n minuteStep?: number\n /** Placeholder text when no value is set. */\n placeholder?: string\n /** Additional class names for the trigger button. */\n className?: string\n}\n\nfunction padTwo(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nfunction generateRange(start: number, end: number, step: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i += step) {\n result.push(i)\n }\n return result\n}\n\nconst DateTimePicker = React.forwardRef<HTMLButtonElement, DateTimePickerProps>(\n function DateTimePicker(\n {\n value,\n onChange,\n minDate,\n maxDate,\n disabledDates,\n timeFormat = '12h',\n minuteStep = 1,\n placeholder = 'Pick date & time',\n className,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(value ?? new Date())\n const [view, setView] = React.useState<CalendarView>('days')\n\n // Reset view when popover closes\n React.useEffect(() => {\n if (!open) setView('days')\n }, [open])\n\n // Derive time parts\n const hours24 = value ? value.getHours() : 0\n const minutes = value ? value.getMinutes() : 0\n const ampm: 'AM' | 'PM' = hours24 >= 12 ? 'PM' : 'AM'\n const hours12 = hours24 === 0 ? 12 : hours24 > 12 ? hours24 - 12 : hours24\n\n const hoursRange =\n timeFormat === '12h' ? generateRange(1, 12, 1) : generateRange(0, 23, 1)\n const minutesRange = generateRange(0, 59, minuteStep)\n\n const selectedHour = timeFormat === '12h' ? hours12 : hours24\n\n // --- Calendar view handlers ---\n\n const handleDateSelect = (date: Date) => {\n // Merge with existing time part (or default to current time parts)\n let merged = setHours(date, value ? value.getHours() : hours24)\n merged = setMinutes(merged, value ? value.getMinutes() : minutes)\n onChange?.(merged)\n }\n\n const handleHeaderClick = () => {\n setView((prev) => (prev === 'days' ? 'months' : 'years'))\n }\n\n const handleMonthSelect = (month: number) => {\n setCurrentMonth((prev) => setMonth(prev, month))\n setView('days')\n }\n\n const handleYearSelect = (year: number) => {\n setCurrentMonth((prev) => setYear(prev, year))\n setView('months')\n }\n\n // --- Time handlers ---\n\n const handleHourChange = (hour: number) => {\n const base = value ? new Date(value) : new Date()\n let h = hour\n\n if (timeFormat === '12h') {\n const currentAmPm = value ? ampm : 'AM'\n if (currentAmPm === 'AM') {\n h = hour === 12 ? 0 : hour\n } else {\n h = hour === 12 ? 12 : hour + 12\n }\n }\n\n const updated = setHours(base, h)\n onChange?.(updated)\n }\n\n const handleMinuteChange = (minute: number) => {\n const base = value ? new Date(value) : new Date()\n const updated = setMinutes(base, minute)\n onChange?.(updated)\n }\n\n const handleAmPmToggle = (period: 'AM' | 'PM') => {\n const base = value ? new Date(value) : new Date()\n const currentH = base.getHours()\n let newH: number\n\n if (period === 'AM') {\n newH = currentH >= 12 ? currentH - 12 : currentH\n } else {\n newH = currentH < 12 ? currentH + 12 : currentH\n }\n\n onChange?.(setHours(base, newH))\n }\n\n // --- Display text ---\n\n const displayText = React.useMemo(() => {\n if (!value) return null\n const fmt =\n timeFormat === '12h' ? 'MMM d, yyyy h:mm a' : 'MMM d, yyyy HH:mm'\n return format(value, fmt)\n }, [value, timeFormat])\n\n // --- Render calendar view ---\n\n const renderView = () => {\n switch (view) {\n case 'years':\n return (\n <YearPicker\n currentYear={currentMonth.getFullYear()}\n selectedYear={value?.getFullYear()}\n onYearSelect={handleYearSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n case 'months':\n return (\n <MonthPicker\n currentYear={currentMonth.getFullYear()}\n selectedMonth={value?.getMonth()}\n onMonthSelect={handleMonthSelect}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n default:\n return (\n <CalendarGrid\n currentMonth={currentMonth}\n selected={value}\n onSelect={handleDateSelect}\n onMonthChange={setCurrentMonth}\n onHeaderClick={handleHeaderClick}\n disabledDates={disabledDates}\n minDate={minDate}\n maxDate={maxDate}\n />\n )\n }\n }\n\n // Compact time selector styles\n const selectBase =\n 'h-ds-sm rounded-control border border-surface-border-strong bg-surface-overlay px-ds-02 text-ds-md text-surface-fg transition-colors duration-fast-01 ease-productive-standard hover:border-surface-border-strong focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 cursor-pointer appearance-none'\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n className,\n )}\n aria-label={displayText ? `Selected: ${displayText}` : placeholder}\n >\n <Icon icon={IconCalendarClock} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n displayText\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {displayText ?? placeholder}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n <div className=\"flex flex-col gap-ds-04\">\n {/* Calendar portion */}\n {renderView()}\n\n {/* Time selection row */}\n {view === 'days' && (\n <div className=\"flex items-center gap-ds-02 border-t border-surface-border-strong pt-ds-04\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Time\n </span>\n\n {/* Hour select */}\n <select\n value={selectedHour ?? ''}\n onChange={(e) => handleHourChange(Number(e.target.value))}\n className={selectBase}\n aria-label=\"Hour\"\n >\n {!value && <option value=\"\">--</option>}\n {hoursRange.map((h) => (\n <option key={h} value={h}>\n {timeFormat === '24h' ? padTwo(h) : h}\n </option>\n ))}\n </select>\n\n <span className=\"text-ds-md font-semibold text-surface-fg-subtle\">\n :\n </span>\n\n {/* Minute select */}\n <select\n value={value ? minutes : ''}\n onChange={(e) => handleMinuteChange(Number(e.target.value))}\n className={selectBase}\n aria-label=\"Minute\"\n >\n {!value && <option value=\"\">--</option>}\n {minutesRange.map((m) => (\n <option key={m} value={m}>\n {padTwo(m)}\n </option>\n ))}\n </select>\n\n {/* AM/PM toggle for 12h */}\n {timeFormat === '12h' && (\n <select\n value={value ? ampm : ''}\n onChange={(e) =>\n handleAmPmToggle(e.target.value as 'AM' | 'PM')\n }\n className={selectBase}\n aria-label=\"AM or PM\"\n >\n {!value && <option value=\"\">--</option>}\n <option value=\"AM\">AM</option>\n <option value=\"PM\">PM</option>\n </select>\n )}\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nDateTimePicker.displayName = 'DateTimePicker'\n\nexport { DateTimePicker }\n","'use client'\n\nimport { IconClock } from '@tabler/icons-react'\nimport { format, setHours, setMinutes, setSeconds } from 'date-fns'\nimport * as React from 'react'\n\nimport { Icon } from '../../ui/icon'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui/popover'\n\nexport interface TimePickerProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'onChange' | 'value'> {\n /** The currently selected time (as a Date object). */\n value?: Date | null\n /** Callback fired when the time changes. */\n onChange?: (date: Date) => void\n /** Display format: 12-hour with AM/PM or 24-hour. */\n format?: '12h' | '24h'\n /** Step interval for minutes column. */\n minuteStep?: number\n /** Step interval for seconds column. */\n secondStep?: number\n /** Whether to show the seconds column. */\n showSeconds?: boolean\n /** Placeholder text when no value is set. */\n placeholder?: string\n /** Additional class names for the trigger button. */\n className?: string\n /** Whether the picker is disabled. */\n disabled?: boolean\n}\n\nfunction generateRange(start: number, end: number, step: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i += step) {\n result.push(i)\n }\n return result\n}\n\nfunction padTwo(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nconst TimePicker = React.forwardRef<HTMLButtonElement, TimePickerProps>(\n function TimePicker(\n {\n value,\n onChange,\n format: timeFormat = '12h',\n minuteStep = 1,\n secondStep = 1,\n showSeconds = false,\n placeholder = 'Pick a time',\n className,\n disabled = false,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(false)\n\n // Derive display parts from value\n const hours24 = value ? value.getHours() : null\n const minutes = value ? value.getMinutes() : null\n const seconds = value ? value.getSeconds() : null\n const ampm = hours24 !== null ? (hours24 >= 12 ? 'PM' : 'AM') : null\n\n // For 12h display, convert 24h to 12h\n const hours12 =\n hours24 !== null\n ? hours24 === 0\n ? 12\n : hours24 > 12\n ? hours24 - 12\n : hours24\n : null\n\n const hoursRange =\n timeFormat === '12h' ? generateRange(1, 12, 1) : generateRange(0, 23, 1)\n const minutesRange = generateRange(0, 59, minuteStep)\n const secondsRange = generateRange(0, 59, secondStep)\n\n const createOrUpdateDate = (\n overrides: { hours?: number; minutes?: number; seconds?: number; ampm?: 'AM' | 'PM' },\n ): Date => {\n const base = value ? new Date(value) : new Date()\n\n let h = overrides.hours ?? base.getHours()\n const m = overrides.minutes ?? base.getMinutes()\n const s = overrides.seconds ?? base.getSeconds()\n\n // If we're in 12h mode, we need to convert the 12h value to 24h\n if (timeFormat === '12h' && overrides.hours !== undefined) {\n const currentAmPm = overrides.ampm ?? ampm ?? 'AM'\n if (currentAmPm === 'AM') {\n h = overrides.hours === 12 ? 0 : overrides.hours\n } else {\n h = overrides.hours === 12 ? 12 : overrides.hours + 12\n }\n }\n\n let result = setHours(base, h)\n result = setMinutes(result, m)\n result = setSeconds(result, s)\n return result\n }\n\n const handleHourSelect = (hour: number) => {\n const updated = createOrUpdateDate({ hours: hour })\n onChange?.(updated)\n }\n\n const handleMinuteSelect = (minute: number) => {\n const updated = createOrUpdateDate({ minutes: minute })\n onChange?.(updated)\n }\n\n const handleSecondSelect = (second: number) => {\n const updated = createOrUpdateDate({ seconds: second })\n onChange?.(updated)\n }\n\n const handleAmPmToggle = (period: 'AM' | 'PM') => {\n if (!value) {\n // Create a date with 12:00 in the chosen period\n const h = period === 'AM' ? 0 : 12\n let d = new Date()\n d = setHours(d, h)\n d = setMinutes(d, 0)\n d = setSeconds(d, 0)\n onChange?.(d)\n return\n }\n\n const currentH = value.getHours()\n let newH: number\n\n if (period === 'AM') {\n newH = currentH >= 12 ? currentH - 12 : currentH\n } else {\n newH = currentH < 12 ? currentH + 12 : currentH\n }\n\n onChange?.(setHours(new Date(value), newH))\n }\n\n // Format display string\n const displayText = React.useMemo(() => {\n if (!value) return null\n if (timeFormat === '12h') {\n const fmt = showSeconds ? 'h:mm:ss a' : 'h:mm a'\n return format(value, fmt)\n }\n const fmt = showSeconds ? 'HH:mm:ss' : 'HH:mm'\n return format(value, fmt)\n }, [value, timeFormat, showSeconds])\n\n const selectedHour = timeFormat === '12h' ? hours12 : hours24\n\n const columnClass =\n 'flex flex-col gap-ds-01 overflow-y-auto max-h-[200px] px-ds-01'\n\n const itemBase =\n 'flex h-ds-sm w-full items-center justify-center rounded-control text-ds-md transition-colors duration-fast-01 ease-productive-standard cursor-pointer'\n const itemSelected =\n 'bg-accent-9 text-accent-fg'\n const itemDefault =\n 'text-surface-fg hover:bg-surface-raised-hover'\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n {...props}\n className={cn(\n 'inline-flex h-ds-sm-plus items-center gap-ds-03 rounded-surface border border-surface-border-strong bg-surface-overlay px-ds-04 text-left transition-colors duration-fast-01 ease-productive-standard',\n 'hover:border-surface-border-strong',\n 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2',\n disabled && 'opacity-action-disabled pointer-events-none',\n className,\n )}\n aria-label={displayText ? `Selected time: ${displayText}` : placeholder}\n >\n <Icon icon={IconClock} size=\"sm\" stroke=\"light\" className=\"text-surface-fg-subtle\" />\n <span\n className={cn(\n 'text-ds-md',\n displayText\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {displayText ?? placeholder}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-auto border-surface-border-strong bg-surface-overlay p-ds-04\"\n align=\"start\"\n sideOffset={4}\n >\n <div className=\"flex gap-ds-03\" role=\"group\" aria-label=\"Time picker\">\n {/* Hours column */}\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Hr\n </span>\n <div className={cn(columnClass, 'min-w-ds-09')}>\n {hoursRange.map((h) => (\n <button\n key={h}\n type=\"button\"\n onClick={() => handleHourSelect(h)}\n className={cn(\n itemBase,\n selectedHour === h ? itemSelected : itemDefault,\n )}\n aria-label={`${h} hours`}\n aria-selected={selectedHour === h || undefined}\n >\n {timeFormat === '24h' ? padTwo(h) : h}\n </button>\n ))}\n </div>\n </div>\n\n {/* Minutes column */}\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Min\n </span>\n <div className={cn(columnClass, 'min-w-ds-09')}>\n {minutesRange.map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => handleMinuteSelect(m)}\n className={cn(\n itemBase,\n minutes === m ? itemSelected : itemDefault,\n )}\n aria-label={`${padTwo(m)} minutes`}\n aria-selected={minutes === m || undefined}\n >\n {padTwo(m)}\n </button>\n ))}\n </div>\n </div>\n\n {/* Seconds column */}\n {showSeconds && (\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n Sec\n </span>\n <div className={cn(columnClass, 'min-w-ds-09')}>\n {secondsRange.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => handleSecondSelect(s)}\n className={cn(\n itemBase,\n seconds === s ? itemSelected : itemDefault,\n )}\n aria-label={`${padTwo(s)} seconds`}\n aria-selected={seconds === s || undefined}\n >\n {padTwo(s)}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* AM/PM toggle for 12h format */}\n {timeFormat === '12h' && (\n <div className=\"flex flex-col items-center gap-ds-02\">\n <span className=\"text-ds-xs font-semibold uppercase tracking-wider text-surface-fg-subtle\">\n &nbsp;\n </span>\n <div className=\"flex flex-col gap-ds-01 px-ds-01\">\n {(['AM', 'PM'] as const).map((period) => (\n <button\n key={period}\n type=\"button\"\n onClick={() => handleAmPmToggle(period)}\n className={cn(\n itemBase,\n 'min-w-[44px] font-semibold',\n ampm === period ? itemSelected : itemDefault,\n )}\n aria-label={period}\n aria-selected={ampm === period || undefined}\n >\n {period}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n )\n },\n)\n\nTimePicker.displayName = 'TimePicker'\n\nexport { TimePicker }\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deadline-indicator.js","names":[],"sources":["../../src/composed/deadline-indicator.tsx"],"sourcesContent":["'use client'\n\nimport { IconClock } from '@tabler/icons-react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { Icon } from '../ui/icon'\nimport { motionProps } from '../ui/lib/motion'\nimport { cn } from '../ui/lib/utils'\nimport { SimpleTooltip } from './simple-tooltip'\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface DeadlineIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n deadline: Date | string\n /** Minutes before deadline to show warning color @default 1440 (24h) */\n warningThreshold?: number\n /** Minutes before deadline to show critical color @default 240 (4h) */\n criticalThreshold?: number\n /** @default 'relative' */\n format?: 'relative' | 'absolute'\n /** Show clock icon prefix */\n showIcon?: boolean\n /** Auto-refresh interval in ms to keep relative time up to date @default 60000 */\n refreshInterval?: number\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\nfunction formatRelative(minutesRemaining: number): string {\n const abs = Math.abs(minutesRemaining)\n const prefix = minutesRemaining < 0 ? 'Overdue by ' : ''\n const suffix = minutesRemaining >= 0 ? ' left' : ''\n\n if (abs < 1) return minutesRemaining < 0 ? 'Overdue' : 'Due now'\n if (abs < 60) return `${prefix}${Math.round(abs)}m${suffix}`\n if (abs < 1440) return `${prefix}${Math.round(abs / 60)}h${suffix}`\n return `${prefix}${Math.round(abs / 1440)}d${suffix}`\n}\n\nfunction formatAbsolute(date: Date): string {\n return date.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n })\n}\n\n// ============================================================\n// DeadlineIndicator\n// ============================================================\n\nconst DeadlineIndicator = React.forwardRef<HTMLSpanElement, DeadlineIndicatorProps>(({\n deadline,\n warningThreshold = 1440,\n criticalThreshold = 240,\n format = 'relative',\n showIcon = false,\n refreshInterval = 60000,\n className,\n ...props\n}, ref) => {\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0)\n React.useEffect(() => {\n if (!refreshInterval) return\n const id = setInterval(forceUpdate, refreshInterval)\n return () => clearInterval(id)\n }, [refreshInterval])\n\n const deadlineDate = React.useMemo(\n () => (deadline instanceof Date ? deadline : new Date(deadline)),\n [deadline],\n )\n const minutesRemaining = (deadlineDate.getTime() - Date.now()) / 60000\n\n let colorClass: string\n if (minutesRemaining <= 0) {\n colorClass = 'text-error-11 font-semibold'\n } else if (minutesRemaining <= criticalThreshold) {\n colorClass = 'text-error-11'\n } else if (minutesRemaining <= warningThreshold) {\n colorClass = 'text-warning-11'\n } else {\n colorClass = 'text-success-11'\n }\n\n const text = format === 'relative'\n ? formatRelative(minutesRemaining)\n : formatAbsolute(deadlineDate)\n\n const isOverdue = minutesRemaining <= 0\n const isCritical = minutesRemaining <= criticalThreshold && minutesRemaining > 0\n // Non-transform opacity loop — MotionConfig won't stop it, so drop the pulse\n // under reduced motion. Colour still signals urgency.\n const prefersReduced = useReducedMotion()\n const shouldPulse = (isOverdue || isCritical) && !prefersReduced\n\n const showTooltip = format === 'relative'\n const tooltipContent = deadlineDate.toLocaleString()\n\n if (shouldPulse) {\n const inner = (\n <motion.span\n ref={ref}\n className={cn('inline-flex items-center gap-ds-01 font-sans text-ds-sm', colorClass, className)}\n animate={{ opacity: [1, 0.7, 1] }}\n transition={{ duration: 2, repeat: Infinity }}\n {...motionProps(props)}\n >\n {showIcon && <Icon icon={IconClock} size=\"xs\" />}\n {text}\n </motion.span>\n )\n\n return showTooltip ? <SimpleTooltip content={tooltipContent}>{inner}</SimpleTooltip> : inner\n }\n\n const inner = (\n <span\n ref={ref}\n className={cn('inline-flex items-center gap-ds-01 font-sans text-ds-sm', colorClass, className)}\n {...props}\n >\n {showIcon && <Icon icon={IconClock} size=\"xs\" />}\n {text}\n </span>\n )\n\n return showTooltip ? <SimpleTooltip content={tooltipContent}>{inner}</SimpleTooltip> : inner\n})\nDeadlineIndicator.displayName = 'DeadlineIndicator'\n\nexport { DeadlineIndicator }\n"],"mappings":";;;;;;;;;;AAiCA,SAAS,EAAe,GAAkC;CACxD,IAAM,IAAM,KAAK,IAAI,EAAiB,EAChC,IAAS,IAAmB,IAAI,gBAAgB,IAChD,IAAS,KAAoB,IAAI,UAAU;AAKjD,QAHI,IAAM,IAAU,IAAmB,IAAI,YAAY,YACnD,IAAM,KAAW,GAAG,IAAS,KAAK,MAAM,EAAI,CAAC,GAAG,MAChD,IAAM,OAAa,GAAG,IAAS,KAAK,MAAM,IAAM,GAAG,CAAC,GAAG,MACpD,GAAG,IAAS,KAAK,MAAM,IAAM,KAAK,CAAC,GAAG;;AAG/C,SAAS,EAAe,GAAoB;AAC1C,QAAO,EAAK,mBAAmB,KAAA,GAAW;EACxC,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AAOJ,IAAM,IAAoB,EAAM,YAAqD,EACnF,aACA,sBAAmB,MACnB,uBAAoB,KACpB,YAAS,YACT,cAAW,IACX,qBAAkB,KAClB,cACA,GAAG,KACF,MAAQ;CACT,IAAM,GAAG,KAAe,EAAM,YAAY,MAAc,IAAI,GAAG,EAAE;AACjE,GAAM,gBAAgB;AACpB,MAAI,CAAC,EAAiB;EACtB,IAAM,IAAK,YAAY,GAAa,EAAgB;AACpD,eAAa,cAAc,EAAG;IAC7B,CAAC,EAAgB,CAAC;CAErB,IAAM,IAAe,EAAM,cAClB,aAAoB,OAAO,IAAW,IAAI,KAAK,EAAS,EAC/D,CAAC,EAAS,CACX,EACK,KAAoB,EAAa,SAAS,GAAG,KAAK,KAAK,IAAI,KAE7D;AACJ,CAOE,IAPE,KAAoB,IACT,gCACJ,KAAoB,IAChB,kBACJ,KAAoB,IAChB,oBAEA;CAGf,IAAM,IAAO,MAAW,aACpB,EAAe,EAAiB,GAChC,EAAe,EAAa,EAE1B,IAAY,KAAoB,GAChC,IAAa,KAAoB,KAAqB,IAAmB,GAGzE,IAAiB,GAAkB,EACnC,KAAe,KAAa,MAAe,CAAC,GAE5C,IAAc,MAAW,YACzB,IAAiB,EAAa,gBAAgB;AAEpD,KAAI,GAAa;EACf,IAAM,IACJ,kBAAC,EAAO,MAAR;GACO;GACL,WAAW,EAAG,2DAA2D,GAAY,EAAU;GAC/F,SAAS,EAAE,SAAS;IAAC;IAAG;IAAK;IAAE,EAAE;GACjC,YAAY;IAAE,UAAU;IAAG,QAAQ;IAAU;GAC7C,GAAI,EAAY,EAAM;aALxB,CAOG,KAAY,kBAAC,GAAD;IAAM,MAAM;IAAW,MAAK;IAAO,CAAA,EAC/C,EACW;;AAGhB,SAAO,IAAc,kBAAC,GAAD;GAAe,SAAS;aAAiB;GAAsB,CAAA,GAAG;;CAGzF,IAAM,IACJ,kBAAC,QAAD;EACO;EACL,WAAW,EAAG,2DAA2D,GAAY,EAAU;EAC/F,GAAI;YAHN,CAKG,KAAY,kBAAC,GAAD;GAAM,MAAM;GAAW,MAAK;GAAO,CAAA,EAC/C,EACI;;AAGT,QAAO,IAAc,kBAAC,GAAD;EAAe,SAAS;YAAiB;EAAsB,CAAA,GAAG;EACvF;AACF,EAAkB,cAAc"}
1
+ {"version":3,"file":"deadline-indicator.js","names":[],"sources":["../../src/composed/deadline-indicator.tsx"],"sourcesContent":["'use client'\n\nimport { IconClock } from '@tabler/icons-react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { Icon } from '../ui/icon'\nimport { motionProps } from '../ui/lib/motion'\nimport { cn } from '../ui/lib/utils'\nimport { SimpleTooltip } from './simple-tooltip'\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface DeadlineIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n deadline: Date | string\n /** Minutes before deadline to show warning color @default 1440 (24h) */\n warningThreshold?: number\n /** Minutes before deadline to show critical color @default 240 (4h) */\n criticalThreshold?: number\n /** @default 'relative' */\n format?: 'relative' | 'absolute'\n /** Show clock icon prefix */\n showIcon?: boolean\n /** Auto-refresh interval in ms to keep relative time up to date @default 60000 */\n refreshInterval?: number\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\nfunction formatRelative(minutesRemaining: number): string {\n const abs = Math.abs(minutesRemaining)\n const prefix = minutesRemaining < 0 ? 'Overdue by ' : ''\n const suffix = minutesRemaining >= 0 ? ' left' : ''\n\n if (abs < 1) return minutesRemaining < 0 ? 'Overdue' : 'Due now'\n if (abs < 60) return `${prefix}${Math.round(abs)}m${suffix}`\n if (abs < 1440) return `${prefix}${Math.round(abs / 60)}h${suffix}`\n return `${prefix}${Math.round(abs / 1440)}d${suffix}`\n}\n\nfunction formatAbsolute(date: Date): string {\n return date.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n })\n}\n\n// ============================================================\n// DeadlineIndicator\n// ============================================================\n\nconst DeadlineIndicator = React.forwardRef<HTMLSpanElement, DeadlineIndicatorProps>(({\n deadline,\n warningThreshold = 1440,\n criticalThreshold = 240,\n format = 'relative',\n showIcon = false,\n refreshInterval = 60000,\n className,\n ...props\n}, ref) => {\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0)\n React.useEffect(() => {\n if (!refreshInterval) return\n const id = setInterval(forceUpdate, refreshInterval)\n return () => clearInterval(id)\n }, [refreshInterval])\n\n const deadlineDate = React.useMemo(\n () => (deadline instanceof Date ? deadline : new Date(deadline)),\n [deadline],\n )\n const minutesRemaining = (deadlineDate.getTime() - Date.now()) / 60000\n\n let colorClass: string\n if (minutesRemaining <= 0) {\n colorClass = 'text-error-11 font-semibold'\n } else if (minutesRemaining <= criticalThreshold) {\n colorClass = 'text-error-11'\n } else if (minutesRemaining <= warningThreshold) {\n colorClass = 'text-warning-11'\n } else {\n colorClass = 'text-success-11'\n }\n\n const text = format === 'relative'\n ? formatRelative(minutesRemaining)\n : formatAbsolute(deadlineDate)\n\n const isOverdue = minutesRemaining <= 0\n const isCritical = minutesRemaining <= criticalThreshold && minutesRemaining > 0\n // Non-transform opacity loop — MotionConfig won't stop it, so drop the pulse\n // under reduced motion. Colour still signals urgency.\n const prefersReduced = useReducedMotion()\n const shouldPulse = (isOverdue || isCritical) && !prefersReduced\n\n const showTooltip = format === 'relative'\n const tooltipContent = deadlineDate.toLocaleString()\n\n if (shouldPulse) {\n const inner = (\n <motion.span\n ref={ref}\n className={cn('inline-flex items-center gap-ds-01 font-sans text-ds-sm', colorClass, className)}\n animate={{ opacity: [1, 0.7, 1] }}\n transition={{ duration: 2, repeat: Infinity }}\n {...motionProps(props)}\n >\n {showIcon && <Icon icon={IconClock} size=\"xs\" />}\n {text}\n </motion.span>\n )\n\n return showTooltip ? <SimpleTooltip content={tooltipContent}>{inner}</SimpleTooltip> : inner\n }\n\n const inner = (\n <span\n ref={ref}\n className={cn('inline-flex items-center gap-ds-01 font-sans text-ds-sm', colorClass, className)}\n {...props}\n >\n {showIcon && <Icon icon={IconClock} size=\"xs\" />}\n {text}\n </span>\n )\n\n return showTooltip ? <SimpleTooltip content={tooltipContent}>{inner}</SimpleTooltip> : inner\n})\nDeadlineIndicator.displayName = 'DeadlineIndicator'\n\nexport { DeadlineIndicator }\n"],"mappings":";;;;;;;;;;AAiCA,SAAS,EAAe,GAAkC;CACxD,IAAM,IAAM,KAAK,IAAI,CAAgB,GAC/B,IAAS,IAAmB,IAAI,gBAAgB,IAChD,IAAS,KAAoB,IAAI,UAAU;CAKjD,OAHI,IAAM,IAAU,IAAmB,IAAI,YAAY,YACnD,IAAM,KAAW,GAAG,IAAS,KAAK,MAAM,CAAG,EAAE,GAAG,MAChD,IAAM,OAAa,GAAG,IAAS,KAAK,MAAM,IAAM,EAAE,EAAE,GAAG,MACpD,GAAG,IAAS,KAAK,MAAM,IAAM,IAAI,EAAE,GAAG;AAC/C;AAEA,SAAS,EAAe,GAAoB;CAC1C,OAAO,EAAK,mBAAmB,KAAA,GAAW;EACxC,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;CACV,CAAC;AACH;AAMA,IAAM,IAAoB,EAAM,YAAqD,EACnF,aACA,sBAAmB,MACnB,uBAAoB,KACpB,YAAS,YACT,cAAW,IACX,qBAAkB,KAClB,cACA,GAAG,KACF,MAAQ;CACT,IAAM,GAAG,KAAe,EAAM,YAAY,MAAc,IAAI,GAAG,CAAC;CAChE,EAAM,gBAAgB;EACpB,IAAI,CAAC,GAAiB;EACtB,IAAM,IAAK,YAAY,GAAa,CAAe;EACnD,aAAa,cAAc,CAAE;CAC/B,GAAG,CAAC,CAAe,CAAC;CAEpB,IAAM,IAAe,EAAM,cAClB,aAAoB,OAAO,IAAW,IAAI,KAAK,CAAQ,GAC9D,CAAC,CAAQ,CACX,GACM,KAAoB,EAAa,QAAQ,IAAI,KAAK,IAAI,KAAK,KAE7D;CACJ,AAOE,IAPE,KAAoB,IACT,gCACJ,KAAoB,IAChB,kBACJ,KAAoB,IAChB,oBAEA;CAGf,IAAM,IAAO,MAAW,aACpB,EAAe,CAAgB,IAC/B,EAAe,CAAY,GAEzB,IAAY,KAAoB,GAChC,IAAa,KAAoB,KAAqB,IAAmB,GAGzE,IAAiB,EAAiB,GAClC,KAAe,KAAa,MAAe,CAAC,GAE5C,IAAc,MAAW,YACzB,IAAiB,EAAa,eAAe;CAEnD,IAAI,GAAa;EACf,IAAM,IACJ,kBAAC,EAAO,MAAR;GACO;GACL,WAAW,EAAG,2DAA2D,GAAY,CAAS;GAC9F,SAAS,EAAE,SAAS;IAAC;IAAG;IAAK;GAAC,EAAE;GAChC,YAAY;IAAE,UAAU;IAAG,QAAQ;GAAS;GAC5C,GAAI,EAAY,CAAK;aALvB,CAOG,KAAY,kBAAC,GAAD;IAAM,MAAM;IAAW,MAAK;GAAM,CAAA,GAC9C,CACU;;EAGf,OAAO,IAAc,kBAAC,GAAD;GAAe,SAAS;aAAiB;EAAqB,CAAA,IAAI;CACzF;CAEA,IAAM,IACJ,kBAAC,QAAD;EACO;EACL,WAAW,EAAG,2DAA2D,GAAY,CAAS;EAC9F,GAAI;YAHN,CAKG,KAAY,kBAAC,GAAD;GAAM,MAAM;GAAW,MAAK;EAAM,CAAA,GAC9C,CACG;;CAGR,OAAO,IAAc,kBAAC,GAAD;EAAe,SAAS;YAAiB;CAAqB,CAAA,IAAI;AACzF,CAAC;AACD,EAAkB,cAAc"}
@@ -36,11 +36,11 @@ export interface EmojiPickerPopoverProps extends EmojiPickerProps {
36
36
  /** @default 'start' */
37
37
  align?: 'start' | 'center' | 'end';
38
38
  }
39
- declare function EmojiPicker({ onSelect, emojibaseUrl, className }: EmojiPickerProps): import("react/jsx-runtime").JSX.Element;
39
+ declare function EmojiPicker({ onSelect, emojibaseUrl, className }: EmojiPickerProps): React.JSX.Element;
40
40
  declare namespace EmojiPicker {
41
41
  var displayName: string;
42
42
  }
43
- declare function EmojiPickerPopover({ children, align, onSelect, emojibaseUrl, className, }: EmojiPickerPopoverProps): import("react/jsx-runtime").JSX.Element;
43
+ declare function EmojiPickerPopover({ children, align, onSelect, emojibaseUrl, className, }: EmojiPickerPopoverProps): React.JSX.Element;
44
44
  declare namespace EmojiPickerPopover {
45
45
  var displayName: string;
46
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"emoji-picker.d.ts","sourceRoot":"","sources":["../../src/composed/emoji-picker.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAA;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,gEAAgE;IAChE,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;IACjC,6EAA6E;IAC7E,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC3C,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;IAChD;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;CACnC;AAaD,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CA6E3E;kBA7EQ,WAAW;;;AAmFpB,iBAAS,kBAAkB,CAAC,EAC1B,QAAQ,EACR,KAAe,EACf,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,EAAE,uBAAuB,2CAoBzB;kBA1BQ,kBAAkB;;;AA+B3B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAA"}
1
+ {"version":3,"file":"emoji-picker.d.ts","sourceRoot":"","sources":["../../src/composed/emoji-picker.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAA;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,gEAAgE;IAChE,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;IACjC,6EAA6E;IAC7E,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC3C,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;IAChD;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;CACnC;AAaD,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,gBAAgB,qBA6E3E;kBA7EQ,WAAW;;;AAmFpB,iBAAS,kBAAkB,CAAC,EAC1B,QAAQ,EACR,KAAe,EACf,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,EAAE,uBAAuB,qBAoBzB;kBA1BQ,kBAAkB;;;AA+B3B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"emoji-picker.js","names":[],"sources":["../../src/composed/emoji-picker.tsx"],"sourcesContent":["'use client'\n\nimport { EmojiPicker as Frimousse } from 'frimousse'\nimport * as React from 'react'\n\nimport { cn } from '../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../ui/popover'\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface EmojiData {\n id: string\n native: string\n shortcodes?: string\n}\n\n/**\n * @deprecated Emoji art styles (apple/google/twitter/facebook) were removed in\n * the frimousse migration — the picker is native-only. Retained for source\n * compatibility; the `set` prop is now a no-op.\n */\nexport type EmojiSet = 'native' | 'apple' | 'google' | 'twitter' | 'facebook'\n\nexport interface EmojiPickerProps {\n onSelect: (emoji: EmojiData) => void\n /** @deprecated no-op — the picker renders native emoji only. */\n set?: EmojiSet\n /** @deprecated no-op — theme follows the surrounding `.dark` class via tokens. */\n theme?: 'auto' | 'light' | 'dark'\n /** @deprecated no-op — removed with the emoji-mart → frimousse migration. */\n previewPosition?: 'top' | 'bottom' | 'none'\n /** @deprecated no-op — removed with the emoji-mart → frimousse migration. */\n skinTonePosition?: 'search' | 'preview' | 'none'\n /**\n * Base URL the emoji dataset is fetched from (`${emojibaseUrl}/${locale}/data.json`).\n * Defaults to frimousse's jsdelivr CDN. Point it at a self-hosted copy of the\n * `emojibase-data` package to remove the runtime CDN dependency (CSP / offline /\n * air-gapped) — e.g. copy `node_modules/emojibase-data` into `public/emojibase`\n * and pass `emojibaseUrl=\"/emojibase\"`.\n */\n emojibaseUrl?: string\n className?: string\n}\n\nexport interface EmojiPickerPopoverProps extends EmojiPickerProps {\n children: React.ReactNode\n /** @default 'start' */\n align?: 'start' | 'center' | 'end'\n}\n\n// frimousse emits `{ emoji: nativeChar, label }`. Map to the DS EmojiData shape;\n// `id` is a kebab of the label (emojibase has no emoji-mart-style short id).\nfunction toEmojiData(e: { emoji: string; label: string }): EmojiData {\n const id = e.label.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')\n return { id, native: e.emoji }\n}\n\n// ============================================================\n// EmojiPicker (frimousse, native-only)\n// ============================================================\n\nfunction EmojiPicker({ onSelect, emojibaseUrl, className }: EmojiPickerProps) {\n return (\n <Frimousse.Root\n onEmojiSelect={(e) => onSelect(toEmojiData(e))}\n emojibaseUrl={emojibaseUrl}\n className={cn(\n 'isolate flex h-[435px] w-[352px] flex-col rounded-surface bg-surface-overlay text-surface-fg shadow-raised-hover',\n className,\n )}\n >\n <div className=\"p-ds-03\">\n <Frimousse.Search\n placeholder=\"Search emoji…\"\n className=\"w-full rounded-control bg-surface-raised px-ds-03 py-ds-02b text-ds-sm text-surface-fg placeholder:text-surface-fg-subtle focus-ring\"\n />\n </div>\n <Frimousse.Viewport className=\"relative flex-1 overflow-y-auto\">\n <Frimousse.Loading className=\"absolute inset-0 flex items-center justify-center text-ds-sm text-surface-fg-muted\">\n Loading…\n </Frimousse.Loading>\n <Frimousse.Empty className=\"absolute inset-0 flex items-center justify-center text-ds-sm text-surface-fg-muted\">\n No emoji found.\n </Frimousse.Empty>\n <Frimousse.List\n className=\"select-none pb-ds-02\"\n components={{\n CategoryHeader: ({ category, ...props }) => (\n <div\n className=\"bg-surface-overlay px-ds-03 pb-ds-01 pt-ds-03 text-ds-xs font-medium text-surface-fg-muted\"\n {...props}\n >\n {category.label}\n </div>\n ),\n Row: ({ children, ...props }) => (\n <div className=\"flex\" {...props}>\n {children}\n </div>\n ),\n // Width is the frimousse column width (viewport ÷ --frimousse-list-columns)\n // so a full row spans edge-to-edge — no fixed size, no right-hand gutter.\n Emoji: ({ emoji, ...props }) => (\n <button\n type=\"button\"\n className={cn(\n 'flex aspect-square w-[calc(100%/var(--frimousse-list-columns))] items-center justify-center rounded-control text-[1.375rem] leading-none',\n 'hover:bg-surface-raised',\n emoji.isActive && 'bg-surface-raised',\n )}\n {...props}\n >\n {emoji.emoji}\n </button>\n ),\n }}\n />\n </Frimousse.Viewport>\n <div className=\"flex items-center justify-between gap-ds-02 border-t border-surface-border-subtle p-ds-02\">\n <Frimousse.ActiveEmoji>\n {({ emoji }) =>\n emoji ? (\n <span className=\"flex min-w-0 items-center gap-ds-02 text-ds-sm text-surface-fg-muted\">\n <span className=\"text-[1.375rem] leading-none\">{emoji.emoji}</span>\n <span className=\"truncate\">{emoji.label}</span>\n </span>\n ) : (\n <span className=\"text-ds-sm text-surface-fg-subtle\">Pick an emoji…</span>\n )\n }\n </Frimousse.ActiveEmoji>\n <Frimousse.SkinToneSelector\n aria-label=\"Change skin tone\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-control text-[1.25rem] leading-none hover:bg-surface-raised focus-ring\"\n />\n </div>\n </Frimousse.Root>\n )\n}\n\n// ============================================================\n// EmojiPickerPopover\n// ============================================================\n\nfunction EmojiPickerPopover({\n children,\n align = 'start',\n onSelect,\n emojibaseUrl,\n className,\n}: EmojiPickerPopoverProps) {\n const [open, setOpen] = React.useState(false)\n\n const handleSelect = (emoji: EmojiData) => {\n onSelect(emoji)\n setOpen(false)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent\n align={align}\n className=\"w-auto border-none bg-transparent p-0 shadow-none\"\n sideOffset={8}\n >\n <EmojiPicker onSelect={handleSelect} emojibaseUrl={emojibaseUrl} className={className} />\n </PopoverContent>\n </Popover>\n )\n}\n\nEmojiPicker.displayName = 'EmojiPicker'\nEmojiPickerPopover.displayName = 'EmojiPickerPopover'\n\nexport { EmojiPicker, EmojiPickerPopover }\n"],"mappings":";;;;;;;AA0DA,SAAS,EAAY,GAAgD;AAEnE,QAAO;EAAE,IADE,EAAE,MAAM,aAAa,CAAC,QAAQ,eAAe,IAAI,CAAC,QAAQ,YAAY,GAAG;EACvE,QAAQ,EAAE;EAAO;;AAOhC,SAAS,EAAY,EAAE,aAAU,iBAAc,gBAA+B;AAC5E,QACE,kBAAC,EAAU,MAAX;EACE,gBAAgB,MAAM,EAAS,EAAY,EAAE,CAAC;EAChC;EACd,WAAW,EACT,oHACA,EACD;YANH;GAQE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,EAAU,QAAX;KACE,aAAY;KACZ,WAAU;KACV,CAAA;IACE,CAAA;GACN,kBAAC,EAAU,UAAX;IAAoB,WAAU;cAA9B;KACE,kBAAC,EAAU,SAAX;MAAmB,WAAU;gBAAqF;MAE9F,CAAA;KACpB,kBAAC,EAAU,OAAX;MAAiB,WAAU;gBAAqF;MAE9F,CAAA;KAClB,kBAAC,EAAU,MAAX;MACE,WAAU;MACV,YAAY;OACV,iBAAiB,EAAE,aAAU,GAAG,QAC9B,kBAAC,OAAD;QACE,WAAU;QACV,GAAI;kBAEH,EAAS;QACN,CAAA;OAER,MAAM,EAAE,aAAU,GAAG,QACnB,kBAAC,OAAD;QAAK,WAAU;QAAO,GAAI;QACvB;QACG,CAAA;OAIR,QAAQ,EAAE,UAAO,GAAG,QAClB,kBAAC,UAAD;QACE,MAAK;QACL,WAAW,EACT,4IACA,2BACA,EAAM,YAAY,oBACnB;QACD,GAAI;kBAEH,EAAM;QACA,CAAA;OAEZ;MACD,CAAA;KACiB;;GACrB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,EAAU,aAAX,EAAA,WACI,EAAE,eACF,IACE,kBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,QAAD;MAAM,WAAU;gBAAgC,EAAM;MAAa,CAAA,EACnE,kBAAC,QAAD;MAAM,WAAU;gBAAY,EAAM;MAAa,CAAA,CAC1C;SAEP,kBAAC,QAAD;KAAM,WAAU;eAAoC;KAAqB,CAAA,EAGvD,CAAA,EACxB,kBAAC,EAAU,kBAAX;KACE,cAAW;KACX,WAAU;KACV,CAAA,CACE;;GACS;;;AAQrB,SAAS,EAAmB,EAC1B,aACA,WAAQ,SACR,aACA,iBACA,gBAC0B;CAC1B,IAAM,CAAC,GAAM,KAAW,EAAM,SAAS,GAAM;AAO7C,QACE,kBAAC,GAAD;EAAe;EAAM,cAAc;YAAnC,CACE,kBAAC,GAAD;GAAgB,SAAA;GAAS;GAA0B,CAAA,EACnD,kBAAC,GAAD;GACS;GACP,WAAU;GACV,YAAY;aAEZ,kBAAC,GAAD;IAAa,WAbG,MAAqB;AAEzC,KADA,EAAS,EAAM,EACf,EAAQ,GAAM;;IAWyC;IAAyB;IAAa,CAAA;GAC1E,CAAA,CACT;;;AAId,EAAY,cAAc,eAC1B,EAAmB,cAAc"}
1
+ {"version":3,"file":"emoji-picker.js","names":[],"sources":["../../src/composed/emoji-picker.tsx"],"sourcesContent":["'use client'\n\nimport { EmojiPicker as Frimousse } from 'frimousse'\nimport * as React from 'react'\n\nimport { cn } from '../ui/lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../ui/popover'\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface EmojiData {\n id: string\n native: string\n shortcodes?: string\n}\n\n/**\n * @deprecated Emoji art styles (apple/google/twitter/facebook) were removed in\n * the frimousse migration — the picker is native-only. Retained for source\n * compatibility; the `set` prop is now a no-op.\n */\nexport type EmojiSet = 'native' | 'apple' | 'google' | 'twitter' | 'facebook'\n\nexport interface EmojiPickerProps {\n onSelect: (emoji: EmojiData) => void\n /** @deprecated no-op — the picker renders native emoji only. */\n set?: EmojiSet\n /** @deprecated no-op — theme follows the surrounding `.dark` class via tokens. */\n theme?: 'auto' | 'light' | 'dark'\n /** @deprecated no-op — removed with the emoji-mart → frimousse migration. */\n previewPosition?: 'top' | 'bottom' | 'none'\n /** @deprecated no-op — removed with the emoji-mart → frimousse migration. */\n skinTonePosition?: 'search' | 'preview' | 'none'\n /**\n * Base URL the emoji dataset is fetched from (`${emojibaseUrl}/${locale}/data.json`).\n * Defaults to frimousse's jsdelivr CDN. Point it at a self-hosted copy of the\n * `emojibase-data` package to remove the runtime CDN dependency (CSP / offline /\n * air-gapped) — e.g. copy `node_modules/emojibase-data` into `public/emojibase`\n * and pass `emojibaseUrl=\"/emojibase\"`.\n */\n emojibaseUrl?: string\n className?: string\n}\n\nexport interface EmojiPickerPopoverProps extends EmojiPickerProps {\n children: React.ReactNode\n /** @default 'start' */\n align?: 'start' | 'center' | 'end'\n}\n\n// frimousse emits `{ emoji: nativeChar, label }`. Map to the DS EmojiData shape;\n// `id` is a kebab of the label (emojibase has no emoji-mart-style short id).\nfunction toEmojiData(e: { emoji: string; label: string }): EmojiData {\n const id = e.label.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')\n return { id, native: e.emoji }\n}\n\n// ============================================================\n// EmojiPicker (frimousse, native-only)\n// ============================================================\n\nfunction EmojiPicker({ onSelect, emojibaseUrl, className }: EmojiPickerProps) {\n return (\n <Frimousse.Root\n onEmojiSelect={(e) => onSelect(toEmojiData(e))}\n emojibaseUrl={emojibaseUrl}\n className={cn(\n 'isolate flex h-[435px] w-[352px] flex-col rounded-surface bg-surface-overlay text-surface-fg shadow-raised-hover',\n className,\n )}\n >\n <div className=\"p-ds-03\">\n <Frimousse.Search\n placeholder=\"Search emoji…\"\n className=\"w-full rounded-control bg-surface-raised px-ds-03 py-ds-02b text-ds-sm text-surface-fg placeholder:text-surface-fg-subtle focus-ring\"\n />\n </div>\n <Frimousse.Viewport className=\"relative flex-1 overflow-y-auto\">\n <Frimousse.Loading className=\"absolute inset-0 flex items-center justify-center text-ds-sm text-surface-fg-muted\">\n Loading…\n </Frimousse.Loading>\n <Frimousse.Empty className=\"absolute inset-0 flex items-center justify-center text-ds-sm text-surface-fg-muted\">\n No emoji found.\n </Frimousse.Empty>\n <Frimousse.List\n className=\"select-none pb-ds-02\"\n components={{\n CategoryHeader: ({ category, ...props }) => (\n <div\n className=\"bg-surface-overlay px-ds-03 pb-ds-01 pt-ds-03 text-ds-xs font-medium text-surface-fg-muted\"\n {...props}\n >\n {category.label}\n </div>\n ),\n Row: ({ children, ...props }) => (\n <div className=\"flex\" {...props}>\n {children}\n </div>\n ),\n // Width is the frimousse column width (viewport ÷ --frimousse-list-columns)\n // so a full row spans edge-to-edge — no fixed size, no right-hand gutter.\n Emoji: ({ emoji, ...props }) => (\n <button\n type=\"button\"\n className={cn(\n 'flex aspect-square w-[calc(100%/var(--frimousse-list-columns))] items-center justify-center rounded-control text-[1.375rem] leading-none',\n 'hover:bg-surface-raised',\n emoji.isActive && 'bg-surface-raised',\n )}\n {...props}\n >\n {emoji.emoji}\n </button>\n ),\n }}\n />\n </Frimousse.Viewport>\n <div className=\"flex items-center justify-between gap-ds-02 border-t border-surface-border-subtle p-ds-02\">\n <Frimousse.ActiveEmoji>\n {({ emoji }) =>\n emoji ? (\n <span className=\"flex min-w-0 items-center gap-ds-02 text-ds-sm text-surface-fg-muted\">\n <span className=\"text-[1.375rem] leading-none\">{emoji.emoji}</span>\n <span className=\"truncate\">{emoji.label}</span>\n </span>\n ) : (\n <span className=\"text-ds-sm text-surface-fg-subtle\">Pick an emoji…</span>\n )\n }\n </Frimousse.ActiveEmoji>\n <Frimousse.SkinToneSelector\n aria-label=\"Change skin tone\"\n className=\"flex size-8 shrink-0 items-center justify-center rounded-control text-[1.25rem] leading-none hover:bg-surface-raised focus-ring\"\n />\n </div>\n </Frimousse.Root>\n )\n}\n\n// ============================================================\n// EmojiPickerPopover\n// ============================================================\n\nfunction EmojiPickerPopover({\n children,\n align = 'start',\n onSelect,\n emojibaseUrl,\n className,\n}: EmojiPickerPopoverProps) {\n const [open, setOpen] = React.useState(false)\n\n const handleSelect = (emoji: EmojiData) => {\n onSelect(emoji)\n setOpen(false)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent\n align={align}\n className=\"w-auto border-none bg-transparent p-0 shadow-none\"\n sideOffset={8}\n >\n <EmojiPicker onSelect={handleSelect} emojibaseUrl={emojibaseUrl} className={className} />\n </PopoverContent>\n </Popover>\n )\n}\n\nEmojiPicker.displayName = 'EmojiPicker'\nEmojiPickerPopover.displayName = 'EmojiPickerPopover'\n\nexport { EmojiPicker, EmojiPickerPopover }\n"],"mappings":";;;;;;;AA0DA,SAAS,EAAY,GAAgD;CAEnE,OAAO;EAAE,IADE,EAAE,MAAM,YAAY,CAAC,CAAC,QAAQ,eAAe,GAAG,CAAC,CAAC,QAAQ,YAAY,EACxE;EAAI,QAAQ,EAAE;CAAM;AAC/B;AAMA,SAAS,EAAY,EAAE,aAAU,iBAAc,gBAA+B;CAC5E,OACE,kBAAC,EAAU,MAAX;EACE,gBAAgB,MAAM,EAAS,EAAY,CAAC,CAAC;EAC/B;EACd,WAAW,EACT,oHACA,CACF;YANF;GAQE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,EAAU,QAAX;KACE,aAAY;KACZ,WAAU;IACX,CAAA;GACE,CAAA;GACL,kBAAC,EAAU,UAAX;IAAoB,WAAU;cAA9B;KACE,kBAAC,EAAU,SAAX;MAAmB,WAAU;gBAAqF;KAE/F,CAAA;KACnB,kBAAC,EAAU,OAAX;MAAiB,WAAU;gBAAqF;KAE/F,CAAA;KACjB,kBAAC,EAAU,MAAX;MACE,WAAU;MACV,YAAY;OACV,iBAAiB,EAAE,aAAU,GAAG,QAC9B,kBAAC,OAAD;QACE,WAAU;QACV,GAAI;kBAEH,EAAS;OACP,CAAA;OAEP,MAAM,EAAE,aAAU,GAAG,QACnB,kBAAC,OAAD;QAAK,WAAU;QAAO,GAAI;QACvB;OACE,CAAA;OAIP,QAAQ,EAAE,UAAO,GAAG,QAClB,kBAAC,UAAD;QACE,MAAK;QACL,WAAW,EACT,4IACA,2BACA,EAAM,YAAY,mBACpB;QACA,GAAI;kBAEH,EAAM;OACD,CAAA;MAEZ;KACD,CAAA;IACiB;;GACpB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,EAAU,aAAX,EAAA,WACI,EAAE,eACF,IACE,kBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,QAAD;MAAM,WAAU;gBAAgC,EAAM;KAAY,CAAA,GAClE,kBAAC,QAAD;MAAM,WAAU;gBAAY,EAAM;KAAY,CAAA,CAC1C;SAEN,kBAAC,QAAD;KAAM,WAAU;eAAoC;IAAoB,CAAA,EAGvD,CAAA,GACvB,kBAAC,EAAU,kBAAX;KACE,cAAW;KACX,WAAU;IACX,CAAA,CACE;;EACS;;AAEpB;AAMA,SAAS,EAAmB,EAC1B,aACA,WAAQ,SACR,aACA,iBACA,gBAC0B;CAC1B,IAAM,CAAC,GAAM,KAAW,EAAM,SAAS,EAAK;CAO5C,OACE,kBAAC,GAAD;EAAe;EAAM,cAAc;YAAnC,CACE,kBAAC,GAAD;GAAgB,SAAA;GAAS;EAAyB,CAAA,GAClD,kBAAC,GAAD;GACS;GACP,WAAU;GACV,YAAY;aAEZ,kBAAC,GAAD;IAAa,WAbG,MAAqB;KAEzC,AADA,EAAS,CAAK,GACd,EAAQ,EAAK;IACf;IAUyD;IAAyB;GAAY,CAAA;EAC1E,CAAA,CACT;;AAEb;AAEA,EAAY,cAAc,eAC1B,EAAmB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"empty-state.js","names":[],"sources":["../../src/composed/empty-state.tsx"],"sourcesContent":["'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { IconProvider, type IconSize } from '../ui/icon-context'\nimport type { IconInput } from '../ui/lib/icon-input'\nimport { tweens } from '../ui/lib/motion'\nimport { normalizeIcon } from '../ui/lib/normalize-icon'\nimport { cn } from '../ui/lib/utils'\n\nexport interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Icon. Accepts any `IconInput`. Falls back to the Devalok chakra glyph. */\n icon?: IconInput\n title: string\n description?: string\n action?: React.ReactNode\n compact?: boolean\n /** Icon size. Defaults to 'sm' when compact, 'md' otherwise. */\n iconSize?: 'sm' | 'md' | 'lg'\n}\n\nconst ICON_SIZE_TO_TOKEN: Record<'sm' | 'md' | 'lg', IconSize> = {\n sm: 'md',\n md: 'xl',\n lg: '2xl',\n}\n\nconst DevalokChakraIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M25.97,21.39c-0.9-1.85,0.08-3.95-1.72-5.39c1.76-1.44,0.8-3.55,1.69-5.39c0.05-0.12,0.04-0.25-0.02-0.35c-0.06-0.1-0.16-0.18-0.29-0.19c-2.05-0.15-3.35-2.04-5.5-1.21c-0.39-2.21-2.7-2.44-3.84-4.13c-0.08-0.1-0.19-0.16-0.31-0.16c-0.12,0-0.23,0.05-0.31,0.16c-1.14,1.69-3.43,1.92-3.82,4.13c-2.14-0.83-3.47,1.07-5.52,1.21c-0.13,0.01-0.23,0.09-0.29,0.19c-0.06,0.1-0.07,0.23-0.02,0.35c0.9,1.85-0.08,3.95,1.72,5.39c-1.76,1.44-0.8,3.55-1.69,5.39C6,21.51,6.02,21.64,6.07,21.74c0.06,0.1,0.16,0.18,0.29,0.19c2.05,0.15,3.38,2.06,5.52,1.23c0.39,2.21,2.67,2.43,3.82,4.12c0.08,0.1,0.19,0.16,0.31,0.16c0.12,0,0.23-0.05,0.31-0.16c1.14-1.69,3.42-1.92,3.81-4.13c2.14,0.83,3.48-1.07,5.53-1.22c0.13-0.01,0.23-0.09,0.29-0.19C26.01,21.64,26.02,21.51,25.97,21.39z\" />\n </svg>\n)\n\nconst EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n {\n icon,\n title,\n description,\n action,\n compact = false,\n iconSize,\n className,\n ...props\n },\n ref,\n ) => {\n const resolvedIconSize = iconSize ?? (compact ? 'sm' : 'md')\n const iconSizeClass = {\n sm: 'h-ico-sm w-ico-sm',\n md: 'h-ico-lg w-ico-lg',\n lg: 'h-ico-xl w-ico-xl',\n }[resolvedIconSize]\n const iconToken = ICON_SIZE_TO_TOKEN[resolvedIconSize]\n const normalized = normalizeIcon(icon, iconToken)\n const resolvedIcon = normalized ?? (\n <DevalokChakraIcon className={cn('text-surface-fg-subtle', iconSizeClass)} />\n )\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col items-center justify-center text-center',\n compact ? 'gap-ds-04 py-ds-07' : 'gap-ds-05 py-ds-10',\n className,\n )}\n {...props}\n >\n <div\n className={cn(\n 'flex items-center justify-center text-surface-fg-subtle',\n compact ? 'h-ds-md w-ds-md' : 'h-ds-lg w-ds-lg',\n )}\n >\n <IconProvider size={iconToken}>{resolvedIcon}</IconProvider>\n </div>\n\n <motion.div\n className=\"flex max-w-[280px] flex-col gap-ds-02\"\n initial={false}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.2, ...tweens.fade }}\n >\n <h3\n className={cn(\n 'text-surface-fg',\n compact ? 'text-ds-md font-semibold' : 'text-ds-base font-semibold',\n )}\n >\n {title}\n </h3>\n {description && (\n <p\n className={cn(\n 'text-surface-fg-subtle',\n compact ? 'text-ds-sm' : 'text-ds-md',\n )}\n >\n {description}\n </p>\n )}\n </motion.div>\n\n {action && <div className=\"mt-ds-02\">{action}</div>}\n </div>\n )\n },\n)\nEmptyState.displayName = 'EmptyState'\n\nexport { EmptyState }\n"],"mappings":";;;;;;;;;AAsBA,IAAM,IAA2D;CAC/D,IAAI;CACJ,IAAI;CACJ,IAAI;CACL,EAEK,KAAqB,EAAE,mBAC3B,kBAAC,OAAD;CACE,OAAM;CACN,SAAQ;CACR,MAAK;CACM;CACX,eAAY;WAEZ,kBAAC,QAAD,EAAM,GAAE,iuBAAkuB,CAAA;CACtuB,CAAA,EAGF,IAAa,EAAM,YAErB,EACE,SACA,UACA,gBACA,WACA,aAAU,IACV,aACA,cACA,GAAG,KAEL,MACG;CACH,IAAM,IAAmB,MAAa,IAAU,OAAO,OACjD,IAAgB;EACpB,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,CAAC,IACI,IAAY,EAAmB,IAE/B,IADa,EAAc,GAAM,EAAU,IAE/C,kBAAC,GAAD,EAAmB,WAAW,EAAG,0BAA0B,EAAc,EAAI,CAAA;AAG/E,QACE,kBAAC,OAAD;EACO;EACL,WAAW,EACT,yDACA,IAAU,uBAAuB,sBACjC,EACD;EACD,GAAI;YAPN;GASE,kBAAC,OAAD;IACE,WAAW,EACT,2DACA,IAAU,oBAAoB,kBAC/B;cAED,kBAAC,GAAD;KAAc,MAAM;eAAY;KAA4B,CAAA;IACxD,CAAA;GAEN,kBAAC,EAAO,KAAR;IACE,WAAU;IACV,SAAS;IACT,SAAS,EAAE,SAAS,GAAG;IACvB,YAAY;KAAE,OAAO;KAAK,GAAG,EAAO;KAAM;cAJ5C,CAME,kBAAC,MAAD;KACE,WAAW,EACT,mBACA,IAAU,6BAA6B,6BACxC;eAEA;KACE,CAAA,EACJ,KACC,kBAAC,KAAD;KACE,WAAW,EACT,0BACA,IAAU,eAAe,aAC1B;eAEA;KACC,CAAA,CAEK;;GAEZ,KAAU,kBAAC,OAAD;IAAK,WAAU;cAAY;IAAa,CAAA;GAC/C;;EAGX;AACD,EAAW,cAAc"}
1
+ {"version":3,"file":"empty-state.js","names":[],"sources":["../../src/composed/empty-state.tsx"],"sourcesContent":["'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { IconProvider, type IconSize } from '../ui/icon-context'\nimport type { IconInput } from '../ui/lib/icon-input'\nimport { tweens } from '../ui/lib/motion'\nimport { normalizeIcon } from '../ui/lib/normalize-icon'\nimport { cn } from '../ui/lib/utils'\n\nexport interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Icon. Accepts any `IconInput`. Falls back to the Devalok chakra glyph. */\n icon?: IconInput\n title: string\n description?: string\n action?: React.ReactNode\n compact?: boolean\n /** Icon size. Defaults to 'sm' when compact, 'md' otherwise. */\n iconSize?: 'sm' | 'md' | 'lg'\n}\n\nconst ICON_SIZE_TO_TOKEN: Record<'sm' | 'md' | 'lg', IconSize> = {\n sm: 'md',\n md: 'xl',\n lg: '2xl',\n}\n\nconst DevalokChakraIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M25.97,21.39c-0.9-1.85,0.08-3.95-1.72-5.39c1.76-1.44,0.8-3.55,1.69-5.39c0.05-0.12,0.04-0.25-0.02-0.35c-0.06-0.1-0.16-0.18-0.29-0.19c-2.05-0.15-3.35-2.04-5.5-1.21c-0.39-2.21-2.7-2.44-3.84-4.13c-0.08-0.1-0.19-0.16-0.31-0.16c-0.12,0-0.23,0.05-0.31,0.16c-1.14,1.69-3.43,1.92-3.82,4.13c-2.14-0.83-3.47,1.07-5.52,1.21c-0.13,0.01-0.23,0.09-0.29,0.19c-0.06,0.1-0.07,0.23-0.02,0.35c0.9,1.85-0.08,3.95,1.72,5.39c-1.76,1.44-0.8,3.55-1.69,5.39C6,21.51,6.02,21.64,6.07,21.74c0.06,0.1,0.16,0.18,0.29,0.19c2.05,0.15,3.38,2.06,5.52,1.23c0.39,2.21,2.67,2.43,3.82,4.12c0.08,0.1,0.19,0.16,0.31,0.16c0.12,0,0.23-0.05,0.31-0.16c1.14-1.69,3.42-1.92,3.81-4.13c2.14,0.83,3.48-1.07,5.53-1.22c0.13-0.01,0.23-0.09,0.29-0.19C26.01,21.64,26.02,21.51,25.97,21.39z\" />\n </svg>\n)\n\nconst EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n {\n icon,\n title,\n description,\n action,\n compact = false,\n iconSize,\n className,\n ...props\n },\n ref,\n ) => {\n const resolvedIconSize = iconSize ?? (compact ? 'sm' : 'md')\n const iconSizeClass = {\n sm: 'h-ico-sm w-ico-sm',\n md: 'h-ico-lg w-ico-lg',\n lg: 'h-ico-xl w-ico-xl',\n }[resolvedIconSize]\n const iconToken = ICON_SIZE_TO_TOKEN[resolvedIconSize]\n const normalized = normalizeIcon(icon, iconToken)\n const resolvedIcon = normalized ?? (\n <DevalokChakraIcon className={cn('text-surface-fg-subtle', iconSizeClass)} />\n )\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col items-center justify-center text-center',\n compact ? 'gap-ds-04 py-ds-07' : 'gap-ds-05 py-ds-10',\n className,\n )}\n {...props}\n >\n <div\n className={cn(\n 'flex items-center justify-center text-surface-fg-subtle',\n compact ? 'h-ds-md w-ds-md' : 'h-ds-lg w-ds-lg',\n )}\n >\n <IconProvider size={iconToken}>{resolvedIcon}</IconProvider>\n </div>\n\n <motion.div\n className=\"flex max-w-[280px] flex-col gap-ds-02\"\n initial={false}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.2, ...tweens.fade }}\n >\n <h3\n className={cn(\n 'text-surface-fg',\n compact ? 'text-ds-md font-semibold' : 'text-ds-base font-semibold',\n )}\n >\n {title}\n </h3>\n {description && (\n <p\n className={cn(\n 'text-surface-fg-subtle',\n compact ? 'text-ds-sm' : 'text-ds-md',\n )}\n >\n {description}\n </p>\n )}\n </motion.div>\n\n {action && <div className=\"mt-ds-02\">{action}</div>}\n </div>\n )\n },\n)\nEmptyState.displayName = 'EmptyState'\n\nexport { EmptyState }\n"],"mappings":";;;;;;;;;AAsBA,IAAM,IAA2D;CAC/D,IAAI;CACJ,IAAI;CACJ,IAAI;AACN,GAEM,KAAqB,EAAE,mBAC3B,kBAAC,OAAD;CACE,OAAM;CACN,SAAQ;CACR,MAAK;CACM;CACX,eAAY;WAEZ,kBAAC,QAAD,EAAM,GAAE,guBAAiuB,CAAA;AACtuB,CAAA,GAGD,IAAa,EAAM,YAErB,EACE,SACA,UACA,gBACA,WACA,aAAU,IACV,aACA,cACA,GAAG,KAEL,MACG;CACH,IAAM,IAAmB,MAAa,IAAU,OAAO,OACjD,IAAgB;EACpB,IAAI;EACJ,IAAI;EACJ,IAAI;CACN,EAAE,IACI,IAAY,EAAmB,IAE/B,IADa,EAAc,GAAM,CAClB,KACnB,kBAAC,GAAD,EAAmB,WAAW,EAAG,0BAA0B,CAAa,EAAI,CAAA;CAG9E,OACE,kBAAC,OAAD;EACO;EACL,WAAW,EACT,yDACA,IAAU,uBAAuB,sBACjC,CACF;EACA,GAAI;YAPN;GASE,kBAAC,OAAD;IACE,WAAW,EACT,2DACA,IAAU,oBAAoB,iBAChC;cAEA,kBAAC,GAAD;KAAc,MAAM;eAAY;IAA2B,CAAA;GACxD,CAAA;GAEL,kBAAC,EAAO,KAAR;IACE,WAAU;IACV,SAAS;IACT,SAAS,EAAE,SAAS,EAAE;IACtB,YAAY;KAAE,OAAO;KAAK,GAAG,EAAO;IAAK;cAJ3C,CAME,kBAAC,MAAD;KACE,WAAW,EACT,mBACA,IAAU,6BAA6B,4BACzC;eAEC;IACC,CAAA,GACH,KACC,kBAAC,KAAD;KACE,WAAW,EACT,0BACA,IAAU,eAAe,YAC3B;eAEC;IACA,CAAA,CAEK;;GAEX,KAAU,kBAAC,OAAD;IAAK,WAAU;cAAY;GAAY,CAAA;EAC/C;;AAET,CACF;AACA,EAAW,cAAc"}
@@ -22,7 +22,7 @@ declare class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBou
22
22
  constructor(props: ErrorBoundaryProps);
23
23
  static getDerivedStateFromError(error: unknown): ErrorBoundaryState;
24
24
  private handleReset;
25
- render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
25
+ render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
26
26
  }
27
27
  export { ErrorBoundary, ErrorDisplay };
28
28
  export type { ErrorBoundaryProps };
@@ -1 +1 @@
1
- {"version":3,"file":"error-boundary.js","names":[],"sources":["../../src/composed/error-boundary.tsx"],"sourcesContent":["'use client'\n\nimport { IconAlertTriangle, IconBan, IconFileUnknown, IconServerOff } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Button } from '../ui/button'\nimport { Icon } from '../ui/icon'\nimport { cn } from '../ui/lib/utils'\n\ndeclare const process: { env: { NODE_ENV?: string } } | undefined\n\nexport interface ErrorDisplayProps extends React.ComponentPropsWithoutRef<'div'> {\n error: unknown\n onReset?: () => void\n}\n\nfunction getStatusFromError(error: unknown): number | undefined {\n if (\n error &&\n typeof error === 'object' &&\n 'status' in error &&\n typeof (error as Record<string, unknown>).status === 'number'\n ) {\n return (error as Record<string, unknown>).status as number\n }\n return undefined\n}\n\nfunction getMessageFromError(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.message\n }\n if (\n error &&\n typeof error === 'object' &&\n 'data' in error\n ) {\n const data = (error as Record<string, unknown>).data\n if (typeof data === 'string') return data\n if (data && typeof data === 'object' && 'message' in data) {\n return String((data as Record<string, unknown>).message)\n }\n }\n if (typeof error === 'string') {\n return error\n }\n return undefined\n}\n\nfunction getStackFromError(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack\n }\n return undefined\n}\n\nfunction getErrorConfig(status?: number) {\n switch (status) {\n case 404:\n return {\n icon: IconFileUnknown,\n title: 'Page not found',\n message:\n 'The page you are looking for does not exist or has been moved.',\n bgClass: 'bg-accent-2',\n iconClass: 'text-accent-11',\n }\n case 403:\n return {\n icon: IconBan,\n title: 'Access denied',\n message:\n 'You do not have permission to view this page. Contact your administrator if you believe this is a mistake.',\n bgClass: 'bg-warning-3',\n iconClass: 'text-warning-11',\n }\n case 500:\n return {\n icon: IconServerOff,\n title: 'Server error',\n message:\n 'Something went wrong on our end. Please try again later or contact support if the issue persists.',\n bgClass: 'bg-error-3',\n iconClass: 'text-error-11',\n }\n default:\n return {\n icon: IconAlertTriangle,\n title: 'Something went wrong',\n message:\n 'An unexpected error occurred. Please try again or go back to the home page.',\n bgClass: 'bg-accent-2',\n iconClass: 'text-accent-11',\n }\n }\n}\n\nconst ErrorDisplay = React.forwardRef<HTMLDivElement, ErrorDisplayProps>(\n function ErrorDisplay({ error, onReset, className, ...props }, ref) {\n const status = getStatusFromError(error)\n const message = getMessageFromError(error)\n const stack = getStackFromError(error)\n const isDev =\n typeof process !== 'undefined' &&\n process.env &&\n process.env.NODE_ENV === 'development'\n\n const errorConfig = getErrorConfig(status)\n const ErrorIcon = errorConfig.icon\n\n return (\n <div ref={ref} {...props} className={cn(\"flex min-h-[60vh] items-center justify-center p-ds-05\", className)}>\n <div\n className=\"flex w-full max-w-lg flex-col items-center gap-ds-06 rounded-overlay-lg bg-surface-raised p-ds-07 text-center shadow-raised\"\n >\n {/* Error Icon */}\n <div\n className={cn(\n 'flex h-ds-lg w-ds-lg items-center justify-center rounded-bubble',\n errorConfig.bgClass,\n )}\n >\n <Icon\n icon={ErrorIcon}\n size=\"2xl\"\n className={errorConfig.iconClass}\n />\n </div>\n\n {/* Error IconInfoCircle */}\n <div className=\"flex flex-col gap-ds-03\">\n {status && (\n <span className=\"text-ds-sm text-surface-fg-subtle\">\n Error {status}\n </span>\n )}\n <h2 className=\"text-ds-2xl font-semibold text-surface-fg\">\n {errorConfig.title}\n </h2>\n <p className=\"text-ds-base text-surface-fg-subtle\">\n {message || errorConfig.message}\n </p>\n </div>\n\n {/* Actions */}\n {onReset && (\n <div className=\"flex items-center gap-ds-04\">\n <Button\n variant=\"soft\"\n size=\"md\"\n onClick={onReset}\n >\n Try Again\n </Button>\n </div>\n )}\n\n {/* Dev stack trace */}\n {isDev && stack && (\n <div className=\"w-full overflow-auto rounded-surface border border-surface-border-strong bg-surface-raised p-ds-05 text-left\">\n <p className=\"text-ds-sm mb-ds-03 font-semibold text-surface-fg\">\n Stack Trace (development only)\n </p>\n <pre className=\"whitespace-pre-wrap text-ds-sm text-surface-fg-subtle\">\n {stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n )\n},\n)\n\nErrorDisplay.displayName = 'ErrorDisplay'\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode\n /** Optional callback when the user clicks \"Try Again\" */\n onReset?: () => void\n /** Optional custom fallback — receives the caught error. Defaults to ErrorDisplay. */\n fallback?: (props: { error: unknown; onReset?: () => void }) => React.ReactNode\n}\n\ninterface ErrorBoundaryState {\n error: unknown | null\n}\n\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { error: null }\n }\n\n static getDerivedStateFromError(error: unknown): ErrorBoundaryState {\n return { error }\n }\n\n private handleReset = () => {\n this.setState({ error: null })\n this.props.onReset?.()\n }\n\n render() {\n if (this.state.error !== null) {\n if (this.props.fallback) {\n return this.props.fallback({ error: this.state.error, onReset: this.handleReset })\n }\n return <ErrorDisplay error={this.state.error} onReset={this.handleReset} />\n }\n return this.props.children\n }\n}\n\nexport { ErrorBoundary,ErrorDisplay }\nexport type { ErrorBoundaryProps }\n"],"mappings":"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"}
1
+ {"version":3,"file":"error-boundary.js","names":[],"sources":["../../src/composed/error-boundary.tsx"],"sourcesContent":["'use client'\n\nimport { IconAlertTriangle, IconBan, IconFileUnknown, IconServerOff } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Button } from '../ui/button'\nimport { Icon } from '../ui/icon'\nimport { cn } from '../ui/lib/utils'\n\ndeclare const process: { env: { NODE_ENV?: string } } | undefined\n\nexport interface ErrorDisplayProps extends React.ComponentPropsWithoutRef<'div'> {\n error: unknown\n onReset?: () => void\n}\n\nfunction getStatusFromError(error: unknown): number | undefined {\n if (\n error &&\n typeof error === 'object' &&\n 'status' in error &&\n typeof (error as Record<string, unknown>).status === 'number'\n ) {\n return (error as Record<string, unknown>).status as number\n }\n return undefined\n}\n\nfunction getMessageFromError(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.message\n }\n if (\n error &&\n typeof error === 'object' &&\n 'data' in error\n ) {\n const data = (error as Record<string, unknown>).data\n if (typeof data === 'string') return data\n if (data && typeof data === 'object' && 'message' in data) {\n return String((data as Record<string, unknown>).message)\n }\n }\n if (typeof error === 'string') {\n return error\n }\n return undefined\n}\n\nfunction getStackFromError(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack\n }\n return undefined\n}\n\nfunction getErrorConfig(status?: number) {\n switch (status) {\n case 404:\n return {\n icon: IconFileUnknown,\n title: 'Page not found',\n message:\n 'The page you are looking for does not exist or has been moved.',\n bgClass: 'bg-accent-2',\n iconClass: 'text-accent-11',\n }\n case 403:\n return {\n icon: IconBan,\n title: 'Access denied',\n message:\n 'You do not have permission to view this page. Contact your administrator if you believe this is a mistake.',\n bgClass: 'bg-warning-3',\n iconClass: 'text-warning-11',\n }\n case 500:\n return {\n icon: IconServerOff,\n title: 'Server error',\n message:\n 'Something went wrong on our end. Please try again later or contact support if the issue persists.',\n bgClass: 'bg-error-3',\n iconClass: 'text-error-11',\n }\n default:\n return {\n icon: IconAlertTriangle,\n title: 'Something went wrong',\n message:\n 'An unexpected error occurred. Please try again or go back to the home page.',\n bgClass: 'bg-accent-2',\n iconClass: 'text-accent-11',\n }\n }\n}\n\nconst ErrorDisplay = React.forwardRef<HTMLDivElement, ErrorDisplayProps>(\n function ErrorDisplay({ error, onReset, className, ...props }, ref) {\n const status = getStatusFromError(error)\n const message = getMessageFromError(error)\n const stack = getStackFromError(error)\n const isDev =\n typeof process !== 'undefined' &&\n process.env &&\n process.env.NODE_ENV === 'development'\n\n const errorConfig = getErrorConfig(status)\n const ErrorIcon = errorConfig.icon\n\n return (\n <div ref={ref} {...props} className={cn(\"flex min-h-[60vh] items-center justify-center p-ds-05\", className)}>\n <div\n className=\"flex w-full max-w-lg flex-col items-center gap-ds-06 rounded-overlay-lg bg-surface-raised p-ds-07 text-center shadow-raised\"\n >\n {/* Error Icon */}\n <div\n className={cn(\n 'flex h-ds-lg w-ds-lg items-center justify-center rounded-bubble',\n errorConfig.bgClass,\n )}\n >\n <Icon\n icon={ErrorIcon}\n size=\"2xl\"\n className={errorConfig.iconClass}\n />\n </div>\n\n {/* Error IconInfoCircle */}\n <div className=\"flex flex-col gap-ds-03\">\n {status && (\n <span className=\"text-ds-sm text-surface-fg-subtle\">\n Error {status}\n </span>\n )}\n <h2 className=\"text-ds-2xl font-semibold text-surface-fg\">\n {errorConfig.title}\n </h2>\n <p className=\"text-ds-base text-surface-fg-subtle\">\n {message || errorConfig.message}\n </p>\n </div>\n\n {/* Actions */}\n {onReset && (\n <div className=\"flex items-center gap-ds-04\">\n <Button\n variant=\"soft\"\n size=\"md\"\n onClick={onReset}\n >\n Try Again\n </Button>\n </div>\n )}\n\n {/* Dev stack trace */}\n {isDev && stack && (\n <div className=\"w-full overflow-auto rounded-surface border border-surface-border-strong bg-surface-raised p-ds-05 text-left\">\n <p className=\"text-ds-sm mb-ds-03 font-semibold text-surface-fg\">\n Stack Trace (development only)\n </p>\n <pre className=\"whitespace-pre-wrap text-ds-sm text-surface-fg-subtle\">\n {stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n )\n},\n)\n\nErrorDisplay.displayName = 'ErrorDisplay'\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode\n /** Optional callback when the user clicks \"Try Again\" */\n onReset?: () => void\n /** Optional custom fallback — receives the caught error. Defaults to ErrorDisplay. */\n fallback?: (props: { error: unknown; onReset?: () => void }) => React.ReactNode\n}\n\ninterface ErrorBoundaryState {\n error: unknown | null\n}\n\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { error: null }\n }\n\n static getDerivedStateFromError(error: unknown): ErrorBoundaryState {\n return { error }\n }\n\n private handleReset = () => {\n this.setState({ error: null })\n this.props.onReset?.()\n }\n\n render() {\n if (this.state.error !== null) {\n if (this.props.fallback) {\n return this.props.fallback({ error: this.state.error, onReset: this.handleReset })\n }\n return <ErrorDisplay error={this.state.error} onReset={this.handleReset} />\n }\n return this.props.children\n }\n}\n\nexport { ErrorBoundary,ErrorDisplay }\nexport type { ErrorBoundaryProps }\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"emoji-node.js","names":[],"sources":["../../../src/composed/extensions/emoji-node.tsx"],"sourcesContent":["import { Node } from '@tiptap/core'\nimport { type NodeViewProps,NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react'\n\n// Native-only since the frimousse migration — renders the native emoji\n// character. (The emoji-mart spritesheet/art-style rendering was removed.)\nexport interface EmojiNodeAttrs {\n id: string\n native: string\n}\n\nfunction EmojiNodeView({ node }: NodeViewProps) {\n const { native } = node.attrs as EmojiNodeAttrs\n return (\n <NodeViewWrapper as=\"span\" className=\"inline\">\n <span>{native}</span>\n </NodeViewWrapper>\n )\n}\n\nexport const EmojiNode = Node.create({\n name: 'emojiNode',\n group: 'inline',\n inline: true,\n atom: true,\n selectable: false,\n\n addAttributes() {\n return {\n id: { default: null },\n native: { default: null },\n }\n },\n\n renderText({ node }) {\n return node.attrs.native ?? ''\n },\n\n parseHTML() {\n return [{\n tag: 'span[data-emoji-id]',\n getAttrs: (el) => {\n const dom = el as HTMLElement\n return {\n id: dom.getAttribute('data-emoji-id'),\n native: dom.textContent ?? '',\n }\n },\n }]\n },\n\n renderHTML({ node }) {\n return ['span', {\n 'data-emoji-id': node.attrs.id,\n 'role': 'img',\n 'aria-label': node.attrs.native,\n }, node.attrs.native ?? '']\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(EmojiNodeView)\n },\n})\n"],"mappings":";;;AAUA,SAAS,EAAc,EAAE,WAAuB;CAC9C,IAAM,EAAE,cAAW,EAAK;AACxB,QACE,kBAAC,GAAD;EAAiB,IAAG;EAAO,WAAU;YACnC,kBAAC,QAAD,EAAA,UAAO,GAAc,CAAA;EACL,CAAA;;AAItB,IAAa,IAAY,EAAK,OAAO;CACnC,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,YAAY;CAEZ,gBAAgB;AACd,SAAO;GACL,IAAI,EAAE,SAAS,MAAM;GACrB,QAAQ,EAAE,SAAS,MAAM;GAC1B;;CAGH,WAAW,EAAE,WAAQ;AACnB,SAAO,EAAK,MAAM,UAAU;;CAG9B,YAAY;AACV,SAAO,CAAC;GACN,KAAK;GACL,WAAW,MAAO;IAChB,IAAM,IAAM;AACZ,WAAO;KACL,IAAI,EAAI,aAAa,gBAAgB;KACrC,QAAQ,EAAI,eAAe;KAC5B;;GAEJ,CAAC;;CAGJ,WAAW,EAAE,WAAQ;AACnB,SAAO;GAAC;GAAQ;IACd,iBAAiB,EAAK,MAAM;IAC5B,MAAQ;IACR,cAAc,EAAK,MAAM;IAC1B;GAAE,EAAK,MAAM,UAAU;GAAG;;CAG7B,cAAc;AACZ,SAAO,EAAsB,EAAc;;CAE9C,CAAC"}
1
+ {"version":3,"file":"emoji-node.js","names":[],"sources":["../../../src/composed/extensions/emoji-node.tsx"],"sourcesContent":["import { Node } from '@tiptap/core'\nimport { type NodeViewProps,NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react'\n\n// Native-only since the frimousse migration — renders the native emoji\n// character. (The emoji-mart spritesheet/art-style rendering was removed.)\nexport interface EmojiNodeAttrs {\n id: string\n native: string\n}\n\nfunction EmojiNodeView({ node }: NodeViewProps) {\n const { native } = node.attrs as EmojiNodeAttrs\n return (\n <NodeViewWrapper as=\"span\" className=\"inline\">\n <span>{native}</span>\n </NodeViewWrapper>\n )\n}\n\nexport const EmojiNode = Node.create({\n name: 'emojiNode',\n group: 'inline',\n inline: true,\n atom: true,\n selectable: false,\n\n addAttributes() {\n return {\n id: { default: null },\n native: { default: null },\n }\n },\n\n renderText({ node }) {\n return node.attrs.native ?? ''\n },\n\n parseHTML() {\n return [{\n tag: 'span[data-emoji-id]',\n getAttrs: (el) => {\n const dom = el as HTMLElement\n return {\n id: dom.getAttribute('data-emoji-id'),\n native: dom.textContent ?? '',\n }\n },\n }]\n },\n\n renderHTML({ node }) {\n return ['span', {\n 'data-emoji-id': node.attrs.id,\n 'role': 'img',\n 'aria-label': node.attrs.native,\n }, node.attrs.native ?? '']\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(EmojiNodeView)\n },\n})\n"],"mappings":";;;AAUA,SAAS,EAAc,EAAE,WAAuB;CAC9C,IAAM,EAAE,cAAW,EAAK;CACxB,OACE,kBAAC,GAAD;EAAiB,IAAG;EAAO,WAAU;YACnC,kBAAC,QAAD,EAAA,UAAO,EAAa,CAAA;CACL,CAAA;AAErB;AAEA,IAAa,IAAY,EAAK,OAAO;CACnC,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,YAAY;CAEZ,gBAAgB;EACd,OAAO;GACL,IAAI,EAAE,SAAS,KAAK;GACpB,QAAQ,EAAE,SAAS,KAAK;EAC1B;CACF;CAEA,WAAW,EAAE,WAAQ;EACnB,OAAO,EAAK,MAAM,UAAU;CAC9B;CAEA,YAAY;EACV,OAAO,CAAC;GACN,KAAK;GACL,WAAW,MAAO;IAChB,IAAM,IAAM;IACZ,OAAO;KACL,IAAI,EAAI,aAAa,eAAe;KACpC,QAAQ,EAAI,eAAe;IAC7B;GACF;EACF,CAAC;CACH;CAEA,WAAW,EAAE,WAAQ;EACnB,OAAO;GAAC;GAAQ;IACd,iBAAiB,EAAK,MAAM;IAC5B,MAAQ;IACR,cAAc,EAAK,MAAM;GAC3B;GAAG,EAAK,MAAM,UAAU;EAAE;CAC5B;CAEA,cAAc;EACZ,OAAO,EAAsB,CAAa;CAC5C;AACF,CAAC"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
+ import * as React from 'react';
2
3
  export default function AudioPreview({ url, fileName, onError }: {
3
4
  url: string;
4
5
  fileName?: string;
5
6
  onError?: (msg: string) => void;
6
- }): import("react/jsx-runtime").JSX.Element;
7
+ }): React.JSX.Element;
7
8
  //# sourceMappingURL=audio-preview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-preview.d.ts","sourceRoot":"","sources":["../../../src/composed/file-preview/audio-preview.tsx"],"names":[],"mappings":"AAcA,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,2CAiJnI"}
1
+ {"version":3,"file":"audio-preview.d.ts","sourceRoot":"","sources":["../../../src/composed/file-preview/audio-preview.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,qBAiJnI"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
+ import * as React from 'react';
2
3
  export default function DocumentPreview({ url, initialPage, onError }: {
3
4
  url: string;
4
5
  initialPage: number;
5
6
  onError?: (msg: string) => void;
6
- }): import("react/jsx-runtime").JSX.Element;
7
+ }): React.JSX.Element;
7
8
  //# sourceMappingURL=document-preview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-preview.d.ts","sourceRoot":"","sources":["../../../src/composed/file-preview/document-preview.tsx"],"names":[],"mappings":"AAiBA,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,2CAmG3I"}
1
+ {"version":3,"file":"document-preview.d.ts","sourceRoot":"","sources":["../../../src/composed/file-preview/document-preview.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,qBAmG3I"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
+ import * as React from 'react';
2
3
  export default function EmbedPreview({ url, embedUrl, onError }: {
3
4
  url: string;
4
5
  embedUrl: string;
5
6
  onError?: (msg: string) => void;
6
- }): import("react/jsx-runtime").JSX.Element;
7
+ }): React.JSX.Element;
7
8
  //# sourceMappingURL=embed-preview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embed-preview.d.ts","sourceRoot":"","sources":["../../../src/composed/file-preview/embed-preview.tsx"],"names":[],"mappings":"AAaA,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,2CA8BlI"}
1
+ {"version":3,"file":"embed-preview.d.ts","sourceRoot":"","sources":["../../../src/composed/file-preview/embed-preview.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,qBA8BlI"}