@devalok/shilp-sutra 0.34.1 → 0.36.1

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 (440) hide show
  1. package/LICENSE +21 -21
  2. package/dist/_chunks/badge-group.js +95 -95
  3. package/dist/_chunks/badge-group.js.map +1 -0
  4. package/dist/_chunks/chat.js +7 -2
  5. package/dist/_chunks/chat.js.map +1 -0
  6. package/dist/_chunks/date-picker.js.map +1 -0
  7. package/dist/_chunks/document-preview.js.map +1 -0
  8. package/dist/_chunks/file-preview.js.map +1 -0
  9. package/dist/_chunks/framer.js +62 -62
  10. package/dist/_chunks/framer.js.map +1 -0
  11. package/dist/_chunks/image-preview.js +1 -1
  12. package/dist/_chunks/image-preview.js.map +1 -0
  13. package/dist/_chunks/keybinding.js.map +1 -0
  14. package/dist/_chunks/link-context.js.map +1 -0
  15. package/dist/_chunks/mention-suggestion.js.map +1 -0
  16. package/dist/_chunks/motion-provider.js.map +1 -0
  17. package/dist/_chunks/popover.js +32 -36
  18. package/dist/_chunks/popover.js.map +1 -0
  19. package/dist/_chunks/primitives.js +686 -686
  20. package/dist/_chunks/primitives.js.map +1 -0
  21. package/dist/_chunks/rich-chat-input.js +651 -650
  22. package/dist/_chunks/rich-chat-input.js.map +1 -0
  23. package/dist/_chunks/shared.js.map +1 -0
  24. package/dist/_chunks/sonner.js.map +1 -0
  25. package/dist/_chunks/stat-row.js +158 -158
  26. package/dist/_chunks/stat-row.js.map +1 -0
  27. package/dist/_chunks/tiptap.js +11 -11
  28. package/dist/_chunks/tiptap.js.map +1 -0
  29. package/dist/_chunks/tree-view.js +1 -1
  30. package/dist/_chunks/tree-view.js.map +1 -0
  31. package/dist/_chunks/use-calendar.js.map +1 -0
  32. package/dist/_chunks/vendor-client.js +1 -1
  33. package/dist/_chunks/vendor-client.js.map +1 -0
  34. package/dist/_chunks/vendor-utils.js.map +1 -0
  35. package/dist/ai/ai-command-provider.js.map +1 -0
  36. package/dist/ai/block-renderer.js.map +1 -0
  37. package/dist/ai/blocks/loading.d.ts.map +1 -1
  38. package/dist/ai/command-bar.js.map +1 -0
  39. package/dist/ai/conversation.js +76 -76
  40. package/dist/ai/conversation.js.map +1 -0
  41. package/dist/ai/devadoot-icon.d.ts.map +1 -1
  42. package/dist/ai/index.js.map +1 -0
  43. package/dist/composed/activity-feed.js.map +1 -0
  44. package/dist/composed/avatar-group.js +1 -1
  45. package/dist/composed/avatar-group.js.map +1 -0
  46. package/dist/composed/bulk-action-bar.js +13 -21
  47. package/dist/composed/bulk-action-bar.js.map +1 -0
  48. package/dist/composed/command-palette.js.map +1 -0
  49. package/dist/composed/confirm-dialog.js.map +1 -0
  50. package/dist/composed/content-card.js.map +1 -0
  51. package/dist/composed/deadline-indicator.js.map +1 -0
  52. package/dist/composed/emoji-picker.js.map +1 -0
  53. package/dist/composed/empty-state.d.ts.map +1 -1
  54. package/dist/composed/empty-state.js +30 -30
  55. package/dist/composed/empty-state.js.map +1 -0
  56. package/dist/composed/error-boundary.js.map +1 -0
  57. package/dist/composed/filter-bar.js.map +1 -0
  58. package/dist/composed/form-section.js.map +1 -0
  59. package/dist/composed/global-loading.js.map +1 -0
  60. package/dist/composed/inline-edit.js.map +1 -0
  61. package/dist/composed/lib/string-utils.js.map +1 -0
  62. package/dist/composed/loading-skeleton.js.map +1 -0
  63. package/dist/composed/markdown-viewer.js.map +1 -0
  64. package/dist/composed/master-detail.js.map +1 -0
  65. package/dist/composed/member-picker.js.map +1 -0
  66. package/dist/composed/multi-select-popover.d.ts.map +1 -1
  67. package/dist/composed/multi-select-popover.js +4 -0
  68. package/dist/composed/multi-select-popover.js.map +1 -0
  69. package/dist/composed/page-header.js.map +1 -0
  70. package/dist/composed/page-skeletons.js.map +1 -0
  71. package/dist/composed/priority-indicator.js.map +1 -0
  72. package/dist/composed/responsive-overlay.js.map +1 -0
  73. package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
  74. package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
  75. package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
  76. package/dist/composed/rich-chat-input.d.ts.map +1 -1
  77. package/dist/composed/rich-text-editor.js +1 -1
  78. package/dist/composed/rich-text-editor.js.map +1 -0
  79. package/dist/composed/schedule-view.js.map +1 -0
  80. package/dist/composed/simple-tooltip.js.map +1 -0
  81. package/dist/composed/status-badge.d.ts.map +1 -1
  82. package/dist/composed/status-badge.js.map +1 -0
  83. package/dist/hooks/use-color-mode.js.map +1 -0
  84. package/dist/hooks/use-mobile.js.map +1 -0
  85. package/dist/hooks/use-touch-device.js.map +1 -0
  86. package/dist/hooks/use-viewport-height.js.map +1 -0
  87. package/dist/motion/check-motion-provider.d.ts +3 -0
  88. package/dist/motion/check-motion-provider.d.ts.map +1 -0
  89. package/dist/motion/index.js +14 -0
  90. package/dist/motion/index.js.map +1 -0
  91. package/dist/motion/primitives-index.js.map +1 -0
  92. package/dist/primitives/react-accordion.d.ts +114 -114
  93. package/dist/primitives/react-alert-dialog.d.ts +51 -51
  94. package/dist/primitives/react-aspect-ratio.d.ts +11 -11
  95. package/dist/primitives/react-avatar.d.ts +24 -24
  96. package/dist/primitives/react-checkbox.d.ts +50 -50
  97. package/dist/primitives/react-collapsible.d.ts +33 -33
  98. package/dist/primitives/react-context-menu.d.ts +96 -96
  99. package/dist/primitives/react-dialog.d.ts +103 -103
  100. package/dist/primitives/react-dropdown-menu.d.ts +97 -97
  101. package/dist/primitives/react-hover-card.d.ts +79 -79
  102. package/dist/primitives/react-label.d.ts +10 -10
  103. package/dist/primitives/react-menu.d.ts +169 -169
  104. package/dist/primitives/react-menubar.d.ts +115 -115
  105. package/dist/primitives/react-navigation-menu.d.ts +126 -126
  106. package/dist/primitives/react-popover.d.ts +85 -85
  107. package/dist/primitives/react-progress.d.ts +19 -19
  108. package/dist/primitives/react-radio-group.d.ts +58 -58
  109. package/dist/primitives/react-roving-focus.d.ts +49 -49
  110. package/dist/primitives/react-select.d.ts +137 -137
  111. package/dist/primitives/react-separator.d.ts +21 -21
  112. package/dist/primitives/react-slider.d.ts +75 -75
  113. package/dist/primitives/react-switch.d.ts +21 -21
  114. package/dist/primitives/react-tabs.d.ts +56 -56
  115. package/dist/primitives/react-toast.d.ts +120 -120
  116. package/dist/primitives/react-toggle-group.d.ts +75 -75
  117. package/dist/primitives/react-toggle.d.ts +24 -24
  118. package/dist/primitives/react-tooltip.d.ts +101 -101
  119. package/dist/primitives/react-visually-hidden.d.ts +22 -22
  120. package/dist/shell/app-command-palette.d.ts +2 -0
  121. package/dist/shell/app-command-palette.d.ts.map +1 -1
  122. package/dist/shell/app-command-palette.js +42 -155
  123. package/dist/shell/app-command-palette.js.map +1 -0
  124. package/dist/shell/bottom-navbar.js +1 -1
  125. package/dist/shell/bottom-navbar.js.map +1 -0
  126. package/dist/shell/command-registry.js.map +1 -0
  127. package/dist/shell/notification-center.d.ts.map +1 -1
  128. package/dist/shell/notification-center.js +194 -169
  129. package/dist/shell/notification-center.js.map +1 -0
  130. package/dist/shell/notification-preferences.js.map +1 -0
  131. package/dist/shell/sidebar.js.map +1 -0
  132. package/dist/shell/top-bar.js +1 -1
  133. package/dist/shell/top-bar.js.map +1 -0
  134. package/dist/tailwind/index.cjs +48 -1
  135. package/dist/tailwind/preset.d.ts.map +1 -1
  136. package/dist/tailwind/preset.js +48 -1
  137. package/dist/tailwind/preset.js.map +1 -0
  138. package/dist/tokens/index.css +4 -4
  139. package/dist/tokens/primitives.css +442 -442
  140. package/dist/tokens/semantic.css +742 -547
  141. package/dist/tokens/typography-semantic.css +123 -100
  142. package/dist/tokens/typography.css +422 -422
  143. package/dist/ui/accordion.js +13 -13
  144. package/dist/ui/accordion.js.map +1 -0
  145. package/dist/ui/alert-dialog.d.ts +6 -2
  146. package/dist/ui/alert-dialog.d.ts.map +1 -1
  147. package/dist/ui/alert-dialog.js +43 -42
  148. package/dist/ui/alert-dialog.js.map +1 -0
  149. package/dist/ui/alert.d.ts +3 -2
  150. package/dist/ui/alert.d.ts.map +1 -1
  151. package/dist/ui/alert.js +31 -5
  152. package/dist/ui/alert.js.map +1 -0
  153. package/dist/ui/aspect-ratio.js +1 -1
  154. package/dist/ui/aspect-ratio.js.map +1 -0
  155. package/dist/ui/autocomplete.d.ts.map +1 -1
  156. package/dist/ui/autocomplete.js +92 -67
  157. package/dist/ui/autocomplete.js.map +1 -0
  158. package/dist/ui/avatar.js +9 -9
  159. package/dist/ui/avatar.js.map +1 -0
  160. package/dist/ui/badge-indicator.js.map +1 -0
  161. package/dist/ui/banner.js.map +1 -0
  162. package/dist/ui/breadcrumb.js +1 -1
  163. package/dist/ui/breadcrumb.js.map +1 -0
  164. package/dist/ui/button-group.js.map +1 -0
  165. package/dist/ui/button-processing.d.ts.map +1 -1
  166. package/dist/ui/button-processing.js +61 -40
  167. package/dist/ui/button-processing.js.map +1 -0
  168. package/dist/ui/button.js +8 -8
  169. package/dist/ui/button.js.map +1 -0
  170. package/dist/ui/card.js.map +1 -0
  171. package/dist/ui/charts/bar-chart.d.ts.map +1 -1
  172. package/dist/ui/charts/chart-container.d.ts +2 -0
  173. package/dist/ui/charts/chart-container.d.ts.map +1 -1
  174. package/dist/ui/charts/index.js +88 -65
  175. package/dist/ui/charts/index.js.map +1 -0
  176. package/dist/ui/charts/line-chart.d.ts.map +1 -1
  177. package/dist/ui/chat/message-input.d.ts.map +1 -1
  178. package/dist/ui/chat/message-list.d.ts +1 -1
  179. package/dist/ui/chat/message-list.d.ts.map +1 -1
  180. package/dist/ui/chat/message.d.ts.map +1 -1
  181. package/dist/ui/chat/system-message.d.ts.map +1 -1
  182. package/dist/ui/checkbox.d.ts.map +1 -1
  183. package/dist/ui/checkbox.js +33 -28
  184. package/dist/ui/checkbox.js.map +1 -0
  185. package/dist/ui/code.js.map +1 -0
  186. package/dist/ui/collapsible.js +1 -1
  187. package/dist/ui/collapsible.js.map +1 -0
  188. package/dist/ui/color-input.d.ts.map +1 -1
  189. package/dist/ui/color-input.js +165 -163
  190. package/dist/ui/color-input.js.map +1 -0
  191. package/dist/ui/color-swatch.js.map +1 -0
  192. package/dist/ui/combobox.d.ts +7 -0
  193. package/dist/ui/combobox.d.ts.map +1 -1
  194. package/dist/ui/combobox.js +147 -113
  195. package/dist/ui/combobox.js.map +1 -0
  196. package/dist/ui/container.js +1 -1
  197. package/dist/ui/container.js.map +1 -0
  198. package/dist/ui/context-menu.js.map +1 -0
  199. package/dist/ui/data-table-body.js.map +1 -0
  200. package/dist/ui/data-table-bulk-actions.js +1 -1
  201. package/dist/ui/data-table-bulk-actions.js.map +1 -0
  202. package/dist/ui/data-table-card.js.map +1 -0
  203. package/dist/ui/data-table-context.js.map +1 -0
  204. package/dist/ui/data-table-header.js.map +1 -0
  205. package/dist/ui/data-table-pagination.js.map +1 -0
  206. package/dist/ui/data-table-toolbar.js.map +1 -0
  207. package/dist/ui/data-table.js +34 -31
  208. package/dist/ui/data-table.js.map +1 -0
  209. package/dist/ui/devalok-grain.js.map +1 -0
  210. package/dist/ui/dialog.js +31 -35
  211. package/dist/ui/dialog.js.map +1 -0
  212. package/dist/ui/dropdown-menu.js.map +1 -0
  213. package/dist/ui/file-upload.js +120 -120
  214. package/dist/ui/file-upload.js.map +1 -0
  215. package/dist/ui/form.d.ts +8 -0
  216. package/dist/ui/form.d.ts.map +1 -1
  217. package/dist/ui/form.js +14 -12
  218. package/dist/ui/form.js.map +1 -0
  219. package/dist/ui/hover-card.js.map +1 -0
  220. package/dist/ui/icon-button.js.map +1 -0
  221. package/dist/ui/icon-context.js.map +1 -0
  222. package/dist/ui/icon-group.js.map +1 -0
  223. package/dist/ui/icon.js.map +1 -0
  224. package/dist/ui/index.d.ts +4 -4
  225. package/dist/ui/index.d.ts.map +1 -1
  226. package/dist/ui/index.js +82 -66
  227. package/dist/ui/index.js.map +1 -0
  228. package/dist/ui/input-otp.d.ts +12 -3
  229. package/dist/ui/input-otp.d.ts.map +1 -1
  230. package/dist/ui/input-otp.js +41 -27
  231. package/dist/ui/input-otp.js.map +1 -0
  232. package/dist/ui/input.d.ts.map +1 -1
  233. package/dist/ui/input.js +16 -15
  234. package/dist/ui/input.js.map +1 -0
  235. package/dist/ui/label.d.ts.map +1 -1
  236. package/dist/ui/label.js +19 -14
  237. package/dist/ui/label.js.map +1 -0
  238. package/dist/ui/lib/check-tokens.d.ts +3 -0
  239. package/dist/ui/lib/check-tokens.d.ts.map +1 -0
  240. package/dist/ui/lib/date-utils.js.map +1 -0
  241. package/dist/ui/lib/motion.d.ts +15 -4
  242. package/dist/ui/lib/motion.d.ts.map +1 -1
  243. package/dist/ui/lib/motion.js +18 -9
  244. package/dist/ui/lib/motion.js.map +1 -0
  245. package/dist/ui/lib/utils.js.map +1 -0
  246. package/dist/ui/link.js +2 -2
  247. package/dist/ui/link.js.map +1 -0
  248. package/dist/ui/menubar.js.map +1 -0
  249. package/dist/ui/navigation-menu.js.map +1 -0
  250. package/dist/ui/number-input.d.ts +16 -1
  251. package/dist/ui/number-input.d.ts.map +1 -1
  252. package/dist/ui/number-input.js +79 -49
  253. package/dist/ui/number-input.js.map +1 -0
  254. package/dist/ui/pagination.js +1 -1
  255. package/dist/ui/pagination.js.map +1 -0
  256. package/dist/ui/progress-ring.d.ts.map +1 -1
  257. package/dist/ui/progress-ring.js.map +1 -0
  258. package/dist/ui/progress.js.map +1 -0
  259. package/dist/ui/radio.d.ts.map +1 -1
  260. package/dist/ui/radio.js +27 -20
  261. package/dist/ui/radio.js.map +1 -0
  262. package/dist/ui/search-input.js.map +1 -0
  263. package/dist/ui/segmented-control.d.ts +1 -1
  264. package/dist/ui/segmented-control.d.ts.map +1 -1
  265. package/dist/ui/segmented-control.js +3 -1
  266. package/dist/ui/segmented-control.js.map +1 -0
  267. package/dist/ui/select.d.ts.map +1 -1
  268. package/dist/ui/select.js +54 -48
  269. package/dist/ui/select.js.map +1 -0
  270. package/dist/ui/separator.d.ts.map +1 -1
  271. package/dist/ui/separator.js +10 -7
  272. package/dist/ui/separator.js.map +1 -0
  273. package/dist/ui/sheet.js +29 -29
  274. package/dist/ui/sheet.js.map +1 -0
  275. package/dist/ui/sidebar.js +9 -9
  276. package/dist/ui/sidebar.js.map +1 -0
  277. package/dist/ui/skeleton.js.map +1 -0
  278. package/dist/ui/slider.d.ts +22 -3
  279. package/dist/ui/slider.d.ts.map +1 -1
  280. package/dist/ui/slider.js +57 -19
  281. package/dist/ui/slider.js.map +1 -0
  282. package/dist/ui/spinner.js.map +1 -0
  283. package/dist/ui/split-button.d.ts.map +1 -1
  284. package/dist/ui/split-button.js +77 -76
  285. package/dist/ui/split-button.js.map +1 -0
  286. package/dist/ui/stack.js.map +1 -0
  287. package/dist/ui/stat-card.js.map +1 -0
  288. package/dist/ui/status-dot.js.map +1 -0
  289. package/dist/ui/stepper.d.ts +10 -0
  290. package/dist/ui/stepper.d.ts.map +1 -1
  291. package/dist/ui/stepper.js +80 -75
  292. package/dist/ui/stepper.js.map +1 -0
  293. package/dist/ui/switch.d.ts.map +1 -1
  294. package/dist/ui/switch.js +26 -22
  295. package/dist/ui/switch.js.map +1 -0
  296. package/dist/ui/table.js.map +1 -0
  297. package/dist/ui/tabs.d.ts +3 -1
  298. package/dist/ui/tabs.d.ts.map +1 -1
  299. package/dist/ui/tabs.js +68 -48
  300. package/dist/ui/tabs.js.map +1 -0
  301. package/dist/ui/text.d.ts +1 -1
  302. package/dist/ui/text.d.ts.map +1 -1
  303. package/dist/ui/text.js +10 -2
  304. package/dist/ui/text.js.map +1 -0
  305. package/dist/ui/textarea.js +1 -1
  306. package/dist/ui/textarea.js.map +1 -0
  307. package/dist/ui/toast-registry.d.ts +8 -0
  308. package/dist/ui/toast-registry.d.ts.map +1 -0
  309. package/dist/ui/toast-registry.js +13 -0
  310. package/dist/ui/toast-registry.js.map +1 -0
  311. package/dist/ui/toast.d.ts.map +1 -1
  312. package/dist/ui/toast.js +141 -136
  313. package/dist/ui/toast.js.map +1 -0
  314. package/dist/ui/toaster.d.ts.map +1 -1
  315. package/dist/ui/toaster.js +15 -14
  316. package/dist/ui/toaster.js.map +1 -0
  317. package/dist/ui/toggle-group.d.ts +2 -0
  318. package/dist/ui/toggle-group.d.ts.map +1 -1
  319. package/dist/ui/toggle-group.js +23 -16
  320. package/dist/ui/toggle-group.js.map +1 -0
  321. package/dist/ui/toggle.d.ts +2 -0
  322. package/dist/ui/toggle.d.ts.map +1 -1
  323. package/dist/ui/toggle.js +14 -6
  324. package/dist/ui/toggle.js.map +1 -0
  325. package/dist/ui/tooltip.js.map +1 -0
  326. package/dist/ui/visually-hidden.js.map +1 -0
  327. package/docs/components/_header.md +85 -85
  328. package/docs/components/composed/activity-feed.md +62 -62
  329. package/docs/components/composed/avatar-group.md +65 -65
  330. package/docs/components/composed/bulk-action-bar.md +40 -40
  331. package/docs/components/composed/command-palette.md +40 -40
  332. package/docs/components/composed/confirm-dialog.md +46 -46
  333. package/docs/components/composed/content-card.md +36 -36
  334. package/docs/components/composed/date-picker.md +130 -130
  335. package/docs/components/composed/deadline-indicator.md +27 -27
  336. package/docs/components/composed/emoji-picker.md +52 -52
  337. package/docs/components/composed/empty-state.md +53 -53
  338. package/docs/components/composed/error-boundary.md +29 -29
  339. package/docs/components/composed/file-preview.md +40 -40
  340. package/docs/components/composed/filter-bar.md +57 -57
  341. package/docs/components/composed/form-section.md +31 -31
  342. package/docs/components/composed/global-loading.md +27 -27
  343. package/docs/components/composed/inline-edit.md +35 -35
  344. package/docs/components/composed/loading-skeleton.md +51 -51
  345. package/docs/components/composed/markdown-viewer.md +27 -27
  346. package/docs/components/composed/master-detail.md +48 -48
  347. package/docs/components/composed/member-picker.md +35 -35
  348. package/docs/components/composed/multi-select-popover.md +62 -62
  349. package/docs/components/composed/page-header.md +41 -41
  350. package/docs/components/composed/page-skeletons.md +32 -32
  351. package/docs/components/composed/priority-indicator.md +32 -32
  352. package/docs/components/composed/responsive-overlay.md +34 -34
  353. package/docs/components/composed/rich-text-editor.md +82 -82
  354. package/docs/components/composed/schedule-view.md +39 -39
  355. package/docs/components/composed/simple-tooltip.md +33 -33
  356. package/docs/components/composed/status-badge.md +55 -55
  357. package/docs/components/shell/app-command-palette.md +44 -44
  358. package/docs/components/shell/bottom-navbar.md +52 -52
  359. package/docs/components/shell/command-registry.md +48 -48
  360. package/docs/components/shell/link-context.md +41 -41
  361. package/docs/components/shell/notification-center.md +63 -63
  362. package/docs/components/shell/notification-preferences.md +42 -42
  363. package/docs/components/shell/sidebar.md +92 -92
  364. package/docs/components/shell/top-bar.md +143 -143
  365. package/docs/components/ui/accordion.md +51 -51
  366. package/docs/components/ui/alert-dialog.md +61 -61
  367. package/docs/components/ui/alert.md +46 -46
  368. package/docs/components/ui/aspect-ratio.md +25 -25
  369. package/docs/components/ui/autocomplete.md +48 -48
  370. package/docs/components/ui/avatar.md +56 -56
  371. package/docs/components/ui/badge.md +83 -82
  372. package/docs/components/ui/banner.md +42 -42
  373. package/docs/components/ui/breadcrumb.md +37 -37
  374. package/docs/components/ui/button-group.md +41 -41
  375. package/docs/components/ui/button.md +94 -93
  376. package/docs/components/ui/card.md +52 -52
  377. package/docs/components/ui/charts.md +43 -43
  378. package/docs/components/ui/checkbox.md +36 -36
  379. package/docs/components/ui/chip.md +47 -47
  380. package/docs/components/ui/code.md +28 -28
  381. package/docs/components/ui/collapsible.md +40 -40
  382. package/docs/components/ui/color-input.md +91 -91
  383. package/docs/components/ui/color-swatch.md +25 -25
  384. package/docs/components/ui/combobox.md +54 -54
  385. package/docs/components/ui/container.md +26 -26
  386. package/docs/components/ui/context-menu.md +43 -43
  387. package/docs/components/ui/data-table-body.md +1 -1
  388. package/docs/components/ui/data-table-bulk-actions.md +1 -1
  389. package/docs/components/ui/data-table-card.md +1 -1
  390. package/docs/components/ui/data-table-context.md +1 -1
  391. package/docs/components/ui/data-table-header.md +1 -1
  392. package/docs/components/ui/data-table-pagination.md +1 -1
  393. package/docs/components/ui/data-table-toolbar.md +44 -44
  394. package/docs/components/ui/data-table.md +94 -94
  395. package/docs/components/ui/dialog.md +54 -54
  396. package/docs/components/ui/dropdown-menu.md +48 -48
  397. package/docs/components/ui/file-upload.md +41 -41
  398. package/docs/components/ui/form.md +51 -51
  399. package/docs/components/ui/hover-card.md +32 -32
  400. package/docs/components/ui/icon-button.md +40 -40
  401. package/docs/components/ui/input-otp.md +44 -44
  402. package/docs/components/ui/input.md +74 -74
  403. package/docs/components/ui/label.md +25 -25
  404. package/docs/components/ui/link.md +29 -29
  405. package/docs/components/ui/menubar.md +44 -44
  406. package/docs/components/ui/navigation-menu.md +46 -46
  407. package/docs/components/ui/number-input.md +44 -44
  408. package/docs/components/ui/pagination.md +48 -48
  409. package/docs/components/ui/popover.md +30 -30
  410. package/docs/components/ui/progress-ring.md +41 -41
  411. package/docs/components/ui/progress.md +34 -34
  412. package/docs/components/ui/radio.md +34 -34
  413. package/docs/components/ui/search-input.md +43 -43
  414. package/docs/components/ui/segmented-control.md +50 -50
  415. package/docs/components/ui/select.md +53 -53
  416. package/docs/components/ui/separator.md +32 -32
  417. package/docs/components/ui/sheet.md +47 -47
  418. package/docs/components/ui/sidebar.md +72 -72
  419. package/docs/components/ui/skeleton.md +77 -77
  420. package/docs/components/ui/slider.md +29 -29
  421. package/docs/components/ui/spinner.md +54 -54
  422. package/docs/components/ui/stack.md +39 -39
  423. package/docs/components/ui/stat-card.md +61 -61
  424. package/docs/components/ui/status-dot.md +26 -26
  425. package/docs/components/ui/stepper.md +49 -49
  426. package/docs/components/ui/switch.md +47 -47
  427. package/docs/components/ui/table.md +47 -47
  428. package/docs/components/ui/tabs.md +60 -60
  429. package/docs/components/ui/text.md +37 -37
  430. package/docs/components/ui/textarea.md +39 -39
  431. package/docs/components/ui/toast.md +65 -65
  432. package/docs/components/ui/toaster.md +47 -47
  433. package/docs/components/ui/toggle-group.md +43 -43
  434. package/docs/components/ui/toggle.md +37 -37
  435. package/docs/components/ui/tooltip.md +38 -38
  436. package/docs/components/ui/tree-view.md +65 -65
  437. package/docs/components/ui/visually-hidden.md +21 -21
  438. package/llms-full.txt +5266 -5264
  439. package/llms.txt +624 -580
  440. package/package.json +7 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.js","names":[],"sources":["../../src/composed/date-picker/year-picker.tsx","../../src/composed/date-picker/month-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/time-picker.tsx","../../src/composed/date-picker/date-time-picker.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\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-ds-md 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 * as React from 'react'\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-ds-md 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'\nimport { format, setMonth, setYear } from 'date-fns'\nimport { IconCalendarEvent } from '@tabler/icons-react'\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 { YearPicker } from './year-picker'\nimport { MonthPicker } from './month-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-ds-lg 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 * as React from 'react'\nimport {\n startOfDay,\n endOfDay,\n subDays,\n startOfMonth,\n endOfMonth,\n subMonths,\n startOfYear,\n} from 'date-fns'\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-ds-md 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 * as React from 'react'\nimport { format, isBefore, isAfter, setMonth, setYear, addMonths } from 'date-fns'\nimport { IconCalendarEvent } from '@tabler/icons-react'\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 { YearPicker } from './year-picker'\nimport { MonthPicker } from './month-picker'\nimport { Presets } from './presets'\nimport type { PresetKey } from './presets'\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-ds-lg 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 * as React from 'react'\nimport { format, setHours, setMinutes, setSeconds } from 'date-fns'\nimport { IconClock } from '@tabler/icons-react'\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-ds-md 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-ds-lg 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-[48px]')}>\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-[48px]')}>\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-[48px]')}>\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","'use client'\n\nimport * as React from 'react'\nimport {\n format,\n setHours,\n setMinutes,\n setMonth,\n setYear,\n} from 'date-fns'\nimport { IconCalendarClock } from '@tabler/icons-react'\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 { YearPicker } from './year-picker'\nimport { MonthPicker } from './month-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-ds-md 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-ds-lg 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"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-preview.js","names":[],"sources":["../../src/composed/file-preview/document-preview.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { tweens } from '../../ui/lib/motion'\nimport { Skeleton } from '../../ui/skeleton'\nimport { Button } from '../../ui/button'\nimport { Icon } from '../../ui/icon'\nimport { IconChevronLeft, IconChevronRight } from '@tabler/icons-react'\nimport { Document, Page, pdfjs } from 'react-pdf'\nimport { ErrorFallback, Toolbar } from './shared'\n\n// ============================================================\n// PDF Preview — Adobe/Google Drive style\n// ============================================================\n\nexport default function DocumentPreview({ url, initialPage, onError }: { url: string; initialPage: number; onError?: (msg: string) => void }) {\n React.useEffect(() => {\n pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`\n }, [])\n\n const [numPages, setNumPages] = React.useState(0)\n const [page, setPage] = React.useState(initialPage)\n const [pageInput, setPageInput] = React.useState(String(initialPage))\n const [error, setError] = React.useState(false)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const [hovered, setHovered] = React.useState(false)\n\n // Sync page input when page changes via buttons\n React.useEffect(() => { setPageInput(String(page)) }, [page])\n\n // Keyboard nav — scoped to container focus/hover\n React.useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n const el = containerRef.current\n if (!el) return\n const hasFocus = el.contains(document.activeElement)\n if (!hasFocus && !hovered) return\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault()\n setPage((p) => Math.min(numPages, p + 1))\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault()\n setPage((p) => Math.max(1, p - 1))\n }\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [numPages, hovered])\n\n function handlePageInputSubmit(e: React.KeyboardEvent) {\n if (e.key === 'Enter') {\n const n = parseInt(pageInput, 10)\n if (n >= 1 && n <= numPages) setPage(n)\n else setPageInput(String(page))\n }\n }\n\n if (error) return <ErrorFallback message=\"Could not load PDF\" url={url} />\n\n return (\n <div\n ref={containerRef}\n className=\"flex flex-col items-center gap-ds-03\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n tabIndex={-1}\n >\n <div className=\"overflow-auto max-h-[70vh] rounded-ds-md bg-surface-sunken border border-surface-border\">\n <Document\n file={url}\n onLoadSuccess={({ numPages: n }) => setNumPages(n)}\n onLoadError={() => { setError(true); onError?.('PDF failed to load') }}\n loading={<Skeleton className=\"h-[500px] w-[400px]\" />}\n error={<ErrorFallback message=\"Failed to load PDF\" url={url} />}\n >\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={page}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={tweens.fade}\n >\n <Page pageNumber={page} renderTextLayer={false} renderAnnotationLayer={false} />\n </motion.div>\n </AnimatePresence>\n </Document>\n </div>\n\n {numPages > 0 && (\n <Toolbar>\n <Button variant=\"ghost\" size=\"icon-xs\" onClick={() => setPage((p) => Math.max(1, p - 1))} disabled={page <= 1} aria-label=\"Previous page (←)\" title=\"Previous page\">\n <Icon icon={IconChevronLeft} size=\"sm\" />\n </Button>\n <div className=\"flex items-center gap-ds-01 text-ds-xs text-surface-fg-muted\">\n <input\n type=\"text\"\n value={pageInput}\n onChange={(e) => setPageInput(e.target.value)}\n onKeyDown={handlePageInputSubmit}\n onBlur={() => setPageInput(String(page))}\n className=\"w-8 bg-transparent text-center font-mono text-surface-fg outline-hidden focus:bg-surface-raised-hover rounded-ds-sm\"\n aria-label=\"Page number\"\n />\n <span>/ {numPages}</span>\n </div>\n <Button variant=\"ghost\" size=\"icon-xs\" onClick={() => setPage((p) => Math.min(numPages, p + 1))} disabled={page >= numPages} aria-label=\"Next page (→)\" title=\"Next page\">\n <Icon icon={IconChevronRight} size=\"sm\" />\n </Button>\n </Toolbar>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-preview.js","names":[],"sources":["../../src/composed/file-preview/video-preview.tsx","../../src/composed/file-preview/audio-preview.tsx","../../src/composed/file-preview/embed-preview.tsx","../../src/composed/file-preview.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { springs, tweens } from '../../ui/lib/motion'\nimport { Icon } from '../../ui/icon'\nimport {\n IconPlayerPlay,\n IconPlayerPause,\n IconMaximize,\n} from '@tabler/icons-react'\nimport { ErrorFallback, VolumeControl, formatTime } from './shared'\n\n// ============================================================\n// Video Preview — Custom player with DS styling\n// ============================================================\n\nconst PLAYBACK_RATES = [0.5, 0.75, 1, 1.25, 1.5, 2] as const\n\nexport default function VideoPreview({ url, onError }: { url: string; onError?: (msg: string) => void }) {\n const videoRef = React.useRef<HTMLVideoElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const [playing, setPlaying] = React.useState(false)\n const [progress, setProgress] = React.useState(0)\n const [duration, setDuration] = React.useState(0)\n const [currentTime, setCurrentTime] = React.useState(0)\n const [muted, setMuted] = React.useState(false)\n const [error, setError] = React.useState(false)\n const [showControls, setShowControls] = React.useState(true)\n const [playbackRate, setPlaybackRate] = React.useState(1)\n const hideTimer = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n React.useEffect(() => {\n return () => clearTimeout(hideTimer.current)\n }, [])\n\n // Keyboard shortcuts — YouTube style\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n const el = containerRef.current\n if (!el || !el.contains(document.activeElement) && document.activeElement !== el) return\n const v = videoRef.current\n if (!v) return\n\n switch (e.key) {\n case ' ':\n case 'k':\n e.preventDefault()\n setPlaying(prev => {\n if (prev) v.pause(); else v.play()\n return !prev\n })\n break\n case 'ArrowRight':\n e.preventDefault()\n v.currentTime = Math.min(v.duration, v.currentTime + 5)\n break\n case 'ArrowLeft':\n e.preventDefault()\n v.currentTime = Math.max(0, v.currentTime - 5)\n break\n case 'j':\n e.preventDefault()\n v.currentTime = Math.max(0, v.currentTime - 10)\n break\n case 'l':\n e.preventDefault()\n v.currentTime = Math.min(v.duration, v.currentTime + 10)\n break\n case 'm':\n e.preventDefault()\n setMuted(prev => {\n v.muted = !prev\n return !prev\n })\n break\n case 'f':\n e.preventDefault()\n v.requestFullscreen?.()\n break\n case '>':\n e.preventDefault()\n cyclePlaybackRate(1)\n break\n case '<':\n e.preventDefault()\n cyclePlaybackRate(-1)\n break\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function cyclePlaybackRate(direction: 1 | -1) {\n const idx = PLAYBACK_RATES.indexOf(playbackRate as typeof PLAYBACK_RATES[number])\n const nextIdx = Math.max(0, Math.min(PLAYBACK_RATES.length - 1, idx + direction))\n const next = PLAYBACK_RATES[nextIdx]\n setPlaybackRate(next)\n if (videoRef.current) videoRef.current.playbackRate = next\n }\n\n function togglePlay() {\n if (!videoRef.current) return\n if (playing) videoRef.current.pause()\n else videoRef.current.play()\n setPlaying(!playing)\n }\n\n function handleSeek(e: React.MouseEvent<HTMLDivElement>) {\n if (!videoRef.current || !duration) return\n const rect = e.currentTarget.getBoundingClientRect()\n const pct = (e.clientX - rect.left) / rect.width\n videoRef.current.currentTime = pct * duration\n }\n\n function handleMouseMove() {\n setShowControls(true)\n clearTimeout(hideTimer.current)\n if (playing) {\n hideTimer.current = setTimeout(() => setShowControls(false), 3000)\n }\n }\n\n if (error) return <ErrorFallback message=\"Could not load video\" url={url} />\n\n return (\n <div\n ref={containerRef}\n className=\"group relative rounded-ds-md bg-black overflow-hidden\"\n onMouseMove={handleMouseMove}\n onMouseLeave={() => playing && setShowControls(false)}\n tabIndex={-1}\n >\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n <video\n ref={videoRef}\n src={url}\n className=\"max-h-[70vh] w-full\"\n onClick={togglePlay}\n muted={muted}\n onTimeUpdate={() => {\n if (!videoRef.current) return\n setCurrentTime(videoRef.current.currentTime)\n if (videoRef.current.duration) setProgress((videoRef.current.currentTime / videoRef.current.duration) * 100)\n }}\n onLoadedMetadata={() => setDuration(videoRef.current?.duration ?? 0)}\n onEnded={() => { setPlaying(false); setShowControls(true) }}\n onError={() => { setError(true); onError?.('Video failed to load') }}\n playsInline\n />\n\n {/* Play button overlay — shown when paused */}\n {!playing && (\n <motion.button\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={springs.snappy}\n onClick={togglePlay}\n className=\"absolute inset-0 flex items-center justify-center bg-black/30\"\n aria-label=\"Play video\"\n >\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full bg-white/90 shadow-floating\">\n <Icon icon={IconPlayerPlay} size=\"xl\" className=\"text-surface-fg ml-0.5\" />\n </div>\n </motion.button>\n )}\n\n {/* Bottom controls — auto-hide after 3s during playback */}\n <AnimatePresence>\n {showControls && duration > 0 && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={tweens.fade}\n className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/80 to-transparent px-ds-04 pb-ds-04 pt-ds-08\"\n >\n {/* Progress bar */}\n <div\n className=\"relative h-1 w-full cursor-pointer rounded-full bg-white/30 mb-ds-03 group/progress\"\n onClick={handleSeek}\n role=\"slider\"\n aria-label=\"Video progress\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n >\n <div\n className=\"absolute left-0 top-0 h-full rounded-full bg-white transition-[width] duration-75\"\n style={{ width: `${progress}%` }}\n />\n {/* Scrub handle */}\n <div\n className=\"absolute top-1/2 -translate-y-1/2 h-3 w-3 rounded-full bg-white shadow-raised opacity-0 group-hover/progress:opacity-100 transition-opacity\"\n style={{ left: `${progress}%`, marginLeft: '-6px' }}\n />\n </div>\n\n {/* Controls row */}\n <div className=\"flex items-center gap-ds-03\">\n <button onClick={togglePlay} className=\"text-white hover:text-white/80\" aria-label={playing ? 'Pause' : 'Play'} title={playing ? 'Pause' : 'Play'}>\n {playing ? <Icon icon={IconPlayerPause} size=\"lg\" /> : <Icon icon={IconPlayerPlay} size=\"lg\" />}\n </button>\n <VolumeControl\n volume={muted ? 0 : 1}\n muted={muted}\n onVolumeChange={(v) => {\n if (videoRef.current) videoRef.current.volume = v\n if (v > 0 && muted) { setMuted(false); if (videoRef.current) videoRef.current.muted = false }\n }}\n onMuteToggle={() => { setMuted(!muted); if (videoRef.current) videoRef.current.muted = !muted }}\n variant=\"dark\"\n />\n <span className=\"text-[11px] font-mono text-white/70 tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n <div className=\"flex-1\" />\n <button\n onClick={() => cyclePlaybackRate(1)}\n className=\"text-[11px] font-mono text-white/70 hover:text-white px-1 rounded-ds-sm hover:bg-white/10 transition-colors\"\n aria-label={`Playback speed: ${playbackRate}x`}\n >\n {playbackRate}x\n </button>\n <button\n onClick={() => videoRef.current?.requestFullscreen?.()}\n className=\"text-white hover:text-white/80\"\n aria-label=\"Fullscreen (F)\"\n title=\"Fullscreen\"\n >\n <Icon icon={IconMaximize} size=\"sm\" />\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Button } from '../../ui/button'\nimport { Icon } from '../../ui/icon'\nimport { IconPlayerPlay, IconPlayerPause } from '@tabler/icons-react'\nimport { ErrorFallback, VolumeControl, formatTime } from './shared'\n\n// ============================================================\n// Audio Preview — Branded mini-player (Spotify/SoundCloud style)\n// ============================================================\n\nexport default function AudioPreview({ url, fileName, onError }: { url: string; fileName?: string; onError?: (msg: string) => void }) {\n const audioRef = React.useRef<HTMLAudioElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const [playing, setPlaying] = React.useState(false)\n const [progress, setProgress] = React.useState(0)\n const [duration, setDuration] = React.useState(0)\n const [currentTime, setCurrentTime] = React.useState(0)\n const [volume, setVolume] = React.useState(1)\n const [muted, setMuted] = React.useState(false)\n const [error, setError] = React.useState(false)\n const [hoverTime, setHoverTime] = React.useState<number | null>(null)\n\n // Keyboard shortcuts\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n const el = containerRef.current\n if (!el || !el.contains(document.activeElement) && document.activeElement !== el) return\n const a = audioRef.current\n if (!a) return\n\n switch (e.key) {\n case ' ':\n e.preventDefault()\n setPlaying(prev => {\n if (prev) a.pause(); else a.play()\n return !prev\n })\n break\n case 'ArrowRight':\n e.preventDefault()\n a.currentTime = Math.min(a.duration || 0, a.currentTime + 5)\n break\n case 'ArrowLeft':\n e.preventDefault()\n a.currentTime = Math.max(0, a.currentTime - 5)\n break\n case 'm':\n e.preventDefault()\n setMuted(prev => {\n a.muted = !prev\n return !prev\n })\n break\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function togglePlay() {\n if (!audioRef.current) return\n if (playing) audioRef.current.pause()\n else audioRef.current.play()\n setPlaying(!playing)\n }\n\n function handleSeek(e: React.MouseEvent<HTMLDivElement>) {\n if (!audioRef.current || !duration) return\n const rect = e.currentTarget.getBoundingClientRect()\n const pct = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n audioRef.current.currentTime = pct * duration\n }\n\n function handleHover(e: React.MouseEvent<HTMLDivElement>) {\n if (!duration) return\n const rect = e.currentTarget.getBoundingClientRect()\n const pct = (e.clientX - rect.left) / rect.width\n setHoverTime(pct * duration)\n }\n\n function toggleMute() {\n if (!audioRef.current) return\n const next = !muted\n setMuted(next)\n audioRef.current.muted = next\n }\n\n if (error) return <ErrorFallback message=\"Could not load audio\" url={url} />\n\n return (\n <div ref={containerRef} className=\"rounded-ds-lg border border-surface-border bg-surface-raised shadow-raised overflow-hidden\" tabIndex={-1}>\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n <audio\n ref={audioRef}\n src={url}\n onTimeUpdate={() => {\n if (!audioRef.current) return\n setCurrentTime(audioRef.current.currentTime)\n if (audioRef.current.duration) setProgress((audioRef.current.currentTime / audioRef.current.duration) * 100)\n }}\n onLoadedMetadata={() => setDuration(audioRef.current?.duration ?? 0)}\n onEnded={() => setPlaying(false)}\n onError={() => { setError(true); onError?.('Audio failed to load') }}\n />\n\n {/* Progress bar — full width at top (Spotify style) */}\n <div\n className=\"relative h-1 w-full cursor-pointer bg-surface-sunken group/bar\"\n onClick={handleSeek}\n onMouseMove={handleHover}\n onMouseLeave={() => setHoverTime(null)}\n role=\"slider\"\n aria-label=\"Audio progress\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n >\n <div\n className=\"absolute left-0 top-0 h-full bg-accent-9 transition-[width] duration-75\"\n style={{ width: `${progress}%` }}\n />\n {/* Hover time tooltip */}\n {hoverTime !== null && (\n <div\n className=\"absolute -top-7 -translate-x-1/2 rounded-ds-sm bg-surface-overlay px-1.5 py-0.5 text-[10px] font-mono text-surface-fg shadow-floating pointer-events-none\"\n style={{ left: `${(hoverTime / (duration || 1)) * 100}%` }}\n >\n {formatTime(hoverTime)}\n </div>\n )}\n {/* Scrub handle */}\n <div\n className=\"absolute top-1/2 -translate-y-1/2 h-2.5 w-2.5 rounded-full bg-accent-9 shadow-raised opacity-0 group-hover/bar:opacity-100 transition-opacity\"\n style={{ left: `${progress}%`, marginLeft: '-5px' }}\n />\n </div>\n\n {/* Controls */}\n <div className=\"flex items-center gap-ds-04 px-ds-05 py-ds-04\">\n <Button\n variant=\"solid\"\n size=\"icon-sm\"\n onClick={togglePlay}\n aria-label={playing ? 'Pause' : 'Play'}\n title={playing ? 'Pause' : 'Play'}\n className=\"shrink-0\"\n >\n {playing ? (\n <Icon icon={IconPlayerPause} size=\"sm\" />\n ) : (\n <Icon icon={IconPlayerPlay} size=\"sm\" className=\"ml-0.5\" />\n )}\n </Button>\n\n {/* File name + time */}\n <div className=\"flex-1 min-w-0\">\n {fileName && (\n <p className=\"text-ds-sm font-semibold text-surface-fg truncate\">{fileName}</p>\n )}\n <p className=\"text-ds-xs font-mono text-surface-fg-muted tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </p>\n </div>\n\n {/* Volume */}\n <VolumeControl\n volume={volume}\n muted={muted}\n onVolumeChange={(v) => {\n setVolume(v)\n if (audioRef.current) audioRef.current.volume = v\n if (v > 0 && muted) {\n setMuted(false)\n if (audioRef.current) audioRef.current.muted = false\n }\n }}\n onMuteToggle={toggleMute}\n variant=\"light\"\n />\n </div>\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { motion } from 'framer-motion'\nimport { tweens } from '../../ui/lib/motion'\nimport { Skeleton } from '../../ui/skeleton'\nimport { ErrorFallback } from './shared'\n\n// ============================================================\n// Embed Preview — 16:9 with error timeout\n// ============================================================\n\nexport default function EmbedPreview({ url, embedUrl, onError }: { url: string; embedUrl: string; onError?: (msg: string) => void }) {\n const [loaded, setLoaded] = React.useState(false)\n const [error, setError] = React.useState(false)\n\n // Timeout — if iframe doesn't load in 15s, show error\n React.useEffect(() => {\n const timer = setTimeout(() => {\n if (!loaded) { setError(true); onError?.('Embed timed out') }\n }, 15000)\n return () => clearTimeout(timer)\n }, [loaded, onError])\n\n if (error) return <ErrorFallback message=\"Could not load embed\" url={url} />\n\n return (\n <div className=\"relative w-full rounded-ds-md overflow-hidden\" style={{ aspectRatio: '16 / 9' }}>\n {!loaded && <Skeleton className=\"absolute inset-0\" />}\n <motion.iframe\n src={embedUrl}\n title=\"Embedded content\"\n onLoad={() => setLoaded(true)}\n onError={() => { setError(true); onError?.('Embed failed to load') }}\n initial={{ opacity: 0 }}\n animate={{ opacity: loaded ? 1 : 0 }}\n transition={tweens.fade}\n className=\"absolute inset-0 h-full w-full border-none\"\n allowFullScreen\n />\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cn } from '../ui/lib/utils'\nimport { Skeleton } from '../ui/skeleton'\nimport { Button } from '../ui/button'\nimport { Icon } from '../ui/icon'\nimport { Badge } from '../ui/badge'\nimport { IconDownload } from '@tabler/icons-react'\n\n// Sub-components: direct imports for non-peer-dep renderers,\n// React.lazy for renderers that pull in optional peer deps\n// (react-zoom-pan-pinch, react-pdf) to preserve code-splitting.\nconst LazyImagePreview = React.lazy(() => import('./file-preview/image-preview'))\nconst LazyDocumentPreview = React.lazy(() => import('./file-preview/document-preview'))\nimport VideoPreview from './file-preview/video-preview'\nimport AudioPreview from './file-preview/audio-preview'\nimport EmbedPreview from './file-preview/embed-preview'\n\n// ============================================================\n// Types\n// ============================================================\n\ntype FileType = 'image' | 'pdf' | 'video' | 'audio' | 'embed'\n\nexport interface FilePreviewProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onError'> {\n url: string\n /** Auto-detected from URL/mimeType if omitted */\n type?: FileType\n mimeType?: string\n alt?: string\n /** PDF starting page @default 1 */\n initialPage?: number\n /** File name for display */\n fileName?: string\n /** File size for display (e.g. '2.4 MB') */\n fileSize?: string\n /** Called on errors (broken URL, CORS, timeout) */\n onError?: (error: string) => void\n}\n\n// ============================================================\n// Type Detection\n// ============================================================\n\nfunction detectType(url: string, mimeType?: string): FileType {\n if (mimeType) {\n if (mimeType.startsWith('image/')) return 'image'\n if (mimeType === 'application/pdf') return 'pdf'\n if (mimeType.startsWith('video/')) return 'video'\n if (mimeType.startsWith('audio/')) return 'audio'\n }\n\n const ext = url.split('?')[0].split('.').pop()?.toLowerCase()\n if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext ?? '')) return 'image'\n if (ext === 'pdf') return 'pdf'\n if (['mp4', 'webm', 'ogg', 'mov'].includes(ext ?? '')) return 'video'\n if (['mp3', 'wav', 'ogg', 'aac', 'flac'].includes(ext ?? '')) return 'audio'\n\n if (url.includes('figma.com') || url.includes('loom.com') || url.includes('youtube.com') || url.includes('youtu.be') || url.includes('vimeo.com')) {\n return 'embed'\n }\n\n return 'image'\n}\n\nfunction getEmbedUrl(url: string): string {\n const ytMatch = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([^&?]+)/)\n if (ytMatch) return `https://www.youtube.com/embed/${ytMatch[1]}`\n\n const vimeoMatch = url.match(/vimeo\\.com\\/(\\d+)/)\n if (vimeoMatch) return `https://player.vimeo.com/video/${vimeoMatch[1]}`\n\n if (url.includes('figma.com')) return `https://www.figma.com/embed?embed_host=share&url=${encodeURIComponent(url)}`\n\n const loomMatch = url.match(/loom\\.com\\/share\\/([^?]+)/)\n if (loomMatch) return `https://www.loom.com/embed/${loomMatch[1]}`\n\n return url\n}\n\n// ============================================================\n// FilePreview — Main component (router)\n// ============================================================\n\nfunction FilePreview({\n url,\n type: typeProp,\n mimeType,\n alt,\n initialPage = 1,\n fileName,\n fileSize,\n onError,\n className,\n ...props\n}: FilePreviewProps) {\n const type = typeProp ?? detectType(url, mimeType)\n const fallback = <Skeleton className=\"h-64 w-full rounded-ds-md\" />\n\n return (\n <div className={cn('flex flex-col gap-ds-03', className)} {...props}>\n {/* File info bar */}\n {(fileName || fileSize) && (\n <div className=\"flex items-center gap-ds-03\">\n {fileName && <span className=\"text-ds-sm font-semibold text-surface-fg truncate\">{fileName}</span>}\n {fileSize && <Badge variant=\"subtle\" size=\"xs\">{fileSize}</Badge>}\n </div>\n )}\n\n {/* Preview */}\n {type === 'image' && (\n <React.Suspense fallback={fallback}>\n <LazyImagePreview url={url} alt={alt} onError={onError} />\n </React.Suspense>\n )}\n {type === 'pdf' && (\n <React.Suspense fallback={fallback}>\n <LazyDocumentPreview url={url} initialPage={initialPage} onError={onError} />\n </React.Suspense>\n )}\n {type === 'video' && <VideoPreview url={url} onError={onError} />}\n {type === 'audio' && <AudioPreview url={url} fileName={fileName} onError={onError} />}\n {type === 'embed' && <EmbedPreview url={url} embedUrl={getEmbedUrl(url)} onError={onError} />}\n\n {/* Download — not shown for audio (it has its own layout) */}\n {type !== 'audio' && (\n <div className=\"flex justify-end\">\n <Button variant=\"ghost\" size=\"xs\" startIcon={<Icon icon={IconDownload} />} asChild>\n <a href={url} download target=\"_blank\" rel=\"noopener noreferrer\">Download</a>\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nexport { FilePreview }\nexport type { FileType }\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAM,IAAiB;CAAC;CAAK;CAAM;CAAG;CAAM;CAAK;CAAE;AAEnD,SAAwB,EAAa,EAAE,QAAK,cAA6D;CACvG,IAAM,IAAW,EAAM,OAAyB,KAAK,EAC/C,IAAe,EAAM,OAAuB,KAAK,EACjD,CAAC,GAAS,KAAc,EAAM,SAAS,GAAM,EAC7C,CAAC,GAAU,KAAe,EAAM,SAAS,EAAE,EAC3C,CAAC,GAAU,KAAe,EAAM,SAAS,EAAE,EAC3C,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAE,EACjD,CAAC,GAAO,KAAY,EAAM,SAAS,GAAM,EACzC,CAAC,GAAO,KAAY,EAAM,SAAS,GAAM,EACzC,CAAC,GAAc,KAAmB,EAAM,SAAS,GAAK,EACtD,CAAC,GAAc,KAAmB,EAAM,SAAS,EAAE,EACnD,IAAY,EAAM,OAAkD,KAAA,EAAU;AAOpF,CALA,EAAM,sBACS,aAAa,EAAU,QAAQ,EAC3C,EAAE,CAAC,EAGN,EAAM,gBAAgB;EACpB,SAAS,EAAc,GAAkB;GACvC,IAAM,IAAK,EAAa;AACxB,OAAI,CAAC,KAAM,CAAC,EAAG,SAAS,SAAS,cAAc,IAAI,SAAS,kBAAkB,EAAI;GAClF,IAAM,IAAI,EAAS;AACd,SAEL,SAAQ,EAAE,KAAV;IACE,KAAK;IACL,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,GAAW,OACL,IAAM,EAAE,OAAO,GAAO,EAAE,MAAM,EAC3B,CAAC,GACR;AACF;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAE,cAAc,KAAK,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE;AACvD;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAE,cAAc,KAAK,IAAI,GAAG,EAAE,cAAc,EAAE;AAC9C;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAE,cAAc,KAAK,IAAI,GAAG,EAAE,cAAc,GAAG;AAC/C;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAE,cAAc,KAAK,IAAI,EAAE,UAAU,EAAE,cAAc,GAAG;AACxD;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,GAAS,OACP,EAAE,QAAQ,CAAC,GACJ,CAAC,GACR;AACF;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAE,qBAAqB;AACvB;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAkB,EAAE;AACpB;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAkB,GAAG;AACrB;;;AAIN,SADA,SAAS,iBAAiB,WAAW,EAAc,QACtC,SAAS,oBAAoB,WAAW,EAAc;IAElE,EAAE,CAAC;CAEN,SAAS,EAAkB,GAAmB;EAC5C,IAAM,IAAM,EAAe,QAAQ,EAA8C,EAE3E,IAAO,EADG,KAAK,IAAI,GAAG,KAAK,IAAI,EAAe,SAAS,GAAG,IAAM,EAAU,CAAC;AAGjF,EADA,EAAgB,EAAK,EACjB,EAAS,YAAS,EAAS,QAAQ,eAAe;;CAGxD,SAAS,IAAa;AACf,IAAS,YACV,IAAS,EAAS,QAAQ,OAAO,GAChC,EAAS,QAAQ,MAAM,EAC5B,EAAW,CAAC,EAAQ;;CAGtB,SAAS,EAAW,GAAqC;AACvD,MAAI,CAAC,EAAS,WAAW,CAAC,EAAU;EACpC,IAAM,IAAO,EAAE,cAAc,uBAAuB,EAC9C,KAAO,EAAE,UAAU,EAAK,QAAQ,EAAK;AAC3C,IAAS,QAAQ,cAAc,IAAM;;CAGvC,SAAS,IAAkB;AAGzB,EAFA,EAAgB,GAAK,EACrB,aAAa,EAAU,QAAQ,EAC3B,MACF,EAAU,UAAU,iBAAiB,EAAgB,GAAM,EAAE,IAAK;;AAMtE,QAFI,IAAc,kBAAC,GAAD;EAAe,SAAQ;EAA4B;EAAO,CAAA,GAG1E,kBAAC,OAAD;EACE,KAAK;EACL,WAAU;EACV,aAAa;EACb,oBAAoB,KAAW,EAAgB,GAAM;EACrD,UAAU;YALZ;GAQE,kBAAC,SAAD;IACE,KAAK;IACL,KAAK;IACL,WAAU;IACV,SAAS;IACF;IACP,oBAAoB;AACb,OAAS,YACd,EAAe,EAAS,QAAQ,YAAY,EACxC,EAAS,QAAQ,YAAU,EAAa,EAAS,QAAQ,cAAc,EAAS,QAAQ,WAAY,IAAI;;IAE9G,wBAAwB,EAAY,EAAS,SAAS,YAAY,EAAE;IACpE,eAAe;AAAqB,KAAnB,EAAW,GAAM,EAAE,EAAgB,GAAK;;IACzD,eAAe;AAAkB,KAAhB,EAAS,GAAK,EAAE,IAAU,uBAAuB;;IAClE,aAAA;IACA,CAAA;GAGD,CAAC,KACA,kBAAC,EAAO,QAAR;IACE,SAAS;KAAE,SAAS;KAAG,OAAO;KAAK;IACnC,SAAS;KAAE,SAAS;KAAG,OAAO;KAAG;IACjC,YAAY,EAAQ;IACpB,SAAS;IACT,WAAU;IACV,cAAW;cAEX,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAM,MAAM;MAAgB,MAAK;MAAK,WAAU;MAA2B,CAAA;KACvE,CAAA;IACQ,CAAA;GAIlB,kBAAC,GAAD,EAAA,UACG,KAAgB,IAAW,KAC1B,kBAAC,EAAO,KAAR;IACE,SAAS;KAAE,SAAS;KAAG,GAAG;KAAI;IAC9B,SAAS;KAAE,SAAS;KAAG,GAAG;KAAG;IAC7B,MAAM;KAAE,SAAS;KAAG,GAAG;KAAI;IAC3B,YAAY,EAAO;IACnB,WAAU;cALZ,CAQE,kBAAC,OAAD;KACE,WAAU;KACV,SAAS;KACT,MAAK;KACL,cAAW;KACX,iBAAe,KAAK,MAAM,EAAS;KACnC,iBAAe;KACf,iBAAe;KACf,UAAU;eARZ,CAUE,kBAAC,OAAD;MACE,WAAU;MACV,OAAO,EAAE,OAAO,GAAG,EAAS,IAAI;MAChC,CAAA,EAEF,kBAAC,OAAD;MACE,WAAU;MACV,OAAO;OAAE,MAAM,GAAG,EAAS;OAAI,YAAY;OAAQ;MACnD,CAAA,CACE;QAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,UAAD;OAAQ,SAAS;OAAY,WAAU;OAAiC,cAAY,IAAU,UAAU;OAAQ,OAAO,IAAU,UAAU;iBACxI,IAAU,kBAAC,GAAD;QAAM,MAAM;QAAiB,MAAK;QAAO,CAAA,GAAG,kBAAC,GAAD;QAAM,MAAM;QAAgB,MAAK;QAAO,CAAA;OACxF,CAAA;MACT,kBAAC,GAAD;OACE,QAAQ;OACD;OACP,iBAAiB,MAAM;AAErB,QADI,EAAS,YAAS,EAAS,QAAQ,SAAS,IAC5C,IAAI,KAAK,MAAS,EAAS,GAAM,EAAM,EAAS,YAAS,EAAS,QAAQ,QAAQ;;OAExF,oBAAoB;AAAoB,QAAlB,EAAS,CAAC,EAAM,EAAM,EAAS,YAAS,EAAS,QAAQ,QAAQ,CAAC;;OACxF,SAAQ;OACR,CAAA;MACF,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACG,EAAW,EAAY;QAAC;QAAI,EAAW,EAAS;QAC5C;;MACP,kBAAC,OAAD,EAAK,WAAU,UAAW,CAAA;MAC1B,kBAAC,UAAD;OACE,eAAe,EAAkB,EAAE;OACnC,WAAU;OACV,cAAY,mBAAmB,EAAa;iBAH9C,CAKG,GAAa,IACP;;MACT,kBAAC,UAAD;OACE,eAAe,EAAS,SAAS,qBAAqB;OACtD,WAAU;OACV,cAAW;OACX,OAAM;iBAEN,kBAAC,GAAD;QAAM,MAAM;QAAc,MAAK;QAAO,CAAA;OAC/B,CAAA;MACL;OACK;OAEC,CAAA;GACd;;;;;ACnOV,SAAwB,EAAa,EAAE,QAAK,aAAU,cAAgF;CACpI,IAAM,IAAW,EAAM,OAAyB,KAAK,EAC/C,IAAe,EAAM,OAAuB,KAAK,EACjD,CAAC,GAAS,KAAc,EAAM,SAAS,GAAM,EAC7C,CAAC,GAAU,KAAe,EAAM,SAAS,EAAE,EAC3C,CAAC,GAAU,KAAe,EAAM,SAAS,EAAE,EAC3C,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAE,EACjD,CAAC,GAAQ,KAAa,EAAM,SAAS,EAAE,EACvC,CAAC,GAAO,KAAY,EAAM,SAAS,GAAM,EACzC,CAAC,GAAO,KAAY,EAAM,SAAS,GAAM,EACzC,CAAC,GAAW,KAAgB,EAAM,SAAwB,KAAK;AAGrE,GAAM,gBAAgB;EACpB,SAAS,EAAc,GAAkB;GACvC,IAAM,IAAK,EAAa;AACxB,OAAI,CAAC,KAAM,CAAC,EAAG,SAAS,SAAS,cAAc,IAAI,SAAS,kBAAkB,EAAI;GAClF,IAAM,IAAI,EAAS;AACd,SAEL,SAAQ,EAAE,KAAV;IACE,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,GAAW,OACL,IAAM,EAAE,OAAO,GAAO,EAAE,MAAM,EAC3B,CAAC,GACR;AACF;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAE,cAAc,KAAK,IAAI,EAAE,YAAY,GAAG,EAAE,cAAc,EAAE;AAC5D;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,EAAE,cAAc,KAAK,IAAI,GAAG,EAAE,cAAc,EAAE;AAC9C;IACF,KAAK;AAEH,KADA,EAAE,gBAAgB,EAClB,GAAS,OACP,EAAE,QAAQ,CAAC,GACJ,CAAC,GACR;AACF;;;AAIN,SADA,SAAS,iBAAiB,WAAW,EAAc,QACtC,SAAS,oBAAoB,WAAW,EAAc;IAElE,EAAE,CAAC;CAEN,SAAS,IAAa;AACf,IAAS,YACV,IAAS,EAAS,QAAQ,OAAO,GAChC,EAAS,QAAQ,MAAM,EAC5B,EAAW,CAAC,EAAQ;;CAGtB,SAAS,EAAW,GAAqC;AACvD,MAAI,CAAC,EAAS,WAAW,CAAC,EAAU;EACpC,IAAM,IAAO,EAAE,cAAc,uBAAuB,EAC9C,IAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,UAAU,EAAK,QAAQ,EAAK,MAAM,CAAC;AAC1E,IAAS,QAAQ,cAAc,IAAM;;CAGvC,SAAS,EAAY,GAAqC;AACxD,MAAI,CAAC,EAAU;EACf,IAAM,IAAO,EAAE,cAAc,uBAAuB;AAEpD,KADa,EAAE,UAAU,EAAK,QAAQ,EAAK,QACxB,EAAS;;CAG9B,SAAS,IAAa;AACpB,MAAI,CAAC,EAAS,QAAS;EACvB,IAAM,IAAO,CAAC;AAEd,EADA,EAAS,EAAK,EACd,EAAS,QAAQ,QAAQ;;AAK3B,QAFI,IAAc,kBAAC,GAAD;EAAe,SAAQ;EAA4B;EAAO,CAAA,GAG1E,kBAAC,OAAD;EAAK,KAAK;EAAc,WAAU;EAA6F,UAAU;YAAzI;GAEE,kBAAC,SAAD;IACE,KAAK;IACL,KAAK;IACL,oBAAoB;AACb,OAAS,YACd,EAAe,EAAS,QAAQ,YAAY,EACxC,EAAS,QAAQ,YAAU,EAAa,EAAS,QAAQ,cAAc,EAAS,QAAQ,WAAY,IAAI;;IAE9G,wBAAwB,EAAY,EAAS,SAAS,YAAY,EAAE;IACpE,eAAe,EAAW,GAAM;IAChC,eAAe;AAAkB,KAAhB,EAAS,GAAK,EAAE,IAAU,uBAAuB;;IAClE,CAAA;GAGF,kBAAC,OAAD;IACE,WAAU;IACV,SAAS;IACT,aAAa;IACb,oBAAoB,EAAa,KAAK;IACtC,MAAK;IACL,cAAW;IACX,iBAAe,KAAK,MAAM,EAAS;IACnC,iBAAe;IACf,iBAAe;IACf,UAAU;cAVZ;KAYE,kBAAC,OAAD;MACE,WAAU;MACV,OAAO,EAAE,OAAO,GAAG,EAAS,IAAI;MAChC,CAAA;KAED,MAAc,QACb,kBAAC,OAAD;MACE,WAAU;MACV,OAAO,EAAE,MAAM,GAAI,KAAa,KAAY,KAAM,IAAI,IAAI;gBAEzD,EAAW,EAAU;MAClB,CAAA;KAGR,kBAAC,OAAD;MACE,WAAU;MACV,OAAO;OAAE,MAAM,GAAG,EAAS;OAAI,YAAY;OAAQ;MACnD,CAAA;KACE;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,SAAQ;MACR,MAAK;MACL,SAAS;MACT,cAAY,IAAU,UAAU;MAChC,OAAO,IAAU,UAAU;MAC3B,WAAU;gBAET,IACC,kBAAC,GAAD;OAAM,MAAM;OAAiB,MAAK;OAAO,CAAA,GAEzC,kBAAC,GAAD;OAAM,MAAM;OAAgB,MAAK;OAAK,WAAU;OAAW,CAAA;MAEtD,CAAA;KAGT,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,KACC,kBAAC,KAAD;OAAG,WAAU;iBAAqD;OAAa,CAAA,EAEjF,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAW,EAAY;QAAC;QAAI,EAAW,EAAS;QAC/C;SACA;;KAGN,kBAAC,GAAD;MACU;MACD;MACP,iBAAiB,MAAM;AAGrB,OAFA,EAAU,EAAE,EACR,EAAS,YAAS,EAAS,QAAQ,SAAS,IAC5C,IAAI,KAAK,MACX,EAAS,GAAM,EACX,EAAS,YAAS,EAAS,QAAQ,QAAQ;;MAGnD,cAAc;MACd,SAAQ;MACR,CAAA;KACE;;GACF;;;;;AC5KV,SAAwB,EAAa,EAAE,QAAK,aAAU,cAA+E;CACnI,IAAM,CAAC,GAAQ,KAAa,EAAM,SAAS,GAAM,EAC3C,CAAC,GAAO,KAAY,EAAM,SAAS,GAAM;AAY/C,QATA,EAAM,gBAAgB;EACpB,IAAM,IAAQ,iBAAiB;AAC7B,GAAK,MAAU,EAAS,GAAK,EAAE,IAAU,kBAAkB;KAC1D,KAAM;AACT,eAAa,aAAa,EAAM;IAC/B,CAAC,GAAQ,EAAQ,CAAC,EAEjB,IAAc,kBAAC,GAAD;EAAe,SAAQ;EAA4B;EAAO,CAAA,GAG1E,kBAAC,OAAD;EAAK,WAAU;EAAgD,OAAO,EAAE,aAAa,UAAU;YAA/F,CACG,CAAC,KAAU,kBAAC,GAAD,EAAU,WAAU,oBAAqB,CAAA,EACrD,kBAAC,EAAO,QAAR;GACE,KAAK;GACL,OAAM;GACN,cAAc,EAAU,GAAK;GAC7B,eAAe;AAAkB,IAAhB,EAAS,GAAK,EAAE,IAAU,uBAAuB;;GAClE,SAAS,EAAE,SAAS,GAAG;GACvB,SAAS,EAAE,SAAS,MAAgB;GACpC,YAAY,EAAO;GACnB,WAAU;GACV,iBAAA;GACA,CAAA,CACE;;;;;AC3BV,IAAM,IAAmB,EAAM,WAAW,OAAO,sBAAgC,EAC3E,IAAsB,EAAM,WAAW,OAAO,yBAAmC;AA+BvF,SAAS,EAAW,GAAa,GAA6B;AAC5D,KAAI,GAAU;AACZ,MAAI,EAAS,WAAW,SAAS,CAAE,QAAO;AAC1C,MAAI,MAAa,kBAAmB,QAAO;AAC3C,MAAI,EAAS,WAAW,SAAS,CAAE,QAAO;AAC1C,MAAI,EAAS,WAAW,SAAS,CAAE,QAAO;;CAG5C,IAAM,IAAM,EAAI,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,aAAa;AAU7D,QATI;EAAC;EAAO;EAAQ;EAAO;EAAO;EAAQ;EAAO;EAAQ;EAAM,CAAC,SAAS,KAAO,GAAG,GAAS,UACxF,MAAQ,QAAc,QACtB;EAAC;EAAO;EAAQ;EAAO;EAAM,CAAC,SAAS,KAAO,GAAG,GAAS,UAC1D;EAAC;EAAO;EAAO;EAAO;EAAO;EAAO,CAAC,SAAS,KAAO,GAAG,GAAS,UAEjE,EAAI,SAAS,YAAY,IAAI,EAAI,SAAS,WAAW,IAAI,EAAI,SAAS,cAAc,IAAI,EAAI,SAAS,WAAW,IAAI,EAAI,SAAS,YAAY,GACxI,UAGF;;AAGT,SAAS,EAAY,GAAqB;CACxC,IAAM,IAAU,EAAI,MAAM,kDAAkD;AAC5E,KAAI,EAAS,QAAO,iCAAiC,EAAQ;CAE7D,IAAM,IAAa,EAAI,MAAM,oBAAoB;AACjD,KAAI,EAAY,QAAO,kCAAkC,EAAW;AAEpE,KAAI,EAAI,SAAS,YAAY,CAAE,QAAO,oDAAoD,mBAAmB,EAAI;CAEjH,IAAM,IAAY,EAAI,MAAM,4BAA4B;AAGxD,QAFI,IAAkB,8BAA8B,EAAU,OAEvD;;AAOT,SAAS,EAAY,EACnB,QACA,MAAM,GACN,aACA,QACA,iBAAc,GACd,aACA,aACA,YACA,cACA,GAAG,KACgB;CACnB,IAAM,IAAO,KAAY,EAAW,GAAK,EAAS,EAC5C,IAAW,kBAAC,GAAD,EAAU,WAAU,6BAA8B,CAAA;AAEnE,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,2BAA2B,EAAU;EAAE,GAAI;YAA9D;IAEI,KAAY,MACZ,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,KAAY,kBAAC,QAAD;KAAM,WAAU;eAAqD;KAAgB,CAAA,EACjG,KAAY,kBAAC,GAAD;KAAO,SAAQ;KAAS,MAAK;eAAM;KAAiB,CAAA,CAC7D;;GAIP,MAAS,WACR,kBAAC,EAAM,UAAP;IAA0B;cACxB,kBAAC,GAAD;KAAuB;KAAU;KAAc;KAAW,CAAA;IAC3C,CAAA;GAElB,MAAS,SACR,kBAAC,EAAM,UAAP;IAA0B;cACxB,kBAAC,GAAD;KAA0B;KAAkB;KAAsB;KAAW,CAAA;IAC9D,CAAA;GAElB,MAAS,WAAW,kBAAC,GAAD;IAAmB;IAAc;IAAW,CAAA;GAChE,MAAS,WAAW,kBAAC,GAAD;IAAmB;IAAe;IAAmB;IAAW,CAAA;GACpF,MAAS,WAAW,kBAAC,GAAD;IAAmB;IAAK,UAAU,EAAY,EAAI;IAAW;IAAW,CAAA;GAG5F,MAAS,WACR,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAK,WAAW,kBAAC,GAAD,EAAM,MAAM,GAAgB,CAAA;KAAE,SAAA;eACzE,kBAAC,KAAD;MAAG,MAAM;MAAK,UAAA;MAAS,QAAO;MAAS,KAAI;gBAAsB;MAAY,CAAA;KACtE,CAAA;IACL,CAAA;GAEJ"}