@proofhound/ui 0.1.6

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 (174) hide show
  1. package/LICENSE +190 -0
  2. package/dist/brand/index.d.ts +2 -0
  3. package/dist/brand/index.d.ts.map +1 -0
  4. package/dist/brand/index.js +2 -0
  5. package/dist/brand/index.js.map +1 -0
  6. package/dist/brand/proofhound-logo.d.ts +21 -0
  7. package/dist/brand/proofhound-logo.d.ts.map +1 -0
  8. package/dist/brand/proofhound-logo.js +58 -0
  9. package/dist/brand/proofhound-logo.js.map +1 -0
  10. package/dist/hooks/index.d.ts +2 -0
  11. package/dist/hooks/index.d.ts.map +1 -0
  12. package/dist/hooks/index.js +2 -0
  13. package/dist/hooks/index.js.map +1 -0
  14. package/dist/hooks/use-mobile.d.ts +2 -0
  15. package/dist/hooks/use-mobile.d.ts.map +1 -0
  16. package/dist/hooks/use-mobile.js +20 -0
  17. package/dist/hooks/use-mobile.js.map +1 -0
  18. package/dist/index.d.ts +8 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +13 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/layout/index.d.ts +2 -0
  23. package/dist/layout/index.d.ts.map +1 -0
  24. package/dist/layout/index.js +2 -0
  25. package/dist/layout/index.js.map +1 -0
  26. package/dist/layout/main.d.ts +9 -0
  27. package/dist/layout/main.d.ts.map +1 -0
  28. package/dist/layout/main.js +6 -0
  29. package/dist/layout/main.js.map +1 -0
  30. package/dist/lib/index.d.ts +2 -0
  31. package/dist/lib/index.d.ts.map +1 -0
  32. package/dist/lib/index.js +2 -0
  33. package/dist/lib/index.js.map +1 -0
  34. package/dist/lib/utils.d.ts +3 -0
  35. package/dist/lib/utils.d.ts.map +1 -0
  36. package/dist/lib/utils.js +6 -0
  37. package/dist/lib/utils.js.map +1 -0
  38. package/dist/primitives/avatar.d.ts +7 -0
  39. package/dist/primitives/avatar.d.ts.map +1 -0
  40. package/dist/primitives/avatar.js +13 -0
  41. package/dist/primitives/avatar.js.map +1 -0
  42. package/dist/primitives/badge.d.ts +10 -0
  43. package/dist/primitives/badge.d.ts.map +1 -0
  44. package/dist/primitives/badge.js +21 -0
  45. package/dist/primitives/badge.js.map +1 -0
  46. package/dist/primitives/button.d.ts +12 -0
  47. package/dist/primitives/button.d.ts.map +1 -0
  48. package/dist/primitives/button.js +34 -0
  49. package/dist/primitives/button.js.map +1 -0
  50. package/dist/primitives/collapsible.d.ts +6 -0
  51. package/dist/primitives/collapsible.d.ts.map +1 -0
  52. package/dist/primitives/collapsible.js +7 -0
  53. package/dist/primitives/collapsible.js.map +1 -0
  54. package/dist/primitives/date-range-segmented.d.ts +50 -0
  55. package/dist/primitives/date-range-segmented.d.ts.map +1 -0
  56. package/dist/primitives/date-range-segmented.js +214 -0
  57. package/dist/primitives/date-range-segmented.js.map +1 -0
  58. package/dist/primitives/detail-page-skeleton.d.ts +9 -0
  59. package/dist/primitives/detail-page-skeleton.d.ts.map +1 -0
  60. package/dist/primitives/detail-page-skeleton.js +8 -0
  61. package/dist/primitives/detail-page-skeleton.js.map +1 -0
  62. package/dist/primitives/dialog.d.ts +20 -0
  63. package/dist/primitives/dialog.d.ts.map +1 -0
  64. package/dist/primitives/dialog.js +32 -0
  65. package/dist/primitives/dialog.js.map +1 -0
  66. package/dist/primitives/dropdown-menu.d.ts +28 -0
  67. package/dist/primitives/dropdown-menu.d.ts.map +1 -0
  68. package/dist/primitives/dropdown-menu.js +37 -0
  69. package/dist/primitives/dropdown-menu.js.map +1 -0
  70. package/dist/primitives/image-preview-dialog.d.ts +11 -0
  71. package/dist/primitives/image-preview-dialog.d.ts.map +1 -0
  72. package/dist/primitives/image-preview-dialog.js +34 -0
  73. package/dist/primitives/image-preview-dialog.js.map +1 -0
  74. package/dist/primitives/index.d.ts +32 -0
  75. package/dist/primitives/index.d.ts.map +1 -0
  76. package/dist/primitives/index.js +32 -0
  77. package/dist/primitives/index.js.map +1 -0
  78. package/dist/primitives/input.d.ts +4 -0
  79. package/dist/primitives/input.d.ts.map +1 -0
  80. package/dist/primitives/input.js +9 -0
  81. package/dist/primitives/input.js.map +1 -0
  82. package/dist/primitives/kanban-scroll-area.d.ts +5 -0
  83. package/dist/primitives/kanban-scroll-area.d.ts.map +1 -0
  84. package/dist/primitives/kanban-scroll-area.js +6 -0
  85. package/dist/primitives/kanban-scroll-area.js.map +1 -0
  86. package/dist/primitives/label.d.ts +6 -0
  87. package/dist/primitives/label.d.ts.map +1 -0
  88. package/dist/primitives/label.js +11 -0
  89. package/dist/primitives/label.js.map +1 -0
  90. package/dist/primitives/list-page-skeleton.d.ts +13 -0
  91. package/dist/primitives/list-page-skeleton.d.ts.map +1 -0
  92. package/dist/primitives/list-page-skeleton.js +11 -0
  93. package/dist/primitives/list-page-skeleton.js.map +1 -0
  94. package/dist/primitives/modality-icon.d.ts +22 -0
  95. package/dist/primitives/modality-icon.d.ts.map +1 -0
  96. package/dist/primitives/modality-icon.js +45 -0
  97. package/dist/primitives/modality-icon.js.map +1 -0
  98. package/dist/primitives/multi-select.d.ts +20 -0
  99. package/dist/primitives/multi-select.d.ts.map +1 -0
  100. package/dist/primitives/multi-select.js +60 -0
  101. package/dist/primitives/multi-select.js.map +1 -0
  102. package/dist/primitives/platform-loader.d.ts +18 -0
  103. package/dist/primitives/platform-loader.d.ts.map +1 -0
  104. package/dist/primitives/platform-loader.js +27 -0
  105. package/dist/primitives/platform-loader.js.map +1 -0
  106. package/dist/primitives/popover.d.ts +8 -0
  107. package/dist/primitives/popover.d.ts.map +1 -0
  108. package/dist/primitives/popover.js +12 -0
  109. package/dist/primitives/popover.js.map +1 -0
  110. package/dist/primitives/progress.d.ts +20 -0
  111. package/dist/primitives/progress.d.ts.map +1 -0
  112. package/dist/primitives/progress.js +28 -0
  113. package/dist/primitives/progress.js.map +1 -0
  114. package/dist/primitives/resource-pagination-footer.d.ts +13 -0
  115. package/dist/primitives/resource-pagination-footer.d.ts.map +1 -0
  116. package/dist/primitives/resource-pagination-footer.js +11 -0
  117. package/dist/primitives/resource-pagination-footer.js.map +1 -0
  118. package/dist/primitives/segmented.d.ts +15 -0
  119. package/dist/primitives/segmented.d.ts.map +1 -0
  120. package/dist/primitives/segmented.js +15 -0
  121. package/dist/primitives/segmented.js.map +1 -0
  122. package/dist/primitives/select.d.ts +14 -0
  123. package/dist/primitives/select.d.ts.map +1 -0
  124. package/dist/primitives/select.js +27 -0
  125. package/dist/primitives/select.js.map +1 -0
  126. package/dist/primitives/separator.d.ts +5 -0
  127. package/dist/primitives/separator.d.ts.map +1 -0
  128. package/dist/primitives/separator.js +9 -0
  129. package/dist/primitives/separator.js.map +1 -0
  130. package/dist/primitives/sheet.d.ts +27 -0
  131. package/dist/primitives/sheet.d.ts.map +1 -0
  132. package/dist/primitives/sheet.js +38 -0
  133. package/dist/primitives/sheet.js.map +1 -0
  134. package/dist/primitives/sidebar.d.ts +68 -0
  135. package/dist/primitives/sidebar.d.ts.map +1 -0
  136. package/dist/primitives/sidebar.js +224 -0
  137. package/dist/primitives/sidebar.js.map +1 -0
  138. package/dist/primitives/skeleton.d.ts +3 -0
  139. package/dist/primitives/skeleton.d.ts.map +1 -0
  140. package/dist/primitives/skeleton.js +7 -0
  141. package/dist/primitives/skeleton.js.map +1 -0
  142. package/dist/primitives/sliding-view-toggle.d.ts +14 -0
  143. package/dist/primitives/sliding-view-toggle.d.ts.map +1 -0
  144. package/dist/primitives/sliding-view-toggle.js +12 -0
  145. package/dist/primitives/sliding-view-toggle.js.map +1 -0
  146. package/dist/primitives/switch.d.ts +5 -0
  147. package/dist/primitives/switch.d.ts.map +1 -0
  148. package/dist/primitives/switch.js +9 -0
  149. package/dist/primitives/switch.js.map +1 -0
  150. package/dist/primitives/table-action.d.ts +52 -0
  151. package/dist/primitives/table-action.d.ts.map +1 -0
  152. package/dist/primitives/table-action.js +47 -0
  153. package/dist/primitives/table-action.js.map +1 -0
  154. package/dist/primitives/table.d.ts +78 -0
  155. package/dist/primitives/table.d.ts.map +1 -0
  156. package/dist/primitives/table.js +131 -0
  157. package/dist/primitives/table.js.map +1 -0
  158. package/dist/primitives/tooltip.d.ts +8 -0
  159. package/dist/primitives/tooltip.d.ts.map +1 -0
  160. package/dist/primitives/tooltip.js +12 -0
  161. package/dist/primitives/tooltip.js.map +1 -0
  162. package/dist/primitives/unused-images-badge.d.ts +9 -0
  163. package/dist/primitives/unused-images-badge.d.ts.map +1 -0
  164. package/dist/primitives/unused-images-badge.js +10 -0
  165. package/dist/primitives/unused-images-badge.js.map +1 -0
  166. package/dist/strings/index.d.ts +3 -0
  167. package/dist/strings/index.d.ts.map +1 -0
  168. package/dist/strings/index.js +2 -0
  169. package/dist/strings/index.js.map +1 -0
  170. package/dist/strings/ui-strings-context.d.ts +33 -0
  171. package/dist/strings/ui-strings-context.d.ts.map +1 -0
  172. package/dist/strings/ui-strings-context.js +19 -0
  173. package/dist/strings/ui-strings-context.js.map +1 -0
  174. package/package.json +74 -0
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
3
+ const Collapsible = CollapsiblePrimitive.Root;
4
+ const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
5
+ const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
6
+ export { Collapsible, CollapsibleTrigger, CollapsibleContent };
7
+ //# sourceMappingURL=collapsible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible.js","sourceRoot":"","sources":["../../src/primitives/collapsible.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,KAAK,oBAAoB,MAAM,6BAA6B,CAAA;AAEnE,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAA;AAE7C,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,kBAAkB,CAAA;AAElE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,kBAAkB,CAAA;AAElE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAA"}
@@ -0,0 +1,50 @@
1
+ export type DateRangePreset = 'h1' | 'h24' | 'd7' | 'd30' | 'custom';
2
+ export interface DateRangeValue {
3
+ preset: DateRangePreset;
4
+ from: string;
5
+ to: string;
6
+ }
7
+ export interface DateRangePresetOption {
8
+ value: DateRangePreset;
9
+ label: string;
10
+ }
11
+ export interface DateRangeSegmentedLabels {
12
+ ariaLabel: string;
13
+ customRangeAriaLabel: string;
14
+ fromLabel: string;
15
+ toLabel: string;
16
+ dateLabel: string;
17
+ timeLabel: string;
18
+ previousMonth: string;
19
+ nextMonth: string;
20
+ cancel: string;
21
+ apply: string;
22
+ invalidRange: string;
23
+ }
24
+ export interface LocalDateTimeParts {
25
+ date: string;
26
+ time: string;
27
+ }
28
+ export interface CalendarDay {
29
+ date: string;
30
+ day: number;
31
+ inCurrentMonth: boolean;
32
+ isToday: boolean;
33
+ }
34
+ export declare function resolveDateRangePreset(preset: DateRangePreset, now?: Date): {
35
+ from: string;
36
+ to: string;
37
+ } | null;
38
+ export declare function resolveRollingDateRangeValue(value: DateRangeValue, now?: Date): DateRangeValue;
39
+ export declare function DateRangeSegmented({ value, onChange, presetLabels, labels, locale, className, }: {
40
+ value: DateRangeValue;
41
+ onChange: (next: DateRangeValue) => void;
42
+ presetLabels?: ReadonlyArray<DateRangePresetOption>;
43
+ labels?: DateRangeSegmentedLabels;
44
+ locale?: string;
45
+ className?: string;
46
+ }): import("react/jsx-runtime").JSX.Element;
47
+ export declare function toLocalDateTimeParts(iso: string): LocalDateTimeParts;
48
+ export declare function localDateTimePartsToIso(parts: LocalDateTimeParts): string | null;
49
+ export declare function buildCalendarDays(month: Date): CalendarDay[];
50
+ //# sourceMappingURL=date-range-segmented.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-segmented.d.ts","sourceRoot":"","sources":["../../src/primitives/date-range-segmented.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAmCD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,EACvB,GAAG,GAAE,IAAiB,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWrC;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,cAAc,EACrB,GAAG,GAAE,IAAiB,GACrB,cAAc,CAGhB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,YAAsB,EACtB,MAAuB,EACvB,MAAgB,EAChB,SAAS,GACV,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CA0BA;AAqPD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAQpE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAkChF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,EAAE,CAgB5D"}
@@ -0,0 +1,214 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useMemo, useState } from 'react';
4
+ import { CalendarRange, ChevronLeft, ChevronRight, Clock } from 'lucide-react';
5
+ import { Popover, PopoverContent, PopoverTrigger } from './popover';
6
+ import { Segmented } from './segmented';
7
+ import { cn } from '../lib/utils';
8
+ const PRESETS = [
9
+ { value: 'h1', label: '近 1 小时' },
10
+ { value: 'h24', label: '近 24 小时' },
11
+ { value: 'd7', label: '近 7 天' },
12
+ { value: 'd30', label: '近 30 天' },
13
+ { value: 'custom', label: '自定义' },
14
+ ];
15
+ const DEFAULT_LABELS = {
16
+ ariaLabel: '时间范围',
17
+ customRangeAriaLabel: '自定义时间范围',
18
+ fromLabel: '开始',
19
+ toLabel: '结束',
20
+ dateLabel: '日期',
21
+ timeLabel: '时间',
22
+ previousMonth: '上个月',
23
+ nextMonth: '下个月',
24
+ cancel: '取消',
25
+ apply: '应用',
26
+ invalidRange: '结束时间必须晚于开始时间',
27
+ };
28
+ const WEEKDAY_REFERENCE_DATES = [
29
+ '2024-01-07T00:00:00',
30
+ '2024-01-08T00:00:00',
31
+ '2024-01-09T00:00:00',
32
+ '2024-01-10T00:00:00',
33
+ '2024-01-11T00:00:00',
34
+ '2024-01-12T00:00:00',
35
+ '2024-01-13T00:00:00',
36
+ ];
37
+ // Compute [from, to) from a preset. to uses now to make monitoring display convenient
38
+ export function resolveDateRangePreset(preset, now = new Date()) {
39
+ if (preset === 'custom')
40
+ return null;
41
+ const ms = {
42
+ h1: 60 * 60_000,
43
+ h24: 24 * 60 * 60_000,
44
+ d7: 7 * 24 * 60 * 60_000,
45
+ d30: 30 * 24 * 60 * 60_000,
46
+ }[preset];
47
+ const to = now;
48
+ const from = new Date(to.getTime() - ms);
49
+ return { from: from.toISOString(), to: to.toISOString() };
50
+ }
51
+ export function resolveRollingDateRangeValue(value, now = new Date()) {
52
+ const resolved = resolveDateRangePreset(value.preset, now);
53
+ return resolved ? { preset: value.preset, ...resolved } : value;
54
+ }
55
+ export function DateRangeSegmented({ value, onChange, presetLabels = PRESETS, labels = DEFAULT_LABELS, locale = 'zh-CN', className, }) {
56
+ return (_jsxs("div", { className: cn('inline-flex items-center gap-2', className), children: [_jsx(Segmented, { ariaLabel: labels.ariaLabel, value: value.preset, options: presetLabels, onChange: (preset) => {
57
+ if (preset === 'custom') {
58
+ onChange({ ...value, preset });
59
+ return;
60
+ }
61
+ const resolved = resolveDateRangePreset(preset);
62
+ if (resolved)
63
+ onChange({ preset, ...resolved });
64
+ } }), value.preset === 'custom' && (_jsx(CustomRangePopover, { value: value, labels: labels, locale: locale, onChange: (from, to) => onChange({ preset: 'custom', from, to }) }))] }));
65
+ }
66
+ function CustomRangePopover({ value, labels, locale, onChange, }) {
67
+ const [open, setOpen] = useState(false);
68
+ const fromLabel = formatDisplay(value.from);
69
+ const toLabel = formatDisplay(value.to);
70
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", "aria-label": labels.customRangeAriaLabel, className: "inline-flex h-8 max-w-[min(42rem,calc(100vw-2rem))] min-w-0 items-center gap-1.5 rounded-lg border bg-background px-2.5 text-[12.5px] font-medium text-foreground hover:bg-accent cursor-pointer", children: [_jsx(CalendarRange, { className: "size-3.5 shrink-0 text-muted-foreground" }), _jsxs("span", { className: "min-w-0 truncate font-mono", children: [fromLabel, " \u2192 ", toLabel] })] }) }), _jsx(PopoverContent, { align: "end", sideOffset: 6, className: "w-[calc(100vw-2rem)] p-3 sm:w-[640px]", children: open && (_jsx(CustomRangeForm, { initialFrom: value.from, initialTo: value.to, labels: labels, locale: locale, onCancel: () => setOpen(false), onApply: (from, to) => {
71
+ onChange(from, to);
72
+ setOpen(false);
73
+ } })) })] }));
74
+ }
75
+ function CustomRangeForm({ initialFrom, initialTo, labels, locale, onApply, onCancel, }) {
76
+ const [from, setFrom] = useState(() => toLocalDateTimeParts(initialFrom));
77
+ const [to, setTo] = useState(() => toLocalDateTimeParts(initialTo));
78
+ const [fromMonth, setFromMonth] = useState(() => monthStartFromParts(toLocalDateTimeParts(initialFrom)));
79
+ const [toMonth, setToMonth] = useState(() => monthStartFromParts(toLocalDateTimeParts(initialTo)));
80
+ const fromIso = localDateTimePartsToIso(from);
81
+ const toIso = localDateTimePartsToIso(to);
82
+ const hasRangeError = Boolean(fromIso && toIso && new Date(fromIso) >= new Date(toIso));
83
+ const canApply = Boolean(fromIso && toIso && !hasRangeError);
84
+ return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "grid gap-3 sm:grid-cols-2", children: [_jsx(CalendarPanel, { scope: "from", label: labels.fromLabel, labels: labels, locale: locale, parts: from, month: fromMonth, onMonthChange: setFromMonth, onDateChange: (date) => {
85
+ setFrom((prev) => ({ ...prev, date }));
86
+ setFromMonth(monthStartFromDateValue(date));
87
+ }, onTimeChange: (time) => setFrom((prev) => ({ ...prev, time })) }), _jsx(CalendarPanel, { scope: "to", label: labels.toLabel, labels: labels, locale: locale, parts: to, month: toMonth, onMonthChange: setToMonth, onDateChange: (date) => {
88
+ setTo((prev) => ({ ...prev, date }));
89
+ setToMonth(monthStartFromDateValue(date));
90
+ }, onTimeChange: (time) => setTo((prev) => ({ ...prev, time })) })] }), _jsxs("div", { className: "flex min-h-5 items-center justify-between gap-3", children: [_jsx("div", { className: "text-[12px] text-destructive", role: hasRangeError ? 'alert' : undefined, children: hasRangeError ? labels.invalidRange : null }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx("button", { type: "button", onClick: onCancel, className: "rounded-md border bg-background px-3 py-1.5 text-[12.5px] text-muted-foreground hover:bg-accent cursor-pointer", children: labels.cancel }), _jsx("button", { type: "button", disabled: !canApply, onClick: () => {
91
+ if (fromIso && toIso && !hasRangeError)
92
+ onApply(fromIso, toIso);
93
+ }, className: "rounded-md bg-primary px-3 py-1.5 text-[12.5px] font-medium text-primary-foreground hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer", children: labels.apply })] })] })] }));
94
+ }
95
+ function CalendarPanel({ scope, label, labels, locale, parts, month, onMonthChange, onDateChange, onTimeChange, }) {
96
+ const days = useMemo(() => buildCalendarDays(month), [month]);
97
+ const weekdayLabels = useMemo(() => buildWeekdayLabels(locale), [locale]);
98
+ return (_jsxs("section", { className: "rounded-lg border bg-background p-2.5", "aria-label": label, "data-testid": `date-range-panel-${scope}`, children: [_jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [_jsxs("div", { children: [_jsx("div", { className: "text-[12.5px] font-semibold text-foreground", children: label }), _jsx("div", { className: "font-mono text-[11px] text-muted-foreground", children: formatDisplayDate(parts.date) })] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { type: "button", "aria-label": `${label} ${labels.previousMonth}`, onClick: () => onMonthChange(shiftMonth(month, -1)), className: "inline-flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer", children: _jsx(ChevronLeft, { className: "size-3.5" }) }), _jsx("div", { className: "min-w-24 text-center text-[12px] font-medium text-foreground", children: formatMonth(month, locale) }), _jsx("button", { type: "button", "aria-label": `${label} ${labels.nextMonth}`, onClick: () => onMonthChange(shiftMonth(month, 1)), className: "inline-flex size-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer", children: _jsx(ChevronRight, { className: "size-3.5" }) })] })] }), _jsxs("div", { className: "grid grid-cols-7 gap-1", "data-testid": `date-range-calendar-${scope}`, children: [weekdayLabels.map((weekday, index) => (_jsx("div", { className: "h-6 text-center text-[11px] font-medium leading-6 text-muted-foreground", children: weekday }, WEEKDAY_REFERENCE_DATES[index]))), days.map((day) => {
99
+ const selected = day.date === parts.date;
100
+ return (_jsx("button", { type: "button", "aria-label": `${label} ${labels.dateLabel} ${formatDisplayDate(day.date)}`, "aria-pressed": selected, onClick: () => onDateChange(day.date), className: cn('inline-flex size-8 items-center justify-center rounded-md border text-[12px] font-medium transition-colors cursor-pointer', selected
101
+ ? 'border-primary bg-primary text-primary-foreground'
102
+ : 'border-transparent text-foreground hover:border-border hover:bg-accent', !selected && !day.inCurrentMonth && 'text-muted-foreground/50', !selected && day.isToday && 'border-primary text-foreground'), children: day.day }, day.date));
103
+ })] }), _jsxs("label", { className: "mt-2 flex items-center gap-2 border-t pt-2 text-[12px] text-muted-foreground", children: [_jsx(Clock, { className: "size-3.5", "aria-hidden": true }), _jsx("span", { className: "shrink-0", children: labels.timeLabel }), _jsx("input", { "data-testid": `date-range-time-${scope}`, type: "time", step: 60, value: parts.time, onChange: (event) => onTimeChange(event.target.value), className: "h-8 min-w-0 flex-1 rounded-md border bg-background px-2 font-mono text-[13px] text-foreground outline-none focus:border-ring" })] })] }));
104
+ }
105
+ export function toLocalDateTimeParts(iso) {
106
+ const d = new Date(iso);
107
+ if (Number.isNaN(d.getTime()))
108
+ return { date: '', time: '' };
109
+ const pad = (n) => String(n).padStart(2, '0');
110
+ return {
111
+ date: `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`,
112
+ time: `${pad(d.getHours())}:${pad(d.getMinutes())}`,
113
+ };
114
+ }
115
+ export function localDateTimePartsToIso(parts) {
116
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(parts.date) || !/^\d{2}:\d{2}$/.test(parts.time))
117
+ return null;
118
+ const dateParts = parts.date.split('-').map(Number);
119
+ const timeParts = parts.time.split(':').map(Number);
120
+ const year = dateParts[0];
121
+ const month = dateParts[1];
122
+ const day = dateParts[2];
123
+ const hour = timeParts[0];
124
+ const minute = timeParts[1];
125
+ if (month < 1 ||
126
+ month > 12 ||
127
+ day < 1 ||
128
+ hour < 0 ||
129
+ hour > 23 ||
130
+ minute < 0 ||
131
+ minute > 59) {
132
+ return null;
133
+ }
134
+ const date = new Date(year, month - 1, day, hour, minute, 0, 0);
135
+ if (date.getFullYear() !== year ||
136
+ date.getMonth() !== month - 1 ||
137
+ date.getDate() !== day ||
138
+ date.getHours() !== hour ||
139
+ date.getMinutes() !== minute) {
140
+ return null;
141
+ }
142
+ return date.toISOString();
143
+ }
144
+ export function buildCalendarDays(month) {
145
+ const monthStart = new Date(month.getFullYear(), month.getMonth(), 1);
146
+ const gridStart = new Date(monthStart);
147
+ gridStart.setDate(monthStart.getDate() - monthStart.getDay());
148
+ return Array.from({ length: 42 }, (_, index) => {
149
+ const date = new Date(gridStart);
150
+ date.setDate(gridStart.getDate() + index);
151
+ const value = formatDateValue(date);
152
+ return {
153
+ date: value,
154
+ day: date.getDate(),
155
+ inCurrentMonth: date.getMonth() === monthStart.getMonth(),
156
+ isToday: value === formatDateValue(new Date()),
157
+ };
158
+ });
159
+ }
160
+ function buildWeekdayLabels(locale) {
161
+ const formatter = new Intl.DateTimeFormat(locale, { weekday: 'narrow' });
162
+ return WEEKDAY_REFERENCE_DATES.map((value) => formatter.format(new Date(value)));
163
+ }
164
+ function monthStartFromParts(parts) {
165
+ return monthStartFromDateValue(parts.date);
166
+ }
167
+ function monthStartFromDateValue(value) {
168
+ const parsed = parseDateValue(value);
169
+ if (!parsed) {
170
+ const now = new Date();
171
+ return new Date(now.getFullYear(), now.getMonth(), 1);
172
+ }
173
+ return new Date(parsed.year, parsed.month - 1, 1);
174
+ }
175
+ function parseDateValue(value) {
176
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value))
177
+ return null;
178
+ const parts = value.split('-').map(Number);
179
+ const year = parts[0];
180
+ const month = parts[1];
181
+ const day = parts[2];
182
+ if (month < 1 || month > 12 || day < 1)
183
+ return null;
184
+ const date = new Date(year, month - 1, day);
185
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
186
+ return null;
187
+ }
188
+ return { year, month, day };
189
+ }
190
+ function shiftMonth(month, offset) {
191
+ return new Date(month.getFullYear(), month.getMonth() + offset, 1);
192
+ }
193
+ function formatMonth(month, locale) {
194
+ return new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'long' }).format(month);
195
+ }
196
+ function formatDateValue(date) {
197
+ const pad = (n) => String(n).padStart(2, '0');
198
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
199
+ }
200
+ function formatDisplayDate(value) {
201
+ const parsed = parseDateValue(value);
202
+ if (!parsed)
203
+ return '—';
204
+ const pad = (n) => String(n).padStart(2, '0');
205
+ return `${parsed.year}/${pad(parsed.month)}/${pad(parsed.day)}`;
206
+ }
207
+ function formatDisplay(iso) {
208
+ const d = new Date(iso);
209
+ if (Number.isNaN(d.getTime()))
210
+ return '—';
211
+ const pad = (n) => String(n).padStart(2, '0');
212
+ return `${d.getFullYear()}/${pad(d.getMonth() + 1)}/${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
213
+ }
214
+ //# sourceMappingURL=date-range-segmented.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-segmented.js","sourceRoot":"","sources":["../../src/primitives/date-range-segmented.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAyClC,MAAM,OAAO,GAAyC;IACpD,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;IAChC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;IAClC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IAC/B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;IACjC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;CAClC,CAAC;AAEF,MAAM,cAAc,GAA6B;IAC/C,SAAS,EAAE,MAAM;IACjB,oBAAoB,EAAE,SAAS;IAC/B,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,KAAK;IACpB,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,YAAY,EAAE,cAAc;CAC7B,CAAC;AAEF,MAAM,uBAAuB,GAAG;IAC9B,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAEF,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CACpC,MAAuB,EACvB,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,EAAE,GAAG;QACT,EAAE,EAAE,EAAE,GAAG,MAAM;QACf,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM;QACrB,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;QACxB,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;KAC3B,CAAC,MAAM,CAAC,CAAC;IACV,MAAM,EAAE,GAAG,GAAG,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAqB,EACrB,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,YAAY,GAAG,OAAO,EACtB,MAAM,GAAG,cAAc,EACvB,MAAM,GAAG,OAAO,EAChB,SAAS,GAQV;IACC,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,gCAAgC,EAAE,SAAS,CAAC,aAC7D,KAAC,SAAS,IACR,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,KAAK,EAAE,KAAK,CAAC,MAAM,EACnB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;oBACnB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACxB,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC/B,OAAO;oBACT,CAAC;oBACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;oBAChD,IAAI,QAAQ;wBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;gBAClD,CAAC,GACD,EACD,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAC5B,KAAC,kBAAkB,IACjB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAChE,CACH,IACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,MAAM,EACN,MAAM,EACN,QAAQ,GAMT;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAExC,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aACxC,KAAC,cAAc,IAAC,OAAO,kBACrB,kBACE,IAAI,EAAC,QAAQ,gBACD,MAAM,CAAC,oBAAoB,EACvC,SAAS,EAAC,kMAAkM,aAE5M,KAAC,aAAa,IAAC,SAAS,EAAC,yCAAyC,GAAG,EACrE,gBAAM,SAAS,EAAC,4BAA4B,aACzC,SAAS,cAAK,OAAO,IACjB,IACA,GACM,EACjB,KAAC,cAAc,IAAC,KAAK,EAAC,KAAK,EAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAC,uCAAuC,YAGzF,IAAI,IAAI,CACP,KAAC,eAAe,IACd,WAAW,EAAE,KAAK,CAAC,IAAI,EACvB,SAAS,EAAE,KAAK,CAAC,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;wBACpB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBACnB,OAAO,CAAC,KAAK,CAAC,CAAC;oBACjB,CAAC,GACD,CACH,GACc,IACT,CACX,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EACvB,WAAW,EACX,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,GAQT;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEnG,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;IAE7D,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,2BAA2B,aACxC,KAAC,aAAa,IACZ,KAAK,EAAC,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,SAAS,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,YAAY,EAC3B,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;4BACrB,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;4BACvC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC9C,CAAC,EACD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAC9D,EACF,KAAC,aAAa,IACZ,KAAK,EAAC,IAAI,EACV,KAAK,EAAE,MAAM,CAAC,OAAO,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,EAAE,EACT,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,UAAU,EACzB,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;4BACrB,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;4BACrC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC5C,CAAC,EACD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAC5D,IACE,EAEN,eAAK,SAAS,EAAC,iDAAiD,aAC9D,cAAK,SAAS,EAAC,8BAA8B,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,YACpF,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,GACvC,EACN,eAAK,SAAS,EAAC,wBAAwB,aACrC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,gHAAgH,YAEzH,MAAM,CAAC,MAAM,GACP,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,QAAQ,EACnB,OAAO,EAAE,GAAG,EAAE;oCACZ,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC,aAAa;wCAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gCAClE,CAAC,EACD,SAAS,EAAC,qKAAqK,YAE9K,MAAM,CAAC,KAAK,GACN,IACL,IACF,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,KAAK,EACL,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,EACL,aAAa,EACb,YAAY,EACZ,YAAY,GAWb;IACC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1E,OAAO,CACL,mBACE,SAAS,EAAC,uCAAuC,gBACrC,KAAK,iBACJ,oBAAoB,KAAK,EAAE,aAExC,eAAK,SAAS,EAAC,8CAA8C,aAC3D,0BACE,cAAK,SAAS,EAAC,6CAA6C,YAAE,KAAK,GAAO,EAC1E,cAAK,SAAS,EAAC,6CAA6C,YAAE,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAO,IAC9F,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,IAAI,EAAC,QAAQ,gBACD,GAAG,KAAK,IAAI,MAAM,CAAC,aAAa,EAAE,EAC9C,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EACnD,SAAS,EAAC,sIAAsI,YAEhJ,KAAC,WAAW,IAAC,SAAS,EAAC,UAAU,GAAG,GAC7B,EACT,cAAK,SAAS,EAAC,8DAA8D,YAC1E,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,GACvB,EACN,iBACE,IAAI,EAAC,QAAQ,gBACD,GAAG,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,EAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAClD,SAAS,EAAC,sIAAsI,YAEhJ,KAAC,YAAY,IAAC,SAAS,EAAC,UAAU,GAAG,GAC9B,IACL,IACF,EAEN,eAAK,SAAS,EAAC,wBAAwB,iBAAc,uBAAuB,KAAK,EAAE,aAChF,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CACrC,cAEE,SAAS,EAAC,yEAAyE,YAElF,OAAO,IAHH,uBAAuB,CAAC,KAAK,CAAC,CAI/B,CACP,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;wBAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;wBACzC,OAAO,CACL,iBAEE,IAAI,EAAC,QAAQ,gBACD,GAAG,KAAK,IAAI,MAAM,CAAC,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,kBAC3D,QAAQ,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EACrC,SAAS,EAAE,EAAE,CACX,2HAA2H,EAC3H,QAAQ;gCACN,CAAC,CAAC,mDAAmD;gCACrD,CAAC,CAAC,wEAAwE,EAC5E,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,0BAA0B,EAC9D,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,IAAI,gCAAgC,CAC7D,YAEA,GAAG,CAAC,GAAG,IAdH,GAAG,CAAC,IAAI,CAeN,CACV,CAAC;oBACJ,CAAC,CAAC,IACE,EAEN,iBAAO,SAAS,EAAC,8EAA8E,aAC7F,KAAC,KAAK,IAAC,SAAS,EAAC,UAAU,wBAAe,EAC1C,eAAM,SAAS,EAAC,UAAU,YAAE,MAAM,CAAC,SAAS,GAAQ,EACpD,+BACe,mBAAmB,KAAK,EAAE,EACvC,IAAI,EAAC,MAAM,EACX,IAAI,EAAE,EAAE,EACR,KAAK,EAAE,KAAK,CAAC,IAAI,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACrD,SAAS,EAAC,8HAA8H,GACxI,IACI,IACA,CACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE;QACvE,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAyB;IAC/D,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9F,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC7B,IACE,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,EAAE;QACV,GAAG,GAAG,CAAC;QACP,IAAI,GAAG,CAAC;QACR,IAAI,GAAG,EAAE;QACT,MAAM,GAAG,CAAC;QACV,MAAM,GAAG,EAAE,EACX,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,IACE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;QAC3B,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG;QACtB,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI;QACxB,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAW;IAC3C,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAE9D,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;YACnB,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,UAAU,CAAC,QAAQ,EAAE;YACzD,OAAO,EAAE,KAAK,KAAK,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC;SAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzE,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB;IACpD,OAAO,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,UAAU,CAAC,KAAW,EAAE,MAAc;IAC7C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,KAAW,EAAE,MAAc;IAC9C,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,eAAe,CAAC,IAAU;IACjC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAChG,CAAC,CAAC,UAAU,EAAE,CACf,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface DetailPageSkeletonProps {
2
+ className?: string;
3
+ blocks?: number;
4
+ showBack?: boolean;
5
+ showAction?: boolean;
6
+ }
7
+ export declare function DetailPageSkeleton({ className, blocks, showBack, showAction, }: DetailPageSkeletonProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=detail-page-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-page-skeleton.d.ts","sourceRoot":"","sources":["../../src/primitives/detail-page-skeleton.tsx"],"names":[],"mappings":"AAIA,UAAU,uBAAuB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,MAAU,EACV,QAAe,EACf,UAAiB,GAClB,EAAE,uBAAuB,2CAsBzB"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PlatformLoaderOverlay } from './platform-loader';
3
+ import { Skeleton } from './skeleton';
4
+ import { cn } from '../lib/utils';
5
+ export function DetailPageSkeleton({ className, blocks = 3, showBack = true, showAction = true, }) {
6
+ return (_jsxs("div", { className: cn('relative', className), "aria-busy": "true", children: [showBack ? _jsx(Skeleton, { className: "mb-4 h-5 w-24" }) : null, _jsxs("div", { className: "mb-5 flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0 space-y-2", children: [_jsx(Skeleton, { className: "h-7 w-56" }), _jsx(Skeleton, { className: "h-3.5 w-80" })] }), showAction ? _jsx(Skeleton, { className: "h-9 w-28" }) : null] }), _jsx("div", { className: "space-y-4", children: Array.from({ length: blocks }).map((_, index) => (_jsx(Skeleton, { className: "h-40 rounded-lg" }, index))) }), _jsx(PlatformLoaderOverlay, {})] }));
7
+ }
8
+ //# sourceMappingURL=detail-page-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-page-skeleton.js","sourceRoot":"","sources":["../../src/primitives/detail-page-skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AASlC,MAAM,UAAU,kBAAkB,CAAC,EACjC,SAAS,EACT,MAAM,GAAG,CAAC,EACV,QAAQ,GAAG,IAAI,EACf,UAAU,GAAG,IAAI,GACO;IACxB,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,eAAY,MAAM,aACxD,QAAQ,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,SAAS,EAAC,eAAe,GAAG,CAAC,CAAC,CAAC,IAAI,EAEzD,eAAK,SAAS,EAAC,uDAAuD,aACpE,eAAK,SAAS,EAAC,mBAAmB,aAChC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACjC,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,IAC/B,EACL,UAAU,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,IAClD,EAEN,cAAK,SAAS,EAAC,WAAW,YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAChD,KAAC,QAAQ,IAAa,SAAS,EAAC,iBAAiB,IAAlC,KAAK,CAAgC,CACrD,CAAC,GACE,EAEN,KAAC,qBAAqB,KAAG,IACrB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
3
+ declare const Dialog: React.FC<DialogPrimitive.DialogProps>;
4
+ declare const DialogTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
5
+ declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
6
+ declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
7
+ declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
8
+ declare const DialogContent: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
+ declare function DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
10
+ declare namespace DialogHeader {
11
+ var displayName: string;
12
+ }
13
+ declare function DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
14
+ declare namespace DialogFooter {
15
+ var displayName: string;
16
+ }
17
+ declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
18
+ declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
19
+ export { Dialog, DialogPortal, DialogOverlay, DialogClose, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, };
20
+ //# sourceMappingURL=dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/primitives/dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAM1D,QAAA,MAAM,MAAM,uCAAuB,CAAC;AACpC,QAAA,MAAM,aAAa,8GAA0B,CAAC;AAC9C,QAAA,MAAM,YAAY,6CAAyB,CAAC;AAC5C,QAAA,MAAM,WAAW,4GAAwB,CAAC;AAE1C,QAAA,MAAM,aAAa,8JAYjB,CAAC;AAGH,QAAA,MAAM,aAAa,8JAyBjB,CAAC;AAGH,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,2CAIlF;kBAJQ,YAAY;;;AAOrB,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,2CAOlF;kBAPQ,YAAY;;;AAUrB,QAAA,MAAM,WAAW,oKASf,CAAC;AAGH,QAAA,MAAM,iBAAiB,8KASrB,CAAC;AAGH,OAAO,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,GAClB,CAAC"}
@@ -0,0 +1,32 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
5
+ import { X } from 'lucide-react';
6
+ import { useUiStrings } from '../strings';
7
+ import { cn } from '../lib/utils';
8
+ const Dialog = DialogPrimitive.Root;
9
+ const DialogTrigger = DialogPrimitive.Trigger;
10
+ const DialogPortal = DialogPrimitive.Portal;
11
+ const DialogClose = DialogPrimitive.Close;
12
+ const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Overlay, { ref: ref, className: cn('fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0', className), ...props })));
13
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
14
+ const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => {
15
+ const s = useUiStrings();
16
+ return (_jsxs(DialogPortal, { children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { ref: ref, className: cn('fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg', className), ...props, children: [children, _jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [_jsx(X, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: s.dialogClose })] })] })] }));
17
+ });
18
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
19
+ function DialogHeader({ className, ...props }) {
20
+ return (_jsx("div", { className: cn('flex flex-col space-y-1.5 text-center sm:text-left', className), ...props }));
21
+ }
22
+ DialogHeader.displayName = 'DialogHeader';
23
+ function DialogFooter({ className, ...props }) {
24
+ return (_jsx("div", { className: cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className), ...props }));
25
+ }
26
+ DialogFooter.displayName = 'DialogFooter';
27
+ const DialogTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Title, { ref: ref, className: cn('text-lg font-semibold leading-none tracking-tight', className), ...props })));
28
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
29
+ const DialogDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Description, { ref: ref, className: cn('text-sm text-muted-foreground', className), ...props })));
30
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
31
+ export { Dialog, DialogPortal, DialogOverlay, DialogClose, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, };
32
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../src/primitives/dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
3
+ declare const DropdownMenu: React.FC<DropdownMenuPrimitive.DropdownMenuProps>;
4
+ declare const DropdownMenuTrigger: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
5
+ declare const DropdownMenuGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & React.RefAttributes<HTMLDivElement>>;
6
+ declare const DropdownMenuPortal: React.FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
7
+ declare const DropdownMenuSub: React.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
8
+ declare const DropdownMenuRadioGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & React.RefAttributes<HTMLDivElement>>;
9
+ declare const DropdownMenuSubTrigger: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
10
+ inset?: boolean;
11
+ } & React.RefAttributes<HTMLDivElement>>;
12
+ declare const DropdownMenuSubContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
+ declare const DropdownMenuContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
14
+ declare const DropdownMenuItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
15
+ inset?: boolean;
16
+ } & React.RefAttributes<HTMLDivElement>>;
17
+ declare const DropdownMenuCheckboxItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
18
+ declare const DropdownMenuRadioItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
19
+ declare const DropdownMenuLabel: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
20
+ inset?: boolean;
21
+ } & React.RefAttributes<HTMLDivElement>>;
22
+ declare const DropdownMenuSeparator: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
23
+ declare const DropdownMenuShortcut: {
24
+ ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): import("react/jsx-runtime").JSX.Element;
25
+ displayName: string;
26
+ };
27
+ export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, };
28
+ //# sourceMappingURL=dropdown-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../src/primitives/dropdown-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,qBAAqB,MAAM,+BAA+B,CAAA;AAKtE,QAAA,MAAM,YAAY,mDAA6B,CAAA;AAE/C,QAAA,MAAM,mBAAmB,0HAAgC,CAAA;AAEzD,QAAA,MAAM,iBAAiB,qHAA8B,CAAA;AAErD,QAAA,MAAM,kBAAkB,yDAA+B,CAAA;AAEvD,QAAA,MAAM,eAAe,sDAA4B,CAAA;AAEjD,QAAA,MAAM,sBAAsB,0HAAmC,CAAA;AAE/D,QAAA,MAAM,sBAAsB;YAGhB,OAAO;wCAejB,CAAA;AAIF,QAAA,MAAM,sBAAsB,6KAY1B,CAAA;AAIF,QAAA,MAAM,mBAAmB,0KAevB,CAAA;AAGF,QAAA,MAAM,gBAAgB;YAGV,OAAO;wCAYjB,CAAA;AAGF,QAAA,MAAM,wBAAwB,+KAoB5B,CAAA;AAIF,QAAA,MAAM,qBAAqB,4KAmBzB,CAAA;AAGF,QAAA,MAAM,iBAAiB;YAGX,OAAO;wCAYjB,CAAA;AAGF,QAAA,MAAM,qBAAqB,4KASzB,CAAA;AAGF,QAAA,MAAM,oBAAoB;8BAGvB,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;;CAOvC,CAAA;AAGD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,CAAA"}
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
5
+ import { Check, ChevronRight, Circle } from "lucide-react";
6
+ import { cn } from '../lib/utils';
7
+ const DropdownMenu = DropdownMenuPrimitive.Root;
8
+ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
9
+ const DropdownMenuGroup = DropdownMenuPrimitive.Group;
10
+ const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
11
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub;
12
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
13
+ const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => (_jsxs(DropdownMenuPrimitive.SubTrigger, { ref: ref, className: cn("flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", inset && "pl-8", className), ...props, children: [children, _jsx(ChevronRight, { className: "ml-auto" })] })));
14
+ DropdownMenuSubTrigger.displayName =
15
+ DropdownMenuPrimitive.SubTrigger.displayName;
16
+ const DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => (_jsx(DropdownMenuPrimitive.SubContent, { ref: ref, className: cn("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=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 origin-[--radix-dropdown-menu-content-transform-origin]", className), ...props })));
17
+ DropdownMenuSubContent.displayName =
18
+ DropdownMenuPrimitive.SubContent.displayName;
19
+ const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(DropdownMenuPrimitive.Portal, { children: _jsx(DropdownMenuPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn("z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=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 origin-[--radix-dropdown-menu-content-transform-origin]", className), ...props }) })));
20
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
21
+ const DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => (_jsx(DropdownMenuPrimitive.Item, { ref: ref, className: cn("relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", inset && "pl-8", className), ...props })));
22
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
23
+ const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => (_jsxs(DropdownMenuPrimitive.CheckboxItem, { ref: ref, className: cn("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className), checked: checked, ...props, children: [_jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(Check, { className: "h-4 w-4" }) }) }), children] })));
24
+ DropdownMenuCheckboxItem.displayName =
25
+ DropdownMenuPrimitive.CheckboxItem.displayName;
26
+ const DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(DropdownMenuPrimitive.RadioItem, { ref: ref, className: cn("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className), ...props, children: [_jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }), children] })));
27
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
28
+ const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => (_jsx(DropdownMenuPrimitive.Label, { ref: ref, className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className), ...props })));
29
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
30
+ const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx(DropdownMenuPrimitive.Separator, { ref: ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props })));
31
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
32
+ const DropdownMenuShortcut = ({ className, ...props }) => {
33
+ return (_jsx("span", { className: cn("ml-auto text-xs tracking-widest opacity-60", className), ...props }));
34
+ };
35
+ DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
36
+ export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, };
37
+ //# sourceMappingURL=dropdown-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-menu.js","sourceRoot":"","sources":["../../src/primitives/dropdown-menu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function ImageZoomHoverOverlay({ className }: {
2
+ className?: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ export declare function isRenderableImage(value: string): boolean;
5
+ export declare function ImagePreviewDialog({ open, onOpenChange, fieldName, value, }: {
6
+ open: boolean;
7
+ onOpenChange: (open: boolean) => void;
8
+ fieldName: string;
9
+ value: string;
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=image-preview-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-preview-dialog.d.ts","sourceRoot":"","sources":["../../src/primitives/image-preview-dialog.tsx"],"names":[],"mappings":"AASA,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAe1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,WAI9C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,KAAK,GACN,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,2CAiDA"}
@@ -0,0 +1,34 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { ZoomIn } from 'lucide-react';
5
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from './dialog';
6
+ import { ModalityIcon } from './modality-icon';
7
+ import { useUiStrings } from '../strings';
8
+ import { cn } from '../lib/utils';
9
+ export function ImageZoomHoverOverlay({ className }) {
10
+ return (_jsx("span", { "aria-hidden": "true", "data-testid": "image-zoom-overlay", className: cn('pointer-events-none absolute inset-0 flex items-center justify-center bg-foreground/35 opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-visible:opacity-100', className), children: _jsx("span", { className: "inline-flex size-7 items-center justify-center rounded-full border border-border bg-background/95 text-foreground shadow-sm", children: _jsx(ZoomIn, { className: "size-3.5" }) }) }));
11
+ }
12
+ export function isRenderableImage(value) {
13
+ const trimmed = value.trim();
14
+ if (!trimmed)
15
+ return false;
16
+ return /^https?:\/\//iu.test(trimmed) || /^data:image\//iu.test(trimmed);
17
+ }
18
+ export function ImagePreviewDialog({ open, onOpenChange, fieldName, value, }) {
19
+ const s = useUiStrings();
20
+ const trimmed = value.trim();
21
+ const [lastTrimmed, setLastTrimmed] = useState(trimmed);
22
+ const [failed, setFailed] = useState(false);
23
+ if (lastTrimmed !== trimmed) {
24
+ setLastTrimmed(trimmed);
25
+ setFailed(false);
26
+ }
27
+ const renderable = isRenderableImage(trimmed) && !failed;
28
+ return (_jsx(Dialog, { open: open, onOpenChange: (next) => {
29
+ if (!next)
30
+ setFailed(false);
31
+ onOpenChange(next);
32
+ }, children: _jsxs(DialogContent, { className: "max-h-[90vh] w-full max-w-[min(90vw,1200px)] gap-0 overflow-hidden p-0", "data-testid": "image-preview-dialog", children: [_jsx(DialogHeader, { className: "border-b border-border px-4 py-3 text-left", children: _jsx(DialogTitle, { className: "truncate font-mono text-sm", children: fieldName }) }), _jsx("div", { className: "flex items-center justify-center bg-muted/40 p-4", children: renderable ? (_jsx("img", { src: trimmed, alt: fieldName, onError: () => setFailed(true), className: "max-h-[70vh] w-full object-contain" })) : (_jsxs("div", { className: "flex flex-col items-center gap-2 py-12 text-sm text-muted-foreground", children: [_jsx(ModalityIcon, { kind: "image", size: "md" }), _jsx("span", { children: s.imagePreviewFailed })] })) }), _jsx("div", { className: "border-t border-border bg-background px-4 py-3", children: _jsx("code", { className: "block max-h-24 overflow-auto break-all font-mono text-[11.5px] text-muted-foreground", children: trimmed || '-' }) })] }) }));
33
+ }
34
+ //# sourceMappingURL=image-preview-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-preview-dialog.js","sourceRoot":"","sources":["../../src/primitives/image-preview-dialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,UAAU,qBAAqB,CAAC,EAAE,SAAS,EAA0B;IACzE,OAAO,CACL,8BACc,MAAM,iBACN,oBAAoB,EAChC,SAAS,EAAE,EAAE,CACX,0LAA0L,EAC1L,SAAS,CACV,YAED,eAAM,SAAS,EAAC,6HAA6H,YAC3I,KAAC,MAAM,IAAC,SAAS,EAAC,UAAU,GAAG,GAC1B,GACF,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,KAAK,GAMN;IACC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QAC5B,cAAc,CAAC,OAAO,CAAC,CAAC;QACxB,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAEzD,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,YAED,MAAC,aAAa,IACZ,SAAS,EAAC,wEAAwE,iBACtE,sBAAsB,aAElC,KAAC,YAAY,IAAC,SAAS,EAAC,4CAA4C,YAClE,KAAC,WAAW,IAAC,SAAS,EAAC,4BAA4B,YAAE,SAAS,GAAe,GAChE,EACf,cAAK,SAAS,EAAC,kDAAkD,YAC9D,UAAU,CAAC,CAAC,CAAC,CACZ,cACE,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAC9B,SAAS,EAAC,oCAAoC,GAC9C,CACH,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,sEAAsE,aACnF,KAAC,YAAY,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,GAAG,EACvC,yBAAO,CAAC,CAAC,kBAAkB,GAAQ,IAC/B,CACP,GACG,EACN,cAAK,SAAS,EAAC,gDAAgD,YAC7D,eAAM,SAAS,EAAC,sFAAsF,YACnG,OAAO,IAAI,GAAG,GACV,GACH,IACQ,GACT,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ export * from './avatar';
2
+ export * from './badge';
3
+ export * from './button';
4
+ export * from './collapsible';
5
+ export * from './date-range-segmented';
6
+ export * from './detail-page-skeleton';
7
+ export * from './dialog';
8
+ export * from './dropdown-menu';
9
+ export * from './image-preview-dialog';
10
+ export * from './input';
11
+ export * from './kanban-scroll-area';
12
+ export * from './label';
13
+ export * from './list-page-skeleton';
14
+ export * from './modality-icon';
15
+ export * from './multi-select';
16
+ export * from './platform-loader';
17
+ export * from './popover';
18
+ export * from './progress';
19
+ export * from './resource-pagination-footer';
20
+ export * from './segmented';
21
+ export * from './select';
22
+ export * from './separator';
23
+ export * from './sheet';
24
+ export * from './sidebar';
25
+ export * from './skeleton';
26
+ export * from './sliding-view-toggle';
27
+ export * from './switch';
28
+ export * from './table';
29
+ export * from './table-action';
30
+ export * from './tooltip';
31
+ export * from './unused-images-badge';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/primitives/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC"}