@docyrus/shadcn 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/data-table-DWI8FPWh.d.ts +209 -0
  2. package/dist/hooks/index.d.ts +5 -0
  3. package/dist/hooks/index.js +300 -16
  4. package/dist/hooks/index.js.map +1 -1
  5. package/dist/hooks/use-data-table.d.ts +29 -0
  6. package/dist/hooks/use-data-table.js +322 -0
  7. package/dist/hooks/use-data-table.js.map +1 -0
  8. package/dist/index.d.ts +87 -25
  9. package/dist/index.js +2504 -1151
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/data-table.d.ts +4 -0
  12. package/dist/lib/data-table.js +100 -0
  13. package/dist/lib/data-table.js.map +1 -0
  14. package/dist/lib/index.d.ts +4 -0
  15. package/dist/lib/index.js +155 -1
  16. package/dist/lib/index.js.map +1 -1
  17. package/dist/lib/parsers.d.ts +4 -0
  18. package/dist/lib/parsers.js +94 -0
  19. package/dist/lib/parsers.js.map +1 -0
  20. package/dist/radix-vega/data-table-column-header.d.ts +13 -0
  21. package/dist/radix-vega/data-table-column-header.js +178 -0
  22. package/dist/radix-vega/data-table-column-header.js.map +1 -0
  23. package/dist/radix-vega/data-table-date-filter.d.ts +11 -0
  24. package/dist/radix-vega/data-table-date-filter.js +470 -0
  25. package/dist/radix-vega/data-table-date-filter.js.map +1 -0
  26. package/dist/radix-vega/data-table-faceted-filter.d.ts +166 -0
  27. package/dist/radix-vega/data-table-faceted-filter.js +468 -0
  28. package/dist/radix-vega/data-table-faceted-filter.js.map +1 -0
  29. package/dist/radix-vega/data-table-pagination.d.ts +10 -0
  30. package/dist/radix-vega/data-table-pagination.js +286 -0
  31. package/dist/radix-vega/data-table-pagination.js.map +1 -0
  32. package/dist/radix-vega/data-table-skeleton.d.ts +14 -0
  33. package/dist/radix-vega/data-table-skeleton.js +151 -0
  34. package/dist/radix-vega/data-table-skeleton.js.map +1 -0
  35. package/dist/radix-vega/data-table-slider-filter.d.ts +10 -0
  36. package/dist/radix-vega/data-table-slider-filter.js +387 -0
  37. package/dist/radix-vega/data-table-slider-filter.js.map +1 -0
  38. package/dist/radix-vega/data-table-toolbar.d.ts +10 -0
  39. package/dist/radix-vega/data-table-toolbar.js +1272 -0
  40. package/dist/radix-vega/data-table-toolbar.js.map +1 -0
  41. package/dist/radix-vega/data-table-view-options.d.ts +13 -0
  42. package/dist/radix-vega/data-table-view-options.js +314 -0
  43. package/dist/radix-vega/data-table-view-options.js.map +1 -0
  44. package/dist/radix-vega/data-table.d.ts +11 -0
  45. package/dist/radix-vega/data-table.js +429 -0
  46. package/dist/radix-vega/data-table.js.map +1 -0
  47. package/dist/radix-vega/index.d.ts +10 -0
  48. package/dist/radix-vega/index.js +2170 -1156
  49. package/dist/radix-vega/index.js.map +1 -1
  50. package/dist/radix-vega/relative-time-card.d.ts +2 -7
  51. package/dist/radix-vega/relative-time-card.js.map +1 -1
  52. package/package.json +4 -3
@@ -1,21 +1,16 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as class_variance_authority_types from 'class-variance-authority/types';
3
- import { HoverCardContentProps } from '@radix-ui/react-hover-card';
3
+ import { HoverCardProps, HoverCardContentProps } from '@radix-ui/react-hover-card';
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
  import * as React from 'react';
6
6
 
7
7
  declare const triggerVariants: (props?: ({
8
8
  variant?: "default" | "ghost" | "muted" | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
- interface RelativeTimeCardProps extends React.ComponentProps<"button">, Pick<HoverCardContentProps, "align" | "side" | "alignOffset" | "sideOffset" | "avoidCollisions" | "collisionBoundary" | "collisionPadding" | "asChild">, VariantProps<typeof triggerVariants> {
10
+ interface RelativeTimeCardProps extends React.ComponentProps<"button">, HoverCardProps, Pick<HoverCardContentProps, "align" | "side" | "alignOffset" | "sideOffset" | "avoidCollisions" | "collisionBoundary" | "collisionPadding" | "asChild">, VariantProps<typeof triggerVariants> {
11
11
  date: Date | string | number;
12
12
  timezones?: string[];
13
13
  updateInterval?: number;
14
- open?: boolean;
15
- defaultOpen?: boolean;
16
- onOpenChange?: (open: boolean) => void;
17
- openDelay?: number;
18
- closeDelay?: number;
19
14
  }
20
15
  declare function RelativeTimeCard(props: RelativeTimeCardProps): react_jsx_runtime.JSX.Element;
21
16
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/radix-vega/hover-card.tsx","../../src/radix-vega/relative-time-card.tsx"],"names":["HoverCardPrimitive","jsx"],"mappings":"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","file":"relative-time-card.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges Tailwind class names, resolving any conflicts.\n *\n * @param inputs - An array of class names to merge.\n * @returns A string of merged and optimized class names.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground w-64 rounded-lg p-4 text-sm shadow-md ring-1 duration-100 z-50 origin-(--radix-hover-card-content-transform-origin) outline-hidden\",\n className\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","\"use client\";\n\nimport type { HoverCardContentProps } from \"@radix-ui/react-hover-card\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"@/radix-vega/hover-card\";\nimport { cn } from \"@/lib/utils\";\n\nfunction pluralize(n: number, word: string) {\n return `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n}\n\nfunction formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const isInFuture = diff < 0;\n const absDiff = Math.abs(diff);\n\n const seconds = Math.floor(absDiff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (seconds < 5) return \"just now\";\n\n if (isInFuture) {\n if (seconds < 60) return `in ${pluralize(seconds, \"second\")}`;\n if (minutes < 60) return `in ${pluralize(minutes, \"minute\")}`;\n if (hours < 24) return `in ${pluralize(hours, \"hour\")}`;\n if (days < 7) return `in ${pluralize(days, \"day\")}`;\n return date.toLocaleDateString();\n }\n\n if (seconds < 60) return `${pluralize(seconds, \"second\")} ago`;\n if (minutes < 60)\n return `${pluralize(minutes, \"minute\")} ${pluralize(seconds % 60, \"second\")} ago`;\n if (hours < 24) return `${pluralize(hours, \"hour\")} ago`;\n if (days < 7) return `${pluralize(days, \"day\")} ago`;\n return date.toLocaleDateString();\n}\n\ninterface TimezoneCardProps extends React.ComponentProps<\"div\"> {\n date: Date;\n timezone?: string;\n}\n\nfunction TimezoneCard(props: TimezoneCardProps) {\n const { date, timezone, ...cardProps } = props;\n\n const locale = React.useMemo(\n () => Intl.DateTimeFormat().resolvedOptions().locale,\n [],\n );\n\n const timezoneName = React.useMemo(\n () =>\n timezone ??\n new Intl.DateTimeFormat(locale, { timeZoneName: \"shortOffset\" })\n .formatToParts(date)\n .find((part) => part.type === \"timeZoneName\")?.value,\n [date, timezone, locale],\n );\n\n const { formattedDate, formattedTime } = React.useMemo(\n () => ({\n formattedDate: new Intl.DateTimeFormat(locale, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone: timezone,\n }).format(date),\n formattedTime: new Intl.DateTimeFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n timeZone: timezone,\n }).format(date),\n }),\n [date, timezone, locale],\n );\n\n return (\n <div\n role=\"region\"\n aria-label={`Time in ${timezoneName}: ${formattedDate} ${formattedTime}`}\n {...cardProps}\n className=\"flex items-center justify-between gap-2 text-muted-foreground text-sm\"\n >\n <span className=\"w-fit rounded bg-accent px-1 font-medium text-xs\">\n {timezoneName}\n </span>\n <div className=\"flex items-center gap-2\">\n <time dateTime={date.toISOString()}>{formattedDate}</time>\n <time className=\"tabular-nums\" dateTime={date.toISOString()}>\n {formattedTime}\n </time>\n </div>\n </div>\n );\n}\n\nconst triggerVariants = cva(\n \"inline-flex w-fit items-center justify-center text-foreground/70 text-sm transition-colors hover:text-foreground/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"\",\n muted: \"text-foreground/50 hover:text-foreground/70\",\n ghost: \"hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\ninterface RelativeTimeCardProps\n extends React.ComponentProps<\"button\">,\n Pick<\n HoverCardContentProps,\n | \"align\"\n | \"side\"\n | \"alignOffset\"\n | \"sideOffset\"\n | \"avoidCollisions\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"asChild\"\n >,\n VariantProps<typeof triggerVariants> {\n date: Date | string | number;\n timezones?: string[];\n updateInterval?: number;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n openDelay?: number;\n closeDelay?: number;\n}\n\nfunction RelativeTimeCard(props: RelativeTimeCardProps) {\n const {\n date: dateProp,\n variant,\n timezones = [\"UTC\"],\n open,\n defaultOpen,\n onOpenChange,\n openDelay = 500,\n closeDelay = 300,\n align,\n side,\n alignOffset,\n sideOffset,\n avoidCollisions,\n collisionBoundary,\n collisionPadding,\n updateInterval = 1000,\n asChild,\n children,\n className,\n ...triggerProps\n } = props;\n\n const date = React.useMemo(\n () => (dateProp instanceof Date ? dateProp : new Date(dateProp)),\n [dateProp],\n );\n\n const locale = React.useMemo(\n () => Intl.DateTimeFormat().resolvedOptions().locale,\n [],\n );\n\n const [formattedTime, setFormattedTime] = React.useState<string>(() =>\n date.toLocaleDateString(),\n );\n\n React.useEffect(() => {\n setFormattedTime(formatRelativeTime(date));\n const timer = setInterval(() => {\n setFormattedTime(formatRelativeTime(date));\n }, updateInterval);\n\n return () => clearInterval(timer);\n }, [date, updateInterval]);\n\n const TriggerPrimitive = asChild ? Slot : \"button\";\n\n return (\n <HoverCard\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n openDelay={openDelay}\n closeDelay={closeDelay}\n >\n <HoverCardTrigger asChild>\n <TriggerPrimitive\n {...triggerProps}\n className={cn(triggerVariants({ variant, className }))}\n >\n {children ?? (\n <time dateTime={date.toISOString()} suppressHydrationWarning>\n {new Intl.DateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date)}\n </time>\n )}\n </TriggerPrimitive>\n </HoverCardTrigger>\n <HoverCardContent\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions={avoidCollisions}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n className=\"flex w-full max-w-[420px] flex-col gap-2 p-3\"\n >\n <time\n dateTime={date.toISOString()}\n className=\"text-muted-foreground text-sm\"\n >\n {formattedTime}\n </time>\n <div role=\"list\" className=\"flex flex-col gap-1\">\n {timezones.map((timezone) => (\n <TimezoneCard\n key={timezone}\n role=\"listitem\"\n date={date}\n timezone={timezone}\n />\n ))}\n <TimezoneCard role=\"listitem\" date={date} />\n </div>\n </HoverCardContent>\n </HoverCard>\n );\n}\n\nexport { RelativeTimeCard };\n"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/radix-vega/hover-card.tsx","../../src/radix-vega/relative-time-card.tsx"],"names":["HoverCardPrimitive","jsx"],"mappings":"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","file":"relative-time-card.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges Tailwind class names, resolving any conflicts.\n *\n * @param inputs - An array of class names to merge.\n * @returns A string of merged and optimized class names.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground w-64 rounded-lg p-4 text-sm shadow-md ring-1 duration-100 z-50 origin-(--radix-hover-card-content-transform-origin) outline-hidden\",\n className\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","\"use client\";\n\nimport type {\n HoverCardContentProps,\n HoverCardProps,\n} from \"@radix-ui/react-hover-card\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"@/radix-vega/hover-card\";\nimport { cn } from \"@/lib/utils\";\n\nfunction pluralize(n: number, word: string) {\n return `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n}\n\nfunction formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const isInFuture = diff < 0;\n const absDiff = Math.abs(diff);\n\n const seconds = Math.floor(absDiff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (seconds < 5) return \"just now\";\n\n if (isInFuture) {\n if (seconds < 60) return `in ${pluralize(seconds, \"second\")}`;\n if (minutes < 60) return `in ${pluralize(minutes, \"minute\")}`;\n if (hours < 24) return `in ${pluralize(hours, \"hour\")}`;\n if (days < 7) return `in ${pluralize(days, \"day\")}`;\n return date.toLocaleDateString();\n }\n\n if (seconds < 60) return `${pluralize(seconds, \"second\")} ago`;\n if (minutes < 60)\n return `${pluralize(minutes, \"minute\")} ${pluralize(seconds % 60, \"second\")} ago`;\n if (hours < 24) return `${pluralize(hours, \"hour\")} ago`;\n if (days < 7) return `${pluralize(days, \"day\")} ago`;\n return date.toLocaleDateString();\n}\n\ninterface TimezoneCardProps extends React.ComponentProps<\"div\"> {\n date: Date;\n timezone?: string;\n}\n\nfunction TimezoneCard(props: TimezoneCardProps) {\n const { date, timezone, ...cardProps } = props;\n\n const locale = React.useMemo(\n () => Intl.DateTimeFormat().resolvedOptions().locale,\n [],\n );\n\n const timezoneName = React.useMemo(\n () =>\n timezone ??\n new Intl.DateTimeFormat(locale, { timeZoneName: \"shortOffset\" })\n .formatToParts(date)\n .find((part) => part.type === \"timeZoneName\")?.value,\n [date, timezone, locale],\n );\n\n const { formattedDate, formattedTime } = React.useMemo(\n () => ({\n formattedDate: new Intl.DateTimeFormat(locale, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone: timezone,\n }).format(date),\n formattedTime: new Intl.DateTimeFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n timeZone: timezone,\n }).format(date),\n }),\n [date, timezone, locale],\n );\n\n return (\n <div\n role=\"region\"\n aria-label={`Time in ${timezoneName}: ${formattedDate} ${formattedTime}`}\n {...cardProps}\n className=\"flex items-center justify-between gap-2 text-muted-foreground text-sm\"\n >\n <span className=\"w-fit rounded bg-accent px-1 font-medium text-xs\">\n {timezoneName}\n </span>\n <div className=\"flex items-center gap-2\">\n <time dateTime={date.toISOString()}>{formattedDate}</time>\n <time className=\"tabular-nums\" dateTime={date.toISOString()}>\n {formattedTime}\n </time>\n </div>\n </div>\n );\n}\n\nconst triggerVariants = cva(\n \"inline-flex w-fit items-center justify-center text-foreground/70 text-sm transition-colors hover:text-foreground/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"\",\n muted: \"text-foreground/50 hover:text-foreground/70\",\n ghost: \"hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\ninterface RelativeTimeCardProps\n extends React.ComponentProps<\"button\">,\n HoverCardProps,\n Pick<\n HoverCardContentProps,\n | \"align\"\n | \"side\"\n | \"alignOffset\"\n | \"sideOffset\"\n | \"avoidCollisions\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"asChild\"\n >,\n VariantProps<typeof triggerVariants> {\n date: Date | string | number;\n timezones?: string[];\n updateInterval?: number;\n}\n\nfunction RelativeTimeCard(props: RelativeTimeCardProps) {\n const {\n date: dateProp,\n variant,\n timezones = [\"UTC\"],\n open,\n defaultOpen,\n onOpenChange,\n openDelay = 500,\n closeDelay = 300,\n align,\n side,\n alignOffset,\n sideOffset,\n avoidCollisions,\n collisionBoundary,\n collisionPadding,\n updateInterval = 1000,\n asChild,\n children,\n className,\n ...triggerProps\n } = props;\n\n const date = React.useMemo(\n () => (dateProp instanceof Date ? dateProp : new Date(dateProp)),\n [dateProp],\n );\n\n const locale = React.useMemo(\n () => Intl.DateTimeFormat().resolvedOptions().locale,\n [],\n );\n\n const [formattedTime, setFormattedTime] = React.useState<string>(() =>\n date.toLocaleDateString(),\n );\n\n React.useEffect(() => {\n setFormattedTime(formatRelativeTime(date));\n const timer = setInterval(() => {\n setFormattedTime(formatRelativeTime(date));\n }, updateInterval);\n\n return () => clearInterval(timer);\n }, [date, updateInterval]);\n\n const TriggerPrimitive = asChild ? Slot : \"button\";\n\n return (\n <HoverCard\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n openDelay={openDelay}\n closeDelay={closeDelay}\n >\n <HoverCardTrigger asChild>\n <TriggerPrimitive\n {...triggerProps}\n className={cn(triggerVariants({ variant, className }))}\n >\n {children ?? (\n <time dateTime={date.toISOString()} suppressHydrationWarning>\n {new Intl.DateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date)}\n </time>\n )}\n </TriggerPrimitive>\n </HoverCardTrigger>\n <HoverCardContent\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions={avoidCollisions}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n className=\"flex w-full max-w-[420px] flex-col gap-2 p-3\"\n >\n <time\n dateTime={date.toISOString()}\n className=\"text-muted-foreground text-sm\"\n >\n {formattedTime}\n </time>\n <div role=\"list\" className=\"flex flex-col gap-1\">\n {timezones.map((timezone) => (\n <TimezoneCard\n key={timezone}\n role=\"listitem\"\n date={date}\n timezone={timezone}\n />\n ))}\n <TimezoneCard role=\"listitem\" date={date} />\n </div>\n </HoverCardContent>\n </HoverCard>\n );\n}\n\nexport { RelativeTimeCard };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docyrus/shadcn",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "All shadcn/ui components bundled in a single NPM package for AI Builder projects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -191,13 +191,14 @@
191
191
  "nuqs": "^2.8.8",
192
192
  "qrcode": "^1.5.4",
193
193
  "radix-ui": "^1.4.3",
194
- "react-day-picker": "^9.13.0",
194
+ "react-day-picker": "^9.13.1",
195
195
  "react-hook-form": "^7.71.1",
196
196
  "react-resizable-panels": "^4.6.1",
197
197
  "recharts": "2.15.4",
198
198
  "sonner": "^2.0.7",
199
199
  "tailwind-merge": "^3.4.0",
200
- "vaul": "^1.1.2"
200
+ "vaul": "^1.1.2",
201
+ "zod": "^4.3.6"
201
202
  },
202
203
  "devDependencies": {
203
204
  "@types/node": "25.2.1",