@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.
- package/dist/data-table-DWI8FPWh.d.ts +209 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.js +300 -16
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-data-table.d.ts +29 -0
- package/dist/hooks/use-data-table.js +322 -0
- package/dist/hooks/use-data-table.js.map +1 -0
- package/dist/index.d.ts +87 -25
- package/dist/index.js +2504 -1151
- package/dist/index.js.map +1 -1
- package/dist/lib/data-table.d.ts +4 -0
- package/dist/lib/data-table.js +100 -0
- package/dist/lib/data-table.js.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.js +155 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/parsers.d.ts +4 -0
- package/dist/lib/parsers.js +94 -0
- package/dist/lib/parsers.js.map +1 -0
- package/dist/radix-vega/data-table-column-header.d.ts +13 -0
- package/dist/radix-vega/data-table-column-header.js +178 -0
- package/dist/radix-vega/data-table-column-header.js.map +1 -0
- package/dist/radix-vega/data-table-date-filter.d.ts +11 -0
- package/dist/radix-vega/data-table-date-filter.js +470 -0
- package/dist/radix-vega/data-table-date-filter.js.map +1 -0
- package/dist/radix-vega/data-table-faceted-filter.d.ts +166 -0
- package/dist/radix-vega/data-table-faceted-filter.js +468 -0
- package/dist/radix-vega/data-table-faceted-filter.js.map +1 -0
- package/dist/radix-vega/data-table-pagination.d.ts +10 -0
- package/dist/radix-vega/data-table-pagination.js +286 -0
- package/dist/radix-vega/data-table-pagination.js.map +1 -0
- package/dist/radix-vega/data-table-skeleton.d.ts +14 -0
- package/dist/radix-vega/data-table-skeleton.js +151 -0
- package/dist/radix-vega/data-table-skeleton.js.map +1 -0
- package/dist/radix-vega/data-table-slider-filter.d.ts +10 -0
- package/dist/radix-vega/data-table-slider-filter.js +387 -0
- package/dist/radix-vega/data-table-slider-filter.js.map +1 -0
- package/dist/radix-vega/data-table-toolbar.d.ts +10 -0
- package/dist/radix-vega/data-table-toolbar.js +1272 -0
- package/dist/radix-vega/data-table-toolbar.js.map +1 -0
- package/dist/radix-vega/data-table-view-options.d.ts +13 -0
- package/dist/radix-vega/data-table-view-options.js +314 -0
- package/dist/radix-vega/data-table-view-options.js.map +1 -0
- package/dist/radix-vega/data-table.d.ts +11 -0
- package/dist/radix-vega/data-table.js +429 -0
- package/dist/radix-vega/data-table.js.map +1 -0
- package/dist/radix-vega/index.d.ts +10 -0
- package/dist/radix-vega/index.js +2170 -1156
- package/dist/radix-vega/index.js.map +1 -1
- package/dist/radix-vega/relative-time-card.d.ts +2 -7
- package/dist/radix-vega/relative-time-card.js.map +1 -1
- 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.
|
|
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.
|
|
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",
|