@exsto/ds 0.0.1-rc.16 → 0.0.1-rc.18

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 (53) hide show
  1. package/README.md +38 -0
  2. package/dist/ds/src/file-input.d.ts +9 -0
  3. package/dist/ds/src/time-field.d.ts +9 -0
  4. package/dist/file-input.js +2 -0
  5. package/dist/index.js +4 -3
  6. package/dist/source-hash.txt +1 -1
  7. package/dist/styles.css +176 -38
  8. package/dist/time-field.js +2 -0
  9. package/dist/ui/src/components/edyn/file-input/file-input.d.ts +90 -0
  10. package/dist/ui/src/components/edyn/file-input/file-input.js +261 -0
  11. package/dist/ui/src/components/edyn/file-input/file-input.js.map +1 -0
  12. package/dist/ui/src/components/edyn/file-input/file-input.test.d.ts +8 -0
  13. package/dist/ui/src/components/edyn/file-input/index.d.ts +1 -0
  14. package/dist/ui/src/components/edyn/multi-select/multi-select.d.ts +12 -1
  15. package/dist/ui/src/components/edyn/multi-select/multi-select.js +11 -7
  16. package/dist/ui/src/components/edyn/multi-select/multi-select.js.map +1 -1
  17. package/dist/ui/src/components/edyn/presence/presence.d.ts +1 -1
  18. package/dist/ui/src/components/edyn/presence/presence.js +5 -1
  19. package/dist/ui/src/components/edyn/presence/presence.js.map +1 -1
  20. package/dist/ui/src/components/edyn/time-field/index.d.ts +1 -0
  21. package/dist/ui/src/components/edyn/time-field/time-field.d.ts +85 -0
  22. package/dist/ui/src/components/edyn/time-field/time-field.js +330 -0
  23. package/dist/ui/src/components/edyn/time-field/time-field.js.map +1 -0
  24. package/dist/ui/src/components/edyn/time-field/time-field.test.d.ts +8 -0
  25. package/dist/ui/src/components/ui/calendar/calendar.behavior.test.d.ts +9 -0
  26. package/dist/ui/src/components/ui/calendar/calendar.d.ts +1 -1
  27. package/dist/ui/src/components/ui/calendar/calendar.js +33 -2
  28. package/dist/ui/src/components/ui/calendar/calendar.js.map +1 -1
  29. package/dist/ui/src/components/ui/combobox/combobox.d.ts +10 -0
  30. package/dist/ui/src/components/ui/combobox/combobox.js +37 -5
  31. package/dist/ui/src/components/ui/combobox/combobox.js.map +1 -1
  32. package/dist/ui/src/components/ui/context-menu/context-menu.d.ts +1 -1
  33. package/dist/ui/src/components/ui/context-menu/context-menu.js +23 -10
  34. package/dist/ui/src/components/ui/context-menu/context-menu.js.map +1 -1
  35. package/dist/ui/src/components/ui/dropdown-menu/dropdown-menu.js +5 -4
  36. package/dist/ui/src/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
  37. package/dist/ui/src/components/ui/menubar/menubar.js +1 -1
  38. package/dist/ui/src/components/ui/menubar/menubar.js.map +1 -1
  39. package/dist/ui/src/components/ui/scroll-area/scroll-area.js +1 -1
  40. package/dist/ui/src/components/ui/scroll-area/scroll-area.js.map +1 -1
  41. package/dist/ui/src/components/ui/select/select.js +7 -6
  42. package/dist/ui/src/components/ui/select/select.js.map +1 -1
  43. package/dist/ui/src/components/ui/sheet/sheet.d.ts +8 -0
  44. package/dist/ui/src/components/ui/sheet/sheet.js +11 -3
  45. package/dist/ui/src/components/ui/sheet/sheet.js.map +1 -1
  46. package/dist/ui/src/components/ui/table/table.d.ts +9 -2
  47. package/dist/ui/src/components/ui/table/table.js +19 -6
  48. package/dist/ui/src/components/ui/table/table.js.map +1 -1
  49. package/dist/ui/src/index.d.ts +1 -0
  50. package/dist/ui/src/lib/popup-list.d.ts +29 -4
  51. package/dist/ui/src/lib/popup-list.js +30 -5
  52. package/dist/ui/src/lib/popup-list.js.map +1 -1
  53. package/package.json +9 -1
package/README.md CHANGED
@@ -81,6 +81,8 @@ query, so a subtree can be dark inside a light page.
81
81
  |---|---|
82
82
  | `@exsto/ds` | React components |
83
83
  | `@exsto/ds/date-picker` | The DatePicker (one day, typed or picked), on its own entry so the main one stays inside its size budget |
84
+ | `@exsto/ds/time-field` | The TimeField (a time of day typed in segments), on its own entry for the same reason |
85
+ | `@exsto/ds/file-input` | The FileInput (files picked or dropped, listed and removable), on its own entry for the same reason |
84
86
  | `@exsto/ds/rich-text-editor` | The rich-text editor, on its own entry so its engine loads only where it is used |
85
87
  | `@exsto/ds/styles.css` | Precompiled tokens and component styles |
86
88
  | `@exsto/ds/theme.css` | Uncompiled tokens, brand layer, and the Tailwind `@theme` mapping |
@@ -152,6 +154,42 @@ const missing = state.kind === 'empty'; // 'refused' is already said by the pick
152
154
 
153
155
  Refused text is reported each time it changes, also when the field held no day before, and emptying the field afterwards reports `empty`. A parent's `aria-invalid` only draws the invalid border; the picker's own message is added to `aria-describedby` once, after the parent's. `DateRangePicker`, for a range, is in the main entry.
154
156
 
157
+ ## Time
158
+
159
+ `TimeField` is a time of day typed in segments (hours, minutes, optional seconds, AM/PM where the locale uses it), with ArrowUp and ArrowDown to step a segment, ArrowLeft and ArrowRight to move between them, and the names a screen reader needs for each. It is on its own entry, like the DatePicker. The value is an `HH:mm` (or `HH:mm:ss`) string in 24-hour form, whatever the hour cycle on screen.
160
+
161
+ ```tsx
162
+ import { TimeField } from '@exsto/ds/time-field';
163
+
164
+ <TimeField aria-label="Start time" value={time} onValueChange={setTime} />;
165
+ ```
166
+
167
+ ## Files
168
+
169
+ `FileInput` chooses files by picking or dropping them. A real `<input type="file">` lies under the drop area, so Tab, Enter and Space, the system's file dialog, a drop and a screen reader's name come from the browser; on top of that it lists the chosen files with their sizes and a remove button named after each, checks them against `accept`, `maxSize` and `maxFiles` (a drop skips the dialog's own filter), and says in one live region what was added, removed or refused. It is on its own entry, like the DatePicker.
170
+
171
+ ```tsx
172
+ import { FileInput } from '@exsto/ds/file-input';
173
+
174
+ <FileInput aria-label="Attachments" multiple accept=".pdf,image/*" maxSize={5 * 1024 * 1024} value={files} onValueChange={setFiles} onReject={(rejected) => report(rejected)} />;
175
+ ```
176
+
177
+ ## Open popups and keyboard audits
178
+
179
+ While a menu, dialog, sheet, popover, select or drawer is open, Base UI puts two empty `<span tabindex="0" data-base-ui-focus-guard>` around it. They are the sentinels that hand focus back into the popup when Tab runs past either end, so they are focusable on purpose, and they always were. From `0.0.1-rc.16` the design system also takes their `aria-hidden` off while the popup is open, because a focusable element that is hidden from assistive technology fails axe's `aria-hidden-focus` (WCAG 4.1.2). A check that walks the Tab order should skip `[data-base-ui-focus-guard]`, as it skips any other sentinel: they hold no text and name nothing.
180
+
181
+ ## Composing a popup of your own
182
+
183
+ Select, Combobox, MultiSelect and the menus share one shape, and the pieces are exported so a popup an app builds itself matches them instead of copying their classes:
184
+
185
+ ```tsx
186
+ import { cn, POPUP_FRAME_CLASS, POPUP_LIST_HEIGHT_CLASS, POPUP_LIST_WIDTH_CLASS, popupItemClass } from '@exsto/ds';
187
+ ```
188
+
189
+ - `popupItemClass(flavor?, checkable?)` is one row: 32px tall, 8px of padding, the highlight and the chosen weight. `'base-ui'` (the default) is for Base UI parts, `'cmdk'` for cmdk's; `checkable` leaves room at the end for the check, which sits at `POPUP_ITEM_INDICATOR_CLASS`.
190
+ - `POPUP_GROUP_LABEL_CLASS` is a group's heading. `ComboboxGroup`, `ComboboxLabel`, `ComboboxCollection` and `ComboboxSeparator` give a Combobox its groups, drawn the same way Select draws its own.
191
+ - `POPUP_FRAME_CLASS` is the frame (a 10px radius and a 1px ring, no border). `POPUP_LIST_WIDTH_CLASS` is its width: at least the control and 8rem, as wide as the longest row, 28rem at most. `POPUP_LIST_HEIGHT_CLASS` caps the scrolling part: eight rows, or as many whole rows as the room allows, so a list never ends on half a row. Put it on a `ScrollArea` that holds the list's own `p-1`, inside a popup that is a flex column with `max-h-(--available-height)`.
192
+
155
193
  ## Status
156
194
 
157
195
  Release candidates (`0.0.1-rc.N`). The API is not stable yet; treat minor versions
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `@exsto/ds/file-input` - the FileInput, on its own entry on purpose.
3
+ *
4
+ * A file field that is a real `<input type="file">` under a drop area, with the list of what was chosen, the checks against
5
+ * `accept`, `maxSize` and `maxFiles`, and a live region that says what was added, removed or refused: about 10 KB unminified.
6
+ * Re-exported from `@exsto/ds` it would be one more thing in the entry every consumer loads and a bundler cannot always tell
7
+ * it unused. Here an app pays for it only on the pages that import this path.
8
+ */
9
+ export * from '../../ui/src/components/edyn/file-input';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `@exsto/ds/time-field` - the TimeField, on its own entry on purpose.
3
+ *
4
+ * A time of day typed in segments (hours, minutes, optional seconds, AM/PM where the locale uses it) with the arrow keys,
5
+ * Tab and the screen-reader names a native time input has: about 11 KB unminified. Re-exported from `@exsto/ds` it would be
6
+ * one more thing in the entry every consumer loads and a bundler cannot always tell it unused. Here an app pays for it only on
7
+ * the pages that import this path.
8
+ */
9
+ export * from '../../ui/src/components/edyn/time-field';
@@ -0,0 +1,2 @@
1
+ import { DEFAULT_FILE_INPUT_LABELS, FileInput, formatBytes, matchesAccept, sortFiles } from "./ui/src/components/edyn/file-input/file-input.js";
2
+ export { DEFAULT_FILE_INPUT_LABELS, FileInput, formatBytes, matchesAccept, sortFiles };
package/dist/index.js CHANGED
@@ -13,7 +13,8 @@ import { AVATAR_TONES, InitialsAvatar, avatarTone, initialsOf } from "./ui/src/c
13
13
  import { useMergedRefs } from "./ui/src/hooks/use-merged-refs.js";
14
14
  import { ScrollArea, ScrollBar } from "./ui/src/components/ui/scroll-area/scroll-area.js";
15
15
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/src/components/ui/tooltip/tooltip.js";
16
- import { DEFAULT_MULTI_SELECT_LABELS, MultiSelect, VIRTUALIZE_FROM, fullSelection, resolveChosen, summarize } from "./ui/src/components/edyn/multi-select/multi-select.js";
16
+ import { POPUP_FRAME_CLASS, POPUP_GROUP_LABEL_CLASS, POPUP_ITEM_INDICATOR_CLASS, POPUP_LIST_HEIGHT_CLASS, POPUP_LIST_WIDTH_CLASS, popupItemClass } from "./ui/src/lib/popup-list.js";
17
+ import { DEFAULT_MULTI_SELECT_LABELS, MultiSelect, SEARCH_FROM, VIRTUALIZE_FROM, fullSelection, resolveChosen, summarize } from "./ui/src/components/edyn/multi-select/multi-select.js";
17
18
  import { DEFAULT_PRESENCE_LABELS, PRESENCE_STATES, Presence } from "./ui/src/components/edyn/presence/presence.js";
18
19
  import { PROGRESS_LINE_COLOR, ProgressLine } from "./ui/src/components/edyn/progress-line/progress-line.js";
19
20
  import { RICH_TEXT_ATTRIBUTES, RICH_TEXT_ELEMENTS, RICH_TEXT_LINK_PROTOCOLS, isAllowedRichTextHref } from "./ui/src/components/edyn/rich-text-content/allow-list.js";
@@ -33,7 +34,7 @@ import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious
33
34
  import { ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent } from "./ui/src/components/ui/chart/chart.js";
34
35
  import { Checkbox } from "./ui/src/components/ui/checkbox/checkbox.js";
35
36
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./ui/src/components/ui/collapsible/collapsible.js";
36
- import { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem } from "./ui/src/components/ui/combobox/combobox.js";
37
+ import { Combobox, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxSeparator } from "./ui/src/components/ui/combobox/combobox.js";
37
38
  import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from "./ui/src/components/ui/dialog/dialog.js";
38
39
  import { Input } from "./ui/src/components/ui/input/input.js";
39
40
  import { Textarea } from "./ui/src/components/ui/textarea/textarea.js";
@@ -74,4 +75,4 @@ import { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants } from "./ui
74
75
  import { Toast, ToastAction, ToastClose, ToastContent, ToastDescription, ToastPortal, ToastProvider, ToastTitle, ToastViewport, Toaster, createToastManager, toast, useToastManager } from "./ui/src/components/ui/toast/toast.js";
75
76
  import { Toggle, toggleVariants } from "./ui/src/components/ui/toggle/toggle.js";
76
77
  import { ToggleGroup, ToggleGroupItem } from "./ui/src/components/ui/toggle-group/toggle-group.js";
77
- export { AVATAR_TONES, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AnimatedNumber, AspectRatio, Attachment, AttachmentAction, AttachmentActions, AttachmentContent, AttachmentDescription, AttachmentGroup, AttachmentMedia, AttachmentTitle, AttachmentTrigger, AudioPlayer, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Bubble, BubbleContent, BubbleGroup, BubbleReactions, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DEFAULT_MULTI_SELECT_LABELS, DEFAULT_PRESENCE_LABELS, DateRangePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectionProvider, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldDescription, FieldError, FieldLabel, HoverCard, HoverCardContent, HoverCardTrigger, Indicator, InitialsAvatar, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, Marker, MarkerContent, MarkerIcon, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Message, MessageAvatar, MessageContent, MessageFooter, MessageGroup, MessageHeader, MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, MultiSelect, NativeSelect, NativeSelectOptGroup, NativeSelectOption, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuPositioner, NavigationMenuTrigger, NumberText, PRESENCE_STATES, PROGRESS_DURATION, PROGRESS_EASE, PROGRESS_LINE_COLOR, Pagination, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Presence, Progress, ProgressLine, Questionnaire, QuestionnaireActions, QuestionnaireChoice, QuestionnaireChoiceDescription, QuestionnaireChoices, QuestionnaireDescription, QuestionnaireError, QuestionnaireInput, QuestionnaireItem, QuestionnaireNext, QuestionnairePrevious, QuestionnaireProgress, QuestionnaireSkip, QuestionnaireSubmit, QuestionnaireTitle, RICH_TEXT_ATTRIBUTES, RICH_TEXT_BODY_CLASS, RICH_TEXT_ELEMENTS, RICH_TEXT_LINK_PROTOCOLS, RICH_TEXT_MENTION_CLASS, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, RichTextContent, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toast, ToastAction, ToastClose, ToastContent, ToastDescription, ToastPortal, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, VIRTUALIZE_FROM, VideoPlayer, avatarTone, badgeVariants, buttonVariants, clampPage, cn, createToastManager, dateToDay, dayToDate, formatCount, formatMediaTime, fullSelection, getPaginationRange, indicatorVariants, initialsOf, isAllowedRichTextHref, markerVariants, navigationMenuTriggerStyle, progressFill, progressTrack, resolveChosen, richTextToNodes, spinnerVariants, summarize, tabsListVariants, toast, toggleVariants, useAnimatedValues, useCarousel, useDirection, useIsMobile, useMediaPlayer, useMergedRefs, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, useSidebar, useToastManager };
78
+ export { AVATAR_TONES, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AnimatedNumber, AspectRatio, Attachment, AttachmentAction, AttachmentActions, AttachmentContent, AttachmentDescription, AttachmentGroup, AttachmentMedia, AttachmentTitle, AttachmentTrigger, AudioPlayer, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Bubble, BubbleContent, BubbleGroup, BubbleReactions, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxSeparator, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DEFAULT_MULTI_SELECT_LABELS, DEFAULT_PRESENCE_LABELS, DateRangePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectionProvider, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldDescription, FieldError, FieldLabel, HoverCard, HoverCardContent, HoverCardTrigger, Indicator, InitialsAvatar, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, Marker, MarkerContent, MarkerIcon, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Message, MessageAvatar, MessageContent, MessageFooter, MessageGroup, MessageHeader, MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, MultiSelect, NativeSelect, NativeSelectOptGroup, NativeSelectOption, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuPositioner, NavigationMenuTrigger, NumberText, POPUP_FRAME_CLASS, POPUP_GROUP_LABEL_CLASS, POPUP_ITEM_INDICATOR_CLASS, POPUP_LIST_HEIGHT_CLASS, POPUP_LIST_WIDTH_CLASS, PRESENCE_STATES, PROGRESS_DURATION, PROGRESS_EASE, PROGRESS_LINE_COLOR, Pagination, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Presence, Progress, ProgressLine, Questionnaire, QuestionnaireActions, QuestionnaireChoice, QuestionnaireChoiceDescription, QuestionnaireChoices, QuestionnaireDescription, QuestionnaireError, QuestionnaireInput, QuestionnaireItem, QuestionnaireNext, QuestionnairePrevious, QuestionnaireProgress, QuestionnaireSkip, QuestionnaireSubmit, QuestionnaireTitle, RICH_TEXT_ATTRIBUTES, RICH_TEXT_BODY_CLASS, RICH_TEXT_ELEMENTS, RICH_TEXT_LINK_PROTOCOLS, RICH_TEXT_MENTION_CLASS, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, RichTextContent, SEARCH_FROM, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toast, ToastAction, ToastClose, ToastContent, ToastDescription, ToastPortal, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, VIRTUALIZE_FROM, VideoPlayer, avatarTone, badgeVariants, buttonVariants, clampPage, cn, createToastManager, dateToDay, dayToDate, formatCount, formatMediaTime, fullSelection, getPaginationRange, indicatorVariants, initialsOf, isAllowedRichTextHref, markerVariants, navigationMenuTriggerStyle, popupItemClass, progressFill, progressTrack, resolveChosen, richTextToNodes, spinnerVariants, summarize, tabsListVariants, toast, toggleVariants, useAnimatedValues, useCarousel, useDirection, useIsMobile, useMediaPlayer, useMergedRefs, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, useSidebar, useToastManager };
@@ -1 +1 @@
1
- e02db65d6034fdeb69accb2fd27d311f2f426b050ddf45dcc35078a5659e9466
1
+ e7f64dd8a5e900b4cc6189554ed97571e1a11bc66a714ebfa14d32bfe3bae156
package/dist/styles.css CHANGED
@@ -1128,6 +1128,10 @@
1128
1128
  max-height: calc(var(--spacing) * 88);
1129
1129
  }
1130
1130
 
1131
+ .max-h-\[min\(16\.5rem\,round\(down\,var\(--available-height\,100dvh\)_-_0\.5rem\,2rem\)_\+_0\.5rem\)\] {
1132
+ max-height: min(16.5rem, round(down, var(--available-height, 100dvh) - .5rem, 2rem) + .5rem);
1133
+ }
1134
+
1131
1135
  .max-h-inherit {
1132
1136
  max-height: inherit;
1133
1137
  }
@@ -1220,6 +1224,10 @@
1220
1224
  width: calc(var(--spacing) * 5);
1221
1225
  }
1222
1226
 
1227
+ .w-7 {
1228
+ width: calc(var(--spacing) * 7);
1229
+ }
1230
+
1223
1231
  .w-10 {
1224
1232
  width: calc(var(--spacing) * 10);
1225
1233
  }
@@ -1280,10 +1288,6 @@
1280
1288
  max-width: calc(100% - 2rem);
1281
1289
  }
1282
1290
 
1283
- .max-w-\[max\(24rem\,var\(--anchor-width\)\)\] {
1284
- max-width: max(24rem, var(--anchor-width));
1285
- }
1286
-
1287
1291
  .max-w-\[max\(var\(--anchor-width\)\,min\(28rem\,var\(--available-width\)\)\)\] {
1288
1292
  max-width: max(var(--anchor-width), min(28rem, var(--available-width)));
1289
1293
  }
@@ -1304,10 +1308,6 @@
1304
1308
  max-width: var(--container-xs);
1305
1309
  }
1306
1310
 
1307
- .min-w-\(--anchor-width\) {
1308
- min-width: var(--anchor-width);
1309
- }
1310
-
1311
1311
  .min-w-\(--cell-size\) {
1312
1312
  min-width: var(--cell-size);
1313
1313
  }
@@ -1332,10 +1332,6 @@
1332
1332
  min-width: calc(var(--spacing) * 32);
1333
1333
  }
1334
1334
 
1335
- .min-w-36 {
1336
- min-width: calc(var(--spacing) * 36);
1337
- }
1338
-
1339
1335
  .min-w-40 {
1340
1336
  min-width: calc(var(--spacing) * 40);
1341
1337
  }
@@ -1348,12 +1344,8 @@
1348
1344
  min-width: 14ch;
1349
1345
  }
1350
1346
 
1351
- .min-w-\[96px\] {
1352
- min-width: 96px;
1353
- }
1354
-
1355
- .min-w-\[var\(--anchor-width\)\] {
1356
- min-width: var(--anchor-width);
1347
+ .min-w-\[max\(8rem\,var\(--anchor-width\)\)\] {
1348
+ min-width: max(8rem, var(--anchor-width));
1357
1349
  }
1358
1350
 
1359
1351
  .flex-1 {
@@ -1567,6 +1559,10 @@
1567
1559
  cursor: default;
1568
1560
  }
1569
1561
 
1562
+ .cursor-not-allowed {
1563
+ cursor: not-allowed;
1564
+ }
1565
+
1570
1566
  .cursor-pointer {
1571
1567
  cursor: pointer;
1572
1568
  }
@@ -1799,6 +1795,10 @@
1799
1795
  overflow-x: hidden !important;
1800
1796
  }
1801
1797
 
1798
+ .overflow-x-visible {
1799
+ overflow-x: visible;
1800
+ }
1801
+
1802
1802
  .overflow-y-auto {
1803
1803
  overflow-y: auto;
1804
1804
  }
@@ -1984,6 +1984,10 @@
1984
1984
  }
1985
1985
  }
1986
1986
 
1987
+ .border-destructive {
1988
+ border-color: var(--destructive);
1989
+ }
1990
+
1987
1991
  .border-input {
1988
1992
  border-color: var(--input);
1989
1993
  }
@@ -2377,10 +2381,6 @@
2377
2381
  padding-bottom: calc(var(--spacing) * 4);
2378
2382
  }
2379
2383
 
2380
- .pl-1\.5 {
2381
- padding-left: calc(var(--spacing) * 1.5);
2382
- }
2383
-
2384
2384
  .pl-2 {
2385
2385
  padding-left: calc(var(--spacing) * 2);
2386
2386
  }
@@ -2619,6 +2619,11 @@
2619
2619
  font-style: italic;
2620
2620
  }
2621
2621
 
2622
+ .ordinal {
2623
+ --tw-ordinal: ordinal;
2624
+ font-variant-numeric: var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, );
2625
+ }
2626
+
2622
2627
  .tabular-nums {
2623
2628
  --tw-numeric-spacing: tabular-nums;
2624
2629
  font-variant-numeric: var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, );
@@ -2628,10 +2633,18 @@
2628
2633
  text-decoration-line: underline;
2629
2634
  }
2630
2635
 
2636
+ .underline-offset-3 {
2637
+ text-underline-offset: 3px;
2638
+ }
2639
+
2631
2640
  .underline-offset-4 {
2632
2641
  text-underline-offset: 4px;
2633
2642
  }
2634
2643
 
2644
+ .caret-transparent {
2645
+ caret-color: #0000;
2646
+ }
2647
+
2635
2648
  .opacity-0 {
2636
2649
  opacity: 0;
2637
2650
  }
@@ -2716,6 +2729,16 @@
2716
2729
  --tw-ring-color: var(--card);
2717
2730
  }
2718
2731
 
2732
+ .ring-destructive\/20 {
2733
+ --tw-ring-color: var(--destructive);
2734
+ }
2735
+
2736
+ @supports (color: color-mix(in lab, red, red)) {
2737
+ .ring-destructive\/20 {
2738
+ --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);
2739
+ }
2740
+ }
2741
+
2719
2742
  .ring-foreground\/10 {
2720
2743
  --tw-ring-color: var(--foreground);
2721
2744
  }
@@ -3050,6 +3073,10 @@
3050
3073
  grid-column-start: 2;
3051
3074
  }
3052
3075
 
3076
+ .group-data-highlighted\:text-foreground:is(:where(.group)[data-highlighted] *) {
3077
+ color: var(--foreground);
3078
+ }
3079
+
3053
3080
  .group-data-indeterminate\/checkbox-indicator\:block:is(:where(.group\/checkbox-indicator)[data-indeterminate] *) {
3054
3081
  display: block;
3055
3082
  }
@@ -3556,6 +3583,14 @@
3556
3583
  background-color: var(--primary);
3557
3584
  }
3558
3585
 
3586
+ .selection\:bg-transparent ::selection {
3587
+ background-color: #0000;
3588
+ }
3589
+
3590
+ .selection\:bg-transparent::selection {
3591
+ background-color: #0000;
3592
+ }
3593
+
3559
3594
  .selection\:text-primary-foreground ::selection {
3560
3595
  color: var(--primary-foreground);
3561
3596
  }
@@ -3761,6 +3796,12 @@
3761
3796
  translate: var(--tw-translate-x) var(--tw-translate-y);
3762
3797
  }
3763
3798
 
3799
+ .after\:-translate-x-1\/3:after {
3800
+ content: var(--tw-content);
3801
+ --tw-translate-x: calc(calc(1 / 3 * 100%) * -1);
3802
+ translate: var(--tw-translate-x) var(--tw-translate-y);
3803
+ }
3804
+
3764
3805
  .after\:-translate-y-1\/2:after {
3765
3806
  content: var(--tw-content);
3766
3807
  --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
@@ -3778,11 +3819,33 @@
3778
3819
  border-width: 1px;
3779
3820
  }
3780
3821
 
3822
+ .after\:border-y-3:after {
3823
+ content: var(--tw-content);
3824
+ border-block-style: var(--tw-border-style);
3825
+ border-block-width: 3px;
3826
+ }
3827
+
3828
+ .after\:border-l-5:after {
3829
+ content: var(--tw-content);
3830
+ border-left-style: var(--tw-border-style);
3831
+ border-left-width: 5px;
3832
+ }
3833
+
3781
3834
  .after\:border-border:after {
3782
3835
  content: var(--tw-content);
3783
3836
  border-color: var(--border);
3784
3837
  }
3785
3838
 
3839
+ .after\:border-y-transparent:after {
3840
+ content: var(--tw-content);
3841
+ border-block-color: #0000;
3842
+ }
3843
+
3844
+ .after\:border-l-background:after {
3845
+ content: var(--tw-content);
3846
+ border-left-color: var(--background);
3847
+ }
3848
+
3786
3849
  .after\:bg-background:after {
3787
3850
  content: var(--tw-content);
3788
3851
  background-color: var(--background);
@@ -3875,6 +3938,10 @@
3875
3938
  border-bottom-right-radius: var(--radius);
3876
3939
  }
3877
3940
 
3941
+ .empty\:hidden:empty {
3942
+ display: none;
3943
+ }
3944
+
3878
3945
  .empty\:p-0:empty {
3879
3946
  padding: 0;
3880
3947
  }
@@ -3928,6 +3995,16 @@
3928
3995
  }
3929
3996
  }
3930
3997
 
3998
+ .hover\:bg-foreground\/4:hover {
3999
+ background-color: var(--foreground);
4000
+ }
4001
+
4002
+ @supports (color: color-mix(in lab, red, red)) {
4003
+ .hover\:bg-foreground\/4:hover {
4004
+ background-color: color-mix(in oklab, var(--foreground) 4%, transparent);
4005
+ }
4006
+ }
4007
+
3931
4008
  .hover\:bg-foreground\/6:hover {
3932
4009
  background-color: var(--foreground);
3933
4010
  }
@@ -4015,6 +4092,16 @@
4015
4092
  background-color: var(--accent);
4016
4093
  }
4017
4094
 
4095
+ .focus\:bg-foreground\/10:focus {
4096
+ background-color: var(--foreground);
4097
+ }
4098
+
4099
+ @supports (color: color-mix(in lab, red, red)) {
4100
+ .focus\:bg-foreground\/10:focus {
4101
+ background-color: color-mix(in oklab, var(--foreground) 10%, transparent);
4102
+ }
4103
+ }
4104
+
4018
4105
  .focus\:bg-muted:focus {
4019
4106
  background-color: var(--muted);
4020
4107
  }
@@ -4444,6 +4531,25 @@
4444
4531
  padding: 0;
4445
4532
  }
4446
4533
 
4534
+ .has-\[input\:focus-visible\]\:border-ring:has(:is(input:focus-visible)) {
4535
+ border-color: var(--ring);
4536
+ }
4537
+
4538
+ .has-\[input\:focus-visible\]\:ring-3:has(:is(input:focus-visible)) {
4539
+ --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
4540
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4541
+ }
4542
+
4543
+ .has-\[input\:focus-visible\]\:ring-ring\/50:has(:is(input:focus-visible)) {
4544
+ --tw-ring-color: var(--ring);
4545
+ }
4546
+
4547
+ @supports (color: color-mix(in lab, red, red)) {
4548
+ .has-\[input\:focus-visible\]\:ring-ring\/50:has(:is(input:focus-visible)) {
4549
+ --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);
4550
+ }
4551
+ }
4552
+
4447
4553
  .has-\[select\:disabled\]\:opacity-50:has(:is(select:disabled)) {
4448
4554
  opacity: .5;
4449
4555
  }
@@ -4682,6 +4788,20 @@
4682
4788
  opacity: 0;
4683
4789
  }
4684
4790
 
4791
+ .data-dragging\:border-ring[data-dragging] {
4792
+ border-color: var(--ring);
4793
+ }
4794
+
4795
+ .data-dragging\:bg-foreground\/6[data-dragging] {
4796
+ background-color: var(--foreground);
4797
+ }
4798
+
4799
+ @supports (color: color-mix(in lab, red, red)) {
4800
+ .data-dragging\:bg-foreground\/6[data-dragging] {
4801
+ background-color: color-mix(in oklab, var(--foreground) 6%, transparent);
4802
+ }
4803
+ }
4804
+
4685
4805
  .data-ending-style\:scale-90[data-ending-style] {
4686
4806
  --tw-scale-x: 90%;
4687
4807
  --tw-scale-y: 90%;
@@ -4710,6 +4830,10 @@
4710
4830
  opacity: 1;
4711
4831
  }
4712
4832
 
4833
+ .data-has-overflow-x\:pb-\(--scroll-bar-reserve\)[data-has-overflow-x] {
4834
+ padding-bottom: var(--scroll-bar-reserve);
4835
+ }
4836
+
4713
4837
  .data-highlighted\:bg-foreground\/6[data-highlighted] {
4714
4838
  background-color: var(--foreground);
4715
4839
  }
@@ -4780,10 +4904,6 @@
4780
4904
  border-color: var(--ring);
4781
4905
  }
4782
4906
 
4783
- .data-popup-open\:bg-accent[data-popup-open] {
4784
- background-color: var(--accent);
4785
- }
4786
-
4787
4907
  .data-popup-open\:bg-foreground\/6[data-popup-open] {
4788
4908
  background-color: var(--foreground);
4789
4909
  }
@@ -4804,10 +4924,6 @@
4804
4924
  }
4805
4925
  }
4806
4926
 
4807
- .data-popup-open\:text-accent-foreground[data-popup-open] {
4808
- color: var(--accent-foreground);
4809
- }
4810
-
4811
4927
  .data-popup-open\:ring-3[data-popup-open] {
4812
4928
  --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
4813
4929
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -5852,6 +5968,16 @@
5852
5968
  translate: var(--tw-translate-x) var(--tw-translate-y);
5853
5969
  }
5854
5970
 
5971
+ .dark\:border-destructive\/50:is(.dark *) {
5972
+ border-color: var(--destructive);
5973
+ }
5974
+
5975
+ @supports (color: color-mix(in lab, red, red)) {
5976
+ .dark\:border-destructive\/50:is(.dark *) {
5977
+ border-color: color-mix(in oklab, var(--destructive) 50%, transparent);
5978
+ }
5979
+ }
5980
+
5855
5981
  .dark\:border-input:is(.dark *) {
5856
5982
  border-color: var(--input);
5857
5983
  }
@@ -5942,6 +6068,16 @@
5942
6068
  color: var(--color-red-300);
5943
6069
  }
5944
6070
 
6071
+ .dark\:ring-destructive\/40:is(.dark *) {
6072
+ --tw-ring-color: var(--destructive);
6073
+ }
6074
+
6075
+ @supports (color: color-mix(in lab, red, red)) {
6076
+ .dark\:ring-destructive\/40:is(.dark *) {
6077
+ --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);
6078
+ }
6079
+ }
6080
+
5945
6081
  .dark\:group-data-checked\/questionnaire-choice\:bg-primary:is(.dark *):is(:is(:where(.group\/questionnaire-choice):where([data-state="checked"]), :where(.group\/questionnaire-choice):where([data-checked]:not([data-checked="false"]))) *) {
5946
6082
  background-color: var(--primary);
5947
6083
  }
@@ -6717,6 +6853,12 @@
6717
6853
  border-bottom-width: 1px;
6718
6854
  }
6719
6855
 
6856
+ @media (hover: hover) {
6857
+ .\[\&_tr\]\:hover\:bg-transparent tr:hover {
6858
+ background-color: #0000;
6859
+ }
6860
+ }
6861
+
6720
6862
  .\[\&_tr\:last-child\]\:border-0 tr:last-child {
6721
6863
  border-style: var(--tw-border-style);
6722
6864
  border-width: 0;
@@ -6958,14 +7100,6 @@
6958
7100
  color: currentColor;
6959
7101
  }
6960
7102
 
6961
- :is(.focus\:\*\:\[svg\]\:text-accent-foreground:focus > *):is(svg) {
6962
- color: var(--accent-foreground);
6963
- }
6964
-
6965
- :is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive[data-variant="destructive"] > *):is(svg) {
6966
- color: var(--destructive);
6967
- }
6968
-
6969
7103
  :is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive\![data-variant="destructive"] > *):is(svg) {
6970
7104
  color: var(--destructive) !important;
6971
7105
  }
@@ -7677,6 +7811,10 @@
7677
7811
  initial-value: 0;
7678
7812
  }
7679
7813
 
7814
+ [data-slot="scroll-area"] {
7815
+ --scroll-bar-reserve: calc(var(--scroll-bar-size) + var(--scroll-bar-gap));
7816
+ }
7817
+
7680
7818
  [data-slot="scroll-area-scrollbar"] {
7681
7819
  --scroll-bar-offset-top: calc(var(--scroll-bar-gap) + var(--scroll-bar-start));
7682
7820
  --scroll-bar-length: calc(100% - var(--scroll-bar-gap) * 2 - var(--scroll-bar-start));
@@ -0,0 +1,2 @@
1
+ import { DEFAULT_TIME_FIELD_LABELS, EMPTY_TIME, TimeField, editSegment, formatTime, localeHourCycle, parseTime, rangeOf, stepValue, typeDigit } from "./ui/src/components/edyn/time-field/time-field.js";
2
+ export { DEFAULT_TIME_FIELD_LABELS, EMPTY_TIME, TimeField, editSegment, formatTime, localeHourCycle, parseTime, rangeOf, stepValue, typeDigit };
@@ -0,0 +1,90 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ export type TFileRejectReason = 'type' | 'size' | 'count';
3
+ export interface IFileRejection {
4
+ file: File;
5
+ reason: TFileRejectReason;
6
+ }
7
+ /** The words a FileInput says and announces. Pass the ones to change. */
8
+ export interface IFileInputLabels {
9
+ /** The prompt in the drop area when it takes one file, before the "browse" link. */
10
+ dropOne: string;
11
+ /** The same, when it takes several. */
12
+ dropMany: string;
13
+ browse: string;
14
+ /** The accessible name of the file chooser itself, when the caller gives it no name of its own. */
15
+ chooseOne: string;
16
+ chooseMany: string;
17
+ /** The accessible name of the list of chosen files. */
18
+ list: string;
19
+ remove: (name: string) => string;
20
+ /** Announced when files are added. */
21
+ added: (count: number) => string;
22
+ /** Announced when a file is taken out. */
23
+ removed: (name: string) => string;
24
+ /** Said, and shown, for a file that was refused. */
25
+ rejection: (name: string, reason: TFileRejectReason, limit: string) => string;
26
+ }
27
+ export declare const DEFAULT_FILE_INPUT_LABELS: IFileInputLabels;
28
+ /** 1,536 bytes as "1.5 KB": the size a person reads next to a file's name. */
29
+ export declare const formatBytes: (bytes: number) => string;
30
+ /** Whether a file is one `accept` allows: an extension (`.pdf`), a type (`application/pdf`) or a family of types (`image/*`). No `accept` allows all. */
31
+ export declare const matchesAccept: (file: {
32
+ name: string;
33
+ type: string;
34
+ }, accept: string | undefined) => boolean;
35
+ export interface ISortFilesInput {
36
+ incoming: readonly File[];
37
+ current: readonly File[];
38
+ multiple: boolean;
39
+ accept?: string;
40
+ maxSize?: number;
41
+ maxFiles?: number;
42
+ }
43
+ /**
44
+ * Which of the files just offered are taken, and which are refused and why. A file already chosen is skipped without a word. With one
45
+ * file allowed, the first acceptable one replaces what was chosen and the rest are refused as too many.
46
+ */
47
+ export declare const sortFiles: ({ incoming, current, multiple, accept, maxSize, maxFiles, }: ISortFilesInput) => {
48
+ accepted: File[];
49
+ rejected: IFileRejection[];
50
+ };
51
+ export interface IFileInputProps extends Omit<ComponentPropsWithoutRef<'div'>, 'defaultValue' | 'onChange' | 'children' | 'id'> {
52
+ /** The chosen files. Leave it out and the field keeps them itself. */
53
+ value?: readonly File[];
54
+ defaultValue?: readonly File[];
55
+ onValueChange?: (files: File[]) => void;
56
+ /** What the picker offers, and what a drop is held to: extensions (`.pdf`), types (`application/pdf`) or families (`image/*`). */
57
+ accept?: string;
58
+ /** Several files, added to each other, instead of one that is replaced. */
59
+ multiple?: boolean;
60
+ /** The most a file may weigh, in bytes. */
61
+ maxSize?: number;
62
+ /** The most files that may be chosen. Several-file fields only. */
63
+ maxFiles?: number;
64
+ /** Called with the files that were refused, each with the reason. They are also listed under the field. */
65
+ onReject?: (rejections: IFileRejection[]) => void;
66
+ disabled?: boolean;
67
+ invalid?: boolean;
68
+ required?: boolean;
69
+ /** Submits the chosen files with a form, under this name. */
70
+ name?: string;
71
+ /** For a `<Label htmlFor>` to name the field. */
72
+ id?: string;
73
+ /** What the field accepts, in words ("PDF or PNG, up to 5 MB"), read with the field. */
74
+ hint?: ReactNode;
75
+ labels?: Partial<IFileInputLabels>;
76
+ 'aria-label'?: string;
77
+ 'aria-labelledby'?: string;
78
+ }
79
+ /**
80
+ * Chooses files by picking them or by dropping them on the field, in the kit's look. It exists so an app does not fall back to
81
+ * `<input type="file">`, which cannot be styled and has no list of what was chosen.
82
+ *
83
+ * The control is a real file input laid over the whole drop area, so Tab, Enter and Space, the system's file dialog, a drop and a
84
+ * screen reader's name for it all come from the browser. What the browser lacks is added around it: the list of chosen files with a
85
+ * button to take each out, the checks against `accept`, `maxSize` and `maxFiles` (a drop skips the dialog's own filter), and a
86
+ * live region that says what was added, removed or refused.
87
+ *
88
+ * Name the field with `aria-label`, `aria-labelledby` or a `<Label htmlFor={id}>`; with none of those it is named "Choose files".
89
+ */
90
+ export declare const FileInput: ({ value, defaultValue, onValueChange, accept, multiple, maxSize, maxFiles, onReject, disabled, invalid, required, name, id, hint, labels: labelOverrides, className, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...rest }: IFileInputProps) => import('react').JSX.Element;