@kodffe/ui 0.0.0-stage → 0.10.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 (304) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +11 -0
  2. package/dist/accordion/accordion.d.ts +44 -0
  3. package/dist/accordion/accordion.js +84 -0
  4. package/dist/accordion/accordion.js.map +1 -0
  5. package/dist/alert/alert.d.ts +17 -0
  6. package/dist/alert/alert.js +59 -0
  7. package/dist/alert/alert.js.map +1 -0
  8. package/dist/app-shell/app-footer.d.ts +29 -0
  9. package/dist/app-shell/app-footer.js +39 -0
  10. package/dist/app-shell/app-footer.js.map +1 -0
  11. package/dist/app-shell/app-shell-context.d.ts +10 -0
  12. package/dist/app-shell/app-shell-context.js +12 -0
  13. package/dist/app-shell/app-shell-context.js.map +1 -0
  14. package/dist/app-shell/app-shell.d.ts +42 -0
  15. package/dist/app-shell/app-shell.js +191 -0
  16. package/dist/app-shell/app-shell.js.map +1 -0
  17. package/dist/app-shell/floating-actions.d.ts +19 -0
  18. package/dist/app-shell/floating-actions.js +59 -0
  19. package/dist/app-shell/floating-actions.js.map +1 -0
  20. package/dist/app-shell/workspace-switcher.d.ts +25 -0
  21. package/dist/app-shell/workspace-switcher.js +82 -0
  22. package/dist/app-shell/workspace-switcher.js.map +1 -0
  23. package/dist/badge/badge.d.ts +19 -0
  24. package/dist/badge/badge.js +59 -0
  25. package/dist/badge/badge.js.map +1 -0
  26. package/dist/banner/banner.d.ts +22 -0
  27. package/dist/banner/banner.js +80 -0
  28. package/dist/banner/banner.js.map +1 -0
  29. package/dist/breadcrumbs/breadcrumbs.d.ts +18 -0
  30. package/dist/breadcrumbs/breadcrumbs.js +45 -0
  31. package/dist/breadcrumbs/breadcrumbs.js.map +1 -0
  32. package/dist/button/button.d.ts +38 -0
  33. package/dist/button/button.js +83 -0
  34. package/dist/button/button.js.map +1 -0
  35. package/dist/card/card.d.ts +159 -0
  36. package/dist/card/card.js +390 -0
  37. package/dist/card/card.js.map +1 -0
  38. package/dist/card/insight-card.d.ts +19 -0
  39. package/dist/card/insight-card.js +51 -0
  40. package/dist/card/insight-card.js.map +1 -0
  41. package/dist/card/integration-card.d.ts +19 -0
  42. package/dist/card/integration-card.js +70 -0
  43. package/dist/card/integration-card.js.map +1 -0
  44. package/dist/charts/charts.d.ts +75 -0
  45. package/dist/charts/charts.js +453 -0
  46. package/dist/charts/charts.js.map +1 -0
  47. package/dist/choice/choice.d.ts +39 -0
  48. package/dist/choice/choice.js +143 -0
  49. package/dist/choice/choice.js.map +1 -0
  50. package/dist/combobox/combobox.d.ts +46 -0
  51. package/dist/combobox/combobox.js +196 -0
  52. package/dist/combobox/combobox.js.map +1 -0
  53. package/dist/command-palette/command-palette.d.ts +35 -0
  54. package/dist/command-palette/command-palette.js +164 -0
  55. package/dist/command-palette/command-palette.js.map +1 -0
  56. package/dist/confirm-dialog/confirm-dialog.d.ts +37 -0
  57. package/dist/confirm-dialog/confirm-dialog.js +106 -0
  58. package/dist/confirm-dialog/confirm-dialog.js.map +1 -0
  59. package/dist/content/assistant.d.ts +86 -0
  60. package/dist/content/assistant.js +213 -0
  61. package/dist/content/assistant.js.map +1 -0
  62. package/dist/content/content.d.ts +45 -0
  63. package/dist/content/content.js +136 -0
  64. package/dist/content/content.js.map +1 -0
  65. package/dist/data-display/avatar-sizes.d.ts +8 -0
  66. package/dist/data-display/avatar-sizes.js +12 -0
  67. package/dist/data-display/avatar-sizes.js.map +1 -0
  68. package/dist/data-display/avatar.d.ts +21 -0
  69. package/dist/data-display/avatar.js +53 -0
  70. package/dist/data-display/avatar.js.map +1 -0
  71. package/dist/data-display/chip.d.ts +20 -0
  72. package/dist/data-display/chip.js +64 -0
  73. package/dist/data-display/chip.js.map +1 -0
  74. package/dist/data-display/code-block.d.ts +14 -0
  75. package/dist/data-display/code-block.js +50 -0
  76. package/dist/data-display/code-block.js.map +1 -0
  77. package/dist/data-display/data-display.d.ts +73 -0
  78. package/dist/data-display/data-display.js +227 -0
  79. package/dist/data-display/data-display.js.map +1 -0
  80. package/dist/data-display/insights.d.ts +120 -0
  81. package/dist/data-display/insights.js +220 -0
  82. package/dist/data-display/insights.js.map +1 -0
  83. package/dist/data-table/cells.d.ts +86 -0
  84. package/dist/data-table/cells.js +163 -0
  85. package/dist/data-table/cells.js.map +1 -0
  86. package/dist/data-table/data-table.d.ts +112 -0
  87. package/dist/data-table/data-table.js +558 -0
  88. package/dist/data-table/data-table.js.map +1 -0
  89. package/dist/date-picker/date-picker.d.ts +61 -0
  90. package/dist/date-picker/date-picker.js +309 -0
  91. package/dist/date-picker/date-picker.js.map +1 -0
  92. package/dist/drawer/drawer.d.ts +32 -0
  93. package/dist/drawer/drawer.js +72 -0
  94. package/dist/drawer/drawer.js.map +1 -0
  95. package/dist/empty-state/empty-state.d.ts +25 -0
  96. package/dist/empty-state/empty-state.js +78 -0
  97. package/dist/empty-state/empty-state.js.map +1 -0
  98. package/dist/error-state/error-state.d.ts +19 -0
  99. package/dist/error-state/error-state.js +56 -0
  100. package/dist/error-state/error-state.js.map +1 -0
  101. package/dist/event-calendar/calendar-logic.test.d.ts +1 -0
  102. package/dist/event-calendar/dates.d.ts +35 -0
  103. package/dist/event-calendar/dates.js +55 -0
  104. package/dist/event-calendar/dates.js.map +1 -0
  105. package/dist/event-calendar/event-calendar.d.ts +125 -0
  106. package/dist/event-calendar/event-calendar.js +795 -0
  107. package/dist/event-calendar/event-calendar.js.map +1 -0
  108. package/dist/event-calendar/event-details.d.ts +50 -0
  109. package/dist/event-calendar/event-details.js +124 -0
  110. package/dist/event-calendar/event-details.js.map +1 -0
  111. package/dist/event-calendar/layout.d.ts +48 -0
  112. package/dist/event-calendar/layout.js +55 -0
  113. package/dist/event-calendar/layout.js.map +1 -0
  114. package/dist/file-upload/file-upload.d.ts +70 -0
  115. package/dist/file-upload/file-upload.js +307 -0
  116. package/dist/file-upload/file-upload.js.map +1 -0
  117. package/dist/filters/filters.d.ts +48 -0
  118. package/dist/filters/filters.js +103 -0
  119. package/dist/filters/filters.js.map +1 -0
  120. package/dist/form-field/form-field.d.ts +39 -0
  121. package/dist/form-field/form-field.js +88 -0
  122. package/dist/form-field/form-field.js.map +1 -0
  123. package/dist/hover-card/hover-card.d.ts +15 -0
  124. package/dist/hover-card/hover-card.js +27 -0
  125. package/dist/hover-card/hover-card.js.map +1 -0
  126. package/dist/hover-card/person-hover-card.d.ts +26 -0
  127. package/dist/hover-card/person-hover-card.js +85 -0
  128. package/dist/hover-card/person-hover-card.js.map +1 -0
  129. package/dist/icon/icon-tile.d.ts +20 -0
  130. package/dist/icon/icon-tile.js +55 -0
  131. package/dist/icon/icon-tile.js.map +1 -0
  132. package/dist/icon/icon.d.ts +14 -0
  133. package/dist/icon/icon.js +28 -0
  134. package/dist/icon/icon.js.map +1 -0
  135. package/dist/icon/icons.generated.d.ts +358 -0
  136. package/dist/icon/icons.generated.js +362 -0
  137. package/dist/icon/icons.generated.js.map +1 -0
  138. package/dist/index.d.ts +90 -0
  139. package/dist/index.js +88 -0
  140. package/dist/input/extra-inputs.d.ts +122 -0
  141. package/dist/input/extra-inputs.js +351 -0
  142. package/dist/input/extra-inputs.js.map +1 -0
  143. package/dist/input/field-styles.d.ts +5 -0
  144. package/dist/input/field-styles.js +14 -0
  145. package/dist/input/field-styles.js.map +1 -0
  146. package/dist/input/input.d.ts +50 -0
  147. package/dist/input/input.js +107 -0
  148. package/dist/input/input.js.map +1 -0
  149. package/dist/layout/layout.d.ts +41 -0
  150. package/dist/layout/layout.js +90 -0
  151. package/dist/layout/layout.js.map +1 -0
  152. package/dist/lib/control-styles.d.ts +9 -0
  153. package/dist/lib/control-styles.js +16 -0
  154. package/dist/lib/control-styles.js.map +1 -0
  155. package/dist/lib/cx.d.ts +2 -0
  156. package/dist/lib/cx.js +8 -0
  157. package/dist/lib/cx.js.map +1 -0
  158. package/dist/lib/glyphs.d.ts +13 -0
  159. package/dist/lib/glyphs.js +67 -0
  160. package/dist/lib/glyphs.js.map +1 -0
  161. package/dist/lib/segmented-styles.d.ts +8 -0
  162. package/dist/lib/segmented-styles.js +12 -0
  163. package/dist/lib/segmented-styles.js.map +1 -0
  164. package/dist/lib/select-on-arrow.d.ts +7 -0
  165. package/dist/lib/select-on-arrow.js +21 -0
  166. package/dist/lib/select-on-arrow.js.map +1 -0
  167. package/dist/lib/skip-link.d.ts +5 -0
  168. package/dist/lib/skip-link.js +13 -0
  169. package/dist/lib/skip-link.js.map +1 -0
  170. package/dist/lib/use-media-query.d.ts +4 -0
  171. package/dist/lib/use-media-query.js +15 -0
  172. package/dist/lib/use-media-query.js.map +1 -0
  173. package/dist/lists/lists.d.ts +76 -0
  174. package/dist/lists/lists.js +133 -0
  175. package/dist/lists/lists.js.map +1 -0
  176. package/dist/locale-switch/locale-switch.d.ts +29 -0
  177. package/dist/locale-switch/locale-switch.js +62 -0
  178. package/dist/locale-switch/locale-switch.js.map +1 -0
  179. package/dist/logo/logo.d.ts +31 -0
  180. package/dist/logo/logo.js +157 -0
  181. package/dist/logo/logo.js.map +1 -0
  182. package/dist/logo/product-logo.d.ts +19 -0
  183. package/dist/logo/product-logo.js +46 -0
  184. package/dist/logo/product-logo.js.map +1 -0
  185. package/dist/marketing/marketing.d.ts +176 -0
  186. package/dist/marketing/marketing.js +451 -0
  187. package/dist/marketing/marketing.js.map +1 -0
  188. package/dist/marketing/newsletter-form.d.ts +21 -0
  189. package/dist/marketing/newsletter-form.js +100 -0
  190. package/dist/marketing/newsletter-form.js.map +1 -0
  191. package/dist/mascot/mascot.d.ts +28 -0
  192. package/dist/mascot/mascot.js +28 -0
  193. package/dist/mascot/mascot.js.map +1 -0
  194. package/dist/mascot/mascots.generated.d.ts +284 -0
  195. package/dist/mascot/mascots.generated.js +287 -0
  196. package/dist/mascot/mascots.generated.js.map +1 -0
  197. package/dist/master-detail/master-detail.d.ts +30 -0
  198. package/dist/master-detail/master-detail.js +71 -0
  199. package/dist/master-detail/master-detail.js.map +1 -0
  200. package/dist/menu/account-menu.d.ts +44 -0
  201. package/dist/menu/account-menu.js +78 -0
  202. package/dist/menu/account-menu.js.map +1 -0
  203. package/dist/menu/context-menu.d.ts +31 -0
  204. package/dist/menu/context-menu.js +111 -0
  205. package/dist/menu/context-menu.js.map +1 -0
  206. package/dist/menu/dropdown-menu.d.ts +49 -0
  207. package/dist/menu/dropdown-menu.js +152 -0
  208. package/dist/menu/dropdown-menu.js.map +1 -0
  209. package/dist/menu/menu-styles.d.ts +8 -0
  210. package/dist/menu/menu-styles.js +6 -0
  211. package/dist/menu/menu-styles.js.map +1 -0
  212. package/dist/menu/menubar.d.ts +31 -0
  213. package/dist/menu/menubar.js +125 -0
  214. package/dist/menu/menubar.js.map +1 -0
  215. package/dist/modal/modal.d.ts +34 -0
  216. package/dist/modal/modal.js +58 -0
  217. package/dist/modal/modal.js.map +1 -0
  218. package/dist/notification-center/notification-center.d.ts +51 -0
  219. package/dist/notification-center/notification-center.js +244 -0
  220. package/dist/notification-center/notification-center.js.map +1 -0
  221. package/dist/otp-input/otp-input.d.ts +23 -0
  222. package/dist/otp-input/otp-input.js +61 -0
  223. package/dist/otp-input/otp-input.js.map +1 -0
  224. package/dist/overlay/overlay.d.ts +53 -0
  225. package/dist/overlay/overlay.js +103 -0
  226. package/dist/overlay/overlay.js.map +1 -0
  227. package/dist/page-header/page-header.d.ts +55 -0
  228. package/dist/page-header/page-header.js +114 -0
  229. package/dist/page-header/page-header.js.map +1 -0
  230. package/dist/page-header/record-headers.d.ts +51 -0
  231. package/dist/page-header/record-headers.js +134 -0
  232. package/dist/page-header/record-headers.js.map +1 -0
  233. package/dist/page-header/section-header.d.ts +21 -0
  234. package/dist/page-header/section-header.js +44 -0
  235. package/dist/page-header/section-header.js.map +1 -0
  236. package/dist/page-navigation/page-navigation.d.ts +59 -0
  237. package/dist/page-navigation/page-navigation.js +136 -0
  238. package/dist/page-navigation/page-navigation.js.map +1 -0
  239. package/dist/pagination/pagination.d.ts +28 -0
  240. package/dist/pagination/pagination.js +102 -0
  241. package/dist/pagination/pagination.js.map +1 -0
  242. package/dist/phone-input/phone-input.d.ts +34 -0
  243. package/dist/phone-input/phone-input.js +171 -0
  244. package/dist/phone-input/phone-input.js.map +1 -0
  245. package/dist/popover/popover.d.ts +23 -0
  246. package/dist/popover/popover.js +40 -0
  247. package/dist/popover/popover.js.map +1 -0
  248. package/dist/progress/progress.d.ts +21 -0
  249. package/dist/progress/progress.js +49 -0
  250. package/dist/progress/progress.js.map +1 -0
  251. package/dist/segmented-control/segmented-control.d.ts +32 -0
  252. package/dist/segmented-control/segmented-control.js +29 -0
  253. package/dist/segmented-control/segmented-control.js.map +1 -0
  254. package/dist/select/select.d.ts +48 -0
  255. package/dist/select/select.js +136 -0
  256. package/dist/select/select.js.map +1 -0
  257. package/dist/settings/permission-matrix.d.ts +29 -0
  258. package/dist/settings/permission-matrix.js +101 -0
  259. package/dist/settings/permission-matrix.js.map +1 -0
  260. package/dist/settings/settings-row.d.ts +32 -0
  261. package/dist/settings/settings-row.js +63 -0
  262. package/dist/settings/settings-row.js.map +1 -0
  263. package/dist/side-nav/side-nav.d.ts +36 -0
  264. package/dist/side-nav/side-nav.js +123 -0
  265. package/dist/side-nav/side-nav.js.map +1 -0
  266. package/dist/site-header/site-header.d.ts +32 -0
  267. package/dist/site-header/site-header.js +99 -0
  268. package/dist/site-header/site-header.js.map +1 -0
  269. package/dist/skeleton/skeleton.d.ts +16 -0
  270. package/dist/skeleton/skeleton.js +19 -0
  271. package/dist/skeleton/skeleton.js.map +1 -0
  272. package/dist/slider/slider.d.ts +15 -0
  273. package/dist/slider/slider.js +48 -0
  274. package/dist/slider/slider.js.map +1 -0
  275. package/dist/spinner/spinner.d.ts +15 -0
  276. package/dist/spinner/spinner.js +42 -0
  277. package/dist/spinner/spinner.js.map +1 -0
  278. package/dist/stepper/step-dots.d.ts +16 -0
  279. package/dist/stepper/step-dots.js +26 -0
  280. package/dist/stepper/step-dots.js.map +1 -0
  281. package/dist/stepper/stepper.d.ts +26 -0
  282. package/dist/stepper/stepper.js +113 -0
  283. package/dist/stepper/stepper.js.map +1 -0
  284. package/dist/tabs/tabs.d.ts +31 -0
  285. package/dist/tabs/tabs.js +66 -0
  286. package/dist/tabs/tabs.js.map +1 -0
  287. package/dist/templates/app-templates.d.ts +126 -0
  288. package/dist/templates/app-templates.js +153 -0
  289. package/dist/templates/app-templates.js.map +1 -0
  290. package/dist/templates/site-templates.d.ts +49 -0
  291. package/dist/templates/site-templates.js +110 -0
  292. package/dist/templates/site-templates.js.map +1 -0
  293. package/dist/toast/toast-store.d.ts +54 -0
  294. package/dist/toast/toast-store.js +49 -0
  295. package/dist/toast/toast-store.js.map +1 -0
  296. package/dist/toast/toaster.d.ts +15 -0
  297. package/dist/toast/toaster.js +124 -0
  298. package/dist/toast/toaster.js.map +1 -0
  299. package/dist/tooltip/tooltip.d.ts +29 -0
  300. package/dist/tooltip/tooltip.js +54 -0
  301. package/dist/tooltip/tooltip.js.map +1 -0
  302. package/package.json +88 -3
  303. package/styles.css +521 -0
  304. package/README.md +0 -3
package/dist/index.js ADDED
@@ -0,0 +1,88 @@
1
+ import { cx as e } from "./lib/cx.js";
2
+ import { Icon as t, iconNames as n } from "./icon/icon.js";
3
+ import { Mascot as r, mascotLyingStates as i, mascotStandingStates as a } from "./mascot/mascot.js";
4
+ import { Spinner as o } from "./spinner/spinner.js";
5
+ import { Logo as s, logoVariants as c } from "./logo/logo.js";
6
+ import { Button as l, IconButton as u } from "./button/button.js";
7
+ import { Badge as d } from "./badge/badge.js";
8
+ import { Alert as f } from "./alert/alert.js";
9
+ import { Modal as p, ModalClose as m, ModalContent as h, ModalTrigger as g } from "./modal/modal.js";
10
+ import { Drawer as _, DrawerClose as v, DrawerContent as y, DrawerTrigger as b } from "./drawer/drawer.js";
11
+ import { DESKTOP_QUERY as x, useMediaQuery as S } from "./lib/use-media-query.js";
12
+ import { toast as C } from "./toast/toast-store.js";
13
+ import { Toaster as w } from "./toast/toaster.js";
14
+ import { ConfirmDialog as T } from "./confirm-dialog/confirm-dialog.js";
15
+ import { Skeleton as E } from "./skeleton/skeleton.js";
16
+ import { EmptyState as D } from "./empty-state/empty-state.js";
17
+ import { NotificationCenter as O, formatRelative as k } from "./notification-center/notification-center.js";
18
+ import { Tooltip as A, TooltipProvider as j } from "./tooltip/tooltip.js";
19
+ import { Popover as M, PopoverAnchor as N, PopoverClose as P, PopoverContent as F, PopoverTrigger as I } from "./popover/popover.js";
20
+ import { HoverCard as L, HoverCardContent as R, HoverCardTrigger as z } from "./hover-card/hover-card.js";
21
+ import { Banner as B } from "./banner/banner.js";
22
+ import { Progress as V } from "./progress/progress.js";
23
+ import { ErrorState as H } from "./error-state/error-state.js";
24
+ import { Container as U, Divider as W, Grid as G, Stack as K } from "./layout/layout.js";
25
+ import { Tabs as q, TabsContent as J, TabsList as Y, TabsTrigger as X } from "./tabs/tabs.js";
26
+ import { Breadcrumbs as Z } from "./breadcrumbs/breadcrumbs.js";
27
+ import { Pagination as Q, paginationRange as $ } from "./pagination/pagination.js";
28
+ import { StepDots as ee } from "./stepper/step-dots.js";
29
+ import { Stepper as te } from "./stepper/stepper.js";
30
+ import { Avatar as ne } from "./data-display/avatar.js";
31
+ import { DropdownMenu as re, DropdownMenuCheckboxItem as ie, DropdownMenuContent as ae, DropdownMenuGroup as oe, DropdownMenuHeader as se, DropdownMenuItem as ce, DropdownMenuLabel as le, DropdownMenuRadioGroup as ue, DropdownMenuRadioItem as de, DropdownMenuSeparator as fe, DropdownMenuSub as pe, DropdownMenuSubContent as me, DropdownMenuSubTrigger as he, DropdownMenuTrigger as ge } from "./menu/dropdown-menu.js";
32
+ import { ContextMenu as _e, ContextMenuCheckboxItem as ve, ContextMenuContent as ye, ContextMenuGroup as be, ContextMenuItem as xe, ContextMenuLabel as Se, ContextMenuRadioGroup as Ce, ContextMenuRadioItem as we, ContextMenuSeparator as Te, ContextMenuSub as Ee, ContextMenuSubContent as De, ContextMenuSubTrigger as Oe, ContextMenuTrigger as ke } from "./menu/context-menu.js";
33
+ import { Menubar as Ae, MenubarCheckboxItem as je, MenubarContent as Me, MenubarGroup as Ne, MenubarItem as Pe, MenubarLabel as Fe, MenubarMenu as Ie, MenubarRadioGroup as Le, MenubarRadioItem as Re, MenubarSeparator as ze, MenubarSub as Be, MenubarSubContent as Ve, MenubarSubTrigger as He, MenubarTrigger as Ue } from "./menu/menubar.js";
34
+ import { Accordion as We, AccordionContent as Ge, AccordionFooter as Ke, AccordionItem as qe, AccordionTrigger as Je, Collapsible as Ye, CollapsibleContent as Xe, CollapsibleTrigger as Ze } from "./accordion/accordion.js";
35
+ import { CommandPalette as Qe, filterCommands as $e } from "./command-palette/command-palette.js";
36
+ import { useAppShell as et } from "./app-shell/app-shell-context.js";
37
+ import { SideNav as tt } from "./side-nav/side-nav.js";
38
+ import { AppShell as nt } from "./app-shell/app-shell.js";
39
+ import { SiteHeader as rt } from "./site-header/site-header.js";
40
+ import { Fieldset as it, FormField as at, useFormField as ot } from "./form-field/form-field.js";
41
+ import { DateField as st, Input as ct, Textarea as lt, useFieldProps as ut } from "./input/input.js";
42
+ import { NativeSelect as dt, Select as ft } from "./select/select.js";
43
+ import { Combobox as pt } from "./combobox/combobox.js";
44
+ import { Checkbox as mt, RadioGroup as ht, Switch as gt } from "./choice/choice.js";
45
+ import { Slider as _t } from "./slider/slider.js";
46
+ import { FileUpload as vt, formatBytes as yt } from "./file-upload/file-upload.js";
47
+ import { OtpInput as bt } from "./otp-input/otp-input.js";
48
+ import { DEFAULT_COUNTRIES as xt, PhoneInput as St, toE164 as Ct } from "./phone-input/phone-input.js";
49
+ import { DataTable as wt } from "./data-table/data-table.js";
50
+ import { IconTile as Tt } from "./icon/icon-tile.js";
51
+ import { CellActions as Et, CellLead as Dt, CellMono as Ot, CellNumber as kt, CellStack as At, CellSwitch as jt, CellTags as Mt, EntityCell as Nt } from "./data-table/cells.js";
52
+ import { ActionList as Pt, ActionListItem as Ft, CheckList as It, DeviceList as Lt, StatGrid as Rt } from "./lists/lists.js";
53
+ import { ArticleCard as zt, Card as Bt, CardBody as Vt, CardFooter as Ht, CardHeader as Ut, CardLink as Wt, CaseCard as Gt, IconCard as Kt, MetricCard as qt, PersonCard as Jt, PlanCard as Yt, ProductCard as Xt } from "./card/card.js";
54
+ import { AvatarGroup as Zt, DescriptionList as Qt, FlowDiagram as $t, Sparkline as en, Tag as tn, Timeline as nn } from "./data-display/data-display.js";
55
+ import { Chip as rn } from "./data-display/chip.js";
56
+ import { CodeBlock as an } from "./data-display/code-block.js";
57
+ import { CtaBand as on, DoorCards as sn, Faq as cn, PageHero as ln, PricingTable as un, ProcessSteps as dn, ProofBar as fn, Section as pn, SignOff as mn, SiteFooter as hn, Testimonial as gn } from "./marketing/marketing.js";
58
+ import { NewsletterForm as _n } from "./marketing/newsletter-form.js";
59
+ import { Calendar as vn, DEFAULT_PRESETS as yn, DatePicker as bn, DateRangePicker as xn } from "./date-picker/date-picker.js";
60
+ import { SegmentedControl as Sn } from "./segmented-control/segmented-control.js";
61
+ import { dates_exports as Cn } from "./event-calendar/dates.js";
62
+ import { CalendarAgenda as wn, DEFAULT_CALENDAR_LABELS as Tn, EventCalendar as En, itemColor as Dn } from "./event-calendar/event-calendar.js";
63
+ import { CalendarYear as On, EventDetails as kn, EventDetailsRow as An } from "./event-calendar/event-details.js";
64
+ import { ActivityFeed as jn, ChipList as Mn, RankedList as Nn, SegmentedBar as Pn, SensitiveProvider as Fn, SensitiveToggle as In, SensitiveValue as Ln, StatusLegend as Rn } from "./data-display/insights.js";
65
+ import { AreaChart as zn, BarChart as Bn, CATEGORY_CHART_COLORS as Vn, CHART_COLORS as Hn, DonutChart as Un, LineChart as Wn } from "./charts/charts.js";
66
+ import { PageHeader as Gn } from "./page-header/page-header.js";
67
+ import { SectionHeader as Kn } from "./page-header/section-header.js";
68
+ import { SettingsList as qn, SettingsRow as Jn } from "./settings/settings-row.js";
69
+ import { FilterBar as Yn, FilterMenu as Xn } from "./filters/filters.js";
70
+ import { AccountMenu as Zn } from "./menu/account-menu.js";
71
+ import { WorkspaceSwitcher as Qn } from "./app-shell/workspace-switcher.js";
72
+ import { AppFooter as $n, KodffeAttribution as er } from "./app-shell/app-footer.js";
73
+ import { ProductLogo as tr } from "./logo/product-logo.js";
74
+ import { LocaleSwitch as nr } from "./locale-switch/locale-switch.js";
75
+ import { PermissionMatrix as rr } from "./settings/permission-matrix.js";
76
+ import { CATEGORY_COLORS as ir, ColorPicker as ar, InlineAddForm as or, PasswordInput as sr, TagInput as cr, TimeRangeInput as lr, WEEKDAYS as ur, WeekdayPicker as dr, WeeklySchedule as fr } from "./input/extra-inputs.js";
77
+ import { IntegrationCard as pr } from "./card/integration-card.js";
78
+ import { EntityHeader as mr, ProfileHeader as hr } from "./page-header/record-headers.js";
79
+ import { MasterDetail as gr } from "./master-detail/master-detail.js";
80
+ import { CycleNavigator as _r, PrevNextNav as vr, TableOfContents as yr } from "./page-navigation/page-navigation.js";
81
+ import { FloatingActions as br } from "./app-shell/floating-actions.js";
82
+ import { DeviceFrame as xr, Note as Sr, Prose as Cr, StepCarousel as wr } from "./content/content.js";
83
+ import { InsightCard as Tr } from "./card/insight-card.js";
84
+ import { PersonHoverCard as Er } from "./hover-card/person-hover-card.js";
85
+ import { ChatComposer as Dr, ChatPanel as Or, PromptSuggestions as kr, QuickPanel as Ar } from "./content/assistant.js";
86
+ import { AccountPage as jr, AppLayout as Mr, CalendarPage as Nr, DashboardPage as Pr, ListPage as Fr, MasterDetailPage as Ir, ProfilePage as Lr, ReportPage as Rr, SettingsPage as zr } from "./templates/app-templates.js";
87
+ import { ArticleLayout as Br, AuthLayout as Vr, DocsLayout as Hr, MarketingLayout as Ur } from "./templates/site-templates.js";
88
+ export { We as Accordion, Ge as AccordionContent, Ke as AccordionFooter, qe as AccordionItem, Je as AccordionTrigger, Zn as AccountMenu, jr as AccountPage, Pt as ActionList, Ft as ActionListItem, jn as ActivityFeed, f as Alert, $n as AppFooter, Mr as AppLayout, nt as AppShell, zn as AreaChart, zt as ArticleCard, Br as ArticleLayout, Vr as AuthLayout, ne as Avatar, Zt as AvatarGroup, d as Badge, B as Banner, Bn as BarChart, Z as Breadcrumbs, l as Button, Vn as CATEGORY_CHART_COLORS, ir as CATEGORY_COLORS, Hn as CHART_COLORS, vn as Calendar, wn as CalendarAgenda, Nr as CalendarPage, On as CalendarYear, Bt as Card, Vt as CardBody, Ht as CardFooter, Ut as CardHeader, Wt as CardLink, Gt as CaseCard, Et as CellActions, Dt as CellLead, Ot as CellMono, kt as CellNumber, At as CellStack, jt as CellSwitch, Mt as CellTags, Dr as ChatComposer, Or as ChatPanel, It as CheckList, mt as Checkbox, rn as Chip, Mn as ChipList, an as CodeBlock, Ye as Collapsible, Xe as CollapsibleContent, Ze as CollapsibleTrigger, ar as ColorPicker, pt as Combobox, Qe as CommandPalette, T as ConfirmDialog, U as Container, _e as ContextMenu, ve as ContextMenuCheckboxItem, ye as ContextMenuContent, be as ContextMenuGroup, xe as ContextMenuItem, Se as ContextMenuLabel, Ce as ContextMenuRadioGroup, we as ContextMenuRadioItem, Te as ContextMenuSeparator, Ee as ContextMenuSub, De as ContextMenuSubContent, Oe as ContextMenuSubTrigger, ke as ContextMenuTrigger, on as CtaBand, _r as CycleNavigator, Tn as DEFAULT_CALENDAR_LABELS, xt as DEFAULT_COUNTRIES, yn as DEFAULT_PRESETS, x as DESKTOP_QUERY, Pr as DashboardPage, wt as DataTable, st as DateField, bn as DatePicker, xn as DateRangePicker, Qt as DescriptionList, xr as DeviceFrame, Lt as DeviceList, W as Divider, Hr as DocsLayout, Un as DonutChart, sn as DoorCards, _ as Drawer, v as DrawerClose, y as DrawerContent, b as DrawerTrigger, re as DropdownMenu, ie as DropdownMenuCheckboxItem, ae as DropdownMenuContent, oe as DropdownMenuGroup, se as DropdownMenuHeader, ce as DropdownMenuItem, le as DropdownMenuLabel, ue as DropdownMenuRadioGroup, de as DropdownMenuRadioItem, fe as DropdownMenuSeparator, pe as DropdownMenuSub, me as DropdownMenuSubContent, he as DropdownMenuSubTrigger, ge as DropdownMenuTrigger, D as EmptyState, Nt as EntityCell, mr as EntityHeader, H as ErrorState, En as EventCalendar, kn as EventDetails, An as EventDetailsRow, cn as Faq, it as Fieldset, vt as FileUpload, Yn as FilterBar, Xn as FilterMenu, br as FloatingActions, $t as FlowDiagram, at as FormField, G as Grid, L as HoverCard, R as HoverCardContent, z as HoverCardTrigger, t as Icon, u as IconButton, Kt as IconCard, Tt as IconTile, or as InlineAddForm, ct as Input, Tr as InsightCard, pr as IntegrationCard, er as KodffeAttribution, Wn as LineChart, Fr as ListPage, nr as LocaleSwitch, s as Logo, Ur as MarketingLayout, r as Mascot, gr as MasterDetail, Ir as MasterDetailPage, Ae as Menubar, je as MenubarCheckboxItem, Me as MenubarContent, Ne as MenubarGroup, Pe as MenubarItem, Fe as MenubarLabel, Ie as MenubarMenu, Le as MenubarRadioGroup, Re as MenubarRadioItem, ze as MenubarSeparator, Be as MenubarSub, Ve as MenubarSubContent, He as MenubarSubTrigger, Ue as MenubarTrigger, qt as MetricCard, p as Modal, m as ModalClose, h as ModalContent, g as ModalTrigger, dt as NativeSelect, _n as NewsletterForm, Sr as Note, O as NotificationCenter, bt as OtpInput, Gn as PageHeader, ln as PageHero, Q as Pagination, sr as PasswordInput, rr as PermissionMatrix, Jt as PersonCard, Er as PersonHoverCard, St as PhoneInput, Yt as PlanCard, M as Popover, N as PopoverAnchor, P as PopoverClose, F as PopoverContent, I as PopoverTrigger, vr as PrevNextNav, un as PricingTable, dn as ProcessSteps, Xt as ProductCard, tr as ProductLogo, hr as ProfileHeader, Lr as ProfilePage, V as Progress, kr as PromptSuggestions, fn as ProofBar, Cr as Prose, Ar as QuickPanel, ht as RadioGroup, Nn as RankedList, Rr as ReportPage, pn as Section, Kn as SectionHeader, Pn as SegmentedBar, Sn as SegmentedControl, ft as Select, Fn as SensitiveProvider, In as SensitiveToggle, Ln as SensitiveValue, qn as SettingsList, zr as SettingsPage, Jn as SettingsRow, tt as SideNav, mn as SignOff, hn as SiteFooter, rt as SiteHeader, E as Skeleton, _t as Slider, en as Sparkline, o as Spinner, K as Stack, Rt as StatGrid, Rn as StatusLegend, wr as StepCarousel, ee as StepDots, te as Stepper, gt as Switch, yr as TableOfContents, q as Tabs, J as TabsContent, Y as TabsList, X as TabsTrigger, tn as Tag, cr as TagInput, gn as Testimonial, lt as Textarea, lr as TimeRangeInput, nn as Timeline, w as Toaster, A as Tooltip, j as TooltipProvider, ur as WEEKDAYS, dr as WeekdayPicker, fr as WeeklySchedule, Qn as WorkspaceSwitcher, Cn as calendarDates, e as cx, $e as filterCommands, yt as formatBytes, k as formatRelative, n as iconNames, Dn as itemColor, c as logoVariants, i as mascotLyingStates, a as mascotStandingStates, $ as paginationRange, Ct as toE164, C as toast, et as useAppShell, ut as useFieldProps, ot as useFormField, S as useMediaQuery };
@@ -0,0 +1,122 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type InputProps } from './input';
3
+ export interface PasswordInputProps extends Omit<InputProps, 'type' | 'suffix' | 'iconEnd'> {
4
+ labels?: {
5
+ show?: string;
6
+ hide?: string;
7
+ };
8
+ }
9
+ /** Password field with a show/hide toggle. Set `autoComplete` ("current-password" or "new-password"). */
10
+ export declare function PasswordInput({ labels, ...rest }: PasswordInputProps): import("react").JSX.Element;
11
+ export interface TimeRange {
12
+ from: string;
13
+ to: string;
14
+ }
15
+ export interface TimeRangeInputProps {
16
+ value: TimeRange;
17
+ onChange: (value: TimeRange) => void;
18
+ /** Shows a remove button (one shift out of several). */
19
+ onRemove?: () => void;
20
+ /** Names the pair for screen readers ("Monday, shift 1"). */
21
+ label: string;
22
+ disabled?: boolean;
23
+ /** Accept ranges that end the next day (night shifts). */
24
+ allowOvernight?: boolean;
25
+ labels?: {
26
+ from?: string;
27
+ to?: string;
28
+ remove?: string;
29
+ };
30
+ className?: string;
31
+ }
32
+ /** Two time fields "from – to", with an optional remove button (shifts, opening hours). */
33
+ export declare function TimeRangeInput({ value, onChange, onRemove, label, disabled, allowOvernight, labels, className, }: TimeRangeInputProps): import("react").JSX.Element;
34
+ export interface Weekday {
35
+ value: string;
36
+ /** Short label on the chip ("Mon"). */
37
+ short: string;
38
+ /** Full name for screen readers ("Monday"). */
39
+ label: string;
40
+ }
41
+ export declare const WEEKDAYS: Weekday[];
42
+ export interface WeekdayPickerProps {
43
+ value: string[];
44
+ onChange: (value: string[]) => void;
45
+ /** Pass translated days, or a week that starts on Sunday. */
46
+ days?: Weekday[];
47
+ 'aria-label'?: string;
48
+ 'aria-labelledby'?: string;
49
+ disabled?: boolean;
50
+ className?: string;
51
+ }
52
+ /** Seven toggle chips (Mon … Sun) for working days and recurring schedules. */
53
+ export declare function WeekdayPicker({ value, onChange, days, disabled, className, ...aria }: WeekdayPickerProps): import("react").JSX.Element;
54
+ export type WeeklyScheduleValue = Record<string, {
55
+ open: boolean;
56
+ shifts: TimeRange[];
57
+ }>;
58
+ export interface WeeklyScheduleProps {
59
+ value: WeeklyScheduleValue;
60
+ onChange: (value: WeeklyScheduleValue) => void;
61
+ days?: Weekday[];
62
+ /** New shifts start with this range. */
63
+ defaultShift?: TimeRange;
64
+ labels?: {
65
+ addShift?: string;
66
+ closed?: string;
67
+ shift?: string;
68
+ open?: string;
69
+ };
70
+ className?: string;
71
+ }
72
+ /** Opening hours or staff shifts: one row per day with a switch, one or more time ranges and "+ Add shift". */
73
+ export declare function WeeklySchedule({ value, onChange, days, defaultShift, labels, className, }: WeeklyScheduleProps): import("react").JSX.Element;
74
+ export interface ColorOption {
75
+ value: string;
76
+ label: string;
77
+ }
78
+ export declare const CATEGORY_COLORS: ColorOption[];
79
+ export interface ColorPickerProps {
80
+ value: string;
81
+ onChange: (value: string) => void;
82
+ /** Defaults to the 12 category colors. */
83
+ colors?: ColorOption[];
84
+ /** An "inherit" option first ("Client color"); its value is `inherit`. */
85
+ inheritLabel?: string;
86
+ /** Allow any color with the system picker (+). */
87
+ allowCustom?: boolean;
88
+ 'aria-label'?: string;
89
+ 'aria-labelledby'?: string;
90
+ labels?: {
91
+ custom?: string;
92
+ };
93
+ className?: string;
94
+ }
95
+ /** Swatches from the category palette, an optional "inherit" option and a custom color (projects, tags, calendars). */
96
+ export declare function ColorPicker({ value, onChange, colors, inheritLabel, allowCustom, labels, className, ...aria }: ColorPickerProps): import("react").JSX.Element;
97
+ export interface TagInputProps {
98
+ value: string[];
99
+ onChange: (value: string[]) => void;
100
+ placeholder?: string;
101
+ /** Maximum number of tags. */
102
+ max?: number;
103
+ id?: string;
104
+ disabled?: boolean;
105
+ labels?: {
106
+ remove?: string;
107
+ };
108
+ className?: string;
109
+ }
110
+ /** Free text turned into chips with Enter, comma or a pasted list; Backspace on an empty field removes the last one. */
111
+ export declare function TagInput({ value, onChange, placeholder, max, labels, className, ...props }: TagInputProps): import("react").JSX.Element;
112
+ export interface InlineAddFormProps {
113
+ /** Labelled fields with `name`s (`FormField` + `Input`/`Select`). */
114
+ children: ReactNode;
115
+ /** Gets the form's data; the form resets and focus returns to the first field. */
116
+ onAdd: (data: FormData) => void;
117
+ addLabel?: string;
118
+ 'aria-label'?: string;
119
+ className?: string;
120
+ }
121
+ /** A compact row of fields with "Add" that appends to the list below (departments, locations, rules). */
122
+ export declare function InlineAddForm({ children, onAdd, addLabel, className, ...aria }: InlineAddFormProps): import("react").JSX.Element;
@@ -0,0 +1,351 @@
1
+ "use client";
2
+ import { cx as e } from "../lib/cx.js";
3
+ import { Icon as t } from "../icon/icon.js";
4
+ import { Button as n, IconButton as r } from "../button/button.js";
5
+ import { Glyph as i } from "../lib/glyphs.js";
6
+ import { Input as a, useFieldProps as o } from "./input.js";
7
+ import { selectOnArrow as s } from "../lib/select-on-arrow.js";
8
+ import { CellSwitch as c } from "../data-table/cells.js";
9
+ import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
10
+ import { useId as f, useRef as p, useState as m } from "react";
11
+ import * as h from "@radix-ui/react-radio-group";
12
+ //#region src/input/extra-inputs.tsx
13
+ function g({ labels: e = {}, ...n }) {
14
+ let [r, i] = m(!1);
15
+ return /* @__PURE__ */ u(a, {
16
+ ...n,
17
+ type: r ? "text" : "password",
18
+ spellCheck: !1,
19
+ suffix: /* @__PURE__ */ u("button", {
20
+ type: "button",
21
+ "aria-pressed": r,
22
+ "aria-label": e.show ?? "Show password",
23
+ onClick: () => i((e) => !e),
24
+ className: "-mr-1.5 grid size-8 cursor-pointer place-items-center rounded-full border-0 bg-transparent text-fg-muted hover:bg-surface-muted hover:text-fg focus-visible:outline-2 focus-visible:outline-focus",
25
+ children: /* @__PURE__ */ u(t, {
26
+ name: r ? "eye-off" : "eye",
27
+ size: 18
28
+ })
29
+ })
30
+ });
31
+ }
32
+ function _({ value: t, onChange: n, onRemove: i, label: o, disabled: s, allowOvernight: c, labels: l = {}, className: f }) {
33
+ let p = !!(t.from && t.to && (c ? t.to === t.from : t.to <= t.from));
34
+ return /* @__PURE__ */ d("div", {
35
+ role: "group",
36
+ "aria-label": o,
37
+ className: e("flex flex-wrap items-center gap-2", f),
38
+ children: [
39
+ /* @__PURE__ */ u(a, {
40
+ type: "time",
41
+ size: "sm",
42
+ className: "max-w-36",
43
+ "aria-label": l.from ?? "From",
44
+ value: t.from,
45
+ disabled: s,
46
+ onChange: (e) => n({
47
+ ...t,
48
+ from: e.target.value
49
+ })
50
+ }),
51
+ /* @__PURE__ */ u("span", {
52
+ "aria-hidden": "true",
53
+ className: "text-fg-muted",
54
+ children: "–"
55
+ }),
56
+ /* @__PURE__ */ u(a, {
57
+ type: "time",
58
+ size: "sm",
59
+ className: "max-w-36",
60
+ "aria-label": l.to ?? "To",
61
+ value: t.to,
62
+ disabled: s,
63
+ invalid: p,
64
+ onChange: (e) => n({
65
+ ...t,
66
+ to: e.target.value
67
+ })
68
+ }),
69
+ i && /* @__PURE__ */ u(r, {
70
+ icon: "trash",
71
+ label: `${l.remove ?? "Remove"} ${o}`,
72
+ size: "sm",
73
+ variant: "ghost",
74
+ onClick: i,
75
+ disabled: s
76
+ })
77
+ ]
78
+ });
79
+ }
80
+ var v = [
81
+ {
82
+ value: "mon",
83
+ short: "Mon",
84
+ label: "Monday"
85
+ },
86
+ {
87
+ value: "tue",
88
+ short: "Tue",
89
+ label: "Tuesday"
90
+ },
91
+ {
92
+ value: "wed",
93
+ short: "Wed",
94
+ label: "Wednesday"
95
+ },
96
+ {
97
+ value: "thu",
98
+ short: "Thu",
99
+ label: "Thursday"
100
+ },
101
+ {
102
+ value: "fri",
103
+ short: "Fri",
104
+ label: "Friday"
105
+ },
106
+ {
107
+ value: "sat",
108
+ short: "Sat",
109
+ label: "Saturday"
110
+ },
111
+ {
112
+ value: "sun",
113
+ short: "Sun",
114
+ label: "Sunday"
115
+ }
116
+ ];
117
+ function y({ value: t, onChange: n, days: r = v, disabled: i, className: a, ...o }) {
118
+ return /* @__PURE__ */ u("div", {
119
+ role: "group",
120
+ ...o,
121
+ className: e("flex flex-wrap gap-1.5 font-sans", a),
122
+ children: r.map((r) => {
123
+ let a = t.includes(r.value);
124
+ return /* @__PURE__ */ d("button", {
125
+ type: "button",
126
+ "aria-pressed": a,
127
+ disabled: i,
128
+ onClick: () => n(a ? t.filter((e) => e !== r.value) : [...t, r.value]),
129
+ className: e("h-9 min-w-12 cursor-pointer rounded-full border px-3 text-sm font-semibold transition-colors pointer-coarse:h-11", "focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus disabled:cursor-not-allowed disabled:opacity-50", a ? "border-primary bg-primary text-on-primary" : "border-border bg-surface text-fg hover:border-fg-muted/50"),
130
+ children: [/* @__PURE__ */ u("span", {
131
+ "aria-hidden": "true",
132
+ children: r.short
133
+ }), /* @__PURE__ */ u("span", {
134
+ className: "sr-only",
135
+ children: r.label
136
+ })]
137
+ }, r.value);
138
+ })
139
+ });
140
+ }
141
+ function b({ value: t, onChange: r, days: i = v, defaultShift: a = {
142
+ from: "09:00",
143
+ to: "17:00"
144
+ }, labels: o = {}, className: s }) {
145
+ let f = (e, n) => r({
146
+ ...t,
147
+ [e]: n
148
+ });
149
+ return /* @__PURE__ */ u("div", {
150
+ className: e("divide-y divide-border font-sans", s),
151
+ children: i.map((e) => {
152
+ let r = t[e.value] ?? {
153
+ open: !1,
154
+ shifts: []
155
+ };
156
+ return /* @__PURE__ */ d("div", {
157
+ className: "flex flex-wrap items-start gap-x-4 gap-y-2 py-3 first:pt-0 last:pb-0",
158
+ children: [/* @__PURE__ */ d("div", {
159
+ className: "flex w-36 shrink-0 items-center gap-3 pt-1",
160
+ children: [/* @__PURE__ */ u(c, {
161
+ checked: r.open,
162
+ onCheckedChange: (t) => f(e.value, {
163
+ open: t,
164
+ shifts: t && !r.shifts.length ? [a] : r.shifts
165
+ }),
166
+ label: `${e.label} ${o.open ?? "open"}`
167
+ }), /* @__PURE__ */ u("span", {
168
+ className: "text-sm font-semibold text-fg",
169
+ children: e.label
170
+ })]
171
+ }), /* @__PURE__ */ u("div", {
172
+ className: "grid min-w-0 flex-1 gap-2",
173
+ children: r.open ? /* @__PURE__ */ d(l, { children: [r.shifts.map((t, n) => /* @__PURE__ */ u(_, {
174
+ label: `${e.label}, ${o.shift ?? "shift"} ${n + 1}`,
175
+ value: t,
176
+ onChange: (t) => f(e.value, {
177
+ ...r,
178
+ shifts: r.shifts.map((e, r) => r === n ? t : e)
179
+ }),
180
+ onRemove: r.shifts.length > 1 ? () => f(e.value, {
181
+ ...r,
182
+ shifts: r.shifts.filter((e, t) => t !== n)
183
+ }) : void 0
184
+ }, n)), /* @__PURE__ */ u(n, {
185
+ type: "button",
186
+ size: "sm",
187
+ variant: "ghost",
188
+ iconStart: "add",
189
+ className: "w-fit",
190
+ onClick: () => f(e.value, {
191
+ ...r,
192
+ shifts: [...r.shifts, a]
193
+ }),
194
+ children: o.addShift ?? "Add shift"
195
+ })] }) : /* @__PURE__ */ u("span", {
196
+ className: "pt-1.5 text-sm text-fg-muted",
197
+ children: o.closed ?? "Closed"
198
+ })
199
+ })]
200
+ }, e.value);
201
+ })
202
+ });
203
+ }
204
+ var x = [
205
+ "Indigo",
206
+ "Teal",
207
+ "Blue",
208
+ "Violet",
209
+ "Pink",
210
+ "Red",
211
+ "Orange",
212
+ "Amber",
213
+ "Olive",
214
+ "Green",
215
+ "Cyan",
216
+ "Slate"
217
+ ].map((e, t) => ({
218
+ value: `var(--kf-category-${t + 1})`,
219
+ label: e
220
+ }));
221
+ function S({ value: t, onChange: n, colors: r = x, inheritLabel: a, allowCustom: o, labels: c = {}, className: l, ...f }) {
222
+ let m = !r.some((e) => e.value === t) && t !== "inherit" ? t : void 0, g = p(null), _ = "relative grid size-8 cursor-pointer place-items-center rounded-full border-0 text-white focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus pointer-coarse:size-10 data-[state=checked]:ring-2 data-[state=checked]:ring-fg data-[state=checked]:ring-offset-2 data-[state=checked]:ring-offset-bg";
223
+ return /* @__PURE__ */ d("div", {
224
+ className: e("flex flex-wrap items-center gap-2", l),
225
+ children: [/* @__PURE__ */ d(h.Root, {
226
+ ...f,
227
+ value: m ? "custom" : t,
228
+ onValueChange: (e) => e !== "custom" && n(e),
229
+ onKeyDown: s,
230
+ className: "flex flex-wrap gap-2",
231
+ children: [
232
+ a && /* @__PURE__ */ u(h.Item, {
233
+ value: "inherit",
234
+ "aria-label": a,
235
+ title: a,
236
+ className: e(_, "border-2 border-dashed border-fg-muted/60 bg-surface text-fg-muted"),
237
+ children: /* @__PURE__ */ u(i, {
238
+ name: "minus",
239
+ size: 14
240
+ })
241
+ }),
242
+ r.map((e) => /* @__PURE__ */ u(h.Item, {
243
+ value: e.value,
244
+ "aria-label": e.label,
245
+ title: e.label,
246
+ className: _,
247
+ style: { background: e.value },
248
+ children: /* @__PURE__ */ u(h.Indicator, { children: /* @__PURE__ */ u(i, {
249
+ name: "check",
250
+ size: 14,
251
+ strokeWidth: 3
252
+ }) })
253
+ }, e.value)),
254
+ m && /* @__PURE__ */ u(h.Item, {
255
+ value: "custom",
256
+ "aria-label": `${c.custom ?? "Custom color"} ${m}`,
257
+ className: _,
258
+ style: { background: m },
259
+ children: /* @__PURE__ */ u(h.Indicator, { children: /* @__PURE__ */ u(i, {
260
+ name: "check",
261
+ size: 14,
262
+ strokeWidth: 3
263
+ }) })
264
+ })
265
+ ]
266
+ }), o && /* @__PURE__ */ d("label", {
267
+ className: e(_, "border-2 border-dashed border-fg-muted/60 bg-surface text-fg-muted has-[:focus-visible]:outline-3 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-focus"),
268
+ children: [
269
+ /* @__PURE__ */ u(i, {
270
+ name: "plus",
271
+ size: 16
272
+ }),
273
+ /* @__PURE__ */ u("span", {
274
+ className: "sr-only",
275
+ children: c.custom ?? "Custom color"
276
+ }),
277
+ /* @__PURE__ */ u("input", {
278
+ ref: g,
279
+ type: "color",
280
+ className: "sr-only",
281
+ value: m?.startsWith("#") ? m : "#4b5bb8",
282
+ onChange: (e) => n(e.target.value)
283
+ })
284
+ ]
285
+ })]
286
+ });
287
+ }
288
+ function C({ value: t, onChange: n, placeholder: r, max: a, labels: s = {}, className: c, ...l }) {
289
+ let { invalid: f, ...p } = o(l), [h, g] = m(""), _ = (e) => {
290
+ let r = new Set(t.map((e) => e.toLowerCase())), i = e.split(/[,\n]/).map((e) => e.trim()).filter((e) => {
291
+ let t = e.toLowerCase();
292
+ return !e || r.has(t) ? !1 : (r.add(t), !0);
293
+ });
294
+ i.length && (n([...t, ...i].slice(0, a ?? Infinity)), g(""));
295
+ }, v = (e) => {
296
+ (e.key === "Enter" || e.key === ",") && h.trim() ? (e.preventDefault(), _(h)) : e.key === "Backspace" && !h && t.length && n(t.slice(0, -1));
297
+ }, y = a !== void 0 && t.length >= a;
298
+ return /* @__PURE__ */ d("div", {
299
+ className: e("flex min-h-11 w-full flex-wrap items-center gap-1.5 rounded-sm border bg-bg px-2 py-1.5 font-sans transition-[border-color,box-shadow]", f ? "border-danger-border" : "border-border hover:border-fg-muted/50", "focus-within:border-primary focus-within:shadow-[0_0_0_3px_color-mix(in_oklab,var(--color-focus),transparent_70%)]", c),
300
+ children: [t.map((e) => /* @__PURE__ */ d("span", {
301
+ className: "inline-flex items-center gap-1 rounded-full bg-info-surface py-0.5 pr-1 pl-2.5 text-sm font-semibold text-info-fg",
302
+ children: [e, /* @__PURE__ */ u("button", {
303
+ type: "button",
304
+ "aria-label": `${s.remove ?? "Remove"} ${e}`,
305
+ onClick: () => n(t.filter((t) => t !== e)),
306
+ className: "grid size-5 cursor-pointer place-items-center rounded-full border-0 bg-transparent text-current hover:bg-bg focus-visible:outline-2 focus-visible:outline-focus",
307
+ children: /* @__PURE__ */ u(i, {
308
+ name: "close",
309
+ size: 10
310
+ })
311
+ })]
312
+ }, e)), /* @__PURE__ */ u("input", {
313
+ ...p,
314
+ value: h,
315
+ disabled: p.disabled,
316
+ readOnly: y,
317
+ placeholder: t.length ? void 0 : r,
318
+ onChange: (e) => g(e.target.value),
319
+ onKeyDown: v,
320
+ onBlur: () => h.trim() && _(h),
321
+ onPaste: (e) => {
322
+ let t = e.clipboardData.getData("text");
323
+ /[,\n]/.test(t) && (e.preventDefault(), _(t));
324
+ },
325
+ className: "min-w-24 flex-1 border-0 bg-transparent px-1 py-1 text-base text-fg outline-none placeholder:text-fg-muted/80 sm:text-[15px]"
326
+ })]
327
+ });
328
+ }
329
+ function w({ children: t, onAdd: r, addLabel: i = "Add", className: a, ...o }) {
330
+ let s = f(), c = (e) => {
331
+ e.preventDefault();
332
+ let t = e.currentTarget;
333
+ r(new FormData(t)), t.reset(), t.querySelector("input, select, textarea, button[role=\"combobox\"]")?.focus();
334
+ };
335
+ return /* @__PURE__ */ d("form", {
336
+ id: s,
337
+ ...o,
338
+ onSubmit: c,
339
+ className: e("flex flex-wrap items-end gap-3 font-sans *:min-w-[min(100%,12rem)] *:flex-1", a),
340
+ children: [t, /* @__PURE__ */ u(n, {
341
+ type: "submit",
342
+ iconStart: "add",
343
+ className: "flex-none!",
344
+ children: i
345
+ })]
346
+ });
347
+ }
348
+ //#endregion
349
+ export { x as CATEGORY_COLORS, S as ColorPicker, w as InlineAddForm, g as PasswordInput, C as TagInput, _ as TimeRangeInput, v as WEEKDAYS, y as WeekdayPicker, b as WeeklySchedule };
350
+
351
+ //# sourceMappingURL=extra-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extra-inputs.js","names":["_Fragment","RadixRadio","PasswordInput","rest","visible","setVisible","useState","Input","labels","v","Icon","TimeRangeInput","invalid","value","allowOvernight","label","cx","className","onChange","onRemove","IconButton","WEEKDAYS","WeekdayPicker","aria","days","on","d","WeeklySchedule","update","day","next","CellSwitch","open","defaultShift","Fragment","i","s","j","r","x","Button","CATEGORY_COLORS","ColorPicker","custom","colors","c","customRef","useRef","swatch","selectOnArrow","inheritLabel","Glyph","allowCustom","TagInput","props","field","useFieldProps","draft","setDraft","add","seen","raw","t","key","max","onKeyDown","full","placeholder","text","InlineAddForm","id","useId","submit","form","onAdd","children","addLabel"],"sources":["../../src/input/extra-inputs.tsx"],"sourcesContent":["'use client';\n\nimport * as RadixRadio from '@radix-ui/react-radio-group';\nimport { useId, useRef, useState, type FormEvent, type KeyboardEvent, type ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { Glyph } from '../lib/glyphs';\nimport { Icon } from '../icon/icon';\nimport { Button, IconButton } from '../button/button';\nimport { CellSwitch } from '../data-table/cells';\nimport { selectOnArrow } from '../lib/select-on-arrow';\nimport { Input, useFieldProps, type InputProps } from './input';\n\n/* ---------------- PasswordInput ---------------- */\n\nexport interface PasswordInputProps extends Omit<InputProps, 'type' | 'suffix' | 'iconEnd'> {\n labels?: { show?: string; hide?: string };\n}\n\n/** Password field with a show/hide toggle. Set `autoComplete` (\"current-password\" or \"new-password\"). */\nexport function PasswordInput({ labels = {}, ...rest }: PasswordInputProps) {\n const [visible, setVisible] = useState(false);\n return (\n <Input\n {...rest}\n type={visible ? 'text' : 'password'}\n spellCheck={false}\n suffix={\n <button\n type=\"button\"\n aria-pressed={visible}\n aria-label={labels.show ?? 'Show password'}\n onClick={() => setVisible((v) => !v)}\n className=\"-mr-1.5 grid size-8 cursor-pointer place-items-center rounded-full border-0 bg-transparent text-fg-muted hover:bg-surface-muted hover:text-fg focus-visible:outline-2 focus-visible:outline-focus\"\n >\n <Icon name={visible ? 'eye-off' : 'eye'} size={18} />\n </button>\n }\n />\n );\n}\n\n/* ---------------- TimeRangeInput ---------------- */\n\nexport interface TimeRange {\n from: string;\n to: string;\n}\n\nexport interface TimeRangeInputProps {\n value: TimeRange;\n onChange: (value: TimeRange) => void;\n /** Shows a remove button (one shift out of several). */\n onRemove?: () => void;\n /** Names the pair for screen readers (\"Monday, shift 1\"). */\n label: string;\n disabled?: boolean;\n /** Accept ranges that end the next day (night shifts). */\n allowOvernight?: boolean;\n labels?: { from?: string; to?: string; remove?: string };\n className?: string;\n}\n\n/** Two time fields \"from – to\", with an optional remove button (shifts, opening hours). */\nexport function TimeRangeInput({\n value,\n onChange,\n onRemove,\n label,\n disabled,\n allowOvernight,\n labels = {},\n className,\n}: TimeRangeInputProps) {\n // Overnight ranges (22:00 – 06:00) are valid with `allowOvernight`; an empty range never is.\n const invalid = Boolean(value.from && value.to && (allowOvernight ? value.to === value.from : value.to <= value.from));\n return (\n <div role=\"group\" aria-label={label} className={cx('flex flex-wrap items-center gap-2', className)}>\n <Input\n type=\"time\"\n size=\"sm\"\n className=\"max-w-36\"\n aria-label={labels.from ?? 'From'}\n value={value.from}\n disabled={disabled}\n onChange={(e) => onChange({ ...value, from: e.target.value })}\n />\n <span aria-hidden=\"true\" className=\"text-fg-muted\">\n –\n </span>\n <Input\n type=\"time\"\n size=\"sm\"\n className=\"max-w-36\"\n aria-label={labels.to ?? 'To'}\n value={value.to}\n disabled={disabled}\n invalid={invalid}\n onChange={(e) => onChange({ ...value, to: e.target.value })}\n />\n {onRemove && (\n <IconButton\n icon=\"trash\"\n label={`${labels.remove ?? 'Remove'} ${label}`}\n size=\"sm\"\n variant=\"ghost\"\n onClick={onRemove}\n disabled={disabled}\n />\n )}\n </div>\n );\n}\n\n/* ---------------- WeekdayPicker ---------------- */\n\nexport interface Weekday {\n value: string;\n /** Short label on the chip (\"Mon\"). */\n short: string;\n /** Full name for screen readers (\"Monday\"). */\n label: string;\n}\n\nexport const WEEKDAYS: Weekday[] = [\n { value: 'mon', short: 'Mon', label: 'Monday' },\n { value: 'tue', short: 'Tue', label: 'Tuesday' },\n { value: 'wed', short: 'Wed', label: 'Wednesday' },\n { value: 'thu', short: 'Thu', label: 'Thursday' },\n { value: 'fri', short: 'Fri', label: 'Friday' },\n { value: 'sat', short: 'Sat', label: 'Saturday' },\n { value: 'sun', short: 'Sun', label: 'Sunday' },\n];\n\nexport interface WeekdayPickerProps {\n value: string[];\n onChange: (value: string[]) => void;\n /** Pass translated days, or a week that starts on Sunday. */\n days?: Weekday[];\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/** Seven toggle chips (Mon … Sun) for working days and recurring schedules. */\nexport function WeekdayPicker({ value, onChange, days = WEEKDAYS, disabled, className, ...aria }: WeekdayPickerProps) {\n return (\n <div role=\"group\" {...aria} className={cx('flex flex-wrap gap-1.5 font-sans', className)}>\n {days.map((d) => {\n const on = value.includes(d.value);\n return (\n <button\n key={d.value}\n type=\"button\"\n aria-pressed={on}\n disabled={disabled}\n onClick={() => onChange(on ? value.filter((v) => v !== d.value) : [...value, d.value])}\n className={cx(\n 'h-9 min-w-12 cursor-pointer rounded-full border px-3 text-sm font-semibold transition-colors pointer-coarse:h-11',\n 'focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus disabled:cursor-not-allowed disabled:opacity-50',\n on\n ? 'border-primary bg-primary text-on-primary'\n : 'border-border bg-surface text-fg hover:border-fg-muted/50',\n )}\n >\n <span aria-hidden=\"true\">{d.short}</span>\n <span className=\"sr-only\">{d.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n/* ---------------- WeeklySchedule ---------------- */\n\nexport type WeeklyScheduleValue = Record<string, { open: boolean; shifts: TimeRange[] }>;\n\nexport interface WeeklyScheduleProps {\n value: WeeklyScheduleValue;\n onChange: (value: WeeklyScheduleValue) => void;\n days?: Weekday[];\n /** New shifts start with this range. */\n defaultShift?: TimeRange;\n labels?: { addShift?: string; closed?: string; shift?: string; open?: string };\n className?: string;\n}\n\n/** Opening hours or staff shifts: one row per day with a switch, one or more time ranges and \"+ Add shift\". */\nexport function WeeklySchedule({\n value,\n onChange,\n days = WEEKDAYS,\n defaultShift = { from: '09:00', to: '17:00' },\n labels = {},\n className,\n}: WeeklyScheduleProps) {\n const update = (day: string, next: { open: boolean; shifts: TimeRange[] }) => onChange({ ...value, [day]: next });\n return (\n <div className={cx('divide-y divide-border font-sans', className)}>\n {days.map((d) => {\n const v = value[d.value] ?? { open: false, shifts: [] };\n return (\n <div key={d.value} className=\"flex flex-wrap items-start gap-x-4 gap-y-2 py-3 first:pt-0 last:pb-0\">\n <div className=\"flex w-36 shrink-0 items-center gap-3 pt-1\">\n <CellSwitch\n checked={v.open}\n onCheckedChange={(open) =>\n update(d.value, { open, shifts: open && !v.shifts.length ? [defaultShift] : v.shifts })\n }\n label={`${d.label} ${labels.open ?? 'open'}`}\n />\n <span className=\"text-sm font-semibold text-fg\">{d.label}</span>\n </div>\n <div className=\"grid min-w-0 flex-1 gap-2\">\n {v.open ? (\n <>\n {v.shifts.map((s, i) => (\n <TimeRangeInput\n key={i}\n label={`${d.label}, ${labels.shift ?? 'shift'} ${i + 1}`}\n value={s}\n onChange={(r) => update(d.value, { ...v, shifts: v.shifts.map((x, j) => (j === i ? r : x)) })}\n onRemove={\n v.shifts.length > 1\n ? () => update(d.value, { ...v, shifts: v.shifts.filter((_, j) => j !== i) })\n : undefined\n }\n />\n ))}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n iconStart=\"add\"\n className=\"w-fit\"\n onClick={() => update(d.value, { ...v, shifts: [...v.shifts, defaultShift] })}\n >\n {labels.addShift ?? 'Add shift'}\n </Button>\n </>\n ) : (\n <span className=\"pt-1.5 text-sm text-fg-muted\">{labels.closed ?? 'Closed'}</span>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/* ---------------- ColorPicker ---------------- */\n\nexport interface ColorOption {\n value: string;\n label: string;\n}\n\nexport const CATEGORY_COLORS: ColorOption[] = [\n 'Indigo',\n 'Teal',\n 'Blue',\n 'Violet',\n 'Pink',\n 'Red',\n 'Orange',\n 'Amber',\n 'Olive',\n 'Green',\n 'Cyan',\n 'Slate',\n].map((label, i) => ({ value: `var(--kf-category-${i + 1})`, label }));\n\nexport interface ColorPickerProps {\n value: string;\n onChange: (value: string) => void;\n /** Defaults to the 12 category colors. */\n colors?: ColorOption[];\n /** An \"inherit\" option first (\"Client color\"); its value is `inherit`. */\n inheritLabel?: string;\n /** Allow any color with the system picker (+). */\n allowCustom?: boolean;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n labels?: { custom?: string };\n className?: string;\n}\n\n/** Swatches from the category palette, an optional \"inherit\" option and a custom color (projects, tags, calendars). */\nexport function ColorPicker({\n value,\n onChange,\n colors = CATEGORY_COLORS,\n inheritLabel,\n allowCustom,\n labels = {},\n className,\n ...aria\n}: ColorPickerProps) {\n const custom = !colors.some((c) => c.value === value) && value !== 'inherit' ? value : undefined;\n const customRef = useRef<HTMLInputElement>(null);\n const swatch =\n 'relative grid size-8 cursor-pointer place-items-center rounded-full border-0 text-white focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus pointer-coarse:size-10 ' +\n 'data-[state=checked]:ring-2 data-[state=checked]:ring-fg data-[state=checked]:ring-offset-2 data-[state=checked]:ring-offset-bg';\n return (\n <div className={cx('flex flex-wrap items-center gap-2', className)}>\n <RadixRadio.Root\n {...aria}\n value={custom ? 'custom' : value}\n onValueChange={(v) => v !== 'custom' && onChange(v)}\n onKeyDown={selectOnArrow}\n className=\"flex flex-wrap gap-2\"\n >\n {inheritLabel && (\n <RadixRadio.Item\n value=\"inherit\"\n aria-label={inheritLabel}\n title={inheritLabel}\n className={cx(swatch, 'border-2 border-dashed border-fg-muted/60 bg-surface text-fg-muted')}\n >\n <Glyph name=\"minus\" size={14} />\n </RadixRadio.Item>\n )}\n {colors.map((c) => (\n <RadixRadio.Item\n key={c.value}\n value={c.value}\n aria-label={c.label}\n title={c.label}\n className={swatch}\n style={{ background: c.value }}\n >\n <RadixRadio.Indicator>\n <Glyph name=\"check\" size={14} strokeWidth={3} />\n </RadixRadio.Indicator>\n </RadixRadio.Item>\n ))}\n {custom && (\n <RadixRadio.Item\n value=\"custom\"\n aria-label={`${labels.custom ?? 'Custom color'} ${custom}`}\n className={swatch}\n style={{ background: custom }}\n >\n <RadixRadio.Indicator>\n <Glyph name=\"check\" size={14} strokeWidth={3} />\n </RadixRadio.Indicator>\n </RadixRadio.Item>\n )}\n </RadixRadio.Root>\n {allowCustom && (\n <label\n className={cx(\n swatch,\n 'border-2 border-dashed border-fg-muted/60 bg-surface text-fg-muted has-[:focus-visible]:outline-3 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-focus',\n )}\n >\n <Glyph name=\"plus\" size={16} />\n <span className=\"sr-only\">{labels.custom ?? 'Custom color'}</span>\n <input\n ref={customRef}\n type=\"color\"\n className=\"sr-only\"\n value={custom?.startsWith('#') ? custom : '#4b5bb8'}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n )}\n </div>\n );\n}\n\n/* ---------------- TagInput ---------------- */\n\nexport interface TagInputProps {\n value: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n /** Maximum number of tags. */\n max?: number;\n id?: string;\n disabled?: boolean;\n labels?: { remove?: string };\n className?: string;\n}\n\n/** Free text turned into chips with Enter, comma or a pasted list; Backspace on an empty field removes the last one. */\nexport function TagInput({ value, onChange, placeholder, max, labels = {}, className, ...props }: TagInputProps) {\n const { invalid, ...field } = useFieldProps(props);\n const [draft, setDraft] = useState('');\n const add = (raw: string) => {\n const seen = new Set(value.map((v) => v.toLowerCase()));\n const next = raw\n .split(/[,\\n]/)\n .map((t) => t.trim())\n .filter((t) => {\n // De-duplicate against the current tags and within the pasted list (case-insensitive).\n const key = t.toLowerCase();\n if (!t || seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n if (!next.length) return;\n onChange([...value, ...next].slice(0, max ?? Infinity));\n setDraft('');\n };\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if ((e.key === 'Enter' || e.key === ',') && draft.trim()) {\n e.preventDefault();\n add(draft);\n } else if (e.key === 'Backspace' && !draft && value.length) {\n onChange(value.slice(0, -1));\n }\n };\n const full = max !== undefined && value.length >= max;\n return (\n <div\n className={cx(\n 'flex min-h-11 w-full flex-wrap items-center gap-1.5 rounded-sm border bg-bg px-2 py-1.5 font-sans transition-[border-color,box-shadow]',\n invalid ? 'border-danger-border' : 'border-border hover:border-fg-muted/50',\n 'focus-within:border-primary focus-within:shadow-[0_0_0_3px_color-mix(in_oklab,var(--color-focus),transparent_70%)]',\n className,\n )}\n >\n {value.map((t) => (\n <span\n key={t}\n className=\"inline-flex items-center gap-1 rounded-full bg-info-surface py-0.5 pr-1 pl-2.5 text-sm font-semibold text-info-fg\"\n >\n {t}\n <button\n type=\"button\"\n aria-label={`${labels.remove ?? 'Remove'} ${t}`}\n onClick={() => onChange(value.filter((v) => v !== t))}\n className=\"grid size-5 cursor-pointer place-items-center rounded-full border-0 bg-transparent text-current hover:bg-bg focus-visible:outline-2 focus-visible:outline-focus\"\n >\n <Glyph name=\"close\" size={10} />\n </button>\n </span>\n ))}\n <input\n {...field}\n value={draft}\n disabled={field.disabled}\n // Read-only (not disabled) when full, so focus stays in the field after adding the last tag.\n readOnly={full}\n placeholder={value.length ? undefined : placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={() => draft.trim() && add(draft)}\n onPaste={(e) => {\n const text = e.clipboardData.getData('text');\n if (/[,\\n]/.test(text)) {\n e.preventDefault();\n add(text);\n }\n }}\n className=\"min-w-24 flex-1 border-0 bg-transparent px-1 py-1 text-base text-fg outline-none placeholder:text-fg-muted/80 sm:text-[15px]\"\n />\n </div>\n );\n}\n\n/* ---------------- InlineAddForm ---------------- */\n\nexport interface InlineAddFormProps {\n /** Labelled fields with `name`s (`FormField` + `Input`/`Select`). */\n children: ReactNode;\n /** Gets the form's data; the form resets and focus returns to the first field. */\n onAdd: (data: FormData) => void;\n addLabel?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\n/** A compact row of fields with \"Add\" that appends to the list below (departments, locations, rules). */\nexport function InlineAddForm({ children, onAdd, addLabel = 'Add', className, ...aria }: InlineAddFormProps) {\n const id = useId();\n const submit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const form = e.currentTarget;\n onAdd(new FormData(form));\n form.reset();\n form.querySelector<HTMLElement>('input, select, textarea, button[role=\"combobox\"]')?.focus();\n };\n return (\n <form\n id={id}\n {...aria}\n onSubmit={submit}\n className={cx('flex flex-wrap items-end gap-3 font-sans *:min-w-[min(100%,12rem)] *:flex-1', className)}\n >\n {children}\n <Button type=\"submit\" iconStart=\"add\" className=\"flex-none!\">\n {addLabel}\n </Button>\n </form>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type ControlSize = 'sm' | 'md' | 'lg';
2
+ /** Heights: 36 / 44 / 52px. Text is 16px below `sm` so iOS does not zoom on focus. */
3
+ export declare const CONTROL_SIZES: Record<ControlSize, string>;
4
+ /** Shared look for text-like controls (Input wrapper, Textarea, Select trigger, Combobox). */
5
+ export declare function controlClasses(size: ControlSize, invalid?: boolean, extra?: string): string;