@comitor/ui 2.0.0 → 2.1.0

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 (131) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +14 -6
  3. package/dist/components/ui/action-bar-constants.d.ts +31 -0
  4. package/dist/components/ui/action-bar-constants.js +9 -0
  5. package/dist/components/ui/action-bar-constants.js.map +1 -0
  6. package/dist/components/ui/action-bar.d.ts +67 -0
  7. package/dist/components/ui/action-bar.js +522 -0
  8. package/dist/components/ui/action-bar.js.map +1 -0
  9. package/dist/components/ui/badge-overflow.d.ts +30 -0
  10. package/dist/components/ui/badge-overflow.js +179 -0
  11. package/dist/components/ui/badge-overflow.js.map +1 -0
  12. package/dist/components/ui/banner.d.ts +79 -0
  13. package/dist/components/ui/banner.js +518 -0
  14. package/dist/components/ui/banner.js.map +1 -0
  15. package/dist/components/ui/circular-progress.d.ts +50 -0
  16. package/dist/components/ui/circular-progress.js +266 -0
  17. package/dist/components/ui/circular-progress.js.map +1 -0
  18. package/dist/components/ui/cropper-constants.d.ts +34 -0
  19. package/dist/components/ui/cropper-constants.js +10 -0
  20. package/dist/components/ui/cropper-constants.js.map +1 -0
  21. package/dist/components/ui/cropper.d.ts +106 -0
  22. package/dist/components/ui/cropper.js +1269 -0
  23. package/dist/components/ui/cropper.js.map +1 -0
  24. package/dist/components/ui/drawer.d.ts +1 -1
  25. package/dist/components/ui/drawer.js +2 -2
  26. package/dist/components/ui/drawer.js.map +1 -1
  27. package/dist/components/ui/kanban-constants.d.ts +61 -0
  28. package/dist/components/ui/kanban-constants.js +21 -0
  29. package/dist/components/ui/kanban-constants.js.map +1 -0
  30. package/dist/components/ui/kanban.d.ts +72 -0
  31. package/dist/components/ui/kanban.js +787 -0
  32. package/dist/components/ui/kanban.js.map +1 -0
  33. package/dist/components/ui/key-value-constants.d.ts +33 -0
  34. package/dist/components/ui/key-value-constants.js +11 -0
  35. package/dist/components/ui/key-value-constants.js.map +1 -0
  36. package/dist/components/ui/key-value.d.ts +96 -0
  37. package/dist/components/ui/key-value.js +641 -0
  38. package/dist/components/ui/key-value.js.map +1 -0
  39. package/dist/components/ui/mask-input-constants.d.ts +99 -0
  40. package/dist/components/ui/mask-input-constants.js +601 -0
  41. package/dist/components/ui/mask-input-constants.js.map +1 -0
  42. package/dist/components/ui/mask-input.d.ts +36 -0
  43. package/dist/components/ui/mask-input.js +558 -0
  44. package/dist/components/ui/mask-input.js.map +1 -0
  45. package/dist/components/ui/mention.d.ts +31 -0
  46. package/dist/components/ui/mention.js +128 -0
  47. package/dist/components/ui/mention.js.map +1 -0
  48. package/dist/components/ui/phone-input-constants.d.ts +54 -0
  49. package/dist/components/ui/phone-input-constants.js +9 -0
  50. package/dist/components/ui/phone-input-constants.js.map +1 -0
  51. package/dist/components/ui/phone-input.d.ts +85 -0
  52. package/dist/components/ui/phone-input.js +743 -0
  53. package/dist/components/ui/phone-input.js.map +1 -0
  54. package/dist/components/ui/rating.d.ts +56 -0
  55. package/dist/components/ui/rating.js +646 -0
  56. package/dist/components/ui/rating.js.map +1 -0
  57. package/dist/components/ui/responsive-dialog.d.ts +35 -0
  58. package/dist/components/ui/responsive-dialog.js +193 -0
  59. package/dist/components/ui/responsive-dialog.js.map +1 -0
  60. package/dist/components/ui/scroll-spy.d.ts +42 -0
  61. package/dist/components/ui/scroll-spy.js +334 -0
  62. package/dist/components/ui/scroll-spy.js.map +1 -0
  63. package/dist/components/ui/stepper-constants.d.ts +29 -0
  64. package/dist/components/ui/stepper-constants.js +9 -0
  65. package/dist/components/ui/stepper-constants.js.map +1 -0
  66. package/dist/components/ui/stepper.d.ts +80 -0
  67. package/dist/components/ui/stepper.js +902 -0
  68. package/dist/components/ui/stepper.js.map +1 -0
  69. package/dist/components/ui/tags-input.d.ts +41 -0
  70. package/dist/components/ui/tags-input.js +127 -0
  71. package/dist/components/ui/tags-input.js.map +1 -0
  72. package/dist/components/ui/time-picker-constants.d.ts +48 -0
  73. package/dist/components/ui/time-picker-constants.js +14 -0
  74. package/dist/components/ui/time-picker-constants.js.map +1 -0
  75. package/dist/components/ui/time-picker.d.ts +115 -0
  76. package/dist/components/ui/time-picker.js +1620 -0
  77. package/dist/components/ui/time-picker.js.map +1 -0
  78. package/dist/components/ui/timeline.d.ts +32 -0
  79. package/dist/components/ui/timeline.js +559 -0
  80. package/dist/components/ui/timeline.js.map +1 -0
  81. package/dist/components/ui/tour-constants.d.ts +39 -0
  82. package/dist/components/ui/tour-constants.js +12 -0
  83. package/dist/components/ui/tour-constants.js.map +1 -0
  84. package/dist/components/ui/tour.d.ts +124 -0
  85. package/dist/components/ui/tour.js +1207 -0
  86. package/dist/components/ui/tour.js.map +1 -0
  87. package/dist/data-grid/data-grid-cell-wrapper.js +1 -1
  88. package/dist/data-grid/data-grid-cell-wrapper.js.map +1 -1
  89. package/dist/data-grid/data-grid-context-menu.js +1 -1
  90. package/dist/data-grid/data-grid-context-menu.js.map +1 -1
  91. package/dist/data-grid/data-grid-paste-dialog.js +1 -1
  92. package/dist/data-grid/data-grid-paste-dialog.js.map +1 -1
  93. package/dist/data-grid/data-grid-row.js +1 -1
  94. package/dist/data-grid/data-grid-row.js.map +1 -1
  95. package/dist/data-grid/data-grid-search.js +1 -1
  96. package/dist/data-grid/data-grid-search.js.map +1 -1
  97. package/dist/data-grid/data-grid.js +1 -1
  98. package/dist/data-grid/data-grid.js.map +1 -1
  99. package/dist/data-grid/sortable.js +1 -1
  100. package/dist/data-grid/sortable.js.map +1 -1
  101. package/dist/data-grid/use-data-grid-undo-redo.js +2 -2
  102. package/dist/data-grid/use-data-grid-undo-redo.js.map +1 -1
  103. package/dist/data-grid/use-data-grid.js +3 -3
  104. package/dist/data-grid/use-data-grid.js.map +1 -1
  105. package/dist/index.d.ts +31 -0
  106. package/dist/index.js +42 -0
  107. package/dist/index.js.map +1 -1
  108. package/dist/lib/compose-refs.js.map +1 -0
  109. package/dist/lib/use-as-ref.js.map +1 -0
  110. package/dist/lib/use-is-mobile.d.ts +10 -0
  111. package/dist/lib/use-is-mobile.js +21 -0
  112. package/dist/lib/use-is-mobile.js.map +1 -0
  113. package/dist/lib/use-isomorphic-layout-effect.js.map +1 -0
  114. package/dist/lib/use-lazy-ref.js.map +1 -0
  115. package/dist/lib/visually-hidden-input.d.ts +12 -0
  116. package/dist/lib/visually-hidden-input.js +105 -0
  117. package/dist/lib/visually-hidden-input.js.map +1 -0
  118. package/package.json +5 -1
  119. package/styles.css +19 -0
  120. package/dist/data-grid/compose-refs.js.map +0 -1
  121. package/dist/data-grid/use-as-ref.js.map +0 -1
  122. package/dist/data-grid/use-isomorphic-layout-effect.js.map +0 -1
  123. package/dist/data-grid/use-lazy-ref.js.map +0 -1
  124. /package/dist/{data-grid → lib}/compose-refs.d.ts +0 -0
  125. /package/dist/{data-grid → lib}/compose-refs.js +0 -0
  126. /package/dist/{data-grid → lib}/use-as-ref.d.ts +0 -0
  127. /package/dist/{data-grid → lib}/use-as-ref.js +0 -0
  128. /package/dist/{data-grid → lib}/use-isomorphic-layout-effect.d.ts +0 -0
  129. /package/dist/{data-grid → lib}/use-isomorphic-layout-effect.js +0 -0
  130. /package/dist/{data-grid → lib}/use-lazy-ref.d.ts +0 -0
  131. /package/dist/{data-grid → lib}/use-lazy-ref.js +0 -0
package/dist/index.d.ts CHANGED
@@ -31,11 +31,15 @@ export { DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_TABLE_PAGINATION_LABELS, TablePagina
31
31
  export { getVietnameseInitials, matchesSearch, normalizeVi, removeVietnameseTones, truncate } from './components/composite/text-utils.js';
32
32
  export { ToastOptions, ToastVariant, Toaster, ToasterProps, dismissToast, toast, toastPromise } from './components/composite/toast.js';
33
33
  export { Accordion, AccordionContent, AccordionContentProps, AccordionItem, AccordionItemProps, AccordionProps, AccordionTrigger, AccordionTriggerProps } from './components/ui/accordion.js';
34
+ export { ActionBar, ActionBarClose, ActionBarCloseProps, ActionBarGroup, ActionBarItem, ActionBarItemProps, ActionBarProps, ActionBarSelection, ActionBarSelectionProps, ActionBarSeparator, ActionBarSeparatorProps } from './components/ui/action-bar.js';
35
+ export { ActionBarLabels, DEFAULT_ACTION_BAR_LABELS } from './components/ui/action-bar-constants.js';
34
36
  export { Alert, AlertDescription, AlertDescriptionProps, AlertProps, AlertTitle, AlertTitleProps, alertVariants } from './components/ui/alert.js';
35
37
  export { AlertDialog, AlertDialogAction, AlertDialogActionProps, AlertDialogCancel, AlertDialogCancelProps, AlertDialogContent, AlertDialogContentProps, AlertDialogDescription, AlertDialogDescriptionProps, AlertDialogFooter, AlertDialogFooterProps, AlertDialogHeader, AlertDialogHeaderProps, AlertDialogOverlay, AlertDialogOverlayProps, AlertDialogPortal, AlertDialogPortalProps, AlertDialogProps, AlertDialogTitle, AlertDialogTitleProps, AlertDialogTrigger, AlertDialogTriggerProps } from './components/ui/alert-dialog.js';
36
38
  export { AspectRatio, AspectRatioProps } from './components/ui/aspect-ratio.js';
37
39
  export { Avatar, AvatarFallback, AvatarFallbackProps, AvatarImage, AvatarImageProps, AvatarProps } from './components/ui/avatar.js';
38
40
  export { Badge, BadgeProps, badgeVariants } from './components/ui/badge.js';
41
+ export { BadgeOverflow, BadgeOverflowProps } from './components/ui/badge-overflow.js';
42
+ export { Banner, BannerActions, BannerClose, BannerCloseProps, BannerContent, BannerData, BannerDescription, BannerIcon, BannerProps, BannerRenderProps, BannerTitle, BannerVariant, Banners, BannersProps, useBanner, useBanners } from './components/ui/banner.js';
39
43
  export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbEllipsisProps, BreadcrumbItem, BreadcrumbItemProps, BreadcrumbLink, BreadcrumbLinkProps, BreadcrumbList, BreadcrumbListProps, BreadcrumbPage, BreadcrumbPageProps, BreadcrumbProps, BreadcrumbSeparator, BreadcrumbSeparatorProps } from './components/ui/breadcrumb.js';
40
44
  export { Button, ButtonProps, buttonVariants } from './components/ui/button.js';
41
45
  export { ButtonGroup, ButtonGroupProps, ButtonGroupSeparator, ButtonGroupSeparatorProps, ButtonGroupText, ButtonGroupTextProps, buttonGroupVariants } from './components/ui/button-group.js';
@@ -43,9 +47,12 @@ export { Calendar, CalendarDayButton, CalendarDayButtonProps, CalendarProps } fr
43
47
  export { Card, CardAction, CardActionProps, CardContent, CardContentProps, CardDescription, CardDescriptionProps, CardFooter, CardFooterProps, CardHeader, CardHeaderProps, CardProps, CardTitle, CardTitleProps, cardVariants } from './components/ui/card.js';
44
48
  export { Carousel, CarouselApi, CarouselContent, CarouselContentProps, CarouselContextProps, CarouselItem, CarouselItemProps, CarouselNext, CarouselNextProps, CarouselOptions, CarouselOwnProps, CarouselPlugin, CarouselPrevious, CarouselPreviousProps, CarouselProps, useCarousel } from './components/ui/carousel.js';
45
49
  export { Checkbox, CheckboxProps } from './components/ui/checkbox.js';
50
+ export { CircularProgress, CircularProgressCombined, CircularProgressIndicator, CircularProgressProps, CircularProgressRange, CircularProgressTrack, CircularProgressValueText, CircularProgressValueTextProps } from './components/ui/circular-progress.js';
46
51
  export { Collapsible, CollapsibleContent, CollapsibleContentProps, CollapsibleProps, CollapsibleTrigger, CollapsibleTriggerProps } from './components/ui/collapsible.js';
47
52
  export { Command, CommandDialog, CommandDialogProps, CommandEmpty, CommandEmptyProps, CommandGroup, CommandGroupProps, CommandInput, CommandInputProps, CommandItem, CommandItemProps, CommandList, CommandListProps, CommandProps, CommandSeparator, CommandSeparatorProps, CommandShortcut, CommandShortcutProps } from './components/ui/command.js';
48
53
  export { ContextMenu, ContextMenuCheckboxItem, ContextMenuCheckboxItemProps, ContextMenuContent, ContextMenuContentProps, ContextMenuGroup, ContextMenuGroupProps, ContextMenuItem, ContextMenuItemProps, ContextMenuItemVariant, ContextMenuLabel, ContextMenuLabelProps, ContextMenuPortal, ContextMenuPortalProps, ContextMenuProps, ContextMenuRadioGroup, ContextMenuRadioGroupProps, ContextMenuRadioItem, ContextMenuRadioItemProps, ContextMenuSeparator, ContextMenuSeparatorProps, ContextMenuShortcut, ContextMenuShortcutProps, ContextMenuSub, ContextMenuSubContent, ContextMenuSubContentProps, ContextMenuSubProps, ContextMenuSubTrigger, ContextMenuSubTriggerProps, ContextMenuTrigger, ContextMenuTriggerProps } from './components/ui/context-menu.js';
54
+ export { Cropper, CropperArea, CropperAreaData, CropperAreaProps, CropperImage, CropperImageProps, CropperMediaSize, CropperObjectFit, CropperPoint, CropperProps, CropperShape, CropperSize, CropperVideo, CropperVideoProps, useCropper } from './components/ui/cropper.js';
55
+ export { CropperLabels, DEFAULT_CROPPER_LABELS } from './components/ui/cropper-constants.js';
49
56
  export { Dialog, DialogBody, DialogBodyProps, DialogClose, DialogCloseProps, DialogContent, DialogContentProps, DialogDescription, DialogDescriptionProps, DialogFooter, DialogFooterProps, DialogHeader, DialogHeaderProps, DialogOverlay, DialogOverlayProps, DialogPortal, DialogPortalProps, DialogProps, DialogSize, DialogTitle, DialogTitleProps, DialogTrigger, DialogTriggerProps } from './components/ui/dialog.js';
50
57
  export { Drawer, DrawerClose, DrawerCloseProps, DrawerContent, DrawerContentProps, DrawerDescription, DrawerDescriptionProps, DrawerFooter, DrawerFooterProps, DrawerHeader, DrawerHeaderProps, DrawerOverlay, DrawerOverlayProps, DrawerPortal, DrawerPortalProps, DrawerProps, DrawerTitle, DrawerTitleProps, DrawerTrigger, DrawerTriggerProps } from './components/ui/drawer.js';
51
58
  export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuCheckboxItemProps, DropdownMenuContent, DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuGroupProps, DropdownMenuItem, DropdownMenuItemProps, DropdownMenuItemVariant, DropdownMenuLabel, DropdownMenuLabelProps, DropdownMenuPortal, DropdownMenuPortalProps, DropdownMenuProps, DropdownMenuRadioGroup, DropdownMenuRadioGroupProps, DropdownMenuRadioItem, DropdownMenuRadioItemProps, DropdownMenuSeparator, DropdownMenuSeparatorProps, DropdownMenuShortcut, DropdownMenuShortcutProps, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubContentProps, DropdownMenuSubProps, DropdownMenuSubTrigger, DropdownMenuSubTriggerProps, DropdownMenuTrigger, DropdownMenuTriggerProps } from './components/ui/dropdown-menu.js';
@@ -56,30 +63,50 @@ export { Input, InputProps } from './components/ui/input.js';
56
63
  export { InputGroup, InputGroupAddon, InputGroupAddonProps, InputGroupButton, InputGroupButtonProps, InputGroupInput, InputGroupInputProps, InputGroupProps, InputGroupText, InputGroupTextProps, InputGroupTextarea, InputGroupTextareaProps, inputGroupAddonVariants, inputGroupButtonVariants } from './components/ui/input-group.js';
57
64
  export { InputOTP, InputOTPGroup, InputOTPGroupProps, InputOTPProps, InputOTPSeparator, InputOTPSeparatorProps, InputOTPSlot, InputOTPSlotProps } from './components/ui/input-otp.js';
58
65
  export { Item, ItemActions, ItemActionsProps, ItemContent, ItemContentProps, ItemDescription, ItemDescriptionProps, ItemFooter, ItemFooterProps, ItemGroup, ItemGroupProps, ItemHeader, ItemHeaderProps, ItemMedia, ItemMediaProps, ItemProps, ItemSeparator, ItemSeparatorProps, ItemTitle, ItemTitleProps, itemMediaVariants, itemVariants } from './components/ui/item.js';
66
+ export { Kanban, KanbanBoard, KanbanBoardProps, KanbanColumn, KanbanColumnHandle, KanbanColumnHandleProps, KanbanColumnProps, KanbanItem, KanbanItemHandle, KanbanItemHandleProps, KanbanItemProps, KanbanOverlay, KanbanOverlayProps, KanbanProps } from './components/ui/kanban.js';
67
+ export { DEFAULT_KANBAN_LABELS, KanbanAnnouncementInfo, KanbanLabels } from './components/ui/kanban-constants.js';
59
68
  export { Kbd, KbdGroup, KbdGroupProps, KbdProps } from './components/ui/kbd.js';
69
+ export { KeyValue, KeyValueAdd, KeyValueAddProps, KeyValueError, KeyValueErrorProps, KeyValueItem, KeyValueItemData, KeyValueItemProps, KeyValueKeyInput, KeyValueKeyInputProps, KeyValueList, KeyValueListProps, KeyValueProps, KeyValueRemove, KeyValueRemoveProps, KeyValueValueInput, KeyValueValueInputProps, useKeyValueStore } from './components/ui/key-value.js';
70
+ export { DEFAULT_KEY_VALUE_LABELS, KeyValueLabels } from './components/ui/key-value-constants.js';
60
71
  export { Label, LabelProps } from './components/ui/label.js';
72
+ export { MaskInput, MaskInputProps } from './components/ui/mask-input.js';
73
+ export { MASK_PATTERNS, MaskPattern, applyCurrencyMask, applyMask, applyPercentageMask, fromUnmaskedIndex, getUnmaskedValue, toUnmaskedIndex } from './components/ui/mask-input-constants.js';
74
+ export { Mention, MentionContent, MentionContentProps, MentionInput, MentionInputProps, MentionItem, MentionItemProps, MentionLabel, MentionLabelProps, MentionProps } from './components/ui/mention.js';
61
75
  export { Menubar, MenubarCheckboxItem, MenubarCheckboxItemProps, MenubarContent, MenubarContentProps, MenubarGroup, MenubarGroupProps, MenubarItem, MenubarItemProps, MenubarItemVariant, MenubarLabel, MenubarLabelProps, MenubarMenu, MenubarMenuProps, MenubarPortal, MenubarPortalProps, MenubarProps, MenubarRadioGroup, MenubarRadioGroupProps, MenubarRadioItem, MenubarRadioItemProps, MenubarSeparator, MenubarSeparatorProps, MenubarShortcut, MenubarShortcutProps, MenubarSub, MenubarSubContent, MenubarSubContentProps, MenubarSubProps, MenubarSubTrigger, MenubarSubTriggerProps, MenubarTrigger, MenubarTriggerProps } from './components/ui/menubar.js';
62
76
  export { NavigationMenu, NavigationMenuContent, NavigationMenuContentProps, NavigationMenuIndicator, NavigationMenuIndicatorProps, NavigationMenuItem, NavigationMenuItemProps, NavigationMenuLink, NavigationMenuLinkProps, NavigationMenuList, NavigationMenuListProps, NavigationMenuProps, NavigationMenuTrigger, NavigationMenuTriggerProps, NavigationMenuViewport, NavigationMenuViewportProps, navigationMenuTriggerStyle } from './components/ui/navigation-menu.js';
63
77
  export { Pagination, PaginationContent, PaginationContentProps, PaginationEllipsis, PaginationEllipsisProps, PaginationItem, PaginationItemProps, PaginationLink, PaginationLinkProps, PaginationNext, PaginationNextProps, PaginationPrevious, PaginationPreviousProps, PaginationProps } from './components/ui/pagination.js';
78
+ export { PhoneInput, PhoneInputCountrySelect, PhoneInputCountrySelectProps, PhoneInputField, PhoneInputFieldProps, PhoneInputProps, usePhoneInput } from './components/ui/phone-input.js';
79
+ export { DEFAULT_PHONE_INPUT_LABELS, PhoneInputCountry, PhoneInputLabels } from './components/ui/phone-input-constants.js';
64
80
  export { Popover, PopoverAnchor, PopoverAnchorProps, PopoverContent, PopoverContentProps, PopoverProps, PopoverTrigger, PopoverTriggerProps } from './components/ui/popover.js';
65
81
  export { Progress, ProgressProps, ProgressTone, progressBarVariants, progressTrackVariants } from './components/ui/progress.js';
66
82
  export { RadioGroup, RadioGroupItem, RadioGroupItemProps, RadioGroupProps } from './components/ui/radio-group.js';
83
+ export { Rating, RatingItem, RatingItemProps, RatingProps, useRating } from './components/ui/rating.js';
67
84
  export { ResizableHandle, ResizableHandleProps, ResizablePanel, ResizablePanelGroup, ResizablePanelGroupProps, ResizablePanelProps } from './components/ui/resizable.js';
85
+ export { ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogCloseProps, ResponsiveDialogContent, ResponsiveDialogContentProps, ResponsiveDialogDescription, ResponsiveDialogDescriptionProps, ResponsiveDialogFooter, ResponsiveDialogFooterProps, ResponsiveDialogHeader, ResponsiveDialogHeaderProps, ResponsiveDialogOverlay, ResponsiveDialogOverlayProps, ResponsiveDialogPortal, ResponsiveDialogPortalProps, ResponsiveDialogProps, ResponsiveDialogTitle, ResponsiveDialogTitleProps, ResponsiveDialogTrigger, ResponsiveDialogTriggerProps } from './components/ui/responsive-dialog.js';
68
86
  export { ScrollArea, ScrollAreaProps, ScrollBar, ScrollBarProps } from './components/ui/scroll-area.js';
87
+ export { ScrollSpy, ScrollSpyLink, ScrollSpyLinkProps, ScrollSpyNav, ScrollSpyNavProps, ScrollSpyProps, ScrollSpySection, ScrollSpySectionProps, ScrollSpyViewport, ScrollSpyViewportProps } from './components/ui/scroll-spy.js';
69
88
  export { Select, SelectContent, SelectContentProps, SelectGroup, SelectGroupProps, SelectItem, SelectItemProps, SelectLabel, SelectLabelProps, SelectProps, SelectScrollDownButton, SelectScrollDownButtonProps, SelectScrollUpButton, SelectScrollUpButtonProps, SelectSeparator, SelectSeparatorProps, SelectTrigger, SelectTriggerProps, SelectValue, SelectValueProps } from './components/ui/select.js';
70
89
  export { Separator, SeparatorProps } from './components/ui/separator.js';
71
90
  export { Sheet, SheetClose, SheetCloseProps, SheetContent, SheetContentProps, SheetDescription, SheetDescriptionProps, SheetFooter, SheetFooterProps, SheetHeader, SheetHeaderProps, SheetOverlay, SheetOverlayProps, SheetPortal, SheetPortalProps, SheetProps, SheetSide, SheetTitle, SheetTitleProps, SheetTrigger, SheetTriggerProps } from './components/ui/sheet.js';
72
91
  export { Skeleton, SkeletonProps } from './components/ui/skeleton.js';
73
92
  export { Slider, SliderProps } from './components/ui/slider.js';
74
93
  export { Spinner, SpinnerProps } from './components/ui/spinner.js';
94
+ export { Stepper, StepperContent, StepperContentProps, StepperDescription, StepperDescriptionProps, StepperIndicator, StepperIndicatorProps, StepperItem, StepperItemProps, StepperList, StepperNext, StepperPrev, StepperProps, StepperSeparator, StepperSeparatorProps, StepperTitle, StepperTitleProps, StepperTrigger, useStepper } from './components/ui/stepper.js';
95
+ export { DEFAULT_STEPPER_LABELS, StepperLabels } from './components/ui/stepper-constants.js';
75
96
  export { Switch, SwitchProps } from './components/ui/switch.js';
76
97
  export { Table, TableBody, TableBodyProps, TableCaption, TableCaptionProps, TableCell, TableCellProps, TableFooter, TableFooterProps, TableHead, TableHeadProps, TableHeader, TableHeaderProps, TableProps, TableRow, TableRowProps } from './components/ui/table.js';
77
98
  export { Tabs, TabsContent, TabsContentProps, TabsList, TabsListProps, TabsProps, TabsTrigger, TabsTriggerProps } from './components/ui/tabs.js';
78
99
  export { TABS_TRIGGER_BASE, TabsVariant, tabsListVariants, tabsTriggerVariants } from './components/ui/tabs-variants.js';
100
+ export { TagsInput, TagsInputClear, TagsInputClearProps, TagsInputInput, TagsInputInputProps, TagsInputItem, TagsInputItemProps, TagsInputLabel, TagsInputLabelProps, TagsInputList, TagsInputListProps, TagsInputProps } from './components/ui/tags-input.js';
79
101
  export { Textarea, TextareaProps } from './components/ui/textarea.js';
102
+ export { TimePicker, TimePickerClear, TimePickerClearProps, TimePickerContent, TimePickerContentProps, TimePickerHour, TimePickerHourProps, TimePickerInput, TimePickerInputGroup, TimePickerInputGroupProps, TimePickerInputProps, TimePickerLabel, TimePickerLabelProps, TimePickerMinute, TimePickerMinuteProps, TimePickerPeriod, TimePickerPeriodProps, TimePickerProps, TimePickerSecond, TimePickerSecondProps, TimePickerSeparator, TimePickerSeparatorProps, TimePickerTrigger, TimePickerTriggerProps, useTimePicker } from './components/ui/time-picker.js';
103
+ export { DEFAULT_TIME_PICKER_LABELS, TimePickerLabels } from './components/ui/time-picker-constants.js';
104
+ export { Timeline, TimelineConnector, TimelineConnectorProps, TimelineContent, TimelineDescription, TimelineDot, TimelineHeader, TimelineItem, TimelineProps, TimelineTime, TimelineTimeProps, TimelineTitle } from './components/ui/timeline.js';
80
105
  export { Toggle, ToggleProps, ToggleVariantProps, toggleVariants } from './components/ui/toggle.js';
81
106
  export { ToggleGroup, ToggleGroupItem, ToggleGroupItemProps, ToggleGroupProps, ToggleGroupVariantProps } from './components/ui/toggle-group.js';
82
107
  export { Tooltip, TooltipContent, TooltipContentProps, TooltipProps, TooltipProvider, TooltipProviderProps, TooltipTrigger, TooltipTriggerProps } from './components/ui/tooltip.js';
108
+ export { Tour, TourArrow, TourArrowProps, TourClose, TourCloseProps, TourDescription, TourDescriptionProps, TourFooter, TourFooterProps, TourHeader, TourHeaderProps, TourNext, TourNextProps, TourPortal, TourPortalProps, TourPrev, TourPrevProps, TourProps, TourSkip, TourSkipProps, TourSpotlight, TourSpotlightProps, TourSpotlightRing, TourSpotlightRingProps, TourStep, TourStepCounter, TourStepCounterProps, TourStepProps, TourTitle, TourTitleProps } from './components/ui/tour.js';
109
+ export { DEFAULT_TOUR_LABELS, TourLabels } from './components/ui/tour-constants.js';
83
110
  export { AVATAR_TONE_NAMES, AvatarToneColors, AvatarToneName, getAvatarToneIndex } from './lib/avatar-tone.js';
84
111
  export { cn } from './lib/cn.js';
85
112
  export { ThemeMode, accent, accentForeground, accentInk, ash, brandNeutral, chart, getAvatarToneColors, gold, highContrast, layout, semantic, status, typography } from './tokens.js';
@@ -103,7 +130,10 @@ import 'vaul';
103
130
  import '@radix-ui/react-dropdown-menu';
104
131
  import '@radix-ui/react-hover-card';
105
132
  import 'input-otp';
133
+ import '@dnd-kit/core';
134
+ import '@dnd-kit/sortable';
106
135
  import '@radix-ui/react-label';
136
+ import '@diceui/mention';
107
137
  import '@radix-ui/react-menubar';
108
138
  import '@radix-ui/react-navigation-menu';
109
139
  import '@radix-ui/react-popover';
@@ -116,6 +146,7 @@ import '@radix-ui/react-separator';
116
146
  import '@radix-ui/react-slider';
117
147
  import '@radix-ui/react-switch';
118
148
  import '@radix-ui/react-tabs';
149
+ import '@diceui/tags-input';
119
150
  import '@radix-ui/react-toggle';
120
151
  import '@radix-ui/react-toggle-group';
121
152
  import '@radix-ui/react-tooltip';
package/dist/index.js CHANGED
@@ -37,11 +37,15 @@ import {
37
37
  } from "./components/composite/text-utils.js";
38
38
  export * from "./components/composite/toast.js";
39
39
  export * from "./components/ui/accordion.js";
40
+ export * from "./components/ui/action-bar.js";
41
+ export * from "./components/ui/action-bar-constants.js";
40
42
  export * from "./components/ui/alert.js";
41
43
  export * from "./components/ui/alert-dialog.js";
42
44
  export * from "./components/ui/aspect-ratio.js";
43
45
  export * from "./components/ui/avatar.js";
44
46
  export * from "./components/ui/badge.js";
47
+ export * from "./components/ui/badge-overflow.js";
48
+ export * from "./components/ui/banner.js";
45
49
  export * from "./components/ui/breadcrumb.js";
46
50
  export * from "./components/ui/button.js";
47
51
  export * from "./components/ui/button-group.js";
@@ -49,9 +53,12 @@ export * from "./components/ui/calendar.js";
49
53
  export * from "./components/ui/card.js";
50
54
  export * from "./components/ui/carousel.js";
51
55
  export * from "./components/ui/checkbox.js";
56
+ export * from "./components/ui/circular-progress.js";
52
57
  export * from "./components/ui/collapsible.js";
53
58
  export * from "./components/ui/command.js";
54
59
  export * from "./components/ui/context-menu.js";
60
+ export * from "./components/ui/cropper.js";
61
+ export * from "./components/ui/cropper-constants.js";
55
62
  export * from "./components/ui/dialog.js";
56
63
  export * from "./components/ui/drawer.js";
57
64
  export * from "./components/ui/dropdown-menu.js";
@@ -62,30 +69,58 @@ export * from "./components/ui/input.js";
62
69
  export * from "./components/ui/input-group.js";
63
70
  export * from "./components/ui/input-otp.js";
64
71
  export * from "./components/ui/item.js";
72
+ export * from "./components/ui/kanban.js";
73
+ export * from "./components/ui/kanban-constants.js";
65
74
  export * from "./components/ui/kbd.js";
75
+ export * from "./components/ui/key-value.js";
76
+ export * from "./components/ui/key-value-constants.js";
66
77
  export * from "./components/ui/label.js";
78
+ export * from "./components/ui/mask-input.js";
79
+ import {
80
+ applyCurrencyMask,
81
+ applyMask,
82
+ applyPercentageMask,
83
+ fromUnmaskedIndex,
84
+ getUnmaskedValue,
85
+ MASK_PATTERNS,
86
+ toUnmaskedIndex
87
+ } from "./components/ui/mask-input-constants.js";
88
+ export * from "./components/ui/mention.js";
67
89
  export * from "./components/ui/menubar.js";
68
90
  export * from "./components/ui/navigation-menu.js";
69
91
  export * from "./components/ui/pagination.js";
92
+ export * from "./components/ui/phone-input.js";
93
+ export * from "./components/ui/phone-input-constants.js";
70
94
  export * from "./components/ui/popover.js";
71
95
  export * from "./components/ui/progress.js";
72
96
  export * from "./components/ui/radio-group.js";
97
+ export * from "./components/ui/rating.js";
73
98
  export * from "./components/ui/resizable.js";
99
+ export * from "./components/ui/responsive-dialog.js";
74
100
  export * from "./components/ui/scroll-area.js";
101
+ export * from "./components/ui/scroll-spy.js";
75
102
  export * from "./components/ui/select.js";
76
103
  export * from "./components/ui/separator.js";
77
104
  export * from "./components/ui/sheet.js";
78
105
  export * from "./components/ui/skeleton.js";
79
106
  export * from "./components/ui/slider.js";
80
107
  export * from "./components/ui/spinner.js";
108
+ export * from "./components/ui/stepper.js";
109
+ export * from "./components/ui/stepper-constants.js";
81
110
  export * from "./components/ui/switch.js";
82
111
  export * from "./components/ui/table.js";
83
112
  export * from "./components/ui/tabs.js";
84
113
  export * from "./components/ui/tabs-variants.js";
114
+ export * from "./components/ui/tags-input.js";
85
115
  export * from "./components/ui/textarea.js";
116
+ export * from "./components/ui/time-picker.js";
117
+ export * from "./components/ui/time-picker-constants.js";
118
+ export * from "./components/ui/timeline.js";
86
119
  export * from "./components/ui/toggle.js";
87
120
  export * from "./components/ui/toggle-group.js";
88
121
  export * from "./components/ui/tooltip.js";
122
+ export * from "./components/ui/tour.js";
123
+ export * from "./components/ui/tour-constants.js";
89
124
  import { AVATAR_TONE_NAMES } from "./lib/avatar-tone.js";
90
125
  export * from "./lib/cn.js";
91
126
  export * from "./tokens.js";
@@ -93,11 +128,18 @@ export {
93
128
  AVATAR_TONE_NAMES,
94
129
  IconAvatar,
95
130
  LetterAvatar,
131
+ MASK_PATTERNS,
132
+ applyCurrencyMask,
133
+ applyMask,
134
+ applyPercentageMask,
135
+ fromUnmaskedIndex,
96
136
  getAvatarToneClasses,
137
+ getUnmaskedValue,
97
138
  getVietnameseInitials,
98
139
  matchesSearch,
99
140
  normalizeVi,
100
141
  removeVietnameseTones,
142
+ toUnmaskedIndex,
101
143
  truncate
102
144
  };
103
145
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Entry chính \"@comitor/ui\" — Tier 1 (primitive) + Tier 2 (composite) + lib + token.\n *\n * Quy tắc của entry này: **chỉ được phụ thuộc peer BẮT BUỘC** (react, react-dom,\n * lucide-react, tailwindcss). Không `next/*`, không `next-themes`, không `recharts`,\n * không `react-hook-form` — đó đều là peer OPTIONAL. Vì `tsup` chạy `bundle: false`\n * (ESM per-file), chỉ cần barrel này re-export một file có import optional peer là\n * mọi app import \"@comitor/ui\" đều buộc phải cài gói đó, nếu không bundler gãy ở\n * bước resolve. Vì vậy 3 nhánh dưới đây nằm ở entry riêng:\n *\n * - Tier 3 shell (next/*, next-themes) → \"@comitor/ui/shell\"\n * - chart (recharts) → \"@comitor/ui/chart\"\n * - binding react-hook-form → \"@comitor/ui/form\"\n *\n * ⚠ Hai file trong `components/ui/` CỐ Ý không có mặt ở đây:\n * - `form.tsx` → xuất qua \"@comitor/ui/form\" (react-hook-form).\n * - `sonner.tsx` → xuất qua \"@comitor/ui/shell\" dưới tên `SonnerToaster`\n * (nó gọi `useTheme()` của next-themes). Bản dùng hằng ngày là composite\n * `Toaster`/`toast` ở Tier 2 — không phụ thuộc next-themes, có sẵn ở entry này.\n *\n * ⚠ Mọi import nội bộ phải giữ đuôi `.js`: output là ESM per-file, Node ESM thuần\n * không tự suy ra phần mở rộng (bundler thì tha, Node thì không).\n */\n\n/*\n * ⚠ Sáu file `*-constants` bên dưới KHÔNG phải chỗ để gom code cho gọn — chúng là RANH GIỚI\n * SERVER/CLIENT. Component chủ (`command-palette.tsx`, `data-table.tsx`, `date-picker.tsx`,\n * `form-field.tsx`, `search-filter-bar.tsx`, `table-pagination.tsx`) đều mở đầu bằng `\"use client\"`,\n * mà mọi export của một module client đến tay Server Component dưới dạng client-reference proxy:\n * đọc ra `undefined`, KHÔNG throw, KHÔNG warning, trong khi TypeScript vẫn khai kiểu thật. Nhãn mặc\n * định / preset / sentinel là hằng dữ liệu thuần nên phải nằm ngoài ranh giới đó, và barrel này\n * phải xuất chúng THẲNG — re-export vòng qua file client là vô hiệu.\n * Cùng lý do với `chart/chart-colors.ts`; chi tiết ghi ở đầu file đó.\n * `scripts/verify-directives.mjs` canh không cho hằng thuần lọt ngược vào file client.\n */\n\n// ─── Tier 2 — composite (pattern lặp lại ở mọi app Comitor) ───\nexport * from \"./components/composite/avatar-group.js\";\nexport * from \"./components/composite/combobox.js\";\nexport * from \"./components/composite/command-palette.js\";\nexport * from \"./components/composite/command-palette-constants.js\";\nexport * from \"./components/composite/confirm-dialog.js\";\nexport * from \"./components/composite/copy-button.js\";\nexport * from \"./components/composite/data-table.js\";\nexport * from \"./components/composite/data-table-constants.js\";\nexport * from \"./components/composite/date-picker.js\";\nexport * from \"./components/composite/date-picker-constants.js\";\nexport * from \"./components/composite/empty-state.js\";\nexport * from \"./components/composite/filter-chips.js\";\nexport * from \"./components/composite/form-field.js\";\nexport * from \"./components/composite/form-field-constants.js\";\nexport * from \"./components/composite/form-section.js\";\nexport { IconAvatar, type IconAvatarIcon, type IconAvatarProps } from \"./components/composite/icon-avatar.js\";\nexport * from \"./components/composite/inline-edit.js\";\nexport * from \"./components/composite/keyboard-hint.js\";\nexport type { LetterAvatarProps, LetterAvatarSize } from \"./components/composite/letter-avatar.js\";\n// Xuất CHỌN LỌC (không `export *`): file này còn `AVATAR_TONES` nhập từ `lib/avatar-tone.js`\n// và các helper nội bộ khác. Liệt kê tường minh thì thêm helper riêng tư vào file KHÔNG tự động\n// biến nó thành API công khai — hàng rào mà `export *` không dựng được.\nexport { getAvatarToneClasses, LetterAvatar } from \"./components/composite/letter-avatar.js\";\nexport * from \"./components/composite/page-container.js\";\nexport * from \"./components/composite/page-header.js\";\nexport * from \"./components/composite/relative-time.js\";\nexport * from \"./components/composite/route-tabs.js\";\nexport * from \"./components/composite/search-filter-bar.js\";\nexport * from \"./components/composite/search-filter-bar-constants.js\";\nexport * from \"./components/composite/stat-card.js\";\nexport * from \"./components/composite/status-config.js\";\nexport * from \"./components/composite/status-pill.js\";\nexport * from \"./components/composite/table-pagination.js\";\nexport * from \"./components/composite/table-pagination-constants.js\";\n// Xuất CHỌN LỌC vì cùng lý do với `letter-avatar` ở trên: `text-utils.ts` là chỗ dễ bị thêm\n// helper nội bộ nhất của Tier 2 (0.1.0 từng rò `hashString`/`pickByString` ra API công khai\n// đúng theo đường này). Năm hàm dưới đây là hợp đồng, phần còn lại của file thì không.\nexport {\n getVietnameseInitials,\n matchesSearch,\n normalizeVi,\n removeVietnameseTones,\n truncate\n} from \"./components/composite/text-utils.js\";\nexport * from \"./components/composite/toast.js\";\n// ─── Tier 1 — primitive (shadcn/ui \"new-york\", đã custom theo brand Comitor) ───\nexport * from \"./components/ui/accordion.js\";\nexport * from \"./components/ui/alert.js\";\nexport * from \"./components/ui/alert-dialog.js\";\nexport * from \"./components/ui/aspect-ratio.js\";\nexport * from \"./components/ui/avatar.js\";\nexport * from \"./components/ui/badge.js\";\nexport * from \"./components/ui/breadcrumb.js\";\nexport * from \"./components/ui/button.js\";\nexport * from \"./components/ui/button-group.js\";\nexport * from \"./components/ui/calendar.js\";\nexport * from \"./components/ui/card.js\";\nexport * from \"./components/ui/carousel.js\";\nexport * from \"./components/ui/checkbox.js\";\nexport * from \"./components/ui/collapsible.js\";\nexport * from \"./components/ui/command.js\";\nexport * from \"./components/ui/context-menu.js\";\nexport * from \"./components/ui/dialog.js\";\nexport * from \"./components/ui/drawer.js\";\nexport * from \"./components/ui/dropdown-menu.js\";\nexport * from \"./components/ui/empty.js\";\nexport * from \"./components/ui/field.js\";\nexport * from \"./components/ui/hover-card.js\";\nexport * from \"./components/ui/input.js\";\nexport * from \"./components/ui/input-group.js\";\nexport * from \"./components/ui/input-otp.js\";\nexport * from \"./components/ui/item.js\";\nexport * from \"./components/ui/kbd.js\";\nexport * from \"./components/ui/label.js\";\nexport * from \"./components/ui/menubar.js\";\nexport * from \"./components/ui/navigation-menu.js\";\nexport * from \"./components/ui/pagination.js\";\nexport * from \"./components/ui/popover.js\";\nexport * from \"./components/ui/progress.js\";\nexport * from \"./components/ui/radio-group.js\";\nexport * from \"./components/ui/resizable.js\";\nexport * from \"./components/ui/scroll-area.js\";\nexport * from \"./components/ui/select.js\";\nexport * from \"./components/ui/separator.js\";\nexport * from \"./components/ui/sheet.js\";\nexport * from \"./components/ui/skeleton.js\";\nexport * from \"./components/ui/slider.js\";\nexport * from \"./components/ui/spinner.js\";\nexport * from \"./components/ui/switch.js\";\nexport * from \"./components/ui/table.js\";\nexport * from \"./components/ui/tabs.js\";\n/* Bảng lớp của Tabs xuất THẲNG từ module thuần — `RouteTabs` và `Tabs` dùng chung nó, và hằng\n dữ liệu đi vòng qua file \"use client\" sẽ thành proxy ở Server Component (CHANGELOG 0.2.2 §2). */\nexport * from \"./components/ui/tabs-variants.js\";\nexport * from \"./components/ui/textarea.js\";\nexport * from \"./components/ui/toggle.js\";\nexport * from \"./components/ui/toggle-group.js\";\nexport * from \"./components/ui/tooltip.js\";\n/*\n * `IconAvatar` — em ruột của `LetterAvatar`, dùng chung bảng tone. Xuất kèm `AVATAR_TONE_NAMES`\n * và kiểu `AvatarToneName` vì prop `tone` chỉ có nghĩa khi chỗ gọi liệt kê được tập chọn (màn\n * quản trị cần dựng một `<Select>` từ đúng tập đó).\n *\n * ⚠ KHÔNG xuất `AVATAR_TONES` lẫn `getAvatarToneIndex` ra entry này: bảng thô và hàm băm vẫn là\n * nội bộ, đúng như `lib/avatar-tone.ts` dặn — xuất chúng là mời app dựng lại phép chọn tone của\n * riêng nó, tức cùng một tên ra hai màu.\n */\nexport { AVATAR_TONE_NAMES, type AvatarToneName } from \"./lib/avatar-tone.js\";\n\n// ─── lib + token ───\nexport * from \"./lib/cn.js\";\nexport * from \"./tokens.js\";\n"],"mappings":"AAqCA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,kBAA6D;AACtE,cAAc;AACd,cAAc;AAKd,SAAS,sBAAsB,oBAAoB;AACnD,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAId;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAUd,SAAS,yBAA8C;AAGvD,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Entry chính \"@comitor/ui\" — Tier 1 (primitive) + Tier 2 (composite) + lib + token.\n *\n * Quy tắc của entry này: **chỉ được phụ thuộc peer BẮT BUỘC** (react, react-dom,\n * lucide-react, tailwindcss). Không `next/*`, không `next-themes`, không `recharts`,\n * không `react-hook-form` — đó đều là peer OPTIONAL. Vì `tsup` chạy `bundle: false`\n * (ESM per-file), chỉ cần barrel này re-export một file có import optional peer là\n * mọi app import \"@comitor/ui\" đều buộc phải cài gói đó, nếu không bundler gãy ở\n * bước resolve. Vì vậy 3 nhánh dưới đây nằm ở entry riêng:\n *\n * - Tier 3 shell (next/*, next-themes) → \"@comitor/ui/shell\"\n * - chart (recharts) → \"@comitor/ui/chart\"\n * - binding react-hook-form → \"@comitor/ui/form\"\n *\n * ⚠ Hai file trong `components/ui/` CỐ Ý không có mặt ở đây:\n * - `form.tsx` → xuất qua \"@comitor/ui/form\" (react-hook-form).\n * - `sonner.tsx` → xuất qua \"@comitor/ui/shell\" dưới tên `SonnerToaster`\n * (nó gọi `useTheme()` của next-themes). Bản dùng hằng ngày là composite\n * `Toaster`/`toast` ở Tier 2 — không phụ thuộc next-themes, có sẵn ở entry này.\n *\n * ⚠ Mọi import nội bộ phải giữ đuôi `.js`: output là ESM per-file, Node ESM thuần\n * không tự suy ra phần mở rộng (bundler thì tha, Node thì không).\n */\n\n/*\n * ⚠ Các file `*-constants` bên dưới — ở CẢ Tier 2 lẫn Tier 1 (từ `2.1.0`: `action-bar`, `cropper`,\n * `kanban`, `key-value`, `mask-input`, `phone-input`, `stepper`, `time-picker`, `tour`) — KHÔNG phải\n * chỗ để gom code cho gọn — chúng là RANH GIỚI SERVER/CLIENT. Component chủ (`command-palette.tsx`,\n * `data-table.tsx`, `kanban.tsx`…) đều mở đầu bằng `\"use client\"`,\n * mà mọi export của một module client đến tay Server Component dưới dạng client-reference proxy:\n * đọc ra `undefined`, KHÔNG throw, KHÔNG warning, trong khi TypeScript vẫn khai kiểu thật. Nhãn mặc\n * định / preset / sentinel là hằng dữ liệu thuần nên phải nằm ngoài ranh giới đó, và barrel này\n * phải xuất chúng THẲNG — re-export vòng qua file client là vô hiệu.\n * Cùng lý do với `chart/chart-colors.ts`; chi tiết ghi ở đầu file đó.\n * `scripts/verify-directives.mjs` canh không cho hằng thuần lọt ngược vào file client.\n */\n\n// ─── Tier 2 — composite (pattern lặp lại ở mọi app Comitor) ───\nexport * from \"./components/composite/avatar-group.js\";\nexport * from \"./components/composite/combobox.js\";\nexport * from \"./components/composite/command-palette.js\";\nexport * from \"./components/composite/command-palette-constants.js\";\nexport * from \"./components/composite/confirm-dialog.js\";\nexport * from \"./components/composite/copy-button.js\";\nexport * from \"./components/composite/data-table.js\";\nexport * from \"./components/composite/data-table-constants.js\";\nexport * from \"./components/composite/date-picker.js\";\nexport * from \"./components/composite/date-picker-constants.js\";\nexport * from \"./components/composite/empty-state.js\";\nexport * from \"./components/composite/filter-chips.js\";\nexport * from \"./components/composite/form-field.js\";\nexport * from \"./components/composite/form-field-constants.js\";\nexport * from \"./components/composite/form-section.js\";\nexport { IconAvatar, type IconAvatarIcon, type IconAvatarProps } from \"./components/composite/icon-avatar.js\";\nexport * from \"./components/composite/inline-edit.js\";\nexport * from \"./components/composite/keyboard-hint.js\";\nexport type { LetterAvatarProps, LetterAvatarSize } from \"./components/composite/letter-avatar.js\";\n// Xuất CHỌN LỌC (không `export *`): file này còn `AVATAR_TONES` nhập từ `lib/avatar-tone.js`\n// và các helper nội bộ khác. Liệt kê tường minh thì thêm helper riêng tư vào file KHÔNG tự động\n// biến nó thành API công khai — hàng rào mà `export *` không dựng được.\nexport { getAvatarToneClasses, LetterAvatar } from \"./components/composite/letter-avatar.js\";\nexport * from \"./components/composite/page-container.js\";\nexport * from \"./components/composite/page-header.js\";\nexport * from \"./components/composite/relative-time.js\";\nexport * from \"./components/composite/route-tabs.js\";\nexport * from \"./components/composite/search-filter-bar.js\";\nexport * from \"./components/composite/search-filter-bar-constants.js\";\nexport * from \"./components/composite/stat-card.js\";\nexport * from \"./components/composite/status-config.js\";\nexport * from \"./components/composite/status-pill.js\";\nexport * from \"./components/composite/table-pagination.js\";\nexport * from \"./components/composite/table-pagination-constants.js\";\n// Xuất CHỌN LỌC vì cùng lý do với `letter-avatar` ở trên: `text-utils.ts` là chỗ dễ bị thêm\n// helper nội bộ nhất của Tier 2 (0.1.0 từng rò `hashString`/`pickByString` ra API công khai\n// đúng theo đường này). Năm hàm dưới đây là hợp đồng, phần còn lại của file thì không.\nexport {\n getVietnameseInitials,\n matchesSearch,\n normalizeVi,\n removeVietnameseTones,\n truncate\n} from \"./components/composite/text-utils.js\";\nexport * from \"./components/composite/toast.js\";\n// ─── Tier 1 — primitive (shadcn/ui \"new-york\", đã custom theo brand Comitor) ───\nexport * from \"./components/ui/accordion.js\";\nexport * from \"./components/ui/action-bar.js\";\nexport * from \"./components/ui/action-bar-constants.js\";\nexport * from \"./components/ui/alert.js\";\nexport * from \"./components/ui/alert-dialog.js\";\nexport * from \"./components/ui/aspect-ratio.js\";\nexport * from \"./components/ui/avatar.js\";\nexport * from \"./components/ui/badge.js\";\nexport * from \"./components/ui/badge-overflow.js\";\nexport * from \"./components/ui/banner.js\";\nexport * from \"./components/ui/breadcrumb.js\";\nexport * from \"./components/ui/button.js\";\nexport * from \"./components/ui/button-group.js\";\nexport * from \"./components/ui/calendar.js\";\nexport * from \"./components/ui/card.js\";\nexport * from \"./components/ui/carousel.js\";\nexport * from \"./components/ui/checkbox.js\";\nexport * from \"./components/ui/circular-progress.js\";\nexport * from \"./components/ui/collapsible.js\";\nexport * from \"./components/ui/command.js\";\nexport * from \"./components/ui/context-menu.js\";\nexport * from \"./components/ui/cropper.js\";\nexport * from \"./components/ui/cropper-constants.js\";\nexport * from \"./components/ui/dialog.js\";\nexport * from \"./components/ui/drawer.js\";\nexport * from \"./components/ui/dropdown-menu.js\";\nexport * from \"./components/ui/empty.js\";\nexport * from \"./components/ui/field.js\";\nexport * from \"./components/ui/hover-card.js\";\nexport * from \"./components/ui/input.js\";\nexport * from \"./components/ui/input-group.js\";\nexport * from \"./components/ui/input-otp.js\";\nexport * from \"./components/ui/item.js\";\nexport * from \"./components/ui/kanban.js\";\nexport * from \"./components/ui/kanban-constants.js\";\nexport * from \"./components/ui/kbd.js\";\nexport * from \"./components/ui/key-value.js\";\nexport * from \"./components/ui/key-value-constants.js\";\nexport * from \"./components/ui/label.js\";\nexport * from \"./components/ui/mask-input.js\";\n/*\n * Xuất CHỌN LỌC: `mask-input-constants.ts` giữ cả bộ máy thuần của MaskInput (tách khỏi file\n * \"use client\" để hằng `MASK_PATTERNS` không thành proxy ở Server Component), gồm những helper nội\n * bộ như `DEFAULT_CURRENCY` / `REGEX_CACHE`. Chỉ đúng các tên thượng nguồn Dice UI xuất là API.\n */\nexport {\n applyCurrencyMask,\n applyMask,\n applyPercentageMask,\n fromUnmaskedIndex,\n getUnmaskedValue,\n MASK_PATTERNS,\n type MaskPattern,\n toUnmaskedIndex\n} from \"./components/ui/mask-input-constants.js\";\nexport * from \"./components/ui/mention.js\";\nexport * from \"./components/ui/menubar.js\";\nexport * from \"./components/ui/navigation-menu.js\";\nexport * from \"./components/ui/pagination.js\";\nexport * from \"./components/ui/phone-input.js\";\nexport * from \"./components/ui/phone-input-constants.js\";\nexport * from \"./components/ui/popover.js\";\nexport * from \"./components/ui/progress.js\";\nexport * from \"./components/ui/radio-group.js\";\nexport * from \"./components/ui/rating.js\";\nexport * from \"./components/ui/resizable.js\";\nexport * from \"./components/ui/responsive-dialog.js\";\nexport * from \"./components/ui/scroll-area.js\";\nexport * from \"./components/ui/scroll-spy.js\";\nexport * from \"./components/ui/select.js\";\nexport * from \"./components/ui/separator.js\";\nexport * from \"./components/ui/sheet.js\";\nexport * from \"./components/ui/skeleton.js\";\nexport * from \"./components/ui/slider.js\";\nexport * from \"./components/ui/spinner.js\";\nexport * from \"./components/ui/stepper.js\";\nexport * from \"./components/ui/stepper-constants.js\";\nexport * from \"./components/ui/switch.js\";\nexport * from \"./components/ui/table.js\";\nexport * from \"./components/ui/tabs.js\";\n/* Bảng lớp của Tabs xuất THẲNG từ module thuần — `RouteTabs` và `Tabs` dùng chung nó, và hằng\n dữ liệu đi vòng qua file \"use client\" sẽ thành proxy ở Server Component (CHANGELOG 0.2.2 §2). */\nexport * from \"./components/ui/tabs-variants.js\";\nexport * from \"./components/ui/tags-input.js\";\nexport * from \"./components/ui/textarea.js\";\nexport * from \"./components/ui/time-picker.js\";\nexport * from \"./components/ui/time-picker-constants.js\";\nexport * from \"./components/ui/timeline.js\";\nexport * from \"./components/ui/toggle.js\";\nexport * from \"./components/ui/toggle-group.js\";\nexport * from \"./components/ui/tooltip.js\";\nexport * from \"./components/ui/tour.js\";\nexport * from \"./components/ui/tour-constants.js\";\n/*\n * `IconAvatar` — em ruột của `LetterAvatar`, dùng chung bảng tone. Xuất kèm `AVATAR_TONE_NAMES`\n * và kiểu `AvatarToneName` vì prop `tone` chỉ có nghĩa khi chỗ gọi liệt kê được tập chọn (màn\n * quản trị cần dựng một `<Select>` từ đúng tập đó).\n *\n * ⚠ KHÔNG xuất `AVATAR_TONES` lẫn `getAvatarToneIndex` ra entry này: bảng thô và hàm băm vẫn là\n * nội bộ, đúng như `lib/avatar-tone.ts` dặn — xuất chúng là mời app dựng lại phép chọn tone của\n * riêng nó, tức cùng một tên ra hai màu.\n */\nexport { AVATAR_TONE_NAMES, type AvatarToneName } from \"./lib/avatar-tone.js\";\n\n// ─── lib + token ───\nexport * from \"./lib/cn.js\";\nexport * from \"./tokens.js\";\n"],"mappings":"AAsCA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,kBAA6D;AACtE,cAAc;AACd,cAAc;AAKd,SAAS,sBAAsB,oBAAoB;AACnD,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAId;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAUd,SAAS,yBAA8C;AAGvD,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/compose-refs.ts"],"sourcesContent":["/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/compose-refs.tsx\n */\n\nimport * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === \"function\") {\n return ref(value);\n }\n\n if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n // biome-ignore lint/correctness/useExhaustiveDependencies: we don't want to re-run this callback when the refs change\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n"],"mappings":"AAIA,YAAY,WAAW;AAQvB,SAAS,OAAU,KAAqB,OAAU;AAChD,MAAI,OAAO,QAAQ,YAAY;AAC7B,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,QAAI,UAAU;AAAA,EAChB;AACF;AAMA,SAAS,eAAkB,MAA8C;AACvE,SAAO,CAAC,SAAS;AACf,QAAI,aAAa;AACjB,UAAM,WAAW,KAAK,IAAI,CAAC,QAAQ;AACjC,YAAM,UAAU,OAAO,KAAK,IAAI;AAChC,UAAI,CAAC,cAAc,OAAO,YAAY,YAAY;AAChD,qBAAa;AAAA,MACf;AACA,aAAO;AAAA,IACT,CAAC;AAMD,QAAI,YAAY;AACd,aAAO,MAAM;AACX,iBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,gBAAM,UAAU,SAAS,CAAC;AAC1B,cAAI,OAAO,YAAY,YAAY;AACjC,oBAAQ;AAAA,UACV,OAAO;AACL,mBAAO,KAAK,CAAC,GAAG,IAAI;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,mBAAsB,MAA8C;AAE3E,SAAO,MAAM,YAAY,YAAY,GAAG,IAAI,GAAG,IAAI;AACrD;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/use-as-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect.js\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,SAAS,iCAAiC;AAE1C,SAAS,SAAY,OAAU;AAC7B,QAAM,MAAM,MAAM,OAAU,KAAK;AAEjC,4BAA0B,MAAM;AAC9B,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO;AACT;","names":[]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `true` khi khung nhìn hẹp hơn `breakpoint` (mặc định 768px — mốc `md` của Tailwind).
3
+ *
4
+ * Đọc qua `useSyncExternalStore` chứ không `useState` + `useEffect`: bản kia render lượt đầu với
5
+ * `false` rồi mới sửa, nên trên điện thoại một `ResponsiveDialog` mở sẵn sẽ nháy dạng Dialog một
6
+ * khung hình trước khi thành Drawer. Phía server luôn trả `false` (không có khung nhìn để đo).
7
+ */
8
+ declare function useIsMobile(breakpoint?: number): boolean;
9
+
10
+ export { useIsMobile };
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ function useIsMobile(breakpoint = 768) {
3
+ const query = `(max-width: ${breakpoint - 1}px)`;
4
+ const subscribe = React.useCallback(
5
+ (onChange) => {
6
+ const mql = window.matchMedia(query);
7
+ mql.addEventListener("change", onChange);
8
+ return () => mql.removeEventListener("change", onChange);
9
+ },
10
+ [query]
11
+ );
12
+ return React.useSyncExternalStore(
13
+ subscribe,
14
+ () => window.matchMedia(query).matches,
15
+ () => false
16
+ );
17
+ }
18
+ export {
19
+ useIsMobile
20
+ };
21
+ //# sourceMappingURL=use-is-mobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/use-is-mobile.ts"],"sourcesContent":["import * as React from \"react\";\n\n/**\n * `true` khi khung nhìn hẹp hơn `breakpoint` (mặc định 768px — mốc `md` của Tailwind).\n *\n * Đọc qua `useSyncExternalStore` chứ không `useState` + `useEffect`: bản kia render lượt đầu với\n * `false` rồi mới sửa, nên trên điện thoại một `ResponsiveDialog` mở sẵn sẽ nháy dạng Dialog một\n * khung hình trước khi thành Drawer. Phía server luôn trả `false` (không có khung nhìn để đo).\n */\nfunction useIsMobile(breakpoint = 768): boolean {\n const query = `(max-width: ${breakpoint - 1}px)`;\n\n const subscribe = React.useCallback(\n (onChange: () => void) => {\n const mql = window.matchMedia(query);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n },\n [query]\n );\n\n return React.useSyncExternalStore(\n subscribe,\n () => window.matchMedia(query).matches,\n () => false\n );\n}\n\nexport { useIsMobile };\n"],"mappings":"AAAA,YAAY,WAAW;AASvB,SAAS,YAAY,aAAa,KAAc;AAC9C,QAAM,QAAQ,eAAe,aAAa,CAAC;AAE3C,QAAM,YAAY,MAAM;AAAA,IACtB,CAAC,aAAyB;AACxB,YAAM,MAAM,OAAO,WAAW,KAAK;AACnC,UAAI,iBAAiB,UAAU,QAAQ;AACvC,aAAO,MAAM,IAAI,oBAAoB,UAAU,QAAQ;AAAA,IACzD;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,SAAO,MAAM;AAAA,IACX;AAAA,IACA,MAAM,OAAO,WAAW,KAAK,EAAE;AAAA,IAC/B,MAAM;AAAA,EACR;AACF;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/use-isomorphic-layout-effect.ts"],"sourcesContent":["import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,MAAM,4BAA4B,OAAO,WAAW,cAAc,MAAM,kBAAkB,MAAM;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/use-lazy-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T): React.RefObject<T> {\n const ref = React.useRef<T | null>(null);\n if (ref.current === null) {\n ref.current = fn();\n }\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,SAAS,WAAc,IAAiC;AACtD,QAAM,MAAM,MAAM,OAAiB,IAAI;AACvC,MAAI,IAAI,YAAY,MAAM;AACxB,QAAI,UAAU,GAAG;AAAA,EACnB;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+
3
+ type InputValue = string[] | string;
4
+ interface VisuallyHiddenInputProps<T = InputValue> extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "checked" | "onReset"> {
5
+ value?: T;
6
+ checked?: boolean;
7
+ control: HTMLElement | null;
8
+ bubbles?: boolean;
9
+ }
10
+ declare function VisuallyHiddenInput<T = InputValue>(props: VisuallyHiddenInputProps<T>): React.JSX.Element;
11
+
12
+ export { VisuallyHiddenInput };
@@ -0,0 +1,105 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ function VisuallyHiddenInput(props) {
5
+ const { control, value, checked, bubbles = true, type = "hidden", style, ...inputProps } = props;
6
+ const isCheckInput = React.useMemo(() => type === "checkbox" || type === "radio" || type === "switch", [type]);
7
+ const inputRef = React.useRef(null);
8
+ const prevValueRef = React.useRef({
9
+ value: isCheckInput ? checked : value,
10
+ previous: isCheckInput ? checked : value
11
+ });
12
+ const prevValue = React.useMemo(() => {
13
+ const currentValue = isCheckInput ? checked : value;
14
+ if (prevValueRef.current.value !== currentValue) {
15
+ prevValueRef.current.previous = prevValueRef.current.value;
16
+ prevValueRef.current.value = currentValue;
17
+ }
18
+ return prevValueRef.current.previous;
19
+ }, [isCheckInput, value, checked]);
20
+ const [controlSize, setControlSize] = React.useState({});
21
+ React.useLayoutEffect(() => {
22
+ if (!control) {
23
+ setControlSize({});
24
+ return;
25
+ }
26
+ setControlSize({
27
+ width: control.offsetWidth,
28
+ height: control.offsetHeight
29
+ });
30
+ if (typeof window === "undefined") return;
31
+ const resizeObserver = new ResizeObserver((entries) => {
32
+ if (!Array.isArray(entries) || !entries.length) return;
33
+ const entry = entries[0];
34
+ if (!entry) return;
35
+ let width;
36
+ let height;
37
+ if ("borderBoxSize" in entry) {
38
+ const borderSizeEntry = entry.borderBoxSize;
39
+ const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;
40
+ width = borderSize.inlineSize;
41
+ height = borderSize.blockSize;
42
+ } else {
43
+ width = control.offsetWidth;
44
+ height = control.offsetHeight;
45
+ }
46
+ setControlSize({ width, height });
47
+ });
48
+ resizeObserver.observe(control, { box: "border-box" });
49
+ return () => {
50
+ resizeObserver.disconnect();
51
+ };
52
+ }, [control]);
53
+ React.useEffect(() => {
54
+ const input = inputRef.current;
55
+ if (!input) return;
56
+ const inputProto = window.HTMLInputElement.prototype;
57
+ const propertyKey = isCheckInput ? "checked" : "value";
58
+ const eventType = isCheckInput ? "click" : "input";
59
+ const currentValue = isCheckInput ? checked : value;
60
+ const serializedCurrentValue = isCheckInput ? checked : typeof value === "object" && value !== null ? JSON.stringify(value) : value;
61
+ const descriptor = Object.getOwnPropertyDescriptor(inputProto, propertyKey);
62
+ const setter = descriptor?.set;
63
+ if (prevValue !== currentValue && setter) {
64
+ const event = new Event(eventType, { bubbles });
65
+ setter.call(input, serializedCurrentValue);
66
+ input.dispatchEvent(event);
67
+ }
68
+ }, [prevValue, value, checked, bubbles, isCheckInput]);
69
+ const composedStyle = React.useMemo(() => {
70
+ return {
71
+ ...style,
72
+ ...controlSize.width !== void 0 && controlSize.height !== void 0 ? controlSize : {},
73
+ border: 0,
74
+ clip: "rect(0 0 0 0)",
75
+ clipPath: "inset(50%)",
76
+ height: "1px",
77
+ margin: "-1px",
78
+ overflow: "hidden",
79
+ padding: 0,
80
+ position: "absolute",
81
+ whiteSpace: "nowrap",
82
+ width: "1px"
83
+ };
84
+ }, [style, controlSize]);
85
+ const [initialValue] = React.useState(
86
+ () => isCheckInput ? void 0 : typeof value === "object" && value !== null ? JSON.stringify(value) : value === void 0 || value === null ? void 0 : String(value)
87
+ );
88
+ return /* @__PURE__ */ jsx(
89
+ "input",
90
+ {
91
+ type,
92
+ ...inputProps,
93
+ ref: inputRef,
94
+ "aria-hidden": isCheckInput,
95
+ tabIndex: -1,
96
+ defaultChecked: isCheckInput ? checked : void 0,
97
+ defaultValue: initialValue,
98
+ style: composedStyle
99
+ }
100
+ );
101
+ }
102
+ export {
103
+ VisuallyHiddenInput
104
+ };
105
+ //# sourceMappingURL=visually-hidden-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/visually-hidden-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (`components/visually-hidden-input.tsx`) — MIT, © 2024 Sadman Sakib.\n *\n * Ô `<input>` ẩn đứng thay cho một control tự dựng (Rating, TimePicker, KeyValue, PhoneInput…) để\n * control đó tham gia được `<form>` thật: có `name`, có mặt trong `FormData`, và phát sự kiện\n * `input`/`click` nổi bọt mỗi khi giá trị đổi — nhờ vậy `onChange` của form bên ngoài vẫn nghe được.\n */\n\nimport * as React from \"react\";\n\ntype InputValue = string[] | string;\n\ninterface VisuallyHiddenInputProps<T = InputValue>\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"value\" | \"checked\" | \"onReset\"> {\n value?: T;\n checked?: boolean;\n control: HTMLElement | null;\n bubbles?: boolean;\n}\n\nfunction VisuallyHiddenInput<T = InputValue>(props: VisuallyHiddenInputProps<T>) {\n const { control, value, checked, bubbles = true, type = \"hidden\", style, ...inputProps } = props;\n\n const isCheckInput = React.useMemo(() => type === \"checkbox\" || type === \"radio\" || type === \"switch\", [type]);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const prevValueRef = React.useRef<{\n value: T | boolean | undefined;\n previous: T | boolean | undefined;\n }>({\n value: isCheckInput ? checked : value,\n previous: isCheckInput ? checked : value\n });\n\n const prevValue = React.useMemo(() => {\n const currentValue = isCheckInput ? checked : value;\n if (prevValueRef.current.value !== currentValue) {\n prevValueRef.current.previous = prevValueRef.current.value;\n prevValueRef.current.value = currentValue;\n }\n return prevValueRef.current.previous;\n }, [isCheckInput, value, checked]);\n\n const [controlSize, setControlSize] = React.useState<{\n width?: number;\n height?: number;\n }>({});\n\n React.useLayoutEffect(() => {\n if (!control) {\n setControlSize({});\n return;\n }\n\n setControlSize({\n width: control.offsetWidth,\n height: control.offsetHeight\n });\n\n if (typeof window === \"undefined\") return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n if (!Array.isArray(entries) || !entries.length) return;\n\n const entry = entries[0];\n if (!entry) return;\n\n let width: number;\n let height: number;\n\n if (\"borderBoxSize\" in entry) {\n const borderSizeEntry = entry.borderBoxSize;\n const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;\n width = borderSize.inlineSize;\n height = borderSize.blockSize;\n } else {\n width = control.offsetWidth;\n height = control.offsetHeight;\n }\n\n setControlSize({ width, height });\n });\n\n resizeObserver.observe(control, { box: \"border-box\" });\n return () => {\n resizeObserver.disconnect();\n };\n }, [control]);\n\n React.useEffect(() => {\n const input = inputRef.current;\n if (!input) return;\n\n const inputProto = window.HTMLInputElement.prototype;\n const propertyKey = isCheckInput ? \"checked\" : \"value\";\n const eventType = isCheckInput ? \"click\" : \"input\";\n const currentValue = isCheckInput ? checked : value;\n\n const serializedCurrentValue = isCheckInput\n ? checked\n : typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : value;\n\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, propertyKey);\n\n const setter = descriptor?.set;\n\n if (prevValue !== currentValue && setter) {\n const event = new Event(eventType, { bubbles });\n setter.call(input, serializedCurrentValue);\n input.dispatchEvent(event);\n }\n }, [prevValue, value, checked, bubbles, isCheckInput]);\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n ...style,\n ...(controlSize.width !== undefined && controlSize.height !== undefined ? controlSize : {}),\n border: 0,\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\"\n };\n }, [style, controlSize]);\n\n /*\n * ⚠ Khác thượng nguồn: bản gốc chỉ ghi giá trị vào ô khi nó ĐỔI (effect ở trên so với lần trước),\n * còn lượt render đầu thì không ghi gì — nên một form gửi đi khi người dùng CHƯA chạm vào control\n * mang chuỗi rỗng thay cho giá trị mặc định (Rating `defaultValue={3}` gửi `rating=\"\"`). Đã thấy\n * đúng như vậy ở render phía server. `defaultValue` chỉ đặt giá trị BAN ĐẦU; mọi lần đổi sau vẫn\n * đi qua setter + sự kiện như cũ.\n */\n const [initialValue] = React.useState(() =>\n isCheckInput\n ? undefined\n : typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : value === undefined || value === null\n ? undefined\n : String(value)\n );\n\n return (\n <input\n type={type}\n {...inputProps}\n ref={inputRef}\n aria-hidden={isCheckInput}\n tabIndex={-1}\n defaultChecked={isCheckInput ? checked : undefined}\n defaultValue={initialValue}\n style={composedStyle}\n />\n );\n}\n\nexport { VisuallyHiddenInput };\n"],"mappings":";AAwJI;AA9IJ,YAAY,WAAW;AAYvB,SAAS,oBAAoC,OAAoC;AAC/E,QAAM,EAAE,SAAS,OAAO,SAAS,UAAU,MAAM,OAAO,UAAU,OAAO,GAAG,WAAW,IAAI;AAE3F,QAAM,eAAe,MAAM,QAAQ,MAAM,SAAS,cAAc,SAAS,WAAW,SAAS,UAAU,CAAC,IAAI,CAAC;AAC7G,QAAM,WAAW,MAAM,OAAyB,IAAI;AAEpD,QAAM,eAAe,MAAM,OAGxB;AAAA,IACD,OAAO,eAAe,UAAU;AAAA,IAChC,UAAU,eAAe,UAAU;AAAA,EACrC,CAAC;AAED,QAAM,YAAY,MAAM,QAAQ,MAAM;AACpC,UAAM,eAAe,eAAe,UAAU;AAC9C,QAAI,aAAa,QAAQ,UAAU,cAAc;AAC/C,mBAAa,QAAQ,WAAW,aAAa,QAAQ;AACrD,mBAAa,QAAQ,QAAQ;AAAA,IAC/B;AACA,WAAO,aAAa,QAAQ;AAAA,EAC9B,GAAG,CAAC,cAAc,OAAO,OAAO,CAAC;AAEjC,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAGzC,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,SAAS;AACZ,qBAAe,CAAC,CAAC;AACjB;AAAA,IACF;AAEA,mBAAe;AAAA,MACb,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,QAAI,OAAO,WAAW,YAAa;AAEnC,UAAM,iBAAiB,IAAI,eAAe,CAAC,YAAY;AACrD,UAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,CAAC,QAAQ,OAAQ;AAEhD,YAAM,QAAQ,QAAQ,CAAC;AACvB,UAAI,CAAC,MAAO;AAEZ,UAAI;AACJ,UAAI;AAEJ,UAAI,mBAAmB,OAAO;AAC5B,cAAM,kBAAkB,MAAM;AAC9B,cAAM,aAAa,MAAM,QAAQ,eAAe,IAAI,gBAAgB,CAAC,IAAI;AACzE,gBAAQ,WAAW;AACnB,iBAAS,WAAW;AAAA,MACtB,OAAO;AACL,gBAAQ,QAAQ;AAChB,iBAAS,QAAQ;AAAA,MACnB;AAEA,qBAAe,EAAE,OAAO,OAAO,CAAC;AAAA,IAClC,CAAC;AAED,mBAAe,QAAQ,SAAS,EAAE,KAAK,aAAa,CAAC;AACrD,WAAO,MAAM;AACX,qBAAe,WAAW;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,UAAU,MAAM;AACpB,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAa,OAAO,iBAAiB;AAC3C,UAAM,cAAc,eAAe,YAAY;AAC/C,UAAM,YAAY,eAAe,UAAU;AAC3C,UAAM,eAAe,eAAe,UAAU;AAE9C,UAAM,yBAAyB,eAC3B,UACA,OAAO,UAAU,YAAY,UAAU,OACrC,KAAK,UAAU,KAAK,IACpB;AAEN,UAAM,aAAa,OAAO,yBAAyB,YAAY,WAAW;AAE1E,UAAM,SAAS,YAAY;AAE3B,QAAI,cAAc,gBAAgB,QAAQ;AACxC,YAAM,QAAQ,IAAI,MAAM,WAAW,EAAE,QAAQ,CAAC;AAC9C,aAAO,KAAK,OAAO,sBAAsB;AACzC,YAAM,cAAc,KAAK;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,WAAW,OAAO,SAAS,SAAS,YAAY,CAAC;AAErD,QAAM,gBAAgB,MAAM,QAA6B,MAAM;AAC7D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAI,YAAY,UAAU,UAAa,YAAY,WAAW,SAAY,cAAc,CAAC;AAAA,MACzF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,CAAC;AASvB,QAAM,CAAC,YAAY,IAAI,MAAM;AAAA,IAAS,MACpC,eACI,SACA,OAAO,UAAU,YAAY,UAAU,OACrC,KAAK,UAAU,KAAK,IACpB,UAAU,UAAa,UAAU,OAC/B,SACA,OAAO,KAAK;AAAA,EACtB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACC,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,eAAa;AAAA,MACb,UAAU;AAAA,MACV,gBAAgB,eAAe,UAAU;AAAA,MACzC,cAAc;AAAA,MACd,OAAO;AAAA;AAAA,EACT;AAEJ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comitor/ui",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Comitor design system — Shadcn/UI tùy biến theo brand Comitor + component dùng chung cho hệ sinh thái SaaS (Tasks, Chat, CRM, HR…)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -114,10 +114,14 @@
114
114
  }
115
115
  },
116
116
  "dependencies": {
117
+ "@diceui/mention": "^1.0.0",
118
+ "@diceui/tags-input": "^1.0.0",
117
119
  "@dnd-kit/core": "^6.3.1",
118
120
  "@dnd-kit/modifiers": "^9.0.0",
119
121
  "@dnd-kit/sortable": "^10.0.0",
120
122
  "@dnd-kit/utilities": "^3.2.2",
123
+ "@floating-ui/react": "^0.27.20",
124
+ "@floating-ui/react-dom": "^2.1.9",
121
125
  "@radix-ui/react-accordion": "1.2.12",
122
126
  "@radix-ui/react-alert-dialog": "1.1.15",
123
127
  "@radix-ui/react-aspect-ratio": "1.1.8",
package/styles.css CHANGED
@@ -1015,3 +1015,22 @@
1015
1015
  -webkit-mask-image: repeating-linear-gradient(135deg, #000 0 6px, transparent 6px 9px);
1016
1016
  mask-image: repeating-linear-gradient(135deg, #000 0 6px, transparent 6px 9px);
1017
1017
  }
1018
+
1019
+ /* ─ VÒNG QUAY của `CircularProgress` ở trạng thái KHÔNG XÁC ĐỊNH (`value={null}`) ─
1020
+ Port từ Dice UI cùng component. Cung 25% quay trọn một vòng mỗi 0,8s, bắt đầu từ 12 giờ
1021
+ (-90deg) để khớp điểm xuất phát của cung ở trạng thái có giá trị. Component chỉ gắn hiệu ứng
1022
+ dưới `motion-safe:`, nên người dùng bật `prefers-reduced-motion` thấy một cung đứng yên.
1023
+ ⚠ Thiếu khối này thì vòng không xác định ĐỨNG YÊN mà không có lỗi nào — nó trông y như
1024
+ "đang ở 25%", tức một con số sai chứ không phải một hiệu ứng hỏng. */
1025
+ @theme {
1026
+ --animate-spin-around: spin-around 0.8s linear infinite;
1027
+
1028
+ @keyframes spin-around {
1029
+ 0% {
1030
+ transform: rotate(-90deg);
1031
+ }
1032
+ 100% {
1033
+ transform: rotate(270deg);
1034
+ }
1035
+ }
1036
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/data-grid/compose-refs.ts"],"sourcesContent":["/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/compose-refs.tsx\n */\n\nimport * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === \"function\") {\n return ref(value);\n }\n\n if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n // biome-ignore lint/correctness/useExhaustiveDependencies: we don't want to re-run this callback when the refs change\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n"],"mappings":"AAIA,YAAY,WAAW;AAQvB,SAAS,OAAU,KAAqB,OAAU;AAChD,MAAI,OAAO,QAAQ,YAAY;AAC7B,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,QAAI,UAAU;AAAA,EAChB;AACF;AAMA,SAAS,eAAkB,MAA8C;AACvE,SAAO,CAAC,SAAS;AACf,QAAI,aAAa;AACjB,UAAM,WAAW,KAAK,IAAI,CAAC,QAAQ;AACjC,YAAM,UAAU,OAAO,KAAK,IAAI;AAChC,UAAI,CAAC,cAAc,OAAO,YAAY,YAAY;AAChD,qBAAa;AAAA,MACf;AACA,aAAO;AAAA,IACT,CAAC;AAMD,QAAI,YAAY;AACd,aAAO,MAAM;AACX,iBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,gBAAM,UAAU,SAAS,CAAC;AAC1B,cAAI,OAAO,YAAY,YAAY;AACjC,oBAAQ;AAAA,UACV,OAAO;AACL,mBAAO,KAAK,CAAC,GAAG,IAAI;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,mBAAsB,MAA8C;AAE3E,SAAO,MAAM,YAAY,YAAY,GAAG,IAAI,GAAG,IAAI;AACrD;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/data-grid/use-as-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect.js\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,SAAS,iCAAiC;AAE1C,SAAS,SAAY,OAAU;AAC7B,QAAM,MAAM,MAAM,OAAU,KAAK;AAEjC,4BAA0B,MAAM;AAC9B,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/data-grid/use-isomorphic-layout-effect.ts"],"sourcesContent":["import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,MAAM,4BAA4B,OAAO,WAAW,cAAc,MAAM,kBAAkB,MAAM;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/data-grid/use-lazy-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T): React.RefObject<T> {\n const ref = React.useRef<T | null>(null);\n if (ref.current === null) {\n ref.current = fn();\n }\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,SAAS,WAAc,IAAiC;AACtD,QAAM,MAAM,MAAM,OAAiB,IAAI;AACvC,MAAI,IAAI,YAAY,MAAM;AACxB,QAAI,UAAU,GAAG;AAAA,EACnB;AACA,SAAO;AACT;","names":[]}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes