maquinaweb-ui 2.75.0 → 2.75.2

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 (175) hide show
  1. package/dist/actions.js +0 -1
  2. package/dist/actions.js.map +1 -1
  3. package/dist/analytics/core.d.ts.map +1 -1
  4. package/dist/analytics/core.js +0 -1
  5. package/dist/analytics/core.js.map +1 -1
  6. package/dist/analytics/delegated-clicks.d.ts.map +1 -1
  7. package/dist/analytics/delegated-clicks.js +0 -1
  8. package/dist/analytics/delegated-clicks.js.map +1 -1
  9. package/dist/analytics/provider.d.ts +2 -2
  10. package/dist/analytics/provider.d.ts.map +1 -1
  11. package/dist/analytics/provider.js +0 -1
  12. package/dist/analytics/provider.js.map +1 -1
  13. package/dist/analytics/types.d.ts.map +1 -1
  14. package/dist/analytics.js +0 -1
  15. package/dist/container-animation/container-animation.d.ts +2 -2
  16. package/dist/container-animation/container-animation.d.ts.map +1 -1
  17. package/dist/container-animation/container-animation.js +1 -2
  18. package/dist/container-animation/container-animation.js.map +1 -1
  19. package/dist/container-animation.js +0 -1
  20. package/dist/date-field/DateField.d.ts +2 -2
  21. package/dist/date-field/DateField.d.ts.map +1 -1
  22. package/dist/date-field/DateField.js +0 -1
  23. package/dist/date-field/DateField.js.map +1 -1
  24. package/dist/date-field.js +0 -1
  25. package/dist/date-hour-field/DateHourField.d.ts +2 -2
  26. package/dist/date-hour-field/DateHourField.d.ts.map +1 -1
  27. package/dist/date-hour-field/DateHourField.js +0 -1
  28. package/dist/date-hour-field/DateHourField.js.map +1 -1
  29. package/dist/date-hour-field/time-wheel-column.js.map +1 -1
  30. package/dist/date-hour-field.js +0 -1
  31. package/dist/input-suggest/input-suggest.d.ts +2 -2
  32. package/dist/input-suggest/input-suggest.d.ts.map +1 -1
  33. package/dist/input-suggest/input-suggest.js +6 -7
  34. package/dist/input-suggest/input-suggest.js.map +1 -1
  35. package/dist/input-suggest.js +0 -1
  36. package/dist/kanban-dnd/constants.js +1 -4
  37. package/dist/kanban-dnd/constants.js.map +1 -1
  38. package/dist/kanban-dnd/context.d.ts +0 -4
  39. package/dist/kanban-dnd/context.d.ts.map +1 -1
  40. package/dist/kanban-dnd/context.js +0 -1
  41. package/dist/kanban-dnd/context.js.map +1 -1
  42. package/dist/kanban-dnd/drag-preview.js +4 -4
  43. package/dist/kanban-dnd/drag-preview.js.map +1 -1
  44. package/dist/kanban-dnd/drop-animation.js.map +1 -1
  45. package/dist/kanban-dnd/kanban-card-item.d.ts +2 -2
  46. package/dist/kanban-dnd/kanban-card-item.d.ts.map +1 -1
  47. package/dist/kanban-dnd/kanban-card-item.js +0 -1
  48. package/dist/kanban-dnd/kanban-card-item.js.map +1 -1
  49. package/dist/kanban-dnd/kanban-dnd-monitor.d.ts +2 -2
  50. package/dist/kanban-dnd/kanban-dnd-monitor.d.ts.map +1 -1
  51. package/dist/kanban-dnd/kanban-dnd-monitor.js +0 -1
  52. package/dist/kanban-dnd/kanban-dnd-monitor.js.map +1 -1
  53. package/dist/kanban-dnd/kanban-dropzone.d.ts +2 -2
  54. package/dist/kanban-dnd/kanban-dropzone.d.ts.map +1 -1
  55. package/dist/kanban-dnd/kanban-dropzone.js +0 -1
  56. package/dist/kanban-dnd/kanban-dropzone.js.map +1 -1
  57. package/dist/kanban-dnd/kanban-selector.d.ts +2 -2
  58. package/dist/kanban-dnd/kanban-selector.d.ts.map +1 -1
  59. package/dist/kanban-dnd/kanban-selector.js +0 -1
  60. package/dist/kanban-dnd/kanban-selector.js.map +1 -1
  61. package/dist/kanban-dnd/move-cards.d.ts.map +1 -1
  62. package/dist/kanban-dnd/move-cards.js.map +1 -1
  63. package/dist/kanban-dnd/types.d.ts.map +1 -1
  64. package/dist/kanban-dnd/use-kanban-column-dnd.d.ts.map +1 -1
  65. package/dist/kanban-dnd/use-kanban-column-dnd.js +0 -1
  66. package/dist/kanban-dnd/use-kanban-column-dnd.js.map +1 -1
  67. package/dist/kanban-dnd/use-kanban-selector-auto-scroll.js.map +1 -1
  68. package/dist/kanban-dnd.d.ts +0 -1
  69. package/dist/kanban-dnd.js +0 -1
  70. package/dist/landing-text/client-landing-text.js +0 -1
  71. package/dist/landing-text/client-landing-text.js.map +1 -1
  72. package/dist/landing-text/landing-content.d.ts +0 -2
  73. package/dist/landing-text/landing-content.d.ts.map +1 -1
  74. package/dist/landing-text/landing-content.js.map +1 -1
  75. package/dist/landing-text/landing-text.d.ts +2 -2
  76. package/dist/landing-text/landing-text.d.ts.map +1 -1
  77. package/dist/landing-text/landing-text.js +1 -1
  78. package/dist/landing-text/landing-text.js.map +1 -1
  79. package/dist/landing-text/server-landing-text.d.ts +2 -2
  80. package/dist/landing-text/server-landing-text.d.ts.map +1 -1
  81. package/dist/landing-text/server-landing-text.js +1 -1
  82. package/dist/landing-text/server-landing-text.js.map +1 -1
  83. package/dist/landing-text/types.d.ts.map +1 -1
  84. package/dist/node_modules/framer-motion/dist/es/utils/use-in-view.js +0 -1
  85. package/dist/node_modules/framer-motion/dist/es/utils/use-in-view.js.map +1 -1
  86. package/dist/node_modules/framer-motion/dist/types/index.d.ts +4 -0
  87. package/dist/node_modules/framer-motion/dist/types.d-DOCC-kZB.d.ts +1 -0
  88. package/dist/node_modules/motion/dist/react.d.ts +2 -0
  89. package/dist/node_modules/motion-dom/dist/index.d.ts +1001 -0
  90. package/dist/node_modules/motion-dom/dist/index.d.ts.map +1 -0
  91. package/dist/node_modules/motion-utils/dist/index.d.ts +17 -0
  92. package/dist/node_modules/motion-utils/dist/index.d.ts.map +1 -0
  93. package/dist/page-header/page-header.d.ts +2 -2
  94. package/dist/page-header/page-header.d.ts.map +1 -1
  95. package/dist/page-header/page-header.js.map +1 -1
  96. package/dist/page-header.js +0 -1
  97. package/dist/remote-selector/remote-selector.d.ts +3 -3
  98. package/dist/remote-selector/remote-selector.d.ts.map +1 -1
  99. package/dist/remote-selector/remote-selector.js +3 -4
  100. package/dist/remote-selector/remote-selector.js.map +1 -1
  101. package/dist/remote-selector.js +0 -1
  102. package/dist/server-infinite-scroll/server-infinite-scroll-items.d.ts +2 -2
  103. package/dist/server-infinite-scroll/server-infinite-scroll-items.d.ts.map +1 -1
  104. package/dist/server-infinite-scroll/server-infinite-scroll-items.js.map +1 -1
  105. package/dist/server-infinite-scroll/server-infinite-scroll-list.d.ts +2 -2
  106. package/dist/server-infinite-scroll/server-infinite-scroll-list.d.ts.map +1 -1
  107. package/dist/server-infinite-scroll/server-infinite-scroll-list.js +6 -7
  108. package/dist/server-infinite-scroll/server-infinite-scroll-list.js.map +1 -1
  109. package/dist/server-infinite-scroll/server-infinite-scroll-observer.d.ts +2 -2
  110. package/dist/server-infinite-scroll/server-infinite-scroll-observer.d.ts.map +1 -1
  111. package/dist/server-infinite-scroll/server-infinite-scroll-observer.js +0 -1
  112. package/dist/server-infinite-scroll/server-infinite-scroll-observer.js.map +1 -1
  113. package/dist/server-infinite-scroll/server-infinite-scroll.d.ts +2 -2
  114. package/dist/server-infinite-scroll/server-infinite-scroll.d.ts.map +1 -1
  115. package/dist/server-infinite-scroll/types.d.ts.map +1 -1
  116. package/dist/split-text-poor/split-text-poor.d.ts.map +1 -1
  117. package/dist/split-text-poor/split-text-poor.js +1 -2
  118. package/dist/split-text-poor/split-text-poor.js.map +1 -1
  119. package/dist/split-text-poor.js +0 -1
  120. package/dist/src/hooks/get-mask-options.js.map +1 -1
  121. package/dist/src/hooks/is-server.js +1 -2
  122. package/dist/src/hooks/is-server.js.map +1 -1
  123. package/dist/src/hooks/use-money-input.js +1 -3
  124. package/dist/src/hooks/use-money-input.js.map +1 -1
  125. package/dist/src/hooks/with-mask.d.ts +0 -1
  126. package/dist/src/hooks/with-mask.d.ts.map +1 -1
  127. package/dist/src/hooks/with-mask.js +2 -2
  128. package/dist/src/hooks/with-mask.js.map +1 -1
  129. package/dist/text-field/TextField.d.ts +5 -5
  130. package/dist/text-field/TextField.d.ts.map +1 -1
  131. package/dist/text-field/TextField.js +8 -9
  132. package/dist/text-field/TextField.js.map +1 -1
  133. package/dist/text-field.js +0 -1
  134. package/dist/toggle-field/ToggleField.d.ts.map +1 -1
  135. package/dist/toggle-field/ToggleField.js +1 -2
  136. package/dist/toggle-field/ToggleField.js.map +1 -1
  137. package/dist/toggle-field/ToggleGroup.d.ts +6 -6
  138. package/dist/toggle-field/ToggleGroup.d.ts.map +1 -1
  139. package/dist/toggle-field/ToggleGroup.js +2 -3
  140. package/dist/toggle-field/ToggleGroup.js.map +1 -1
  141. package/dist/toggle-field.js +0 -1
  142. package/dist/ui/badge.js +1 -1
  143. package/dist/ui/badge.js.map +1 -1
  144. package/dist/ui/button.js +1 -1
  145. package/dist/ui/button.js.map +1 -1
  146. package/dist/ui/calendar.js +8 -9
  147. package/dist/ui/calendar.js.map +1 -1
  148. package/dist/ui/checkbox.js +1 -2
  149. package/dist/ui/checkbox.js.map +1 -1
  150. package/dist/ui/command.js +5 -6
  151. package/dist/ui/command.js.map +1 -1
  152. package/dist/ui/content-help.js.map +1 -1
  153. package/dist/ui/form.js +4 -5
  154. package/dist/ui/form.js.map +1 -1
  155. package/dist/ui/input-date-field.js +1 -1
  156. package/dist/ui/input-date-field.js.map +1 -1
  157. package/dist/ui/input-help.js +0 -1
  158. package/dist/ui/input-help.js.map +1 -1
  159. package/dist/ui/input.js +1 -1
  160. package/dist/ui/input.js.map +1 -1
  161. package/dist/ui/label.js +1 -2
  162. package/dist/ui/label.js.map +1 -1
  163. package/dist/ui/popover.js +1 -2
  164. package/dist/ui/popover.js.map +1 -1
  165. package/dist/ui/scroll-area.js +1 -2
  166. package/dist/ui/scroll-area.js.map +1 -1
  167. package/dist/ui/selector.d.ts +0 -2
  168. package/dist/ui/selector.d.ts.map +1 -1
  169. package/dist/ui/selector.js +3 -4
  170. package/dist/ui/selector.js.map +1 -1
  171. package/dist/ui/tooltip.js +2 -3
  172. package/dist/ui/tooltip.js.map +1 -1
  173. package/dist/ui/tree-item-renderer.js +1 -3
  174. package/dist/ui/tree-item-renderer.js.map +1 -1
  175. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"selector.js","names":["TreeItemRenderer"],"sources":["../../src/components/ui/selector.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport type { PopoverProps } from '@radix-ui/react-popover';\nimport { ScrollArea, ScrollAreaViewport } from '@radix-ui/react-scroll-area';\n\nimport { Check, ChevronsUpDown, Loader2, Package, X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { useInView } from 'react-intersection-observer';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from './command';\nimport { InputHelp } from './input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { ScrollBar } from './scroll-area';\nimport TreeItemRenderer from './tree-item-renderer';\n\nexport type SelectorOption = {\n id: string | number;\n name: string;\n value?: any;\n children?: SelectorOption[];\n disabled?: boolean;\n};\n\nexport type SelectorProps<T> = {\n type?: 'single' | 'multiple';\n value?: T | T[];\n onChange?: (item: T | T[] | undefined | null) => void;\n search?: string;\n onSearch?: (search: string) => void;\n placeholder?: string;\n empty?: React.ReactNode;\n items: T[];\n fieldLabel: keyof T;\n withPortal?: boolean;\n fieldKey?: keyof T;\n groupBy?: keyof T;\n treeRender?: boolean;\n fieldChildren?: keyof T;\n fieldParent?: keyof T;\n fieldDisabled?: keyof T;\n disabled?: boolean;\n searchPlaceholder?: string;\n label?: string;\n name?: string;\n className?: string;\n required?: boolean;\n error?: React.ReactNode;\n selectFirstIsOne?: boolean;\n help?: string;\n extra?: string;\n extraOnClick?: (\n onChange?: (item: T | T[] | undefined | null) => void\n ) => Promise<void> | void;\n open?: boolean;\n setOpen?: (open: boolean) => void;\n maxVisibleBadges?: number;\n id?: string;\n imageField?: keyof T;\n disabledField?: keyof T;\n onDisabledClick?: (item: T) => void;\n itemRightElement?: (item: T) => React.ReactNode;\n loadMore?: () => void;\n hasMore?: boolean;\n isLoading?: boolean;\n} & PopoverProps;\n\ntype SelectorGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\n};\n\nexport function Selector<T>({\n type = 'single',\n value,\n onChange,\n search,\n onSearch,\n items,\n withPortal = true,\n label,\n placeholder,\n fieldLabel,\n fieldKey,\n groupBy,\n treeRender = false,\n fieldChildren,\n fieldParent,\n fieldDisabled,\n searchPlaceholder,\n name,\n empty = 'Nenhuma opção encontrada...',\n disabled = false,\n className,\n required,\n error,\n selectFirstIsOne,\n help,\n extra,\n extraOnClick,\n open,\n setOpen,\n maxVisibleBadges = 3,\n id,\n imageField,\n disabledField,\n onDisabledClick,\n itemRightElement,\n loadMore,\n hasMore,\n isLoading,\n ...props\n}: SelectorProps<T>) {\n const itemKey = fieldKey || fieldLabel;\n const childrenKey = (fieldChildren || 'children') as keyof T;\n const parentKey = (fieldParent || 'parent') as keyof T;\n\n const isMultiple = type === 'multiple';\n const selectedItems = isMultiple && Array.isArray(value) ? value : [];\n const singleValue = !isMultiple && !Array.isArray(value) ? value : undefined;\n const itensGroups = useMemo(\n () => buildGroups(items, groupBy),\n [items, groupBy]\n );\n\n // Infinite scroll\n const { ref: loadMoreRef, inView } = useInView({\n threshold: 0,\n rootMargin: '100px',\n skip: !hasMore || isLoading,\n });\n\n useEffect(() => {\n if (inView && hasMore && loadMore && !isLoading) {\n loadMore();\n }\n }, [inView, hasMore, loadMore, isLoading]);\n\n const isItemSelected = (item: T): boolean => {\n if (isMultiple) {\n return selectedItems.some(\n (selected) => selected[itemKey] === item[itemKey]\n );\n }\n return singleValue?.[itemKey] === item[itemKey];\n };\n\n const handleItemSelect = (item: T) => {\n if (isMultiple) {\n const isSelected = isItemSelected(item);\n const newValue = isSelected\n ? selectedItems.filter(\n (selected) => selected[itemKey] !== item[itemKey]\n )\n : [...selectedItems, item];\n onChange?.(newValue.length > 0 ? newValue : null);\n } else {\n onChange?.(item);\n setOpen?.(false);\n }\n };\n\n useEffect(() => {\n if (selectFirstIsOne && items && items.length === 1 && !value) {\n onChange?.(items[0] as any);\n }\n }, [items]);\n\n return (\n <div\n className={cn('w-full flex flex-col gap-1', className)}\n id={id || `selector-${name}`}\n >\n {label && (\n <div className=\"flex items-end gap-1.5\">\n <label\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n htmlFor={id || name}\n >\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-px\">*</span>\n )}\n </label>\n\n <InputHelp help={help} name={name} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <Popover onOpenChange={setOpen} open={open} {...props}>\n <PopoverTrigger asChild>\n <Button\n aria-expanded={open}\n aria-label=\"Carregando opções...\"\n className={cn(\n 'mt-0! justify-between w-full hover:bg-transparent cursor-pointer',\n !value && 'text-muted-foreground',\n error && 'border-destructive'\n )}\n disabled={disabled}\n id={id || name}\n role=\"combobox\"\n variant=\"outline\"\n >\n {isMultiple && selectedItems.length > 0 ? (\n <div className=\"flex gap-1 flex-1 min-w-0 overflow-hidden\">\n {selectedItems\n .slice(0, maxVisibleBadges)\n .map((item, index) => (\n <Badge\n className=\"truncate shrink min-w-0\"\n key={`badge-${item[itemKey]}-${index}`}\n variant=\"secondary\"\n >\n <span className=\"truncate block\">\n {item[fieldLabel] as string}\n </span>\n </Badge>\n ))}\n {selectedItems.length > maxVisibleBadges && (\n <Badge className=\"shrink-0\" variant=\"secondary\">\n +{selectedItems.length - maxVisibleBadges}\n </Badge>\n )}\n </div>\n ) : (\n <span className=\"truncate\">\n {!isMultiple && singleValue\n ? (singleValue[fieldLabel] as string)\n : placeholder || `Selecione a ${label?.toLowerCase()}`}\n </span>\n )}\n <div className=\"flex items-center shrink-0\">\n <div className=\"relative size-4\">\n {((isMultiple && selectedItems.length > 0) ||\n (!isMultiple && singleValue !== undefined)) && (\n <div\n className=\"absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onChange?.(null);\n }}\n >\n <X className=\"size-4\" />\n </div>\n )}\n </div>\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-(--radix-popover-trigger-width) max-w-2xl p-0\"\n withPortal={withPortal}\n >\n <Command shouldFilter={false}>\n <CommandInput\n onValueChange={onSearch}\n placeholder={\n searchPlaceholder ||\n `Pesquise por uma ${label?.toLowerCase()}`\n }\n value={search}\n />\n <CommandList\n className=\"max-h-none overflow-visible\"\n onWheel={(e) => e.stopPropagation()}\n >\n <ScrollArea className=\"h-fit max-h-75\" id=\"scroll\">\n <ScrollAreaViewport className=\"w-full h-fit max-h-75 relative\">\n <CommandEmpty className=\"text-sm p-3 text-foreground/60\">\n {empty}\n </CommandEmpty>\n {treeRender\n ? items.length > 0 && (\n <CommandGroup>\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={fieldDisabled}\n groupBy={groupBy}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={items}\n labelKey={fieldLabel}\n onSelect={handleItemSelect}\n parentKey={parentKey}\n />\n </CommandGroup>\n )\n : itensGroups.length > 0 &&\n itensGroups.some((group) => group.items.length > 0) &&\n itensGroups.map((group) => (\n <CommandGroup\n heading={\n group.heading ||\n (group.id === UNDEFINED_GROUP_ID && 'Outros')\n }\n key={`group-${group.id}`}\n >\n {group.items.map((item) => {\n const isDisabled = disabledField ? !!item[disabledField] : false;\n return (\n <CommandItem\n className={cn(\n 'transition-all p-2',\n isMultiple && 'gap-2',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground',\n isDisabled && !onDisabledClick && !itemRightElement && 'opacity-50'\n )}\n key={`item-${item[itemKey]}`}\n onSelect={() => {\n if (isDisabled && onDisabledClick) {\n onDisabledClick(item);\n return;\n }\n if (isDisabled) return;\n handleItemSelect(item);\n }}\n value={String(item[itemKey])}\n >\n {isMultiple && (\n <Checkbox checked={isItemSelected(item)} />\n )}\n {isMultiple && imageField && (\n <div className=\"relative w-8 h-8 overflow-hidden rounded-md border bg-muted shrink-0\">\n {item[imageField] ? (\n <img\n alt={item[fieldLabel] as string}\n src={item[imageField] as string}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <Package className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n <span className={cn('flex-1 text-left min-w-0 pr-2', isDisabled && 'opacity-50')}>\n {item[fieldLabel] as string}\n </span>\n {itemRightElement?.(item)}\n {!isMultiple && isItemSelected(item) && !isDisabled && (\n <Check className=\"ml-auto h-4 w-4 shrink-0\" />\n )}\n </CommandItem>\n );\n })}\n </CommandGroup>\n ))}\n {extra && (\n <CommandItem\n className={cn(\n 'transition-all p-2 sticky bottom-0 bg-white hover:bg-accent! aria-selected:bg-accent!'\n )}\n onSelect={() => {\n extraOnClick?.(onChange);\n setOpen?.(false);\n }}\n >\n {extra}\n </CommandItem>\n )}\n {/* Infinite scroll sentinel */}\n {hasMore && (\n <div\n className=\"flex justify-center py-2\"\n ref={loadMoreRef}\n >\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n )}\n </div>\n )}\n </ScrollAreaViewport>\n <ScrollBar />\n </ScrollArea>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n {error && error}\n </div>\n </div>\n );\n}\n\nconst DEFAULT_GROUP_ID = 'selector-default-group';\nconst UNDEFINED_GROUP_ID = 'selector-undefined-group';\n\nconst buildGroups = <T,>(items: T[], groupBy?: keyof T): SelectorGroup<T>[] => {\n if (!groupBy) return [{ id: DEFAULT_GROUP_ID, items }];\n\n return Object.values(\n items.reduce<Record<string, SelectorGroup<T>>>((acc, item) => {\n const rawValue = item[groupBy];\n const heading = rawValue == null ? undefined : String(rawValue);\n const groupId = heading ?? UNDEFINED_GROUP_ID;\n\n if (!acc[groupId]) {\n acc[groupId] = { id: groupId, heading, items: [] };\n }\n\n acc[groupId].items.push(item);\n return acc;\n }, {})\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"selector.js","names":[],"sources":["../../src/components/ui/selector.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport type { PopoverProps } from '@radix-ui/react-popover';\nimport { ScrollArea, ScrollAreaViewport } from '@radix-ui/react-scroll-area';\n\nimport { Check, ChevronsUpDown, Loader2, Package, X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { useInView } from 'react-intersection-observer';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from './command';\nimport { InputHelp } from './input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { ScrollBar } from './scroll-area';\nimport TreeItemRenderer from './tree-item-renderer';\n\nexport type SelectorOption = {\n id: string | number;\n name: string;\n value?: any;\n children?: SelectorOption[];\n disabled?: boolean;\n};\n\nexport type SelectorProps<T> = {\n type?: 'single' | 'multiple';\n value?: T | T[];\n onChange?: (item: T | T[] | undefined | null) => void;\n search?: string;\n onSearch?: (search: string) => void;\n placeholder?: string;\n empty?: React.ReactNode;\n items: T[];\n fieldLabel: keyof T;\n withPortal?: boolean;\n fieldKey?: keyof T;\n groupBy?: keyof T;\n treeRender?: boolean;\n fieldChildren?: keyof T;\n fieldParent?: keyof T;\n fieldDisabled?: keyof T;\n disabled?: boolean;\n searchPlaceholder?: string;\n label?: string;\n name?: string;\n className?: string;\n required?: boolean;\n error?: React.ReactNode;\n selectFirstIsOne?: boolean;\n help?: string;\n extra?: string;\n extraOnClick?: (\n onChange?: (item: T | T[] | undefined | null) => void\n ) => Promise<void> | void;\n open?: boolean;\n setOpen?: (open: boolean) => void;\n maxVisibleBadges?: number;\n id?: string;\n imageField?: keyof T;\n disabledField?: keyof T;\n onDisabledClick?: (item: T) => void;\n itemRightElement?: (item: T) => React.ReactNode;\n loadMore?: () => void;\n hasMore?: boolean;\n isLoading?: boolean;\n} & PopoverProps;\n\ntype SelectorGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\n};\n\nexport function Selector<T>({\n type = 'single',\n value,\n onChange,\n search,\n onSearch,\n items,\n withPortal = true,\n label,\n placeholder,\n fieldLabel,\n fieldKey,\n groupBy,\n treeRender = false,\n fieldChildren,\n fieldParent,\n fieldDisabled,\n searchPlaceholder,\n name,\n empty = 'Nenhuma opção encontrada...',\n disabled = false,\n className,\n required,\n error,\n selectFirstIsOne,\n help,\n extra,\n extraOnClick,\n open,\n setOpen,\n maxVisibleBadges = 3,\n id,\n imageField,\n disabledField,\n onDisabledClick,\n itemRightElement,\n loadMore,\n hasMore,\n isLoading,\n ...props\n}: SelectorProps<T>) {\n const itemKey = fieldKey || fieldLabel;\n const childrenKey = (fieldChildren || 'children') as keyof T;\n const parentKey = (fieldParent || 'parent') as keyof T;\n\n const isMultiple = type === 'multiple';\n const selectedItems = isMultiple && Array.isArray(value) ? value : [];\n const singleValue = !isMultiple && !Array.isArray(value) ? value : undefined;\n const itensGroups = useMemo(\n () => buildGroups(items, groupBy),\n [items, groupBy]\n );\n\n // Infinite scroll\n const { ref: loadMoreRef, inView } = useInView({\n threshold: 0,\n rootMargin: '100px',\n skip: !hasMore || isLoading,\n });\n\n useEffect(() => {\n if (inView && hasMore && loadMore && !isLoading) {\n loadMore();\n }\n }, [inView, hasMore, loadMore, isLoading]);\n\n const isItemSelected = (item: T): boolean => {\n if (isMultiple) {\n return selectedItems.some(\n (selected) => selected[itemKey] === item[itemKey]\n );\n }\n return singleValue?.[itemKey] === item[itemKey];\n };\n\n const handleItemSelect = (item: T) => {\n if (isMultiple) {\n const isSelected = isItemSelected(item);\n const newValue = isSelected\n ? selectedItems.filter(\n (selected) => selected[itemKey] !== item[itemKey]\n )\n : [...selectedItems, item];\n onChange?.(newValue.length > 0 ? newValue : null);\n } else {\n onChange?.(item);\n setOpen?.(false);\n }\n };\n\n useEffect(() => {\n if (selectFirstIsOne && items && items.length === 1 && !value) {\n onChange?.(items[0] as any);\n }\n }, [items]);\n\n return (\n <div\n className={cn('w-full flex flex-col gap-1', className)}\n id={id || `selector-${name}`}\n >\n {label && (\n <div className=\"flex items-end gap-1.5\">\n <label\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n htmlFor={id || name}\n >\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-px\">*</span>\n )}\n </label>\n\n <InputHelp help={help} name={name} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <Popover onOpenChange={setOpen} open={open} {...props}>\n <PopoverTrigger asChild>\n <Button\n aria-expanded={open}\n aria-label=\"Carregando opções...\"\n className={cn(\n 'mt-0! justify-between w-full hover:bg-transparent cursor-pointer',\n !value && 'text-muted-foreground',\n error && 'border-destructive'\n )}\n disabled={disabled}\n id={id || name}\n role=\"combobox\"\n variant=\"outline\"\n >\n {isMultiple && selectedItems.length > 0 ? (\n <div className=\"flex gap-1 flex-1 min-w-0 overflow-hidden\">\n {selectedItems\n .slice(0, maxVisibleBadges)\n .map((item, index) => (\n <Badge\n className=\"truncate shrink min-w-0\"\n key={`badge-${item[itemKey]}-${index}`}\n variant=\"secondary\"\n >\n <span className=\"truncate block\">\n {item[fieldLabel] as string}\n </span>\n </Badge>\n ))}\n {selectedItems.length > maxVisibleBadges && (\n <Badge className=\"shrink-0\" variant=\"secondary\">\n +{selectedItems.length - maxVisibleBadges}\n </Badge>\n )}\n </div>\n ) : (\n <span className=\"truncate\">\n {!isMultiple && singleValue\n ? (singleValue[fieldLabel] as string)\n : placeholder || `Selecione a ${label?.toLowerCase()}`}\n </span>\n )}\n <div className=\"flex items-center shrink-0\">\n <div className=\"relative size-4\">\n {((isMultiple && selectedItems.length > 0) ||\n (!isMultiple && singleValue !== undefined)) && (\n <div\n className=\"absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onChange?.(null);\n }}\n >\n <X className=\"size-4\" />\n </div>\n )}\n </div>\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-(--radix-popover-trigger-width) max-w-2xl p-0\"\n withPortal={withPortal}\n >\n <Command shouldFilter={false}>\n <CommandInput\n onValueChange={onSearch}\n placeholder={\n searchPlaceholder ||\n `Pesquise por uma ${label?.toLowerCase()}`\n }\n value={search}\n />\n <CommandList\n className=\"max-h-none overflow-visible\"\n onWheel={(e) => e.stopPropagation()}\n >\n <ScrollArea className=\"h-fit max-h-75\" id=\"scroll\">\n <ScrollAreaViewport className=\"w-full h-fit max-h-75 relative\">\n <CommandEmpty className=\"text-sm p-3 text-foreground/60\">\n {empty}\n </CommandEmpty>\n {treeRender\n ? items.length > 0 && (\n <CommandGroup>\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={fieldDisabled}\n groupBy={groupBy}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={items}\n labelKey={fieldLabel}\n onSelect={handleItemSelect}\n parentKey={parentKey}\n />\n </CommandGroup>\n )\n : itensGroups.length > 0 &&\n itensGroups.some((group) => group.items.length > 0) &&\n itensGroups.map((group) => (\n <CommandGroup\n heading={\n group.heading ||\n (group.id === UNDEFINED_GROUP_ID && 'Outros')\n }\n key={`group-${group.id}`}\n >\n {group.items.map((item) => {\n const isDisabled = disabledField ? !!item[disabledField] : false;\n return (\n <CommandItem\n className={cn(\n 'transition-all p-2',\n isMultiple && 'gap-2',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground',\n isDisabled && !onDisabledClick && !itemRightElement && 'opacity-50'\n )}\n key={`item-${item[itemKey]}`}\n onSelect={() => {\n if (isDisabled && onDisabledClick) {\n onDisabledClick(item);\n return;\n }\n if (isDisabled) return;\n handleItemSelect(item);\n }}\n value={String(item[itemKey])}\n >\n {isMultiple && (\n <Checkbox checked={isItemSelected(item)} />\n )}\n {isMultiple && imageField && (\n <div className=\"relative w-8 h-8 overflow-hidden rounded-md border bg-muted shrink-0\">\n {item[imageField] ? (\n <img\n alt={item[fieldLabel] as string}\n src={item[imageField] as string}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <Package className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n <span className={cn('flex-1 text-left min-w-0 pr-2', isDisabled && 'opacity-50')}>\n {item[fieldLabel] as string}\n </span>\n {itemRightElement?.(item)}\n {!isMultiple && isItemSelected(item) && !isDisabled && (\n <Check className=\"ml-auto h-4 w-4 shrink-0\" />\n )}\n </CommandItem>\n );\n })}\n </CommandGroup>\n ))}\n {extra && (\n <CommandItem\n className={cn(\n 'transition-all p-2 sticky bottom-0 bg-white hover:bg-accent! aria-selected:bg-accent!'\n )}\n onSelect={() => {\n extraOnClick?.(onChange);\n setOpen?.(false);\n }}\n >\n {extra}\n </CommandItem>\n )}\n {/* Infinite scroll sentinel */}\n {hasMore && (\n <div\n className=\"flex justify-center py-2\"\n ref={loadMoreRef}\n >\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n )}\n </div>\n )}\n </ScrollAreaViewport>\n <ScrollBar />\n </ScrollArea>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n {error && error}\n </div>\n </div>\n );\n}\n\nconst DEFAULT_GROUP_ID = 'selector-default-group';\nconst UNDEFINED_GROUP_ID = 'selector-undefined-group';\n\nconst buildGroups = <T,>(items: T[], groupBy?: keyof T): SelectorGroup<T>[] => {\n if (!groupBy) return [{ id: DEFAULT_GROUP_ID, items }];\n\n return Object.values(\n items.reduce<Record<string, SelectorGroup<T>>>((acc, item) => {\n const rawValue = item[groupBy];\n const heading = rawValue == null ? undefined : String(rawValue);\n const groupId = heading ?? UNDEFINED_GROUP_ID;\n\n if (!acc[groupId]) {\n acc[groupId] = { id: groupId, heading, items: [] };\n }\n\n acc[groupId].items.push(item);\n return acc;\n }, {})\n );\n};\n"],"mappings":"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"}
@@ -1,13 +1,12 @@
1
1
  'use client';
2
2
 
3
-
4
3
  import { cn } from "../src/lib/utils.js";
5
4
  import "react";
6
5
  import { jsx, jsxs } from "react/jsx-runtime";
7
6
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
8
7
 
9
8
  //#region src/components/ui/tooltip.tsx
10
- function TooltipProvider({ delayDuration = 0,...props }) {
9
+ function TooltipProvider({ delayDuration = 0, ...props }) {
11
10
  return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, {
12
11
  "data-slot": "tooltip-provider",
13
12
  delayDuration,
@@ -26,7 +25,7 @@ function TooltipTrigger({ ...props }) {
26
25
  ...props
27
26
  });
28
27
  }
29
- function TooltipContent({ className, sideOffset = 0, children,...props }) {
28
+ function TooltipContent({ className, sideOffset = 0, children, ...props }) {
30
29
  return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(TooltipPrimitive.Content, {
31
30
  className: cn("bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance", className),
32
31
  "data-slot": "tooltip-content",
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","names":[],"sources":["../../src/components/ui/tooltip.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\n\nimport { cn } from '@/lib/utils';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className\n )}\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n"],"mappings":";;;;;;;;;AAQA,SAAS,gBAAgB,EACvB,gBAAgB,EAChB,GAAG,SACsD;AACzD,QACE,oBAAC,iBAAiB;EAChB,aAAU;EACK;EACf,GAAI;GACJ;;AAIN,SAAS,QAAQ,EACf,GAAG,SACkD;AACrD,QACE,oBAAC,6BACC,oBAAC,iBAAiB;EAAK,aAAU;EAAU,GAAI;GAAS,GACxC;;AAItB,SAAS,eAAe,EACtB,GAAG,SACqD;AACxD,QAAO,oBAAC,iBAAiB;EAAQ,aAAU;EAAkB,GAAI;GAAS;;AAG5E,SAAS,eAAe,EACtB,WACA,aAAa,GACb,SACA,GAAG,SACqD;AACxD,QACE,oBAAC,iBAAiB,oBAChB,qBAAC,iBAAiB;EAChB,WAAW,GACT,qaACA,UACD;EACD,aAAU;EACE;EACZ,GAAI;aAEH,UACD,oBAAC,iBAAiB,SAAM,WAAU,uGAAuG;GAChH,GACH"}
1
+ {"version":3,"file":"tooltip.js","names":[],"sources":["../../src/components/ui/tooltip.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\n\nimport { cn } from '@/lib/utils';\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className\n )}\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n"],"mappings":";;;;;;;;AAQA,SAAS,gBAAgB,EACvB,gBAAgB,GAChB,GAAG,SACsD;AACzD,QACE,oBAAC,iBAAiB,UAAlB;EACE,aAAU;EACK;EACf,GAAI;EACJ;;AAIN,SAAS,QAAQ,EACf,GAAG,SACkD;AACrD,QACE,oBAAC,iBAAD,YACE,oBAAC,iBAAiB,MAAlB;EAAuB,aAAU;EAAU,GAAI;EAAS,GACxC;;AAItB,SAAS,eAAe,EACtB,GAAG,SACqD;AACxD,QAAO,oBAAC,iBAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;EAAS;;AAG5E,SAAS,eAAe,EACtB,WACA,aAAa,GACb,UACA,GAAG,SACqD;AACxD,QACE,oBAAC,iBAAiB,QAAlB,YACE,qBAAC,iBAAiB,SAAlB;EACE,WAAW,GACT,qaACA,UACD;EACD,aAAU;EACE;EACZ,GAAI;YAPN,CASG,UACD,oBAAC,iBAAiB,OAAlB,EAAwB,WAAU,sGAAuG,EAChH;KACH"}
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
 
3
-
4
3
  import { cn } from "../src/lib/utils.js";
5
4
  import { Checkbox } from "./checkbox.js";
6
5
  import { CommandItem } from "./command.js";
@@ -107,8 +106,7 @@ const normalizeTreeItems = (items, itemKey, childrenKey, parentKey) => {
107
106
  }
108
107
  return roots;
109
108
  };
110
- var tree_item_renderer_default = TreeItemRenderer;
111
109
 
112
110
  //#endregion
113
- export { tree_item_renderer_default as default };
111
+ export { TreeItemRenderer as default };
114
112
  //# sourceMappingURL=tree-item-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tree-item-renderer.js","names":["roots: T[]"],"sources":["../../src/components/ui/tree-item-renderer.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment, memo, useMemo } from 'react';\n\nimport { Check } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Checkbox } from './checkbox';\nimport { CommandItem } from './command';\n\ntype TreeItemRendererProps<T> = {\n items: T[];\n itemKey: keyof T;\n labelKey: keyof T;\n childrenKey: keyof T;\n parentKey?: keyof T;\n groupBy?: keyof T;\n disabledKey?: keyof T;\n isMultiple?: boolean;\n isItemSelected: (item: T) => boolean;\n onSelect: (item: T) => void;\n level?: number;\n};\n\nconst TreeItemRendererComponent = <T,>({\n items,\n itemKey,\n labelKey,\n childrenKey,\n parentKey,\n groupBy,\n disabledKey,\n isMultiple = false,\n isItemSelected,\n onSelect,\n level = 0,\n}: TreeItemRendererProps<T>) => {\n const parsedItems = useMemo(\n () =>\n level === 0\n ? normalizeTreeItems(\n items,\n itemKey,\n childrenKey,\n (parentKey || 'parent') as keyof T\n )\n : items,\n [level, items, itemKey, childrenKey, parentKey]\n );\n\n return (\n <>\n {parsedItems.map((item) => {\n const children = Array.isArray(item[childrenKey])\n ? (item[childrenKey] as T[])\n : [];\n const childrenGroups = buildGroups(children, groupBy);\n\n return (\n <Fragment key={`tree-item-${String(item[itemKey])}-${level}`}>\n <div className=\"relative\">\n {level > 0 && (\n <div className=\"pointer-events-none absolute left-0 top-1/2 -translate-y-1/2 w-4 h-px bg-gray-300\" />\n )}\n <CommandItem\n className={cn(\n 'transition-all p-2',\n level > 0 && 'ml-4',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground'\n )}\n disabled={disabledKey ? Boolean(item[disabledKey]) : false}\n key={`item-${String(item[itemKey])}`}\n onSelect={() => onSelect(item)}\n value={String(item[itemKey])}\n >\n <div\n className={cn(\n 'flex items-center w-full gap-2',\n level > 0 && 'pl-2'\n )}\n >\n {isMultiple && <Checkbox checked={isItemSelected(item)} />}\n <span className=\"truncate\">\n {String(item[labelKey] || '')}\n </span>\n {!isMultiple && isItemSelected(item) && (\n <Check className=\"ml-auto h-4 w-4\" />\n )}\n </div>\n </CommandItem>\n </div>\n <div\n className={cn(\n children.length > 0 &&\n 'ml-4 relative before:absolute before:left-0 before:top-0 before:bottom-4 before:border-l before:border-gray-300'\n )}\n >\n {children.length > 0 && (\n <>\n {childrenGroups.map((group) => (\n <div\n key={`tree-group-${String(item[itemKey])}-${group.id}`}\n >\n {groupBy && (\n <div className=\"px-2 py-1 ml-4 text-[11px] font-medium text-muted-foreground/90 uppercase tracking-wide\">\n {group.heading || 'Outros'}\n </div>\n )}\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={disabledKey}\n groupBy={groupBy}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={group.items}\n labelKey={labelKey}\n level={level + 1}\n onSelect={onSelect}\n parentKey={parentKey}\n />\n </div>\n ))}\n </>\n )}\n </div>\n </Fragment>\n );\n })}\n </>\n );\n};\n\nconst TreeItemRenderer = memo(\n TreeItemRendererComponent\n) as typeof TreeItemRendererComponent;\n\ntype TreeGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\n};\n\nconst DEFAULT_GROUP_ID = 'tree-group-default';\nconst UNDEFINED_GROUP_ID = 'tree-group-undefined';\n\nconst buildGroups = <T,>(items: T[], groupBy?: keyof T): TreeGroup<T>[] => {\n if (!groupBy) return [{ id: DEFAULT_GROUP_ID, items }];\n\n return Object.values(\n items.reduce<Record<string, TreeGroup<T>>>((acc, item) => {\n const rawValue = item[groupBy];\n const heading = rawValue == null ? undefined : String(rawValue);\n const groupId = heading ?? UNDEFINED_GROUP_ID;\n\n if (!acc[groupId]) {\n acc[groupId] = { id: groupId, heading, items: [] };\n }\n\n acc[groupId].items.push(item);\n return acc;\n }, {})\n );\n};\n\nconst normalizeTreeItems = <T,>(\n items: T[],\n itemKey: keyof T,\n childrenKey: keyof T,\n parentKey: keyof T\n): T[] => {\n if (items.length === 0) return items;\n\n const hasNestedChildren = items.some(\n (item) =>\n Array.isArray(item[childrenKey]) &&\n (item[childrenKey] as unknown[]).length > 0\n );\n\n if (hasNestedChildren) return items;\n\n const hasParentField = items.some((item) =>\n Object.prototype.hasOwnProperty.call(\n item as object,\n parentKey as PropertyKey\n )\n );\n\n if (!hasParentField) return items;\n\n const nodes = new Map<string, T>();\n const roots: T[] = [];\n\n for (const item of items) {\n nodes.set(String(item[itemKey]), {\n ...(item as object),\n [childrenKey]: [],\n } as T);\n }\n\n for (const item of items) {\n const node = nodes.get(String(item[itemKey]));\n if (!node) continue;\n\n const parentValue = item[parentKey] as unknown;\n const hasParent =\n parentValue !== null &&\n parentValue !== undefined &&\n String(parentValue) !== '';\n\n if (!hasParent) {\n roots.push(node);\n continue;\n }\n\n const parentNode = nodes.get(String(parentValue));\n if (!parentNode) {\n roots.push(node);\n continue;\n }\n\n (parentNode[childrenKey] as unknown[]).push(node);\n }\n\n return roots;\n};\n\nexport default TreeItemRenderer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"tree-item-renderer.js","names":[],"sources":["../../src/components/ui/tree-item-renderer.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment, memo, useMemo } from 'react';\n\nimport { Check } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Checkbox } from './checkbox';\nimport { CommandItem } from './command';\n\ntype TreeItemRendererProps<T> = {\n items: T[];\n itemKey: keyof T;\n labelKey: keyof T;\n childrenKey: keyof T;\n parentKey?: keyof T;\n groupBy?: keyof T;\n disabledKey?: keyof T;\n isMultiple?: boolean;\n isItemSelected: (item: T) => boolean;\n onSelect: (item: T) => void;\n level?: number;\n};\n\nconst TreeItemRendererComponent = <T,>({\n items,\n itemKey,\n labelKey,\n childrenKey,\n parentKey,\n groupBy,\n disabledKey,\n isMultiple = false,\n isItemSelected,\n onSelect,\n level = 0,\n}: TreeItemRendererProps<T>) => {\n const parsedItems = useMemo(\n () =>\n level === 0\n ? normalizeTreeItems(\n items,\n itemKey,\n childrenKey,\n (parentKey || 'parent') as keyof T\n )\n : items,\n [level, items, itemKey, childrenKey, parentKey]\n );\n\n return (\n <>\n {parsedItems.map((item) => {\n const children = Array.isArray(item[childrenKey])\n ? (item[childrenKey] as T[])\n : [];\n const childrenGroups = buildGroups(children, groupBy);\n\n return (\n <Fragment key={`tree-item-${String(item[itemKey])}-${level}`}>\n <div className=\"relative\">\n {level > 0 && (\n <div className=\"pointer-events-none absolute left-0 top-1/2 -translate-y-1/2 w-4 h-px bg-gray-300\" />\n )}\n <CommandItem\n className={cn(\n 'transition-all p-2',\n level > 0 && 'ml-4',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground'\n )}\n disabled={disabledKey ? Boolean(item[disabledKey]) : false}\n key={`item-${String(item[itemKey])}`}\n onSelect={() => onSelect(item)}\n value={String(item[itemKey])}\n >\n <div\n className={cn(\n 'flex items-center w-full gap-2',\n level > 0 && 'pl-2'\n )}\n >\n {isMultiple && <Checkbox checked={isItemSelected(item)} />}\n <span className=\"truncate\">\n {String(item[labelKey] || '')}\n </span>\n {!isMultiple && isItemSelected(item) && (\n <Check className=\"ml-auto h-4 w-4\" />\n )}\n </div>\n </CommandItem>\n </div>\n <div\n className={cn(\n children.length > 0 &&\n 'ml-4 relative before:absolute before:left-0 before:top-0 before:bottom-4 before:border-l before:border-gray-300'\n )}\n >\n {children.length > 0 && (\n <>\n {childrenGroups.map((group) => (\n <div\n key={`tree-group-${String(item[itemKey])}-${group.id}`}\n >\n {groupBy && (\n <div className=\"px-2 py-1 ml-4 text-[11px] font-medium text-muted-foreground/90 uppercase tracking-wide\">\n {group.heading || 'Outros'}\n </div>\n )}\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={disabledKey}\n groupBy={groupBy}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={group.items}\n labelKey={labelKey}\n level={level + 1}\n onSelect={onSelect}\n parentKey={parentKey}\n />\n </div>\n ))}\n </>\n )}\n </div>\n </Fragment>\n );\n })}\n </>\n );\n};\n\nconst TreeItemRenderer = memo(\n TreeItemRendererComponent\n) as typeof TreeItemRendererComponent;\n\ntype TreeGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\n};\n\nconst DEFAULT_GROUP_ID = 'tree-group-default';\nconst UNDEFINED_GROUP_ID = 'tree-group-undefined';\n\nconst buildGroups = <T,>(items: T[], groupBy?: keyof T): TreeGroup<T>[] => {\n if (!groupBy) return [{ id: DEFAULT_GROUP_ID, items }];\n\n return Object.values(\n items.reduce<Record<string, TreeGroup<T>>>((acc, item) => {\n const rawValue = item[groupBy];\n const heading = rawValue == null ? undefined : String(rawValue);\n const groupId = heading ?? UNDEFINED_GROUP_ID;\n\n if (!acc[groupId]) {\n acc[groupId] = { id: groupId, heading, items: [] };\n }\n\n acc[groupId].items.push(item);\n return acc;\n }, {})\n );\n};\n\nconst normalizeTreeItems = <T,>(\n items: T[],\n itemKey: keyof T,\n childrenKey: keyof T,\n parentKey: keyof T\n): T[] => {\n if (items.length === 0) return items;\n\n const hasNestedChildren = items.some(\n (item) =>\n Array.isArray(item[childrenKey]) &&\n (item[childrenKey] as unknown[]).length > 0\n );\n\n if (hasNestedChildren) return items;\n\n const hasParentField = items.some((item) =>\n Object.prototype.hasOwnProperty.call(\n item as object,\n parentKey as PropertyKey\n )\n );\n\n if (!hasParentField) return items;\n\n const nodes = new Map<string, T>();\n const roots: T[] = [];\n\n for (const item of items) {\n nodes.set(String(item[itemKey]), {\n ...(item as object),\n [childrenKey]: [],\n } as T);\n }\n\n for (const item of items) {\n const node = nodes.get(String(item[itemKey]));\n if (!node) continue;\n\n const parentValue = item[parentKey] as unknown;\n const hasParent =\n parentValue !== null &&\n parentValue !== undefined &&\n String(parentValue) !== '';\n\n if (!hasParent) {\n roots.push(node);\n continue;\n }\n\n const parentNode = nodes.get(String(parentValue));\n if (!parentNode) {\n roots.push(node);\n continue;\n }\n\n (parentNode[childrenKey] as unknown[]).push(node);\n }\n\n return roots;\n};\n\nexport default TreeItemRenderer;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "maquinaweb-ui",
3
- "version": "2.75.0",
3
+ "version": "2.75.2",
4
4
  "description": "A minimal React component library",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -89,8 +89,8 @@
89
89
  "@air/react-drag-to-select": "^5.0.5",
90
90
  "@atlaskit/pragmatic-drag-and-drop": "^1.7.9",
91
91
  "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.5",
92
- "react": "^18.0.0 || ^19.0.0",
93
- "react-dom": "^18.0.0 || ^19.0.0"
92
+ "react": "^19.2.5",
93
+ "react-dom": "^19.2.5"
94
94
  },
95
95
  "peerDependenciesMeta": {
96
96
  "@air/react-drag-to-select": {
@@ -151,12 +151,12 @@
151
151
  },
152
152
  "devDependencies": {
153
153
  "@air/react-drag-to-select": "^5.0.5",
154
- "@biomejs/biome": "^2.3.2",
155
- "@atlaskit/pragmatic-drag-and-drop": "^1.7.9",
154
+ "@biomejs/biome": "^2.4.13",
155
+ "@atlaskit/pragmatic-drag-and-drop": "^1.8.1",
156
156
  "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.5",
157
157
  "@semantic-release/changelog": "^6.0.3",
158
158
  "@semantic-release/git": "^10.0.1",
159
- "@tailwindcss/postcss": "^4.1.16",
159
+ "@tailwindcss/postcss": "^4.2.4",
160
160
  "@types/inputmask": "^5.0.7",
161
161
  "@types/react": "^19.2.14",
162
162
  "@types/react-dom": "^19.2.3",
@@ -168,18 +168,18 @@
168
168
  "lint-staged": "^16.2.3",
169
169
  "lucide-react": "^0.544.0",
170
170
  "motion": "^12.23.22",
171
- "next": "^16.2.0-canary.35",
171
+ "next": "^16.2.4",
172
172
  "nuqs": "^2.7.0",
173
- "react": "^19.2.4",
174
- "react-cosmos": "^7.0.0",
175
- "react-cosmos-next": "^7.0.0",
176
- "react-cosmos-plugin-open-fixture": "^7.0.0",
177
- "react-dom": "^19.2.4",
178
- "react-hook-form": "^7.71.2",
179
- "tailwindcss": "^4.1.14",
180
- "tsdown": "^0.15.6",
173
+ "react": "^19.2.5",
174
+ "react-cosmos": "^7.3.0",
175
+ "react-cosmos-next": "^7.3.0",
176
+ "react-cosmos-plugin-open-fixture": "^7.3.0",
177
+ "react-dom": "^19.2.5",
178
+ "react-hook-form": "^7.74.0",
179
+ "tailwindcss": "^4.2.4",
180
+ "tsdown": "^0.21.10",
181
181
  "tw-animate-css": "^1.4.0",
182
- "typescript": "^5.7.2"
182
+ "typescript": "^6.0.3"
183
183
  },
184
184
  "keywords": [
185
185
  "react",