@uselets/ui 1.4.0 → 1.6.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.
- package/README.md +5 -4
- package/dist/components/badge.d.ts +5 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/badge.js.map +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/button.js.map +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/data-table.js +1 -1
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/dialog.d.ts +7 -2
- package/dist/components/dialog.js +1 -1
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/dropzone.js +1 -1
- package/dist/components/dropzone.js.map +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/flex.d.ts +2 -2
- package/dist/components/group.d.ts +2 -2
- package/dist/components/mask-input.d.ts +1 -0
- package/dist/components/mask-input.js +1 -1
- package/dist/components/mask-input.js.map +1 -1
- package/dist/components/stack.d.ts +2 -2
- package/dist/components/table.js +1 -1
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/timeline.d.ts +2 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +1 -1
- package/dist/lib/badge.d.ts +20 -0
- package/dist/lib/badge.js +2 -0
- package/dist/lib/badge.js.map +1 -0
- package/dist/lib/compose-refs.d.ts +9 -0
- package/dist/lib/compose-refs.js +2 -0
- package/dist/lib/compose-refs.js.map +1 -0
- package/dist/skills/uselets-ui/references/component-catalog.md +9 -3
- package/dist/skills/uselets-ui/references/package-guide.md +1 -1
- package/dist/styles/theme.css +4 -0
- package/package.json +1 -1
- package/skills/uselets-ui/references/component-catalog.md +9 -3
- package/skills/uselets-ui/references/package-guide.md +1 -1
package/README.md
CHANGED
|
@@ -318,7 +318,8 @@ You can import from the package root (`@uselets/ui`) or by subpath (`@uselets/ui
|
|
|
318
318
|
| `alert` | `Alert`, `AlertTitle`, `AlertDescription`, `AlertAction` | `Alert` supports `variant: 'default' \| 'destructive'` (default: `default`). |
|
|
319
319
|
| `anchor` | `Anchor`, `anchorVariants` | Link primitive rendered as `<a>` with `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'`, `underline: 'always' \| 'hover' \| 'never' \| 'not-hover'` (default: `hover`), and `asChild`. |
|
|
320
320
|
| `avatar` | `Avatar`, `AvatarImage`, `AvatarFallback`, `AvatarBadge`, `AvatarGroup`, `AvatarGroupCount` | `Avatar` supports `size: 'sm' \| 'md' \| 'lg'` (default: `md`). |
|
|
321
|
-
| `
|
|
321
|
+
| `badge` | `Badge`, `badgeVariants` | `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` (default: `md`); `variant: 'solid' \| 'outline' \| 'subtle' \| 'ghost' \| 'link'` (default: `solid`); `color: UIColor` (default: `primary`); `asChild?: boolean`. |
|
|
322
|
+
| `button` | `Button`, `buttonVariants` | `variant: 'solid' \| 'secondary' \| 'outline' \| 'subtle' \| 'ghost' \| 'link'` (default: `solid`); `color: UIColor` (default: `primary`); `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| 'icon-xs' \| 'icon-sm' \| 'icon' \| 'icon-lg' \| 'icon-xl'`; `loading?: boolean`. |
|
|
322
323
|
| `unstyled-button` | `UnstyledButton` | Button primitive with reset styles, pointer cursor, accessible focus ring, default `type="button"`, and `asChild`. |
|
|
323
324
|
| `calendar` | `Calendar`, `CalendarDayButton` | Also exports the `DateRange` type. Weekends render with destructive text, week numbers are low-emphasis, and selected single/range endpoints use the `primary` palette with a subtle primary range fill. |
|
|
324
325
|
| `date-range-picker` | `DateRangePicker`, `DateRangePickerTrigger`, `DateRangePickerValue`, `DateRangePickerContent`, `DateRangePickerPresets`, `DateRangePickerPreset`, `DateRangePickerCalendar`, `DateRangePickerDateFields`, `DateRangePickerActions`, `DateRangePickerApply`, `DateRangePickerReset` | Compound popover picker backed by `Calendar` range mode. Draft edits from fixed presets, relative-day inputs, date inputs, and calendar stay in sync until `Apply`; reset/clear emits `null` through `onValueChange`. |
|
|
@@ -326,7 +327,7 @@ You can import from the package root (`@uselets/ui`) or by subpath (`@uselets/ui
|
|
|
326
327
|
| `checkbox` | `Checkbox` | `Checkbox` supports `size: 'sm' \| 'md' \| 'lg'` (default: `md`), `color: UIColor` (default: `primary`), `label?: React.ReactNode`, and `labelProps` for the composed `Label`. When `label` is provided without `id`, it generates an id and wires `htmlFor` automatically. Label text follows checkbox size: `sm` 12px, `md` 14px, `lg` 20px. |
|
|
327
328
|
| `code` | `Code` | Inline code primitive rendered as `<code>`. |
|
|
328
329
|
| `combobox` | `Combobox`, `ComboboxInput`, `ComboboxContent`, `ComboboxList`, `ComboboxItem`, `ComboboxGroup`, `ComboboxLabel`, `ComboboxCollection`, `ComboboxClear`, `ComboboxEmpty`, `ComboboxSeparator`, `ComboboxChips`, `ComboboxChip`, `ComboboxChipsInput`, `ComboboxTrigger`, `ComboboxValue`, `useComboboxAnchor` | `ComboboxInput` supports `icon?: React.ReactNode`, `triggerIcon?: React.ReactNode`, `showTrigger?: boolean`, and `showClear?: boolean`; `ComboboxContent` supports `container` for rendering inside overlays such as dialogs. |
|
|
329
|
-
| `dialog` | `Dialog`, `DialogTrigger`, `DialogPortal`, `DialogClose`, `DialogOverlay`, `DialogContent`, `DialogHeader`, `DialogFooter`, `DialogTitle`, `DialogDescription` | `Dialog` supports `size: 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` (default: `
|
|
330
|
+
| `dialog` | `Dialog`, `DialogTrigger`, `DialogPortal`, `DialogClose`, `DialogOverlay`, `DialogContent`, `DialogHeader`, `DialogBody`, `DialogFooter`, `DialogTitle`, `DialogDescription` | `Dialog` supports `size: 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl' \| '3xl' \| 'full'` (default: `md`); `full` occupies the entire viewport. `DialogContent` caps its height at `calc(100dvh - 2rem)` and arranges children as a flex column; wrap long content in `DialogBody` (`flex-1 overflow-y-auto`) so the body scrolls while `DialogHeader` and `DialogFooter` stay pinned. `DialogContent.showCloseButton` (default: `true`); `DialogFooter.showCloseButton` (default: `false`). |
|
|
330
331
|
| `drawer` | `Drawer`, `DrawerTrigger`, `DrawerPortal`, `DrawerClose`, `DrawerOverlay`, `DrawerContent`, `DrawerHeader`, `DrawerBody`, `DrawerFooter`, `DrawerTitle`, `DrawerDescription` | `Drawer` supports `size: 'sm' \| 'md' \| 'lg' \| 'xl'` (default: `md`); `DrawerBody` provides padded auto-scroll content; `DrawerFooter` stacks actions on mobile and aligns them to the end on larger breakpoints; `DrawerContent.showCloseButton` (default: `true`). Direction (`top/right/bottom/left`) is handled by Vaul root props. |
|
|
331
332
|
| `dropzone` | `Dropzone`, `DropzoneArea`, `DropzoneDescription`, `DropzoneFileList`, `DropzoneFileListItem`, `DropzoneFileMessage`, `DropzoneMessage`, `DropzoneRemoveFile`, `DropzoneRetryFile`, `DropzoneTrigger`, `InfiniteProgress`, `useDropzone` | `useDropzone` manages upload lifecycle, validation (`accept`, `minSize`, `maxSize`, `maxFiles`), retry handling, and optional `shiftOnMaxFiles` replacement. Compose the returned state with `Dropzone` and its subcomponents. |
|
|
332
333
|
| `dropdown-menu` | `DropdownMenu`, `DropdownMenuTrigger`, `DropdownMenuContent`, `DropdownMenuItem`, `DropdownMenuCheckboxItem`, `DropdownMenuRadioGroup`, `DropdownMenuRadioItem`, `DropdownMenuSub`, `DropdownMenuSubTrigger`, `DropdownMenuSubContent`, `DropdownMenuSeparator`, `DropdownMenuShortcut` | `DropdownMenuContent` supports `side`, `sideOffset`, `align`, `alignOffset`; items support `inset`, and `DropdownMenuItem` supports `variant: 'default' \| 'destructive'`. |
|
|
@@ -337,7 +338,7 @@ You can import from the package root (`@uselets/ui`) or by subpath (`@uselets/ui
|
|
|
337
338
|
| `heading` | `Heading`, `headingVariants` | Heading primitive with `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` (default: `md`) and `asChild`. |
|
|
338
339
|
| `input` | `Input` | Wrapper for Base UI Input with all native `<input>` props. |
|
|
339
340
|
| `input-otp` | `InputOTP`, `InputOTPGroup`, `InputOTPSlot`, `InputOTPSeparator`, `REGEXP_ONLY_CHARS`, `REGEXP_ONLY_DIGITS`, `REGEXP_ONLY_DIGITS_AND_CHARS` | `InputOTP` supports all `input-otp` props plus `containerClassName`; use `maxLength` and `pattern` for validation. |
|
|
340
|
-
| `mask-input` | `MaskInput` | Formatted input backed by `@react-input/mask`. Accepts `mask` plus optional `replacement`, `showMask`, `separate`, `track`, `modify`. Default replacement tokens: `9` (digit), `a` (letter), `*` (any). The `useMask` hook is also exported from `@uselets/ui/hooks/use-mask` for custom inputs. |
|
|
341
|
+
| `mask-input` | `MaskInput` | Formatted input backed by `@react-input/mask`. Accepts `mask` plus optional `replacement`, `showMask`, `separate`, `track`, `modify`. Default replacement tokens: `9` (digit), `a` (letter), `*` (any). Forwards an external `ref` prop to the underlying `<input>`, composed with the mask ref. The `useMask` hook is also exported from `@uselets/ui/hooks/use-mask` for custom inputs. |
|
|
341
342
|
| `kbd` | `Kbd`, `KbdGroup` | Keyboard shortcut presentation primitives. |
|
|
342
343
|
| `label` | `Label` | Styled `<label>` wrapper. |
|
|
343
344
|
| `list` | `List`, `ListItem`, `ListIcon`, `listVariants` | `List.type: 'unordered' \| 'ordered'`; `size` and `spacing` use the `xs` to `xl` scale; `ListIcon` can use `asChild` and replaces the default marker with a primary-colored icon. |
|
|
@@ -405,7 +406,7 @@ const [draft, setDraft] = useLocalStorage('draft', {
|
|
|
405
406
|
})
|
|
406
407
|
```
|
|
407
408
|
|
|
408
|
-
Utilities are exported from the package root and `@uselets/ui/utils`, including `cn` and `randomId`.
|
|
409
|
+
Utilities are exported from the package root and `@uselets/ui/utils`, including `cn` and `randomId`. The package also exports `composeRefs` (and `setRef`) from `@uselets/ui/lib/compose-refs` for composing multiple refs into a single callback ref — handy when a component needs to merge a forwarded `ref` with an internal one (for example `MaskInput`).
|
|
409
410
|
|
|
410
411
|
### Sonner example
|
|
411
412
|
|
|
@@ -4,14 +4,18 @@ import * as React from "react";
|
|
|
4
4
|
|
|
5
5
|
//#region src/components/badge.d.ts
|
|
6
6
|
declare const badgeVariants: (props?: ({
|
|
7
|
-
|
|
7
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl" | null | undefined;
|
|
8
|
+
variant?: "solid" | "outline" | "subtle" | "ghost" | "link" | null | undefined;
|
|
9
|
+
color?: "primary" | "brand" | "gray" | "zinc" | "red" | "yellow" | "blue" | "indigo" | "pink" | "green" | null | undefined;
|
|
8
10
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
9
11
|
type BadgeProps = React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & {
|
|
10
12
|
asChild?: boolean;
|
|
11
13
|
};
|
|
12
14
|
declare function Badge({
|
|
13
15
|
className,
|
|
16
|
+
size,
|
|
14
17
|
variant,
|
|
18
|
+
color,
|
|
15
19
|
asChild,
|
|
16
20
|
...props
|
|
17
21
|
}: BadgeProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/components/badge.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{badgeColorVariants as t}from"../lib/badge.js";import{Slot as n}from"radix-ui";import{jsx as r}from"react/jsx-runtime";import{cva as i}from"class-variance-authority";const a=i(`group/badge inline-flex w-fit shrink-0 items-center justify-center overflow-hidden border border-transparent font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none`,{variants:{size:{xs:`h-4 gap-0.5 px-1.5 text-[10px] rounded-md [&>svg]:size-2.5! has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1`,sm:`h-4.5 gap-0.5 px-2 text-[11px] rounded-[7px] [&>svg]:size-2.5! has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5`,md:`h-5 gap-1 px-2 py-0.5 text-xs rounded-[8px] [&>svg]:size-3! has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5`,lg:`h-6 gap-1 px-2.5 text-xs rounded-[9px] [&>svg]:size-3.5! has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2`,xl:`h-7 gap-1.5 px-3 text-sm rounded-[10px] [&>svg]:size-4! has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5`},variant:{solid:`bg-(--badge-solid) text-(--badge-solid-foreground) [a]:hover:opacity-90`,outline:`border-(--badge-outline-border) text-(--badge-outline-foreground) [a]:hover:bg-(--badge-soft) [a]:hover:text-(--badge-soft-foreground)`,subtle:`bg-(--badge-soft) text-(--badge-soft-foreground) [a]:hover:bg-(--badge-soft-hover)`,ghost:`text-(--badge-ghost-foreground) [a]:hover:bg-(--badge-ghost-hover) [a]:hover:text-(--badge-ghost-foreground)`,link:`text-(--badge-link-foreground) underline-offset-4 [a]:hover:underline`},color:t},defaultVariants:{size:`md`,variant:`solid`,color:`primary`}});function Badge({className:t,size:i=`md`,variant:o=`solid`,color:s=`primary`,asChild:c=!1,...l}){return r(c?n.Root:`span`,{"data-slot":`badge`,"data-size":i,"data-variant":o,"data-color":s,className:e(a({size:i,variant:o,color:s}),t),...l})}export{Badge,a as badgeVariants};
|
|
2
2
|
//# sourceMappingURL=badge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge.js","names":[],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'group/badge inline-flex
|
|
1
|
+
{"version":3,"file":"badge.js","names":[],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { badgeColorVariants } from '../lib/badge'\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'group/badge inline-flex w-fit shrink-0 items-center justify-center overflow-hidden border border-transparent font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none',\n {\n variants: {\n size: {\n xs: 'h-4 gap-0.5 px-1.5 text-[10px] rounded-md [&>svg]:size-2.5! has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1',\n sm: 'h-4.5 gap-0.5 px-2 text-[11px] rounded-[7px] [&>svg]:size-2.5! has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5',\n md: 'h-5 gap-1 px-2 py-0.5 text-xs rounded-[8px] [&>svg]:size-3! has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5',\n lg: 'h-6 gap-1 px-2.5 text-xs rounded-[9px] [&>svg]:size-3.5! has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n xl: 'h-7 gap-1.5 px-3 text-sm rounded-[10px] [&>svg]:size-4! has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5'\n },\n variant: {\n solid: 'bg-(--badge-solid) text-(--badge-solid-foreground) [a]:hover:opacity-90',\n outline:\n 'border-(--badge-outline-border) text-(--badge-outline-foreground) [a]:hover:bg-(--badge-soft) [a]:hover:text-(--badge-soft-foreground)',\n subtle: 'bg-(--badge-soft) text-(--badge-soft-foreground) [a]:hover:bg-(--badge-soft-hover)',\n ghost:\n 'text-(--badge-ghost-foreground) [a]:hover:bg-(--badge-ghost-hover) [a]:hover:text-(--badge-ghost-foreground)',\n link: 'text-(--badge-link-foreground) underline-offset-4 [a]:hover:underline'\n },\n color: badgeColorVariants\n },\n defaultVariants: {\n size: 'md',\n variant: 'solid',\n color: 'primary'\n }\n }\n)\n\nexport type BadgeProps = React.ComponentProps<'span'> &\n VariantProps<typeof badgeVariants> & {\n asChild?: boolean\n }\n\nfunction Badge({\n className,\n size = 'md',\n variant = 'solid',\n color = 'primary',\n asChild = false,\n ...props\n}: BadgeProps) {\n const Comp = asChild ? Slot.Root : 'span'\n\n return (\n <Comp\n data-slot=\"badge\"\n data-size={size}\n data-variant={variant}\n data-color={color}\n className={cn(badgeVariants({ size, variant, color }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":"8OAQA,MAAM,EAAgB,EACpB,6WACA,CACE,SAAU,CACR,KAAM,CACJ,GAAI,gIACJ,GAAI,uIACJ,GAAI,oIACJ,GAAI,6HACJ,GAAI,+HACN,EACA,QAAS,CACP,MAAO,0EACP,QACE,yIACF,OAAQ,qFACR,MACE,+GACF,KAAM,uEACR,EACA,MAAO,CACT,EACA,gBAAiB,CACf,KAAM,KACN,QAAS,QACT,MAAO,SACT,CACF,CACF,EAOA,SAAS,MAAM,CACb,YACA,OAAO,KACP,UAAU,QACV,QAAQ,UACR,UAAU,GACV,GAAG,GACU,CAGb,OACE,EAHW,EAAU,EAAK,KAAO,OAGjC,CACE,YAAU,QACV,YAAW,EACX,eAAc,EACd,aAAY,EACZ,UAAW,EAAG,EAAc,CAAE,OAAM,UAAS,OAAM,CAAC,EAAG,CAAS,EAChE,GAAI,CACL,CAAA,CAEL"}
|
|
@@ -4,7 +4,7 @@ import * as React from "react";
|
|
|
4
4
|
|
|
5
5
|
//#region src/components/button.d.ts
|
|
6
6
|
declare const buttonVariants: (props?: ({
|
|
7
|
-
variant?: "outline" | "
|
|
7
|
+
variant?: "solid" | "outline" | "subtle" | "ghost" | "link" | "secondary" | null | undefined;
|
|
8
8
|
color?: "primary" | "brand" | "gray" | "zinc" | "red" | "yellow" | "blue" | "indigo" | "pink" | "green" | null | undefined;
|
|
9
9
|
size?: "xs" | "sm" | "md" | "lg" | "xl" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | "icon-xl" | null | undefined;
|
|
10
10
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{buttonColorVariants as t}from"../lib/button.js";import{Spinner as n}from"./spinner.js";import{Slot as r}from"radix-ui";import{Fragment as i,jsx as a,jsxs as o}from"react/jsx-runtime";import{cva as s}from"class-variance-authority";const c=s(`focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 relative rounded-full border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all [&_svg]:transition-colors disabled:pointer-events-none disabled:opacity-50 disabled:data-[loading=true]:pointer-events-auto disabled:data-[loading=true]:cursor-not-allowed disabled:data-[loading=true]:opacity-100 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none`,{variants:{variant:{solid:`bg-(--button-solid) text-(--button-solid-foreground) hover:bg-(--button-solid-hover) data-[loading=true]:hover:bg-(--button-solid)`,outline:`border-(--button-outline-border) bg-
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{buttonColorVariants as t}from"../lib/button.js";import{Spinner as n}from"./spinner.js";import{Slot as r}from"radix-ui";import{Fragment as i,jsx as a,jsxs as o}from"react/jsx-runtime";import{cva as s}from"class-variance-authority";const c=s(`focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 relative rounded-full border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all [&_svg]:transition-colors disabled:pointer-events-none disabled:opacity-50 disabled:data-[loading=true]:pointer-events-auto disabled:data-[loading=true]:cursor-not-allowed disabled:data-[loading=true]:opacity-100 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none`,{variants:{variant:{solid:`bg-(--button-solid) text-(--button-solid-foreground) hover:bg-(--button-solid-hover) data-[loading=true]:hover:bg-(--button-solid)`,secondary:`border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50`,outline:`border-(--button-outline-border) bg-transparent text-(--button-outline-foreground) hover:bg-(--button-solid) hover:text-(--button-solid-foreground) hover:[&_svg]:text-(--button-solid-foreground) data-[loading=true]:hover:bg-background data-[loading=true]:hover:text-(--button-outline-foreground) aria-expanded:bg-(--button-solid) aria-expanded:text-(--button-solid-foreground) aria-expanded:[&_svg]:text-(--button-solid-foreground)`,subtle:`bg-(--button-soft) text-(--button-soft-foreground) hover:bg-(--button-soft-hover) hover:text-(--button-soft-foreground) data-[loading=true]:hover:bg-(--button-soft) data-[loading=true]:hover:text-(--button-soft-foreground) aria-expanded:bg-(--button-soft-hover) aria-expanded:text-(--button-soft-foreground)`,ghost:`text-(--button-ghost-foreground) hover:bg-(--button-ghost-hover) hover:text-(--button-ghost-foreground) data-[loading=true]:hover:bg-transparent data-[loading=true]:hover:text-(--button-ghost-foreground) aria-expanded:bg-(--button-ghost-hover) aria-expanded:text-(--button-ghost-foreground)`,link:`text-(--button-link-foreground) underline-offset-4 hover:underline data-[loading=true]:hover:no-underline`},color:t,size:{xs:`h-7 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3`,sm:`h-8 gap-1 px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5`,md:`h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2`,lg:`h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3`,xl:`h-11 gap-2 px-3 has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4`,icon:`size-9`,"icon-xs":`size-7 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3`,"icon-sm":`size-8 in-data-[slot=button-group]:rounded-lg`,"icon-lg":`size-10`,"icon-xl":`size-11`}},defaultVariants:{variant:`solid`,color:`primary`,size:`md`}});function Button({children:t,className:s,variant:l=`solid`,color:u=`primary`,size:d=`md`,asChild:f=!1,disabled:p,loading:m=!1,...h}){return a(f?r.Root:`button`,{type:f?void 0:`button`,"data-slot":`button`,"data-variant":l,"data-color":u,"data-size":d,"data-loading":m,"aria-busy":m?!0:void 0,disabled:p||m,className:e(c({variant:l,color:u,size:d,className:s})),...h,children:m&&!f?o(i,{children:[a(`span`,{className:`invisible inline-flex items-center gap-[inherit]`,children:t}),a(`span`,{className:`absolute inset-0 inline-flex items-center justify-center`,children:a(n,{})})]}):m?a(n,{}):t})}export{Button,c as buttonVariants};
|
|
2
2
|
//# sourceMappingURL=button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","names":[],"sources":["../../src/components/button.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { buttonColorVariants } from '../lib/button'\nimport { cn } from '../lib/utils'\nimport { Spinner } from './spinner'\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 relative rounded-full border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all [&_svg]:transition-colors disabled:pointer-events-none disabled:opacity-50 disabled:data-[loading=true]:pointer-events-auto disabled:data-[loading=true]:cursor-not-allowed disabled:data-[loading=true]:opacity-100 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n solid:\n 'bg-(--button-solid) text-(--button-solid-foreground) hover:bg-(--button-solid-hover) data-[loading=true]:hover:bg-(--button-solid)',\n outline:\n 'border-(--button-outline-border) bg-
|
|
1
|
+
{"version":3,"file":"button.js","names":[],"sources":["../../src/components/button.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { buttonColorVariants } from '../lib/button'\nimport { cn } from '../lib/utils'\nimport { Spinner } from './spinner'\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 relative rounded-full border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all [&_svg]:transition-colors disabled:pointer-events-none disabled:opacity-50 disabled:data-[loading=true]:pointer-events-auto disabled:data-[loading=true]:cursor-not-allowed disabled:data-[loading=true]:opacity-100 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n solid:\n 'bg-(--button-solid) text-(--button-solid-foreground) hover:bg-(--button-solid-hover) data-[loading=true]:hover:bg-(--button-solid)',\n secondary:\n 'border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50',\n outline:\n 'border-(--button-outline-border) bg-transparent text-(--button-outline-foreground) hover:bg-(--button-solid) hover:text-(--button-solid-foreground) hover:[&_svg]:text-(--button-solid-foreground) data-[loading=true]:hover:bg-background data-[loading=true]:hover:text-(--button-outline-foreground) aria-expanded:bg-(--button-solid) aria-expanded:text-(--button-solid-foreground) aria-expanded:[&_svg]:text-(--button-solid-foreground)',\n subtle:\n 'bg-(--button-soft) text-(--button-soft-foreground) hover:bg-(--button-soft-hover) hover:text-(--button-soft-foreground) data-[loading=true]:hover:bg-(--button-soft) data-[loading=true]:hover:text-(--button-soft-foreground) aria-expanded:bg-(--button-soft-hover) aria-expanded:text-(--button-soft-foreground)',\n ghost:\n 'text-(--button-ghost-foreground) hover:bg-(--button-ghost-hover) hover:text-(--button-ghost-foreground) data-[loading=true]:hover:bg-transparent data-[loading=true]:hover:text-(--button-ghost-foreground) aria-expanded:bg-(--button-ghost-hover) aria-expanded:text-(--button-ghost-foreground)',\n link: 'text-(--button-link-foreground) underline-offset-4 hover:underline data-[loading=true]:hover:no-underline'\n },\n color: buttonColorVariants,\n size: {\n xs: \"h-7 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n md: 'h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n lg: 'h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3',\n xl: 'h-11 gap-2 px-3 has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4',\n icon: 'size-9',\n 'icon-xs': \"size-7 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n 'icon-sm': 'size-8 in-data-[slot=button-group]:rounded-lg',\n 'icon-lg': 'size-10',\n 'icon-xl': 'size-11'\n }\n },\n defaultVariants: {\n variant: 'solid',\n color: 'primary',\n size: 'md'\n }\n }\n)\n\nexport type ButtonProps = React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n loading?: boolean\n }\n\nfunction Button({\n children,\n className,\n variant = 'solid',\n color = 'primary',\n size = 'md',\n asChild = false,\n disabled,\n loading = false,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot.Root : 'button'\n const isDisabled = disabled || loading\n\n return (\n <Comp\n type={!asChild ? 'button' : undefined}\n data-slot=\"button\"\n data-variant={variant}\n data-color={color}\n data-size={size}\n data-loading={loading}\n aria-busy={loading ? true : undefined}\n disabled={isDisabled}\n className={cn(buttonVariants({ variant, color, size, className }))}\n {...props}\n >\n {loading && !asChild ? (\n <>\n <span className=\"invisible inline-flex items-center gap-[inherit]\">{children}</span>\n <span className=\"absolute inset-0 inline-flex items-center justify-center\">\n <Spinner />\n </span>\n </>\n ) : loading ? (\n <Spinner />\n ) : (\n children\n )}\n </Comp>\n )\n}\n\nexport { Button, buttonVariants }\n"],"mappings":"+SASA,MAAM,EAAiB,EACrB,kuBACA,CACE,SAAU,CACR,QAAS,CACP,MACE,qIACF,UACE,kLACF,QACE,kbACF,OACE,sTACF,MACE,qSACF,KAAM,2GACR,EACA,MAAO,EACP,KAAM,CACJ,GAAI,2KACJ,GAAI,qLACJ,GAAI,8HACJ,GAAI,wFACJ,GAAI,oFACJ,KAAM,SACN,UAAW,qFACX,UAAW,gDACX,UAAW,UACX,UAAW,SACb,CACF,EACA,gBAAiB,CACf,QAAS,QACT,MAAO,UACP,KAAM,IACR,CACF,CACF,EAQA,SAAS,OAAO,CACd,WACA,YACA,UAAU,QACV,QAAQ,UACR,OAAO,KACP,UAAU,GACV,WACA,UAAU,GACV,GAAG,GACW,CAId,OACE,EAJW,EAAU,EAAK,KAAO,SAIjC,CACE,KAAO,EAAqB,IAAA,GAAX,SACjB,YAAU,SACV,eAAc,EACd,aAAY,EACZ,YAAW,EACX,eAAc,EACd,YAAW,EAAU,GAAO,IAAA,GAC5B,SAXe,GAAY,EAY3B,UAAW,EAAG,EAAe,CAAE,UAAS,QAAO,OAAM,WAAU,CAAC,CAAC,EACjE,GAAI,WAEH,GAAW,CAAC,EACX,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,OAAD,CAAM,UAAU,mDAAoD,UAAe,CAAA,EACnF,EAAC,OAAD,CAAM,UAAU,oEACd,EAAC,EAAD,CAAU,CAAA,CACN,CAAA,CACN,CAAA,CAAA,EACA,EACF,EAAC,EAAD,CAAU,CAAA,EAEV,CAEE,CAAA,CAEV"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{useFieldControlId as n}from"./field.js";import{InputGroup as r,InputGroupAddon as i,InputGroupButton as a,InputGroupInput as o}from"./input-group.js";import{IconCheck as s,IconSelector as c,IconX as l}from"@tabler/icons-react";import{jsx as u,jsxs as d}from"react/jsx-runtime";import*as f from"react";import{Combobox as p}from"@base-ui/react";const m=p.Root;function ComboboxValue({...e}){return u(p.Value,{"data-slot":`combobox-value`,...e})}function ComboboxTrigger({className:t,children:n,icon:r=u(c,{className:`pointer-events-none size-4 text-muted-foreground`}),...i}){return d(p.Trigger,{"data-slot":`combobox-trigger`,className:e(`[&_svg:not([class*='size-'])]:size-4`,t),...i,children:[n,r]})}function ComboboxClear({className:t,...n}){return u(p.Clear,{"data-slot":`combobox-clear`,render:u(a,{variant:`ghost`,size:`icon-xs`}),className:e(t),...n,children:u(l,{className:`pointer-events-none`})})}function ComboboxInput({className:t,children:s,disabled:c=!1,icon:l,id:f,showTrigger:m=!0,showClear:h=!1,triggerIcon:g,..._}){let v=n(f);return d(r,{className:e(`w-auto`,t),children:[l&&u(i,{align:`inline-start`,children:l}),u(p.Input,{id:v,render:u(o,{disabled:c}),..._}),d(i,{align:`inline-end`,children:[m&&u(a,{size:`icon-xs`,variant:`ghost`,asChild:!0,"data-slot":`input-group-button`,className:`group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent`,disabled:c,children:u(ComboboxTrigger,{icon:g})}),h&&u(ComboboxClear,{disabled:c})]}),s]})}function ComboboxContent({className:t,side:n=`bottom`,sideOffset:r=6,align:i=`start`,alignOffset:a=0,anchor:o,container:s,...c}){return u(p.Portal,{container:s,className:`absolute`,children:u(p.Positioner,{side:n,sideOffset:r,align:i,alignOffset:a,anchor:o,className:`isolate z-50`,children:u(p.Popup,{"data-slot":`combobox-content`,"data-chips":!!o,className:e(`group/combobox-content max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{useFieldControlId as n}from"./field.js";import{InputGroup as r,InputGroupAddon as i,InputGroupButton as a,InputGroupInput as o}from"./input-group.js";import{IconCheck as s,IconSelector as c,IconX as l}from"@tabler/icons-react";import{jsx as u,jsxs as d}from"react/jsx-runtime";import*as f from"react";import{Combobox as p}from"@base-ui/react";const m=p.Root;function ComboboxValue({...e}){return u(p.Value,{"data-slot":`combobox-value`,...e})}function ComboboxTrigger({className:t,children:n,icon:r=u(c,{className:`pointer-events-none size-4 text-muted-foreground`}),...i}){return d(p.Trigger,{"data-slot":`combobox-trigger`,className:e(`[&_svg:not([class*='size-'])]:size-4`,t),...i,children:[n,r]})}function ComboboxClear({className:t,...n}){return u(p.Clear,{"data-slot":`combobox-clear`,render:u(a,{variant:`ghost`,size:`icon-xs`}),className:e(t),...n,children:u(l,{className:`pointer-events-none`})})}function ComboboxInput({className:t,children:s,disabled:c=!1,icon:l,id:f,showTrigger:m=!0,showClear:h=!1,triggerIcon:g,..._}){let v=n(f);return d(r,{className:e(`w-auto`,t),children:[l&&u(i,{align:`inline-start`,children:l}),u(p.Input,{id:v,render:u(o,{disabled:c}),..._}),d(i,{align:`inline-end`,children:[m&&u(a,{size:`icon-xs`,variant:`ghost`,asChild:!0,"data-slot":`input-group-button`,className:`group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent`,disabled:c,children:u(ComboboxTrigger,{icon:g})}),h&&u(ComboboxClear,{disabled:c})]}),s]})}function ComboboxContent({className:t,side:n=`bottom`,sideOffset:r=6,align:i=`start`,alignOffset:a=0,anchor:o,container:s,...c}){return u(p.Portal,{container:s,className:`absolute`,children:u(p.Positioner,{side:n,sideOffset:r,align:i,alignOffset:a,anchor:o,className:`isolate z-50`,children:u(p.Popup,{"data-slot":`combobox-content`,"data-chips":!!o,className:e(`group/combobox-content max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+(--spacing(7)))] origin-(--transform-origin) overflow-hidden rounded-lg text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:focus:bg-foreground/10 **:data-[slot$=-item]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-foreground/5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! **:data-[variant=destructive]:focus:bg-foreground/10! **:data-[variant=destructive]:text-accent-foreground! **:data-[variant=destructive]:**:text-accent-foreground!`,t),...c})})})}function ComboboxList({className:t,...n}){return u(p.List,{"data-slot":`combobox-list`,className:e(`no-scrollbar max-h-[min(calc(--spacing(72)-(--spacing(9))),calc(var(--available-height)-(--spacing(9))))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0`,t),...n})}function ComboboxItem({className:t,children:n,...r}){return d(p.Item,{"data-slot":`combobox-item`,className:e(`relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,t),...r,children:[n,u(p.ItemIndicator,{render:u(`span`,{className:`pointer-events-none absolute right-2 flex size-4 items-center justify-center`}),children:u(s,{className:`pointer-events-none`})})]})}function ComboboxGroup({className:t,...n}){return u(p.Group,{"data-slot":`combobox-group`,className:e(t),...n})}function ComboboxLabel({className:t,...n}){return u(p.GroupLabel,{"data-slot":`combobox-label`,className:e(`px-2 py-1.5 text-xs text-muted-foreground`,t),...n})}function ComboboxCollection({...e}){return u(p.Collection,{"data-slot":`combobox-collection`,...e})}function ComboboxEmpty({className:t,...n}){return u(p.Empty,{"data-slot":`combobox-empty`,className:e(`hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex`,t),...n})}function ComboboxSeparator({className:t,...n}){return u(p.Separator,{"data-slot":`combobox-separator`,className:e(`-mx-1 my-1 h-px bg-border`,t),...n})}function ComboboxChips({className:t,...n}){return u(p.Chips,{"data-slot":`combobox-chips`,className:e(`flex min-h-8 overflow-hidden flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40`,t),...n})}function ComboboxChip({className:n,children:r,showRemove:i=!0,...a}){return d(p.Chip,{"data-slot":`combobox-chip`,className:e(`flex h-[calc(--spacing(5.25))] w-fit text-left max-w-full items-center justify-start gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0`,n),...a,children:[u(`span`,{className:`flex-1 truncate`,children:r}),i&&u(p.ChipRemove,{render:u(t,{variant:`ghost`,color:`zinc`,size:`icon-xs`}),className:`-ml-1 opacity-50 shrink-0 hover:opacity-100`,"data-slot":`combobox-chip-remove`,children:u(l,{className:`pointer-events-none`})})]})}function ComboboxChipsInput({className:t,id:r,...i}){let a=n(r);return u(p.Input,{id:a,"data-slot":`combobox-chip-input`,className:e(`min-w-16 flex-1 outline-none`,t),...i})}function useComboboxAnchor(){return f.useRef(null)}export{m as Combobox,ComboboxChip,ComboboxChips,ComboboxChipsInput,ComboboxClear,ComboboxCollection,ComboboxContent,ComboboxEmpty,ComboboxGroup,ComboboxInput,ComboboxItem,ComboboxLabel,ComboboxList,ComboboxSeparator,ComboboxTrigger,ComboboxValue,useComboboxAnchor};
|
|
2
2
|
//# sourceMappingURL=combobox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.js","names":["ComboboxPrimitive"],"sources":["../../src/components/combobox.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { Combobox as ComboboxPrimitive } from '@base-ui/react'\nimport { IconCheck, IconSelector, IconX } from '@tabler/icons-react'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { useFieldControlId } from './field'\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from './input-group'\n\nexport type ComboboxProps = React.ComponentProps<typeof ComboboxPrimitive.Root>\n\nexport type ComboboxValueProps = ComboboxPrimitive.Value.Props\n\nexport type ComboboxTriggerProps = ComboboxPrimitive.Trigger.Props & {\n icon?: React.ReactNode\n}\n\nexport type ComboboxClearProps = ComboboxPrimitive.Clear.Props\n\nexport type ComboboxInputProps = ComboboxPrimitive.Input.Props & {\n icon?: React.ReactNode\n triggerIcon?: React.ReactNode\n showTrigger?: boolean\n showClear?: boolean\n}\n\nexport type ComboboxContentProps = ComboboxPrimitive.Popup.Props &\n Pick<ComboboxPrimitive.Positioner.Props, 'side' | 'align' | 'sideOffset' | 'alignOffset' | 'anchor'> &\n Pick<ComboboxPrimitive.Portal.Props, 'container'>\n\nexport type ComboboxListProps = ComboboxPrimitive.List.Props\n\nexport type ComboboxItemProps = ComboboxPrimitive.Item.Props\n\nexport type ComboboxGroupProps = ComboboxPrimitive.Group.Props\n\nexport type ComboboxLabelProps = ComboboxPrimitive.GroupLabel.Props\n\nexport type ComboboxCollectionProps = ComboboxPrimitive.Collection.Props\n\nexport type ComboboxEmptyProps = ComboboxPrimitive.Empty.Props\n\nexport type ComboboxSeparatorProps = ComboboxPrimitive.Separator.Props\n\nexport type ComboboxChipsProps = React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props\n\nexport type ComboboxChipProps = ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}\n\nexport type ComboboxChipsInputProps = ComboboxPrimitive.Input.Props\n\nconst Combobox = ComboboxPrimitive.Root\n\nfunction ComboboxValue({ ...props }: ComboboxValueProps) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n icon = <IconSelector className=\"pointer-events-none size-4 text-muted-foreground\" />,\n ...props\n}: ComboboxTriggerProps) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n {icon}\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxClearProps) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <IconX className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n icon,\n id,\n showTrigger = true,\n showClear = false,\n triggerIcon,\n ...props\n}: ComboboxInputProps) {\n const fieldControlId = useFieldControlId(id)\n\n return (\n <InputGroup className={cn('w-auto', className)}>\n {icon && <InputGroupAddon align=\"inline-start\">{icon}</InputGroupAddon>}\n <ComboboxPrimitive.Input id={fieldControlId} render={<InputGroupInput disabled={disabled} />} {...props} />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n asChild\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n >\n <ComboboxTrigger icon={triggerIcon} />\n </InputGroupButton>\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = 'bottom',\n sideOffset = 6,\n align = 'start',\n alignOffset = 0,\n anchor,\n container,\n ...props\n}: ComboboxContentProps) {\n return (\n <ComboboxPrimitive.Portal container={container} className=\"absolute\">\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\n 'group/combobox-content max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:focus:bg-foreground/10 **:data-[slot$=-item]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-foreground/5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! **:data-[variant=destructive]:focus:bg-foreground/10! **:data-[variant=destructive]:text-accent-foreground! **:data-[variant=destructive]:**:text-accent-foreground!',\n className\n )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxListProps) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n 'no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({ className, children, ...props }: ComboboxItemProps) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={<span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />}\n >\n <IconCheck className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxGroupProps) {\n return <ComboboxPrimitive.Group data-slot=\"combobox-group\" className={cn(className)} {...props} />\n}\n\nfunction ComboboxLabel({ className, ...props }: ComboboxLabelProps) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn('px-2 py-1.5 text-xs text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxCollectionProps) {\n return <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxEmptyProps) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n 'hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({ className, ...props }: ComboboxSeparatorProps) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({ className, ...props }: ComboboxChipsProps) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n 'flex min-h-8 overflow-hidden flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({ className, children, showRemove = true, ...props }: ComboboxChipProps) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n 'flex h-[calc(--spacing(5.25))] w-fit text-left max-w-full items-center justify-start gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0',\n className\n )}\n {...props}\n >\n <span className=\"flex-1 truncate\">{children}</span>\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" color=\"zinc\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 shrink-0 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <IconX className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({ className, id, ...props }: ComboboxChipsInputProps) {\n const fieldControlId = useFieldControlId(id)\n\n return (\n <ComboboxPrimitive.Input\n id={fieldControlId}\n data-slot=\"combobox-chip-input\"\n className={cn('min-w-16 flex-1 outline-none', className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxClear,\n ComboboxCollection,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxGroup,\n ComboboxInput,\n ComboboxItem,\n ComboboxLabel,\n ComboboxList,\n ComboboxSeparator,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"combobox.js","names":["ComboboxPrimitive"],"sources":["../../src/components/combobox.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { Combobox as ComboboxPrimitive } from '@base-ui/react'\nimport { IconCheck, IconSelector, IconX } from '@tabler/icons-react'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { useFieldControlId } from './field'\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from './input-group'\n\nexport type ComboboxProps = React.ComponentProps<typeof ComboboxPrimitive.Root>\n\nexport type ComboboxValueProps = ComboboxPrimitive.Value.Props\n\nexport type ComboboxTriggerProps = ComboboxPrimitive.Trigger.Props & {\n icon?: React.ReactNode\n}\n\nexport type ComboboxClearProps = ComboboxPrimitive.Clear.Props\n\nexport type ComboboxInputProps = ComboboxPrimitive.Input.Props & {\n icon?: React.ReactNode\n triggerIcon?: React.ReactNode\n showTrigger?: boolean\n showClear?: boolean\n}\n\nexport type ComboboxContentProps = ComboboxPrimitive.Popup.Props &\n Pick<ComboboxPrimitive.Positioner.Props, 'side' | 'align' | 'sideOffset' | 'alignOffset' | 'anchor'> &\n Pick<ComboboxPrimitive.Portal.Props, 'container'>\n\nexport type ComboboxListProps = ComboboxPrimitive.List.Props\n\nexport type ComboboxItemProps = ComboboxPrimitive.Item.Props\n\nexport type ComboboxGroupProps = ComboboxPrimitive.Group.Props\n\nexport type ComboboxLabelProps = ComboboxPrimitive.GroupLabel.Props\n\nexport type ComboboxCollectionProps = ComboboxPrimitive.Collection.Props\n\nexport type ComboboxEmptyProps = ComboboxPrimitive.Empty.Props\n\nexport type ComboboxSeparatorProps = ComboboxPrimitive.Separator.Props\n\nexport type ComboboxChipsProps = React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props\n\nexport type ComboboxChipProps = ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}\n\nexport type ComboboxChipsInputProps = ComboboxPrimitive.Input.Props\n\nconst Combobox = ComboboxPrimitive.Root\n\nfunction ComboboxValue({ ...props }: ComboboxValueProps) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n icon = <IconSelector className=\"pointer-events-none size-4 text-muted-foreground\" />,\n ...props\n}: ComboboxTriggerProps) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n {icon}\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxClearProps) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <IconX className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n icon,\n id,\n showTrigger = true,\n showClear = false,\n triggerIcon,\n ...props\n}: ComboboxInputProps) {\n const fieldControlId = useFieldControlId(id)\n\n return (\n <InputGroup className={cn('w-auto', className)}>\n {icon && <InputGroupAddon align=\"inline-start\">{icon}</InputGroupAddon>}\n <ComboboxPrimitive.Input id={fieldControlId} render={<InputGroupInput disabled={disabled} />} {...props} />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n asChild\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n >\n <ComboboxTrigger icon={triggerIcon} />\n </InputGroupButton>\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = 'bottom',\n sideOffset = 6,\n align = 'start',\n alignOffset = 0,\n anchor,\n container,\n ...props\n}: ComboboxContentProps) {\n return (\n <ComboboxPrimitive.Portal container={container} className=\"absolute\">\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\n 'group/combobox-content max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+(--spacing(7)))] origin-(--transform-origin) overflow-hidden rounded-lg text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:focus:bg-foreground/10 **:data-[slot$=-item]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-foreground/5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! **:data-[variant=destructive]:focus:bg-foreground/10! **:data-[variant=destructive]:text-accent-foreground! **:data-[variant=destructive]:**:text-accent-foreground!',\n className\n )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxListProps) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n 'no-scrollbar max-h-[min(calc(--spacing(72)-(--spacing(9))),calc(var(--available-height)-(--spacing(9))))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({ className, children, ...props }: ComboboxItemProps) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={<span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />}\n >\n <IconCheck className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxGroupProps) {\n return <ComboboxPrimitive.Group data-slot=\"combobox-group\" className={cn(className)} {...props} />\n}\n\nfunction ComboboxLabel({ className, ...props }: ComboboxLabelProps) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn('px-2 py-1.5 text-xs text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxCollectionProps) {\n return <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxEmptyProps) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n 'hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({ className, ...props }: ComboboxSeparatorProps) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({ className, ...props }: ComboboxChipsProps) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n 'flex min-h-8 overflow-hidden flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({ className, children, showRemove = true, ...props }: ComboboxChipProps) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n 'flex h-[calc(--spacing(5.25))] w-fit text-left max-w-full items-center justify-start gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0',\n className\n )}\n {...props}\n >\n <span className=\"flex-1 truncate\">{children}</span>\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" color=\"zinc\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 shrink-0 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <IconX className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({ className, id, ...props }: ComboboxChipsInputProps) {\n const fieldControlId = useFieldControlId(id)\n\n return (\n <ComboboxPrimitive.Input\n id={fieldControlId}\n data-slot=\"combobox-chip-input\"\n className={cn('min-w-16 flex-1 outline-none', className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxClear,\n ComboboxCollection,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxGroup,\n ComboboxInput,\n ComboboxItem,\n ComboboxLabel,\n ComboboxList,\n ComboboxSeparator,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{Checkbox as n}from"./checkbox.js";import{Input as r}from"./input.js";import{InputGroup as i,InputGroupAddon as a,InputGroupInput as o}from"./input-group.js";import{DropdownMenu as s,DropdownMenuCheckboxItem as c,DropdownMenuContent as l,DropdownMenuGroup as u,DropdownMenuTrigger as d}from"./dropdown-menu.js";import{Select as f,SelectContent as p,SelectGroup as m,SelectItem as h,SelectTrigger as g,SelectValue as _}from"./select.js";import{Table as v,TableBody as y,TableCell as b,TableContainer as x,TableHead as S,TableHeader as C,TableRow as w}from"./table.js";import{IconArrowsSort as T,IconChevronLeft as E,IconChevronRight as D,IconChevronsLeft as O,IconChevronsRight as k,IconColumns3 as A,IconSortAscending as j,IconSortDescending as M}from"@tabler/icons-react";import{jsx as N,jsxs as P}from"react/jsx-runtime";import*as F from"react";import{flexRender as I,getCoreRowModel as L,getFilteredRowModel as R,getPaginationRowModel as z,getSortedRowModel as B,useReactTable as V}from"@tanstack/react-table";const H={filterPlaceholder:`Filtrar linhas...`,filterColumnSelectorLabel:`Coluna para filtrar`,emptyMessage:`Nenhum resultado.`,columnsButton:`Colunas`,rowsPerPage:`Linhas por página`,pageOf:(e,t)=>`Página ${e} de ${t}`,goToFirstPage:`Ir para a primeira página`,goToPreviousPage:`Ir para a página anterior`,goToNextPage:`Ir para a próxima página`,goToLastPage:`Ir para a última página`,selectAllRows:`Selecionar todas as linhas`,selectRow:`Selecionar linha`},U=F.createContext(null);function useDataTableContext(){let e=F.useContext(U);if(!e)throw Error(`useDataTableContext must be used within <DataTableRoot>`);return e}function useOptionalDataTableContext(){return F.useContext(U)}function renderToolbarActions(e,t){return typeof e==`function`?e(t):e}function getColumnLabel(e){return e?e.columnDef.meta?.label??e.id:``}function useDataTable({columns:e,data:t,getRowId:n,pageSize:r=10,enableRowSelection:i=!1,enableSorting:a=!1,enablePagination:o=!0,labels:s}){let[c,l]=F.useState([]),[u,d]=F.useState([]),[f,p]=F.useState({}),[m,h]=F.useState({pageIndex:0,pageSize:r}),[g,_]=F.useState({}),v=F.useMemo(()=>({...H,...s}),[s]);return V({data:t,columns:F.useMemo(()=>!i||e.some(e=>e.id===`select`)?e:[createDataTableSelectColumn({labels:{selectAllRows:v.selectAllRows,selectRow:v.selectRow}}),...e],[e,i,v.selectAllRows,v.selectRow]),getRowId:n,enableRowSelection:i,enableSorting:a,state:{sorting:c,columnFilters:u,columnVisibility:f,rowSelection:g,pagination:m},onSortingChange:l,onColumnFiltersChange:d,onColumnVisibilityChange:p,onPaginationChange:h,onRowSelectionChange:_,getCoreRowModel:L(),getFilteredRowModel:R(),getPaginationRowModel:o?z():void 0,getSortedRowModel:a?B():void 0})}function DataTableRootControlled({table:t,labels:n,className:r,children:i}){let a={table:t,labels:F.useMemo(()=>({...H,...n}),[n])};return N(U.Provider,{value:a,children:N(`div`,{className:e(`flex w-full flex-col gap-4`,r),children:i})})}function DataTableRootUncontrolled({columns:e,data:t,getRowId:n,pageSize:r,enableRowSelection:i,enableSorting:a,enablePagination:o,labels:s,className:c,children:l}){return N(DataTableRootControlled,{table:useDataTable({columns:e,data:t,getRowId:n,pageSize:r,enableRowSelection:i,enableSorting:a,enablePagination:o,labels:s}),labels:s,className:c,children:l})}function DataTableRoot(e){if(`table`in e&&e.table!==void 0){let{table:t,labels:n,className:r,children:i}=e;return N(DataTableRootControlled,{table:t,labels:n,className:r,children:i})}let{columns:t,data:n,getRowId:r,pageSize:i,enableRowSelection:a,enableSorting:o,enablePagination:s,labels:c,className:l,children:u}=e;return N(DataTableRootUncontrolled,{columns:t,data:n,getRowId:r,pageSize:i,enableRowSelection:a,enableSorting:o,enablePagination:s,labels:c,className:l,children:u})}function DataTableColumnHeader({column:n,title:r,className:i,...a}){if(!n.getCanSort())return N(`div`,{className:e(`inline-flex items-center gap-1`,i),...a,children:r});let o=n.getIsSorted();return P(`div`,{className:e(`inline-flex items-center gap-1`,i),...a,children:[r,N(t,{variant:`ghost`,color:`zinc`,size:`icon-xs`,onClick:()=>{if(o===`desc`)return n.clearSorting();n.toggleSorting(o===`asc`)},children:N(o===`desc`?M:o===`asc`?j:T,{className:`size-4`,"data-icon":`inline-end`})})]})}function DataTableViewOptions({table:n,label:r,className:i,...a}){let o=useOptionalDataTableContext(),f=n??o?.table;if(!f)throw Error("DataTableViewOptions requires a `table` prop or to be rendered within <DataTableRoot>");let p=r??o?.labels.columnsButton??H.columnsButton,m=f.getAllColumns().filter(e=>e.accessorFn!==void 0&&e.getCanHide());return m.length===0?null:P(s,{children:[N(d,{asChild:!0,children:P(t,{type:`button`,variant:`outline`,color:`zinc`,size:`sm`,className:e(`ml-auto`,i),...a,children:[N(A,{"data-icon":`inline-start`}),p]})}),N(l,{align:`end`,className:`w-44`,children:N(u,{children:m.map(e=>N(c,{checked:e.getIsVisible(),onCheckedChange:t=>e.toggleVisibility(!!t),children:e.id},e.id))})})]})}function DataTableToolbar({filterColumns:t,showColumnVisibility:n,toolbarActions:s,labels:c,className:l}){let{table:u,labels:d}=useDataTableContext(),f=F.useMemo(()=>c?{...d,...c}:d,[d,c]),p=F.useMemo(()=>t?Array.isArray(t)?t:[t]:[],[t]),m=renderToolbarActions(s,u),h=p.length>0,[g,_]=F.useState(p[0]);if(F.useEffect(()=>{if(p.length===0){_(void 0);return}_(e=>e&&p.includes(e)?e:p[0])},[p]),!h&&!n&&!m)return null;let v=g?u.getColumn(g):void 0,y=v?.getFilterValue()??``,handleColumnChange=e=>{e!==g&&(g&&u.getColumn(g)?.setFilterValue(void 0),_(e))};return P(`div`,{className:e(`flex flex-col gap-2 sm:flex-row sm:items-center`,l),children:[h&&v?p.length>1?P(i,{className:`h-8 w-full sm:max-w-md`,children:[N(a,{align:`inline-start`,className:`pr-0`,children:N(`select`,{"aria-label":f.filterColumnSelectorLabel,value:g,onChange:e=>handleColumnChange(e.target.value),className:`cursor-pointer appearance-none border-0 bg-transparent pr-1 text-sm font-medium text-foreground outline-none focus:outline-none`,children:p.map(e=>N(`option`,{value:e,children:getColumnLabel(u.getColumn(e))},e))})}),N(o,{placeholder:f.filterPlaceholder,value:y,onChange:e=>v.setFilterValue(e.target.value)})]}):N(r,{placeholder:f.filterPlaceholder,value:y,onChange:e=>v.setFilterValue(e.target.value),className:`h-8 w-full sm:max-w-xs`}):null,P(`div`,{className:`flex flex-1 items-center justify-end gap-2`,children:[m,n?N(DataTableViewOptions,{table:u,label:f.columnsButton}):null]})]})}function DataTableHeader({className:e}={}){let{table:t}=useDataTableContext();return N(C,{className:e,children:t.getHeaderGroups().map(e=>N(w,{children:e.headers.map(e=>N(S,{colSpan:e.colSpan,children:e.isPlaceholder?null:I(e.column.columnDef.header,e.getContext())},e.id))},e.id))})}function DataTableBody({emptyMessage:e,className:t}={}){let{table:n,labels:r}=useDataTableContext(),i=n.getRowModel().rows,a=n.getVisibleLeafColumns().length,o=e??r.emptyMessage;return N(y,{className:t,children:i.length===0?N(w,{children:N(b,{colSpan:a,className:`h-24 text-center`,children:o})}):i.map(e=>N(w,{"data-state":e.getIsSelected()?`selected`:void 0,children:e.getVisibleCells().map(e=>N(b,{children:I(e.column.columnDef.cell,e.getContext())},e.id))},e.id))})}function DataTablePagination({table:n,pageSizeOptions:r=[10,20,30,40,50],labels:i,className:a,...o}){let s=useOptionalDataTableContext(),c=n??s?.table;if(!c)throw Error("DataTablePagination requires a `table` prop or to be rendered within <DataTableRoot>");let l=F.useMemo(()=>({...H,...s?.labels,...i}),[s?.labels,i]),u=c.getPageCount(),d=Math.max(u,1),v=c.getState().pagination.pageIndex;return N(`div`,{className:e(`flex items-center justify-end gap-4 px-2`,a),...o,children:P(`div`,{className:`flex items-center gap-6 lg:gap-8`,children:[P(`div`,{className:`hidden items-center gap-2 sm:flex`,children:[N(`p`,{className:`text-sm font-medium`,children:l.rowsPerPage}),P(f,{value:`${c.getState().pagination.pageSize}`,onValueChange:e=>c.setPageSize(Number(e)),children:[N(g,{size:`sm`,className:`h-8 w-20`,children:N(_,{})}),N(p,{side:`top`,children:N(m,{children:r.map(e=>N(h,{value:`${e}`,children:e},e))})})]})]}),N(`div`,{className:`text-sm font-medium`,children:l.pageOf(v+1,d)}),P(`div`,{className:`flex items-center gap-1`,children:[N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,className:`hidden lg:inline-flex`,onClick:()=>c.setPageIndex(0),disabled:!c.getCanPreviousPage(),"aria-label":l.goToFirstPage,children:N(O,{})}),N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,onClick:()=>c.previousPage(),disabled:!c.getCanPreviousPage(),"aria-label":l.goToPreviousPage,children:N(E,{})}),N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,onClick:()=>c.nextPage(),disabled:!c.getCanNextPage(),"aria-label":l.goToNextPage,children:N(D,{})}),N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,className:`hidden lg:inline-flex`,onClick:()=>c.setPageIndex(u-1),disabled:!c.getCanNextPage(),"aria-label":l.goToLastPage,children:N(k,{})})]})]})})}function createDataTableSelectColumn(e){let t=e?.labels?.selectAllRows??H.selectAllRows,r=e?.labels?.selectRow??H.selectRow;return{id:`select`,enableSorting:!1,enableHiding:!1,header:({table:e})=>N(n,{"aria-label":t,checked:e.getIsAllPageRowsSelected()||e.getIsSomePageRowsSelected()&&`indeterminate`,onCheckedChange:t=>e.toggleAllPageRowsSelected(!!t)}),cell:({row:e})=>N(n,{"aria-label":r,checked:e.getIsSelected()||e.getIsSomeSelected()&&`indeterminate`,disabled:!e.getCanSelect(),onCheckedChange:t=>e.toggleSelected(!!t)})}}function DataTable({columns:e,data:t,getRowId:n,filterColumns:r,pageSize:i=10,pageSizeOptions:a,enableRowSelection:o=!1,enableSorting:s=!1,showPagination:c=!1,showColumnVisibility:l=!1,toolbarActions:u,labels:d,className:f,tableClassName:p,variant:m}){return P(DataTableRoot,{columns:e,data:t,getRowId:n,pageSize:i,enableRowSelection:o,enableSorting:s,labels:d,className:f,children:[N(DataTableToolbar,{filterColumns:r,showColumnVisibility:l,toolbarActions:u}),N(x,{children:P(v,{className:p,variant:m,children:[N(DataTableHeader,{}),N(DataTableBody,{})]})}),c?N(DataTablePagination,{pageSizeOptions:a}):null]})}export{DataTable,DataTableBody,DataTableColumnHeader,DataTableHeader,DataTablePagination,DataTableRoot,DataTableToolbar,DataTableViewOptions,createDataTableSelectColumn,H as defaultDataTableLabels,useDataTable,useDataTableContext};
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{Checkbox as n}from"./checkbox.js";import{Input as r}from"./input.js";import{InputGroup as i,InputGroupAddon as a,InputGroupInput as o}from"./input-group.js";import{DropdownMenu as s,DropdownMenuCheckboxItem as c,DropdownMenuContent as l,DropdownMenuGroup as u,DropdownMenuTrigger as d}from"./dropdown-menu.js";import{Select as f,SelectContent as p,SelectGroup as m,SelectItem as h,SelectTrigger as g,SelectValue as _}from"./select.js";import{Table as v,TableBody as y,TableCell as b,TableContainer as x,TableHead as S,TableHeader as C,TableRow as w}from"./table.js";import{IconArrowsSort as T,IconChevronLeft as E,IconChevronRight as D,IconChevronsLeft as O,IconChevronsRight as k,IconColumns3 as A,IconSortAscending as j,IconSortDescending as M}from"@tabler/icons-react";import{jsx as N,jsxs as P}from"react/jsx-runtime";import*as F from"react";import{flexRender as I,getCoreRowModel as L,getFilteredRowModel as R,getPaginationRowModel as z,getSortedRowModel as B,useReactTable as V}from"@tanstack/react-table";const H={filterPlaceholder:`Filtrar linhas...`,filterColumnSelectorLabel:`Coluna para filtrar`,emptyMessage:`Nenhum resultado.`,columnsButton:`Colunas`,rowsPerPage:`Linhas por página`,pageOf:(e,t)=>`Página ${e} de ${t}`,goToFirstPage:`Ir para a primeira página`,goToPreviousPage:`Ir para a página anterior`,goToNextPage:`Ir para a próxima página`,goToLastPage:`Ir para a última página`,selectAllRows:`Selecionar todas as linhas`,selectRow:`Selecionar linha`},U=F.createContext(null);function useDataTableContext(){let e=F.useContext(U);if(!e)throw Error(`useDataTableContext must be used within <DataTableRoot>`);return e}function useOptionalDataTableContext(){return F.useContext(U)}function renderToolbarActions(e,t){return typeof e==`function`?e(t):e}function getColumnLabel(e){return e?e.columnDef.meta?.label??e.id:``}function useDataTable({columns:e,data:t,getRowId:n,pageSize:r=10,enableRowSelection:i=!1,enableSorting:a=!1,enablePagination:o=!1,labels:s}){let[c,l]=F.useState([]),[u,d]=F.useState([]),[f,p]=F.useState({}),[m,h]=F.useState({pageIndex:0,pageSize:r}),[g,_]=F.useState({}),v=F.useMemo(()=>({...H,...s}),[s]);return V({data:t,columns:F.useMemo(()=>!i||e.some(e=>e.id===`select`)?e:[createDataTableSelectColumn({labels:{selectAllRows:v.selectAllRows,selectRow:v.selectRow}}),...e],[e,i,v.selectAllRows,v.selectRow]),getRowId:n,enableRowSelection:i,enableSorting:a,state:{sorting:c,columnFilters:u,columnVisibility:f,rowSelection:g,pagination:m},onSortingChange:l,onColumnFiltersChange:d,onColumnVisibilityChange:p,onPaginationChange:h,onRowSelectionChange:_,getCoreRowModel:L(),getFilteredRowModel:R(),getPaginationRowModel:o?z():void 0,getSortedRowModel:a?B():void 0})}function DataTableRootControlled({table:t,labels:n,className:r,children:i}){let a={table:t,labels:F.useMemo(()=>({...H,...n}),[n])};return N(U.Provider,{value:a,children:N(`div`,{className:e(`flex w-full flex-col gap-4`,r),children:i})})}function DataTableRootUncontrolled({columns:e,data:t,getRowId:n,pageSize:r,enableRowSelection:i,enableSorting:a,enablePagination:o,labels:s,className:c,children:l}){return N(DataTableRootControlled,{table:useDataTable({columns:e,data:t,getRowId:n,pageSize:r,enableRowSelection:i,enableSorting:a,enablePagination:o,labels:s}),labels:s,className:c,children:l})}function DataTableRoot(e){if(`table`in e&&e.table!==void 0){let{table:t,labels:n,className:r,children:i}=e;return N(DataTableRootControlled,{table:t,labels:n,className:r,children:i})}let{columns:t,data:n,getRowId:r,pageSize:i,enableRowSelection:a,enableSorting:o,enablePagination:s,labels:c,className:l,children:u}=e;return N(DataTableRootUncontrolled,{columns:t,data:n,getRowId:r,pageSize:i,enableRowSelection:a,enableSorting:o,enablePagination:s,labels:c,className:l,children:u})}function DataTableColumnHeader({column:n,title:r,className:i,...a}){if(!n.getCanSort())return N(`div`,{className:e(`inline-flex items-center gap-1`,i),...a,children:r});let o=n.getIsSorted();return P(`div`,{className:e(`inline-flex items-center gap-1`,i),...a,children:[r,N(t,{variant:`ghost`,color:`zinc`,size:`icon-xs`,onClick:()=>{if(o===`desc`)return n.clearSorting();n.toggleSorting(o===`asc`)},children:N(o===`desc`?M:o===`asc`?j:T,{className:`size-4`,"data-icon":`inline-end`})})]})}function DataTableViewOptions({table:n,label:r,className:i,...a}){let o=useOptionalDataTableContext(),f=n??o?.table;if(!f)throw Error("DataTableViewOptions requires a `table` prop or to be rendered within <DataTableRoot>");let p=r??o?.labels.columnsButton??H.columnsButton,m=f.getAllColumns().filter(e=>e.accessorFn!==void 0&&e.getCanHide());return m.length===0?null:P(s,{children:[N(d,{asChild:!0,children:P(t,{type:`button`,variant:`outline`,color:`zinc`,size:`sm`,className:e(`ml-auto`,i),...a,children:[N(A,{"data-icon":`inline-start`}),p]})}),N(l,{align:`end`,className:`w-44`,children:N(u,{children:m.map(e=>N(c,{checked:e.getIsVisible(),onCheckedChange:t=>e.toggleVisibility(!!t),children:e.id},e.id))})})]})}function DataTableToolbar({filterColumns:t,showColumnVisibility:n,toolbarActions:s,labels:c,className:l}){let{table:u,labels:d}=useDataTableContext(),f=F.useMemo(()=>c?{...d,...c}:d,[d,c]),p=F.useMemo(()=>t?Array.isArray(t)?t:[t]:[],[t]),m=renderToolbarActions(s,u),h=p.length>0,[g,_]=F.useState(p[0]);if(F.useEffect(()=>{if(p.length===0){_(void 0);return}_(e=>e&&p.includes(e)?e:p[0])},[p]),!h&&!n&&!m)return null;let v=g?u.getColumn(g):void 0,y=v?.getFilterValue()??``,handleColumnChange=e=>{e!==g&&(g&&u.getColumn(g)?.setFilterValue(void 0),_(e))};return P(`div`,{className:e(`flex flex-col gap-2 sm:flex-row sm:items-center`,l),children:[h&&v?p.length>1?P(i,{className:`h-8 w-full sm:max-w-md`,children:[N(a,{align:`inline-start`,className:`pr-0`,children:N(`select`,{"aria-label":f.filterColumnSelectorLabel,value:g,onChange:e=>handleColumnChange(e.target.value),className:`cursor-pointer appearance-none border-0 bg-transparent pr-1 text-sm font-medium text-foreground outline-none focus:outline-none`,children:p.map(e=>N(`option`,{value:e,children:getColumnLabel(u.getColumn(e))},e))})}),N(o,{placeholder:f.filterPlaceholder,value:y,onChange:e=>v.setFilterValue(e.target.value)})]}):N(r,{placeholder:f.filterPlaceholder,value:y,onChange:e=>v.setFilterValue(e.target.value),className:`h-8 w-full sm:max-w-xs`}):null,P(`div`,{className:`flex flex-1 items-center justify-end gap-2`,children:[m,n?N(DataTableViewOptions,{table:u,label:f.columnsButton}):null]})]})}function DataTableHeader({className:e}={}){let{table:t}=useDataTableContext();return N(C,{className:e,children:t.getHeaderGroups().map(e=>N(w,{children:e.headers.map(e=>N(S,{colSpan:e.colSpan,children:e.isPlaceholder?null:I(e.column.columnDef.header,e.getContext())},e.id))},e.id))})}function DataTableBody({emptyMessage:e,className:t}={}){let{table:n,labels:r}=useDataTableContext(),i=n.getRowModel().rows,a=n.getVisibleLeafColumns().length,o=e??r.emptyMessage;return N(y,{className:t,children:i.length===0?N(w,{children:N(b,{colSpan:a,className:`h-24 text-center`,children:o})}):i.map(e=>N(w,{"data-state":e.getIsSelected()?`selected`:void 0,children:e.getVisibleCells().map(e=>N(b,{children:I(e.column.columnDef.cell,e.getContext())},e.id))},e.id))})}function DataTablePagination({table:n,pageSizeOptions:r=[10,20,30,40,50],labels:i,className:a,...o}){let s=useOptionalDataTableContext(),c=n??s?.table;if(!c)throw Error("DataTablePagination requires a `table` prop or to be rendered within <DataTableRoot>");let l=F.useMemo(()=>({...H,...s?.labels,...i}),[s?.labels,i]),u=c.getPageCount(),d=Math.max(u,1),v=c.getState().pagination.pageIndex;return N(`div`,{className:e(`flex items-center justify-end gap-4 px-2`,a),...o,children:P(`div`,{className:`flex items-center gap-6 lg:gap-8`,children:[P(`div`,{className:`hidden items-center gap-2 sm:flex`,children:[N(`p`,{className:`text-sm font-medium`,children:l.rowsPerPage}),P(f,{value:`${c.getState().pagination.pageSize}`,onValueChange:e=>c.setPageSize(Number(e)),children:[N(g,{size:`sm`,className:`h-8 w-20`,children:N(_,{})}),N(p,{side:`top`,children:N(m,{children:r.map(e=>N(h,{value:`${e}`,children:e},e))})})]})]}),N(`div`,{className:`text-sm font-medium`,children:l.pageOf(v+1,d)}),P(`div`,{className:`flex items-center gap-1`,children:[N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,className:`hidden lg:inline-flex`,onClick:()=>c.setPageIndex(0),disabled:!c.getCanPreviousPage(),"aria-label":l.goToFirstPage,children:N(O,{})}),N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,onClick:()=>c.previousPage(),disabled:!c.getCanPreviousPage(),"aria-label":l.goToPreviousPage,children:N(E,{})}),N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,onClick:()=>c.nextPage(),disabled:!c.getCanNextPage(),"aria-label":l.goToNextPage,children:N(D,{})}),N(t,{type:`button`,variant:`outline`,color:`zinc`,size:`icon-sm`,className:`hidden lg:inline-flex`,onClick:()=>c.setPageIndex(u-1),disabled:!c.getCanNextPage(),"aria-label":l.goToLastPage,children:N(k,{})})]})]})})}function createDataTableSelectColumn(e){let t=e?.labels?.selectAllRows??H.selectAllRows,r=e?.labels?.selectRow??H.selectRow;return{id:`select`,enableSorting:!1,enableHiding:!1,header:({table:e})=>N(n,{"aria-label":t,checked:e.getIsAllPageRowsSelected()||e.getIsSomePageRowsSelected()&&`indeterminate`,onCheckedChange:t=>e.toggleAllPageRowsSelected(!!t)}),cell:({row:e})=>N(n,{"aria-label":r,checked:e.getIsSelected()||e.getIsSomeSelected()&&`indeterminate`,disabled:!e.getCanSelect(),onCheckedChange:t=>e.toggleSelected(!!t)})}}function DataTable({columns:e,data:t,getRowId:n,filterColumns:r,pageSize:i=10,pageSizeOptions:a,enableRowSelection:o=!1,enableSorting:s=!1,showPagination:c=!1,showColumnVisibility:l=!1,toolbarActions:u,labels:d,className:f,tableClassName:p,variant:m}){return P(DataTableRoot,{columns:e,data:t,getRowId:n,pageSize:i,enableRowSelection:o,enableSorting:s,labels:d,className:f,children:[N(DataTableToolbar,{filterColumns:r,showColumnVisibility:l,toolbarActions:u}),N(x,{children:P(v,{className:p,variant:m,children:[N(DataTableHeader,{}),N(DataTableBody,{})]})}),c?N(DataTablePagination,{pageSizeOptions:a}):null]})}export{DataTable,DataTableBody,DataTableColumnHeader,DataTableHeader,DataTablePagination,DataTableRoot,DataTableToolbar,DataTableViewOptions,createDataTableSelectColumn,H as defaultDataTableLabels,useDataTable,useDataTableContext};
|
|
2
2
|
//# sourceMappingURL=data-table.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.js","names":["Table"],"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport {\n IconArrowsSort,\n IconChevronLeft,\n IconChevronRight,\n IconChevronsLeft,\n IconChevronsRight,\n IconColumns3,\n IconSortAscending,\n IconSortDescending\n} from '@tabler/icons-react'\nimport type {\n Column,\n ColumnDef,\n ColumnFiltersState,\n PaginationState,\n RowData,\n RowSelectionState,\n SortingState,\n Table as TanStackTable,\n VisibilityState\n} from '@tanstack/react-table'\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { Checkbox } from './checkbox'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuTrigger\n} from './dropdown-menu'\nimport { Input } from './input'\nimport { InputGroup, InputGroupAddon, InputGroupInput } from './input-group'\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from './select'\nimport { Table, TableBody, TableCell, TableContainer, TableHead, TableHeader, type TableProps, TableRow } from './table'\n\ntype DataTableToolbarActions<TData> = React.ReactNode | ((table: TanStackTable<TData>) => React.ReactNode)\n\nexport type DataTableLabels = {\n filterPlaceholder: string\n filterColumnSelectorLabel: string\n emptyMessage: React.ReactNode\n columnsButton: string\n rowsPerPage: string\n pageOf: (current: number, total: number) => React.ReactNode\n goToFirstPage: string\n goToPreviousPage: string\n goToNextPage: string\n goToLastPage: string\n selectAllRows: string\n selectRow: string\n}\n\nexport const defaultDataTableLabels: DataTableLabels = {\n filterPlaceholder: 'Filtrar linhas...',\n filterColumnSelectorLabel: 'Coluna para filtrar',\n emptyMessage: 'Nenhum resultado.',\n columnsButton: 'Colunas',\n rowsPerPage: 'Linhas por página',\n pageOf: (current, total) => `Página ${current} de ${total}`,\n goToFirstPage: 'Ir para a primeira página',\n goToPreviousPage: 'Ir para a página anterior',\n goToNextPage: 'Ir para a próxima página',\n goToLastPage: 'Ir para a última página',\n selectAllRows: 'Selecionar todas as linhas',\n selectRow: 'Selecionar linha'\n}\n\nexport type DataTableProps<TData extends RowData, TValue = unknown> = {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n getRowId?: (originalRow: TData, index: number, parent?: { id: string }) => string\n filterColumns?: string | string[]\n pageSize?: number\n pageSizeOptions?: number[]\n enableRowSelection?: boolean\n enableSorting?: boolean\n showPagination?: boolean\n showColumnVisibility?: boolean\n toolbarActions?: DataTableToolbarActions<TData>\n labels?: Partial<DataTableLabels>\n className?: string\n tableClassName?: string\n variant?: TableProps['variant']\n}\n\nexport type DataTableColumnHeaderProps<TData extends RowData, TValue> = React.ComponentProps<'div'> & {\n column: Column<TData, TValue>\n title: React.ReactNode\n}\n\nexport type DataTablePaginationProps<TData extends RowData> = React.ComponentProps<'div'> & {\n table?: TanStackTable<TData>\n pageSizeOptions?: number[]\n labels?: Partial<DataTableLabels>\n}\n\nexport type DataTableViewOptionsProps<TData extends RowData> = React.ComponentProps<typeof Button> & {\n table?: TanStackTable<TData>\n label?: React.ReactNode\n}\n\nexport type UseDataTableOptions<TData extends RowData, TValue = unknown> = {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n getRowId?: (originalRow: TData, index: number, parent?: { id: string }) => string\n pageSize?: number\n enableRowSelection?: boolean\n enableSorting?: boolean\n enablePagination?: boolean\n labels?: Partial<DataTableLabels>\n}\n\nexport type DataTableRootProps<TData extends RowData, TValue = unknown> = {\n labels?: Partial<DataTableLabels>\n className?: string\n children: React.ReactNode\n} & (\n | { table: TanStackTable<TData>; columns?: never; data?: never }\n | (Omit<UseDataTableOptions<TData, TValue>, 'labels'> & { table?: never })\n)\n\nexport type DataTableToolbarProps<TData extends RowData> = {\n filterColumns?: string | string[]\n showColumnVisibility?: boolean\n toolbarActions?: DataTableToolbarActions<TData>\n labels?: Partial<DataTableLabels>\n className?: string\n}\n\nexport type DataTableHeaderProps = {\n className?: string\n}\n\nexport type DataTableBodyProps = {\n emptyMessage?: React.ReactNode\n className?: string\n}\n\ntype DataTableContextValue<TData extends RowData> = {\n table: TanStackTable<TData>\n labels: DataTableLabels\n}\n\nconst DataTableContext = React.createContext<DataTableContextValue<RowData> | null>(null)\n\nexport function useDataTableContext<TData extends RowData>(): DataTableContextValue<TData> {\n const ctx = React.useContext(DataTableContext)\n if (!ctx) {\n throw new Error('useDataTableContext must be used within <DataTableRoot>')\n }\n return ctx as unknown as DataTableContextValue<TData>\n}\n\nfunction useOptionalDataTableContext<TData extends RowData>(): DataTableContextValue<TData> | null {\n const ctx = React.useContext(DataTableContext)\n return ctx as unknown as DataTableContextValue<TData> | null\n}\n\nfunction renderToolbarActions<TData extends RowData>(\n actions: DataTableToolbarActions<TData> | undefined,\n table: TanStackTable<TData>\n) {\n return typeof actions === 'function' ? actions(table) : actions\n}\n\nfunction getColumnLabel<TData extends RowData>(column: ReturnType<TanStackTable<TData>['getColumn']>): string {\n if (!column) {\n return ''\n }\n const meta = column.columnDef.meta as { label?: string } | undefined\n return meta?.label ?? column.id\n}\n\nexport function useDataTable<TData extends RowData, TValue = unknown>({\n columns,\n data,\n getRowId,\n pageSize = 10,\n enableRowSelection = false,\n enableSorting = false,\n enablePagination = true,\n labels\n}: UseDataTableOptions<TData, TValue>): TanStackTable<TData> {\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([])\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})\n const [pagination, setPagination] = React.useState<PaginationState>({\n pageIndex: 0,\n pageSize\n })\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({})\n\n const mergedLabels = React.useMemo(() => ({ ...defaultDataTableLabels, ...labels }), [labels])\n const resolvedColumns = React.useMemo<ColumnDef<TData, TValue>[]>(() => {\n if (!enableRowSelection) {\n return columns\n }\n if (columns.some((column) => column.id === 'select')) {\n return columns\n }\n return [\n createDataTableSelectColumn<TData>({\n labels: { selectAllRows: mergedLabels.selectAllRows, selectRow: mergedLabels.selectRow }\n }) as ColumnDef<TData, TValue>,\n ...columns\n ]\n }, [columns, enableRowSelection, mergedLabels.selectAllRows, mergedLabels.selectRow])\n\n return useReactTable({\n data,\n columns: resolvedColumns,\n getRowId,\n enableRowSelection,\n enableSorting,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n pagination\n },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onPaginationChange: setPagination,\n onRowSelectionChange: setRowSelection,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: enablePagination ? getPaginationRowModel() : undefined,\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined\n })\n}\n\nfunction DataTableRootControlled<TData extends RowData>({\n table,\n labels,\n className,\n children\n}: {\n table: TanStackTable<TData>\n labels?: Partial<DataTableLabels>\n className?: string\n children: React.ReactNode\n}) {\n const mergedLabels = React.useMemo(() => ({ ...defaultDataTableLabels, ...labels }), [labels])\n const value: DataTableContextValue<TData> = { table, labels: mergedLabels }\n return (\n <DataTableContext.Provider value={value as unknown as DataTableContextValue<RowData>}>\n <div className={cn('flex w-full flex-col gap-4', className)}>{children}</div>\n </DataTableContext.Provider>\n )\n}\n\nfunction DataTableRootUncontrolled<TData extends RowData, TValue = unknown>({\n columns,\n data,\n getRowId,\n pageSize,\n enableRowSelection,\n enableSorting,\n enablePagination,\n labels,\n className,\n children\n}: Omit<UseDataTableOptions<TData, TValue>, 'labels'> & {\n labels?: Partial<DataTableLabels>\n className?: string\n children: React.ReactNode\n}) {\n const table = useDataTable<TData, TValue>({\n columns,\n data,\n getRowId,\n pageSize,\n enableRowSelection,\n enableSorting,\n enablePagination,\n labels\n })\n return (\n <DataTableRootControlled table={table} labels={labels} className={className}>\n {children}\n </DataTableRootControlled>\n )\n}\n\nfunction DataTableRoot<TData extends RowData, TValue = unknown>(props: DataTableRootProps<TData, TValue>) {\n if ('table' in props && props.table !== undefined) {\n const { table, labels, className, children } = props\n return (\n <DataTableRootControlled table={table} labels={labels} className={className}>\n {children}\n </DataTableRootControlled>\n )\n }\n const {\n columns,\n data,\n getRowId,\n pageSize,\n enableRowSelection,\n enableSorting,\n enablePagination,\n labels,\n className,\n children\n } = props\n return (\n <DataTableRootUncontrolled<TData, TValue>\n columns={columns!}\n data={data!}\n getRowId={getRowId}\n pageSize={pageSize}\n enableRowSelection={enableRowSelection}\n enableSorting={enableSorting}\n enablePagination={enablePagination}\n labels={labels}\n className={className}\n >\n {children}\n </DataTableRootUncontrolled>\n )\n}\n\nfunction DataTableColumnHeader<TData extends RowData, TValue>({\n column,\n title,\n className,\n ...props\n}: DataTableColumnHeaderProps<TData, TValue>) {\n if (!column.getCanSort()) {\n return (\n <div className={cn('inline-flex items-center gap-1', className)} {...props}>\n {title}\n </div>\n )\n }\n\n const sorted = column.getIsSorted()\n\n return (\n <div className={cn('inline-flex items-center gap-1', className)} {...props}>\n {title}\n <Button\n variant=\"ghost\"\n color=\"zinc\"\n size=\"icon-xs\"\n onClick={() => {\n if (sorted === 'desc') return column.clearSorting()\n column.toggleSorting(sorted === 'asc')\n }}\n >\n {sorted === 'desc' ? (\n <IconSortDescending className=\"size-4\" data-icon=\"inline-end\" />\n ) : sorted === 'asc' ? (\n <IconSortAscending className=\"size-4\" data-icon=\"inline-end\" />\n ) : (\n <IconArrowsSort className=\"size-4\" data-icon=\"inline-end\" />\n )}\n </Button>\n </div>\n )\n}\n\nfunction DataTableViewOptions<TData extends RowData>({\n table: tableProp,\n label,\n className,\n ...props\n}: DataTableViewOptionsProps<TData>) {\n const ctx = useOptionalDataTableContext<TData>()\n const table = tableProp ?? ctx?.table\n if (!table) {\n throw new Error('DataTableViewOptions requires a `table` prop or to be rendered within <DataTableRoot>')\n }\n const resolvedLabel = label ?? ctx?.labels.columnsButton ?? defaultDataTableLabels.columnsButton\n const columns = table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n\n if (columns.length === 0) {\n return null\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"outline\" color=\"zinc\" size=\"sm\" className={cn('ml-auto', className)} {...props}>\n <IconColumns3 data-icon=\"inline-start\" />\n {resolvedLabel}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuGroup>\n {columns.map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(Boolean(value))}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nfunction DataTableToolbar<TData extends RowData>({\n filterColumns,\n showColumnVisibility,\n toolbarActions,\n labels: labelsOverride,\n className\n}: DataTableToolbarProps<TData>) {\n const { table, labels: contextLabels } = useDataTableContext<TData>()\n const labels = React.useMemo(\n () => (labelsOverride ? { ...contextLabels, ...labelsOverride } : contextLabels),\n [contextLabels, labelsOverride]\n )\n const filterColumnIds = React.useMemo<string[]>(() => {\n if (!filterColumns) {\n return []\n }\n return Array.isArray(filterColumns) ? filterColumns : [filterColumns]\n }, [filterColumns])\n\n const actions = renderToolbarActions(toolbarActions, table)\n const hasFilter = filterColumnIds.length > 0\n const [activeFilterColumn, setActiveFilterColumn] = React.useState<string | undefined>(filterColumnIds[0])\n\n React.useEffect(() => {\n if (filterColumnIds.length === 0) {\n setActiveFilterColumn(undefined)\n return\n }\n setActiveFilterColumn((current) => (current && filterColumnIds.includes(current) ? current : filterColumnIds[0]))\n }, [filterColumnIds])\n\n if (!hasFilter && !showColumnVisibility && !actions) {\n return null\n }\n\n const activeColumn = activeFilterColumn ? table.getColumn(activeFilterColumn) : undefined\n const filterValue = (activeColumn?.getFilterValue() as string | undefined) ?? ''\n\n const handleColumnChange = (nextId: string) => {\n if (nextId === activeFilterColumn) {\n return\n }\n if (activeFilterColumn) {\n table.getColumn(activeFilterColumn)?.setFilterValue(undefined)\n }\n setActiveFilterColumn(nextId)\n }\n\n return (\n <div className={cn('flex flex-col gap-2 sm:flex-row sm:items-center', className)}>\n {hasFilter && activeColumn ? (\n filterColumnIds.length > 1 ? (\n <InputGroup className=\"h-8 w-full sm:max-w-md\">\n <InputGroupAddon align=\"inline-start\" className=\"pr-0\">\n <select\n aria-label={labels.filterColumnSelectorLabel}\n value={activeFilterColumn}\n onChange={(event) => handleColumnChange(event.target.value)}\n className=\"cursor-pointer appearance-none border-0 bg-transparent pr-1 text-sm font-medium text-foreground outline-none focus:outline-none\"\n >\n {filterColumnIds.map((id) => (\n <option key={id} value={id}>\n {getColumnLabel(table.getColumn(id))}\n </option>\n ))}\n </select>\n </InputGroupAddon>\n <InputGroupInput\n placeholder={labels.filterPlaceholder}\n value={filterValue}\n onChange={(event) => activeColumn.setFilterValue(event.target.value)}\n />\n </InputGroup>\n ) : (\n <Input\n placeholder={labels.filterPlaceholder}\n value={filterValue}\n onChange={(event) => activeColumn.setFilterValue(event.target.value)}\n className=\"h-8 w-full sm:max-w-xs\"\n />\n )\n ) : null}\n <div className=\"flex flex-1 items-center justify-end gap-2\">\n {actions}\n {showColumnVisibility ? <DataTableViewOptions table={table} label={labels.columnsButton} /> : null}\n </div>\n </div>\n )\n}\n\nfunction DataTableHeader<TData extends RowData>({ className }: DataTableHeaderProps = {}) {\n const { table } = useDataTableContext<TData>()\n return (\n <TableHeader className={className}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id} colSpan={header.colSpan}>\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n )\n}\n\nfunction DataTableBody<TData extends RowData>({ emptyMessage, className }: DataTableBodyProps = {}) {\n const { table, labels } = useDataTableContext<TData>()\n const rows = table.getRowModel().rows\n const visibleColumnCount = table.getVisibleLeafColumns().length\n const resolvedEmptyMessage = emptyMessage ?? labels.emptyMessage\n\n return (\n <TableBody className={className}>\n {rows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={visibleColumnCount} className=\"h-24 text-center\">\n {resolvedEmptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n rows.map((row) => (\n <TableRow key={row.id} data-state={row.getIsSelected() ? 'selected' : undefined}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n )\n}\n\nfunction DataTablePagination<TData extends RowData>({\n table: tableProp,\n pageSizeOptions = [10, 20, 30, 40, 50],\n labels: labelsOverride,\n className,\n ...props\n}: DataTablePaginationProps<TData>) {\n const ctx = useOptionalDataTableContext<TData>()\n const table = tableProp ?? ctx?.table\n if (!table) {\n throw new Error('DataTablePagination requires a `table` prop or to be rendered within <DataTableRoot>')\n }\n const mergedLabels = React.useMemo(\n () => ({ ...defaultDataTableLabels, ...ctx?.labels, ...labelsOverride }),\n [ctx?.labels, labelsOverride]\n )\n const pageCount = table.getPageCount()\n const safePageCount = Math.max(pageCount, 1)\n const pageIndex = table.getState().pagination.pageIndex\n\n return (\n <div className={cn('flex items-center justify-end gap-4 px-2', className)} {...props}>\n <div className=\"flex items-center gap-6 lg:gap-8\">\n <div className=\"hidden items-center gap-2 sm:flex\">\n <p className=\"text-sm font-medium\">{mergedLabels.rowsPerPage}</p>\n <Select\n value={`${table.getState().pagination.pageSize}`}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger size=\"sm\" className=\"h-8 w-20\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent side=\"top\">\n <SelectGroup>\n {pageSizeOptions.map((pageSize) => (\n <SelectItem key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-sm font-medium\">{mergedLabels.pageOf(pageIndex + 1, safePageCount)}</div>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n className=\"hidden lg:inline-flex\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label={mergedLabels.goToFirstPage}\n >\n <IconChevronsLeft />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label={mergedLabels.goToPreviousPage}\n >\n <IconChevronLeft />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label={mergedLabels.goToNextPage}\n >\n <IconChevronRight />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n className=\"hidden lg:inline-flex\"\n onClick={() => table.setPageIndex(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n aria-label={mergedLabels.goToLastPage}\n >\n <IconChevronsRight />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nfunction createDataTableSelectColumn<TData extends RowData>(options?: {\n labels?: Pick<Partial<DataTableLabels>, 'selectAllRows' | 'selectRow'>\n}): ColumnDef<TData> {\n const selectAllRows = options?.labels?.selectAllRows ?? defaultDataTableLabels.selectAllRows\n const selectRow = options?.labels?.selectRow ?? defaultDataTableLabels.selectRow\n\n return {\n id: 'select',\n enableSorting: false,\n enableHiding: false,\n header: ({ table }) => (\n <Checkbox\n aria-label={selectAllRows}\n checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate')}\n onCheckedChange={(value) => table.toggleAllPageRowsSelected(Boolean(value))}\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n aria-label={selectRow}\n checked={row.getIsSelected() || (row.getIsSomeSelected() && 'indeterminate')}\n disabled={!row.getCanSelect()}\n onCheckedChange={(value) => row.toggleSelected(Boolean(value))}\n />\n )\n }\n}\n\nfunction DataTable<TData extends RowData, TValue = unknown>({\n columns,\n data,\n getRowId,\n filterColumns,\n pageSize = 10,\n pageSizeOptions,\n enableRowSelection = false,\n enableSorting = false,\n showPagination = false,\n showColumnVisibility = false,\n toolbarActions,\n labels,\n className,\n tableClassName,\n variant\n}: DataTableProps<TData, TValue>) {\n return (\n <DataTableRoot<TData, TValue>\n columns={columns}\n data={data}\n getRowId={getRowId}\n pageSize={pageSize}\n enableRowSelection={enableRowSelection}\n enableSorting={enableSorting}\n labels={labels}\n className={className}\n >\n <DataTableToolbar\n filterColumns={filterColumns}\n showColumnVisibility={showColumnVisibility}\n toolbarActions={toolbarActions}\n />\n <TableContainer>\n <Table className={tableClassName} variant={variant}>\n <DataTableHeader />\n <DataTableBody />\n </Table>\n </TableContainer>\n {showPagination ? <DataTablePagination pageSizeOptions={pageSizeOptions} /> : null}\n </DataTableRoot>\n )\n}\n\nexport type { Column, ColumnDef, RowData, Table as TanStackTable } from '@tanstack/react-table'\n\nexport {\n createDataTableSelectColumn,\n DataTable,\n DataTableBody,\n DataTableColumnHeader,\n DataTableHeader,\n DataTablePagination,\n DataTableRoot,\n DataTableToolbar,\n DataTableViewOptions\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.js","names":["Table"],"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport {\n IconArrowsSort,\n IconChevronLeft,\n IconChevronRight,\n IconChevronsLeft,\n IconChevronsRight,\n IconColumns3,\n IconSortAscending,\n IconSortDescending\n} from '@tabler/icons-react'\nimport type {\n Column,\n ColumnDef,\n ColumnFiltersState,\n PaginationState,\n RowData,\n RowSelectionState,\n SortingState,\n Table as TanStackTable,\n VisibilityState\n} from '@tanstack/react-table'\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable\n} from '@tanstack/react-table'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { Checkbox } from './checkbox'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuTrigger\n} from './dropdown-menu'\nimport { Input } from './input'\nimport { InputGroup, InputGroupAddon, InputGroupInput } from './input-group'\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from './select'\nimport { Table, TableBody, TableCell, TableContainer, TableHead, TableHeader, type TableProps, TableRow } from './table'\n\ntype DataTableToolbarActions<TData> = React.ReactNode | ((table: TanStackTable<TData>) => React.ReactNode)\n\nexport type DataTableLabels = {\n filterPlaceholder: string\n filterColumnSelectorLabel: string\n emptyMessage: React.ReactNode\n columnsButton: string\n rowsPerPage: string\n pageOf: (current: number, total: number) => React.ReactNode\n goToFirstPage: string\n goToPreviousPage: string\n goToNextPage: string\n goToLastPage: string\n selectAllRows: string\n selectRow: string\n}\n\nexport const defaultDataTableLabels: DataTableLabels = {\n filterPlaceholder: 'Filtrar linhas...',\n filterColumnSelectorLabel: 'Coluna para filtrar',\n emptyMessage: 'Nenhum resultado.',\n columnsButton: 'Colunas',\n rowsPerPage: 'Linhas por página',\n pageOf: (current, total) => `Página ${current} de ${total}`,\n goToFirstPage: 'Ir para a primeira página',\n goToPreviousPage: 'Ir para a página anterior',\n goToNextPage: 'Ir para a próxima página',\n goToLastPage: 'Ir para a última página',\n selectAllRows: 'Selecionar todas as linhas',\n selectRow: 'Selecionar linha'\n}\n\nexport type DataTableProps<TData extends RowData, TValue = unknown> = {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n getRowId?: (originalRow: TData, index: number, parent?: { id: string }) => string\n filterColumns?: string | string[]\n pageSize?: number\n pageSizeOptions?: number[]\n enableRowSelection?: boolean\n enableSorting?: boolean\n showPagination?: boolean\n showColumnVisibility?: boolean\n toolbarActions?: DataTableToolbarActions<TData>\n labels?: Partial<DataTableLabels>\n className?: string\n tableClassName?: string\n variant?: TableProps['variant']\n}\n\nexport type DataTableColumnHeaderProps<TData extends RowData, TValue> = React.ComponentProps<'div'> & {\n column: Column<TData, TValue>\n title: React.ReactNode\n}\n\nexport type DataTablePaginationProps<TData extends RowData> = React.ComponentProps<'div'> & {\n table?: TanStackTable<TData>\n pageSizeOptions?: number[]\n labels?: Partial<DataTableLabels>\n}\n\nexport type DataTableViewOptionsProps<TData extends RowData> = React.ComponentProps<typeof Button> & {\n table?: TanStackTable<TData>\n label?: React.ReactNode\n}\n\nexport type UseDataTableOptions<TData extends RowData, TValue = unknown> = {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n getRowId?: (originalRow: TData, index: number, parent?: { id: string }) => string\n pageSize?: number\n enableRowSelection?: boolean\n enableSorting?: boolean\n enablePagination?: boolean\n labels?: Partial<DataTableLabels>\n}\n\nexport type DataTableRootProps<TData extends RowData, TValue = unknown> = {\n labels?: Partial<DataTableLabels>\n className?: string\n children: React.ReactNode\n} & (\n | { table: TanStackTable<TData>; columns?: never; data?: never }\n | (Omit<UseDataTableOptions<TData, TValue>, 'labels'> & { table?: never })\n)\n\nexport type DataTableToolbarProps<TData extends RowData> = {\n filterColumns?: string | string[]\n showColumnVisibility?: boolean\n toolbarActions?: DataTableToolbarActions<TData>\n labels?: Partial<DataTableLabels>\n className?: string\n}\n\nexport type DataTableHeaderProps = {\n className?: string\n}\n\nexport type DataTableBodyProps = {\n emptyMessage?: React.ReactNode\n className?: string\n}\n\ntype DataTableContextValue<TData extends RowData> = {\n table: TanStackTable<TData>\n labels: DataTableLabels\n}\n\nconst DataTableContext = React.createContext<DataTableContextValue<RowData> | null>(null)\n\nexport function useDataTableContext<TData extends RowData>(): DataTableContextValue<TData> {\n const ctx = React.useContext(DataTableContext)\n if (!ctx) {\n throw new Error('useDataTableContext must be used within <DataTableRoot>')\n }\n return ctx as unknown as DataTableContextValue<TData>\n}\n\nfunction useOptionalDataTableContext<TData extends RowData>(): DataTableContextValue<TData> | null {\n const ctx = React.useContext(DataTableContext)\n return ctx as unknown as DataTableContextValue<TData> | null\n}\n\nfunction renderToolbarActions<TData extends RowData>(\n actions: DataTableToolbarActions<TData> | undefined,\n table: TanStackTable<TData>\n) {\n return typeof actions === 'function' ? actions(table) : actions\n}\n\nfunction getColumnLabel<TData extends RowData>(column: ReturnType<TanStackTable<TData>['getColumn']>): string {\n if (!column) {\n return ''\n }\n const meta = column.columnDef.meta as { label?: string } | undefined\n return meta?.label ?? column.id\n}\n\nexport function useDataTable<TData extends RowData, TValue = unknown>({\n columns,\n data,\n getRowId,\n pageSize = 10,\n enableRowSelection = false,\n enableSorting = false,\n enablePagination = false,\n labels\n}: UseDataTableOptions<TData, TValue>): TanStackTable<TData> {\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([])\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})\n const [pagination, setPagination] = React.useState<PaginationState>({\n pageIndex: 0,\n pageSize\n })\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({})\n\n const mergedLabels = React.useMemo(() => ({ ...defaultDataTableLabels, ...labels }), [labels])\n const resolvedColumns = React.useMemo<ColumnDef<TData, TValue>[]>(() => {\n if (!enableRowSelection) {\n return columns\n }\n if (columns.some((column) => column.id === 'select')) {\n return columns\n }\n return [\n createDataTableSelectColumn<TData>({\n labels: { selectAllRows: mergedLabels.selectAllRows, selectRow: mergedLabels.selectRow }\n }) as ColumnDef<TData, TValue>,\n ...columns\n ]\n }, [columns, enableRowSelection, mergedLabels.selectAllRows, mergedLabels.selectRow])\n\n return useReactTable({\n data,\n columns: resolvedColumns,\n getRowId,\n enableRowSelection,\n enableSorting,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n pagination\n },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onPaginationChange: setPagination,\n onRowSelectionChange: setRowSelection,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: enablePagination ? getPaginationRowModel() : undefined,\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined\n })\n}\n\nfunction DataTableRootControlled<TData extends RowData>({\n table,\n labels,\n className,\n children\n}: {\n table: TanStackTable<TData>\n labels?: Partial<DataTableLabels>\n className?: string\n children: React.ReactNode\n}) {\n const mergedLabels = React.useMemo(() => ({ ...defaultDataTableLabels, ...labels }), [labels])\n const value: DataTableContextValue<TData> = { table, labels: mergedLabels }\n return (\n <DataTableContext.Provider value={value as unknown as DataTableContextValue<RowData>}>\n <div className={cn('flex w-full flex-col gap-4', className)}>{children}</div>\n </DataTableContext.Provider>\n )\n}\n\nfunction DataTableRootUncontrolled<TData extends RowData, TValue = unknown>({\n columns,\n data,\n getRowId,\n pageSize,\n enableRowSelection,\n enableSorting,\n enablePagination,\n labels,\n className,\n children\n}: Omit<UseDataTableOptions<TData, TValue>, 'labels'> & {\n labels?: Partial<DataTableLabels>\n className?: string\n children: React.ReactNode\n}) {\n const table = useDataTable<TData, TValue>({\n columns,\n data,\n getRowId,\n pageSize,\n enableRowSelection,\n enableSorting,\n enablePagination,\n labels\n })\n return (\n <DataTableRootControlled table={table} labels={labels} className={className}>\n {children}\n </DataTableRootControlled>\n )\n}\n\nfunction DataTableRoot<TData extends RowData, TValue = unknown>(props: DataTableRootProps<TData, TValue>) {\n if ('table' in props && props.table !== undefined) {\n const { table, labels, className, children } = props\n return (\n <DataTableRootControlled table={table} labels={labels} className={className}>\n {children}\n </DataTableRootControlled>\n )\n }\n const {\n columns,\n data,\n getRowId,\n pageSize,\n enableRowSelection,\n enableSorting,\n enablePagination,\n labels,\n className,\n children\n } = props\n return (\n <DataTableRootUncontrolled<TData, TValue>\n columns={columns!}\n data={data!}\n getRowId={getRowId}\n pageSize={pageSize}\n enableRowSelection={enableRowSelection}\n enableSorting={enableSorting}\n enablePagination={enablePagination}\n labels={labels}\n className={className}\n >\n {children}\n </DataTableRootUncontrolled>\n )\n}\n\nfunction DataTableColumnHeader<TData extends RowData, TValue>({\n column,\n title,\n className,\n ...props\n}: DataTableColumnHeaderProps<TData, TValue>) {\n if (!column.getCanSort()) {\n return (\n <div className={cn('inline-flex items-center gap-1', className)} {...props}>\n {title}\n </div>\n )\n }\n\n const sorted = column.getIsSorted()\n\n return (\n <div className={cn('inline-flex items-center gap-1', className)} {...props}>\n {title}\n <Button\n variant=\"ghost\"\n color=\"zinc\"\n size=\"icon-xs\"\n onClick={() => {\n if (sorted === 'desc') return column.clearSorting()\n column.toggleSorting(sorted === 'asc')\n }}\n >\n {sorted === 'desc' ? (\n <IconSortDescending className=\"size-4\" data-icon=\"inline-end\" />\n ) : sorted === 'asc' ? (\n <IconSortAscending className=\"size-4\" data-icon=\"inline-end\" />\n ) : (\n <IconArrowsSort className=\"size-4\" data-icon=\"inline-end\" />\n )}\n </Button>\n </div>\n )\n}\n\nfunction DataTableViewOptions<TData extends RowData>({\n table: tableProp,\n label,\n className,\n ...props\n}: DataTableViewOptionsProps<TData>) {\n const ctx = useOptionalDataTableContext<TData>()\n const table = tableProp ?? ctx?.table\n if (!table) {\n throw new Error('DataTableViewOptions requires a `table` prop or to be rendered within <DataTableRoot>')\n }\n const resolvedLabel = label ?? ctx?.labels.columnsButton ?? defaultDataTableLabels.columnsButton\n const columns = table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n\n if (columns.length === 0) {\n return null\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"outline\" color=\"zinc\" size=\"sm\" className={cn('ml-auto', className)} {...props}>\n <IconColumns3 data-icon=\"inline-start\" />\n {resolvedLabel}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuGroup>\n {columns.map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(Boolean(value))}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nfunction DataTableToolbar<TData extends RowData>({\n filterColumns,\n showColumnVisibility,\n toolbarActions,\n labels: labelsOverride,\n className\n}: DataTableToolbarProps<TData>) {\n const { table, labels: contextLabels } = useDataTableContext<TData>()\n const labels = React.useMemo(\n () => (labelsOverride ? { ...contextLabels, ...labelsOverride } : contextLabels),\n [contextLabels, labelsOverride]\n )\n const filterColumnIds = React.useMemo<string[]>(() => {\n if (!filterColumns) {\n return []\n }\n return Array.isArray(filterColumns) ? filterColumns : [filterColumns]\n }, [filterColumns])\n\n const actions = renderToolbarActions(toolbarActions, table)\n const hasFilter = filterColumnIds.length > 0\n const [activeFilterColumn, setActiveFilterColumn] = React.useState<string | undefined>(filterColumnIds[0])\n\n React.useEffect(() => {\n if (filterColumnIds.length === 0) {\n setActiveFilterColumn(undefined)\n return\n }\n setActiveFilterColumn((current) => (current && filterColumnIds.includes(current) ? current : filterColumnIds[0]))\n }, [filterColumnIds])\n\n if (!hasFilter && !showColumnVisibility && !actions) {\n return null\n }\n\n const activeColumn = activeFilterColumn ? table.getColumn(activeFilterColumn) : undefined\n const filterValue = (activeColumn?.getFilterValue() as string | undefined) ?? ''\n\n const handleColumnChange = (nextId: string) => {\n if (nextId === activeFilterColumn) {\n return\n }\n if (activeFilterColumn) {\n table.getColumn(activeFilterColumn)?.setFilterValue(undefined)\n }\n setActiveFilterColumn(nextId)\n }\n\n return (\n <div className={cn('flex flex-col gap-2 sm:flex-row sm:items-center', className)}>\n {hasFilter && activeColumn ? (\n filterColumnIds.length > 1 ? (\n <InputGroup className=\"h-8 w-full sm:max-w-md\">\n <InputGroupAddon align=\"inline-start\" className=\"pr-0\">\n <select\n aria-label={labels.filterColumnSelectorLabel}\n value={activeFilterColumn}\n onChange={(event) => handleColumnChange(event.target.value)}\n className=\"cursor-pointer appearance-none border-0 bg-transparent pr-1 text-sm font-medium text-foreground outline-none focus:outline-none\"\n >\n {filterColumnIds.map((id) => (\n <option key={id} value={id}>\n {getColumnLabel(table.getColumn(id))}\n </option>\n ))}\n </select>\n </InputGroupAddon>\n <InputGroupInput\n placeholder={labels.filterPlaceholder}\n value={filterValue}\n onChange={(event) => activeColumn.setFilterValue(event.target.value)}\n />\n </InputGroup>\n ) : (\n <Input\n placeholder={labels.filterPlaceholder}\n value={filterValue}\n onChange={(event) => activeColumn.setFilterValue(event.target.value)}\n className=\"h-8 w-full sm:max-w-xs\"\n />\n )\n ) : null}\n <div className=\"flex flex-1 items-center justify-end gap-2\">\n {actions}\n {showColumnVisibility ? <DataTableViewOptions table={table} label={labels.columnsButton} /> : null}\n </div>\n </div>\n )\n}\n\nfunction DataTableHeader<TData extends RowData>({ className }: DataTableHeaderProps = {}) {\n const { table } = useDataTableContext<TData>()\n return (\n <TableHeader className={className}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id} colSpan={header.colSpan}>\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n )\n}\n\nfunction DataTableBody<TData extends RowData>({ emptyMessage, className }: DataTableBodyProps = {}) {\n const { table, labels } = useDataTableContext<TData>()\n const rows = table.getRowModel().rows\n const visibleColumnCount = table.getVisibleLeafColumns().length\n const resolvedEmptyMessage = emptyMessage ?? labels.emptyMessage\n\n return (\n <TableBody className={className}>\n {rows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={visibleColumnCount} className=\"h-24 text-center\">\n {resolvedEmptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n rows.map((row) => (\n <TableRow key={row.id} data-state={row.getIsSelected() ? 'selected' : undefined}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n )\n}\n\nfunction DataTablePagination<TData extends RowData>({\n table: tableProp,\n pageSizeOptions = [10, 20, 30, 40, 50],\n labels: labelsOverride,\n className,\n ...props\n}: DataTablePaginationProps<TData>) {\n const ctx = useOptionalDataTableContext<TData>()\n const table = tableProp ?? ctx?.table\n if (!table) {\n throw new Error('DataTablePagination requires a `table` prop or to be rendered within <DataTableRoot>')\n }\n const mergedLabels = React.useMemo(\n () => ({ ...defaultDataTableLabels, ...ctx?.labels, ...labelsOverride }),\n [ctx?.labels, labelsOverride]\n )\n const pageCount = table.getPageCount()\n const safePageCount = Math.max(pageCount, 1)\n const pageIndex = table.getState().pagination.pageIndex\n\n return (\n <div className={cn('flex items-center justify-end gap-4 px-2', className)} {...props}>\n <div className=\"flex items-center gap-6 lg:gap-8\">\n <div className=\"hidden items-center gap-2 sm:flex\">\n <p className=\"text-sm font-medium\">{mergedLabels.rowsPerPage}</p>\n <Select\n value={`${table.getState().pagination.pageSize}`}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger size=\"sm\" className=\"h-8 w-20\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent side=\"top\">\n <SelectGroup>\n {pageSizeOptions.map((pageSize) => (\n <SelectItem key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-sm font-medium\">{mergedLabels.pageOf(pageIndex + 1, safePageCount)}</div>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n className=\"hidden lg:inline-flex\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label={mergedLabels.goToFirstPage}\n >\n <IconChevronsLeft />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label={mergedLabels.goToPreviousPage}\n >\n <IconChevronLeft />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label={mergedLabels.goToNextPage}\n >\n <IconChevronRight />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"zinc\"\n size=\"icon-sm\"\n className=\"hidden lg:inline-flex\"\n onClick={() => table.setPageIndex(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n aria-label={mergedLabels.goToLastPage}\n >\n <IconChevronsRight />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nfunction createDataTableSelectColumn<TData extends RowData>(options?: {\n labels?: Pick<Partial<DataTableLabels>, 'selectAllRows' | 'selectRow'>\n}): ColumnDef<TData> {\n const selectAllRows = options?.labels?.selectAllRows ?? defaultDataTableLabels.selectAllRows\n const selectRow = options?.labels?.selectRow ?? defaultDataTableLabels.selectRow\n\n return {\n id: 'select',\n enableSorting: false,\n enableHiding: false,\n header: ({ table }) => (\n <Checkbox\n aria-label={selectAllRows}\n checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate')}\n onCheckedChange={(value) => table.toggleAllPageRowsSelected(Boolean(value))}\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n aria-label={selectRow}\n checked={row.getIsSelected() || (row.getIsSomeSelected() && 'indeterminate')}\n disabled={!row.getCanSelect()}\n onCheckedChange={(value) => row.toggleSelected(Boolean(value))}\n />\n )\n }\n}\n\nfunction DataTable<TData extends RowData, TValue = unknown>({\n columns,\n data,\n getRowId,\n filterColumns,\n pageSize = 10,\n pageSizeOptions,\n enableRowSelection = false,\n enableSorting = false,\n showPagination = false,\n showColumnVisibility = false,\n toolbarActions,\n labels,\n className,\n tableClassName,\n variant\n}: DataTableProps<TData, TValue>) {\n return (\n <DataTableRoot<TData, TValue>\n columns={columns}\n data={data}\n getRowId={getRowId}\n pageSize={pageSize}\n enableRowSelection={enableRowSelection}\n enableSorting={enableSorting}\n labels={labels}\n className={className}\n >\n <DataTableToolbar\n filterColumns={filterColumns}\n showColumnVisibility={showColumnVisibility}\n toolbarActions={toolbarActions}\n />\n <TableContainer>\n <Table className={tableClassName} variant={variant}>\n <DataTableHeader />\n <DataTableBody />\n </Table>\n </TableContainer>\n {showPagination ? <DataTablePagination pageSizeOptions={pageSizeOptions} /> : null}\n </DataTableRoot>\n )\n}\n\nexport type { Column, ColumnDef, RowData, Table as TanStackTable } from '@tanstack/react-table'\n\nexport {\n createDataTableSelectColumn,\n DataTable,\n DataTableBody,\n DataTableColumnHeader,\n DataTableHeader,\n DataTablePagination,\n DataTableRoot,\n DataTableToolbar,\n DataTableViewOptions\n}\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import * as React from "react";
|
|
|
5
5
|
|
|
6
6
|
//#region src/components/dialog.d.ts
|
|
7
7
|
declare const dialogContentVariants: (props?: ({
|
|
8
|
-
size?: "sm" | "md" | "lg" | "xl" | "2xl" | null | undefined;
|
|
8
|
+
size?: "sm" | "md" | "lg" | "xl" | "full" | "2xl" | "3xl" | null | undefined;
|
|
9
9
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
10
10
|
type DialogSize = NonNullable<VariantProps<typeof dialogContentVariants>['size']>;
|
|
11
11
|
type DialogProps = React.ComponentProps<typeof Dialog$1.Root> & {
|
|
@@ -20,6 +20,7 @@ type DialogContentProps = React.ComponentProps<typeof Dialog$1.Content> & {
|
|
|
20
20
|
overlayRef?: React.Ref<HTMLDivElement>;
|
|
21
21
|
};
|
|
22
22
|
type DialogHeaderProps = React.ComponentProps<'div'>;
|
|
23
|
+
type DialogBodyProps = React.ComponentProps<'div'>;
|
|
23
24
|
type DialogFooterProps = React.ComponentProps<'div'> & {
|
|
24
25
|
showCloseButton?: boolean;
|
|
25
26
|
};
|
|
@@ -53,6 +54,10 @@ declare function DialogHeader({
|
|
|
53
54
|
className,
|
|
54
55
|
...props
|
|
55
56
|
}: DialogHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
declare function DialogBody({
|
|
58
|
+
className,
|
|
59
|
+
...props
|
|
60
|
+
}: DialogBodyProps): import("react/jsx-runtime").JSX.Element;
|
|
56
61
|
declare function DialogFooter({
|
|
57
62
|
className,
|
|
58
63
|
showCloseButton,
|
|
@@ -68,5 +73,5 @@ declare function DialogDescription({
|
|
|
68
73
|
...props
|
|
69
74
|
}: DialogDescriptionProps): import("react/jsx-runtime").JSX.Element;
|
|
70
75
|
//#endregion
|
|
71
|
-
export { Dialog, DialogClose, DialogCloseProps, DialogContent, DialogContentProps, DialogDescription, DialogDescriptionProps, DialogFooter, DialogFooterProps, DialogHeader, DialogHeaderProps, DialogOverlay, DialogOverlayProps, DialogPortal, DialogPortalProps, DialogProps, DialogTitle, DialogTitleProps, DialogTrigger, DialogTriggerProps };
|
|
76
|
+
export { Dialog, DialogBody, DialogBodyProps, DialogClose, DialogCloseProps, DialogContent, DialogContentProps, DialogDescription, DialogDescriptionProps, DialogFooter, DialogFooterProps, DialogHeader, DialogHeaderProps, DialogOverlay, DialogOverlayProps, DialogPortal, DialogPortalProps, DialogProps, DialogTitle, DialogTitleProps, DialogTrigger, DialogTriggerProps };
|
|
72
77
|
//# sourceMappingURL=dialog.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{IconX as n}from"@tabler/icons-react";import{Dialog as r}from"radix-ui";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{cva as o}from"class-variance-authority";import*as s from"react";const c=o(`bg-background
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{IconX as n}from"@tabler/icons-react";import{Dialog as r}from"radix-ui";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{cva as o}from"class-variance-authority";import*as s from"react";const c=o([`bg-background ring-foreground/10 fixed top-1/2 left-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 outline-none`,`flex flex-col gap-4 rounded-xl p-4 text-sm ring-1 duration-100`,`max-w-[calc(100%-2rem)] max-h-[calc(100dvh-2rem)] overflow-hidden`,`data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95`],{variants:{size:{sm:`sm:max-w-sm`,md:`sm:max-w-md`,lg:`sm:max-w-lg`,xl:`sm:max-w-xl`,"2xl":`sm:max-w-2xl`,"3xl":`sm:max-w-3xl`,full:`w-screen h-screen max-w-none max-h-screen rounded-none sm:max-w-none`}},defaultVariants:{size:`md`}}),l=s.createContext({size:`sm`});function Dialog({size:e=`sm`,...t}){let n=s.useMemo(()=>({size:e}),[e]);return i(l.Provider,{value:n,children:i(r.Root,{"data-slot":`dialog`,...t})})}function DialogTrigger({...e}){return i(r.Trigger,{"data-slot":`dialog-trigger`,...e})}function DialogPortal({...e}){return i(r.Portal,{"data-slot":`dialog-portal`,...e})}function DialogClose({...e}){return i(r.Close,{"data-slot":`dialog-close`,...e})}function DialogOverlay({className:t,...n}){return i(r.Overlay,{"data-slot":`dialog-overlay`,className:e(`bg-black/10 fixed inset-0 isolate z-50`,`data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0`,`duration-100 supports-backdrop-filter:backdrop-blur-xs`,t),...n})}function DialogContent({className:o,children:u,showCloseButton:d=!0,overlayRef:f,...p}){let{size:m}=s.useContext(l);return a(DialogPortal,{children:[i(DialogOverlay,{ref:f}),a(r.Content,{"data-slot":`dialog-content`,className:e(c({size:m}),o),...p,children:[u,d&&i(r.Close,{"data-slot":`dialog-close`,asChild:!0,children:a(t,{variant:`ghost`,className:`absolute top-2 right-2`,size:`icon-sm`,children:[i(n,{}),i(`span`,{className:`sr-only`,children:`Close`})]})})]})]})}function DialogHeader({className:t,...n}){return i(`div`,{"data-slot":`dialog-header`,className:e(`gap-2 flex flex-col shrink-0`,t),...n})}function DialogBody({className:t,...n}){return i(`div`,{"data-slot":`dialog-body`,className:e(`-mx-4 px-4 flex-1 overflow-y-auto`,t),...n})}function DialogFooter({className:n,showCloseButton:o=!1,children:s,...c}){return a(`div`,{"data-slot":`dialog-footer`,className:e(`bg-muted/50 -mx-4 -mb-4 rounded-b-xl border-t p-4 shrink-0`,`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,n),...c,children:[s,o&&i(r.Close,{asChild:!0,children:i(t,{variant:`outline`,children:`Close`})})]})}function DialogTitle({className:t,...n}){return i(r.Title,{"data-slot":`dialog-title`,className:e(`text-base leading-none font-medium`,t),...n})}function DialogDescription({className:t,...n}){return i(r.Description,{"data-slot":`dialog-description`,className:e(`text-muted-foreground text-sm`,`*:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,t),...n})}export{Dialog,DialogBody,DialogClose,DialogContent,DialogDescription,DialogFooter,DialogHeader,DialogOverlay,DialogPortal,DialogTitle,DialogTrigger};
|
|
2
2
|
//# sourceMappingURL=dialog.js.map
|