@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,9 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as SwitchPrimitives from "@radix-ui/react-switch";
5
+ import { cn } from '../lib/utils';
6
+ const Switch = React.forwardRef(({ className, ...props }, ref) => (_jsx(SwitchPrimitives.Root, { className: cn("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input", className), ...props, ref: ref, children: _jsx(SwitchPrimitives.Thumb, { className: cn("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0") }) })));
7
+ Switch.displayName = SwitchPrimitives.Root.displayName;
8
+ export { Switch };
9
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../src/primitives/switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAA;AAE1D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAG7B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,gBAAgB,CAAC,IAAI,IACpB,SAAS,EAAE,EAAE,CACX,mXAAmX,EACnX,SAAS,CACV,KACG,KAAK,EACT,GAAG,EAAE,GAAG,YAER,KAAC,gBAAgB,CAAC,KAAK,IACrB,SAAS,EAAE,EAAE,CACX,4KAA4K,CAC7K,GACD,GACoB,CACzB,CAAC,CAAA;AACF,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAA;AAEtD,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ import { type ButtonProps } from './button';
3
+ import { TooltipContent } from './tooltip';
4
+ export declare const TABLE_ACTION_ICON_BUTTON_CLASS = "size-7 cursor-pointer disabled:cursor-not-allowed";
5
+ interface TableActionTooltipProps {
6
+ label: React.ReactNode;
7
+ disabled?: boolean;
8
+ side?: React.ComponentPropsWithoutRef<typeof TooltipContent>['side'];
9
+ className?: string;
10
+ children: React.ReactNode;
11
+ }
12
+ export declare function TableActionTooltip({ label, disabled, side, className, children, }: TableActionTooltipProps): import("react/jsx-runtime").JSX.Element;
13
+ interface TableActionIconButtonProps extends ButtonProps {
14
+ label: string;
15
+ tooltipLabel?: React.ReactNode;
16
+ tooltipSide?: React.ComponentPropsWithoutRef<typeof TooltipContent>['side'];
17
+ }
18
+ export declare const TableActionIconButton: React.ForwardRefExoticComponent<TableActionIconButtonProps & React.RefAttributes<HTMLButtonElement>>;
19
+ export interface TableActionDescriptor {
20
+ /** Stable key for React (also used as aria-label fallback). */
21
+ key: string;
22
+ /** Visible label in tooltip + dropdown item + aria-label. */
23
+ label: string;
24
+ /** Lucide-style icon component. */
25
+ icon: React.ComponentType<{
26
+ className?: string;
27
+ }>;
28
+ onClick: () => void;
29
+ disabled?: boolean;
30
+ loading?: boolean;
31
+ destructive?: boolean;
32
+ /** When true, the action is filtered out before rendering. */
33
+ hide?: boolean;
34
+ /** Optional override for the icon-button's aria-label (e.g. include row name). */
35
+ ariaLabel?: string;
36
+ }
37
+ export interface TableActionRowProps {
38
+ actions: TableActionDescriptor[];
39
+ /** Max number of inline icon buttons before overflowing into ⋯ menu. */
40
+ maxInline?: number;
41
+ /** Override aria-label / tooltip for the ⋯ trigger. Defaults to `UiStrings.actionsMore`. */
42
+ moreLabel?: string;
43
+ className?: string;
44
+ }
45
+ /**
46
+ * Caps inline action icons at `maxInline` (default 4); the rest go into a ⋯
47
+ * DropdownMenu. Pair with `actions` column preset of `'normal'` (180px) which
48
+ * fits exactly 4 size-7 (28px) buttons + gap-0.5 + cell px-3 padding.
49
+ */
50
+ export declare function TableActionRow({ actions, maxInline, moreLabel, className, }: TableActionRowProps): import("react/jsx-runtime").JSX.Element;
51
+ export {};
52
+ //# sourceMappingURL=table-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-action.d.ts","sourceRoot":"","sources":["../../src/primitives/table-action.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAOpD,OAAO,EAAW,cAAc,EAAmC,MAAM,WAAW,CAAC;AAIrF,eAAO,MAAM,8BAA8B,sDAAsD,CAAC;AAElG,UAAU,uBAAuB;IAC/B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC,wBAAwB,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,IAAY,EACZ,SAAS,EACT,QAAQ,GACT,EAAE,uBAAuB,2CAqBzB;AAED,UAAU,0BAA2B,SAAQ,WAAW;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,KAAK,CAAC,wBAAwB,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;CAC7E;AAED,eAAO,MAAM,qBAAqB,sGAiBjC,CAAC;AAGF,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAa,EACb,SAAS,EACT,SAAS,GACV,EAAE,mBAAmB,2CA+DrB"}
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { MoreHorizontal } from 'lucide-react';
5
+ import { Button } from './button';
6
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from './dropdown-menu';
7
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip';
8
+ import { useUiStrings } from '../strings';
9
+ import { cn } from '../lib/utils';
10
+ export const TABLE_ACTION_ICON_BUTTON_CLASS = 'size-7 cursor-pointer disabled:cursor-not-allowed';
11
+ export function TableActionTooltip({ label, disabled, side = 'top', className, children, }) {
12
+ return (_jsx(TooltipProvider, { delayDuration: 160, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: cn('inline-flex', disabled ? 'cursor-not-allowed' : 'cursor-pointer', className), onClick: (event) => {
13
+ if (disabled)
14
+ event.stopPropagation();
15
+ }, onPointerDown: (event) => {
16
+ if (disabled)
17
+ event.stopPropagation();
18
+ }, children: children }) }), _jsx(TooltipContent, { side: side, children: label })] }) }));
19
+ }
20
+ export const TableActionIconButton = React.forwardRef(({ label, tooltipLabel, tooltipSide, className, children, disabled, ...props }, ref) => (_jsx(TableActionTooltip, { label: tooltipLabel ?? label, disabled: disabled, side: tooltipSide, children: _jsx(Button, { ref: ref, ...props, type: "button", variant: "ghost", size: "icon", className: cn(TABLE_ACTION_ICON_BUTTON_CLASS, className), "aria-label": label, disabled: disabled, children: children }) })));
21
+ TableActionIconButton.displayName = 'TableActionIconButton';
22
+ /**
23
+ * Caps inline action icons at `maxInline` (default 4); the rest go into a ⋯
24
+ * DropdownMenu. Pair with `actions` column preset of `'normal'` (180px) which
25
+ * fits exactly 4 size-7 (28px) buttons + gap-0.5 + cell px-3 padding.
26
+ */
27
+ export function TableActionRow({ actions, maxInline = 4, moreLabel, className, }) {
28
+ const s = useUiStrings();
29
+ const visible = actions.filter((action) => !action.hide);
30
+ const inline = visible.slice(0, maxInline);
31
+ const overflow = visible.slice(maxInline);
32
+ const resolvedMoreLabel = moreLabel ?? s.actionsMore;
33
+ return (_jsxs("div", { className: cn('inline-flex items-center justify-end gap-0.5', className), children: [inline.map((action) => {
34
+ const Icon = action.icon;
35
+ return (_jsx(TableActionIconButton, { label: action.ariaLabel ?? action.label, tooltipLabel: action.label, disabled: action.disabled, className: cn(action.destructive && 'text-destructive hover:text-destructive'), onClick: (event) => {
36
+ event.stopPropagation();
37
+ action.onClick();
38
+ }, children: _jsx(Icon, { className: cn('size-3.5', action.loading && 'animate-spin') }) }, action.key));
39
+ }), overflow.length > 0 ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(TableActionIconButton, { label: resolvedMoreLabel, onClick: (event) => event.stopPropagation(), children: _jsx(MoreHorizontal, { className: "size-3.5" }) }) }), _jsx(DropdownMenuContent, { align: "end", onClick: (event) => event.stopPropagation(), children: overflow.map((action) => {
40
+ const Icon = action.icon;
41
+ return (_jsxs(DropdownMenuItem, { disabled: action.disabled, onClick: (event) => {
42
+ event.stopPropagation();
43
+ action.onClick();
44
+ }, className: cn('gap-2 text-xs', action.destructive && 'text-destructive focus:text-destructive'), children: [_jsx(Icon, { className: cn('size-3.5', action.loading && 'animate-spin') }), _jsx("span", { children: action.label })] }, action.key));
45
+ }) })] })) : null] }));
46
+ }
47
+ //# sourceMappingURL=table-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-action.js","sourceRoot":"","sources":["../../src/primitives/table-action.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { type ReactNode } from 'react';
2
+ export type ColumnWidth = 'narrow' | 'compact' | 'normal' | 'wide' | 'flex';
3
+ export interface TableColumn {
4
+ key: string;
5
+ width: ColumnWidth;
6
+ sticky?: 'left' | 'right';
7
+ /** Only consumed by `flex` columns; defaults to FLEX_MIN_PX_DEFAULT (180). */
8
+ minPx?: number;
9
+ }
10
+ export declare const WIDTH_PRESETS_PX: Readonly<Record<Exclude<ColumnWidth, 'flex'>, number>>;
11
+ export declare const FLEX_MIN_PX_DEFAULT = 180;
12
+ export declare function resolveColumnPx(column: Pick<TableColumn, 'width' | 'minPx'>): number;
13
+ export interface ResolvedColumn extends TableColumn {
14
+ index: number;
15
+ px: number;
16
+ leftOffsetPx?: number;
17
+ rightOffsetPx?: number;
18
+ }
19
+ export interface ColumnLayout {
20
+ columns: ResolvedColumn[];
21
+ columnsByKey: Record<string, ResolvedColumn>;
22
+ /** Sum of all non-flex column px + each flex column's minPx — used for `<table style.minWidth>`. */
23
+ minWidthPx: number;
24
+ }
25
+ export declare function computeColumnLayout(columns: TableColumn[]): ColumnLayout;
26
+ export interface TableProps {
27
+ columns: TableColumn[];
28
+ layout?: 'fixed' | 'auto';
29
+ className?: string;
30
+ containerClassName?: string;
31
+ containerTestId?: string;
32
+ children: ReactNode;
33
+ }
34
+ export declare function Table({ columns, layout, className, containerClassName, containerTestId, children, }: TableProps): import("react/jsx-runtime").JSX.Element;
35
+ export declare function TableHeader({ className, children }: {
36
+ className?: string;
37
+ children: ReactNode;
38
+ }): import("react/jsx-runtime").JSX.Element;
39
+ export declare function TableBody({ className, children }: {
40
+ className?: string;
41
+ children: ReactNode;
42
+ }): import("react/jsx-runtime").JSX.Element;
43
+ export interface TableRowProps {
44
+ className?: string;
45
+ selected?: boolean;
46
+ selectedTone?: 'primary' | 'canary';
47
+ onClick?: () => void;
48
+ children: ReactNode;
49
+ 'data-testid'?: string;
50
+ }
51
+ export declare function TableRow({ className, selected, selectedTone, onClick, children, ...rest }: TableRowProps): import("react/jsx-runtime").JSX.Element;
52
+ interface CellSharedProps {
53
+ column: string;
54
+ className?: string;
55
+ children?: ReactNode;
56
+ /** Single-line truncate (true / 1), or two-line clamp (2). */
57
+ truncate?: boolean | 1 | 2;
58
+ }
59
+ export declare function shouldStopCellClickPropagation(column: Pick<ResolvedColumn, 'key' | 'sticky'>, explicit?: boolean): boolean;
60
+ export interface TableHeadProps extends CellSharedProps {
61
+ scope?: 'col' | 'row';
62
+ }
63
+ export declare function TableHead({ column, className, children, truncate, scope }: TableHeadProps): import("react/jsx-runtime").JSX.Element;
64
+ export interface TableCellProps extends CellSharedProps {
65
+ /** Stop click propagation so cell clicks don't bubble to <TableRow onClick>. Defaults to true for select / actions cells. */
66
+ stopPropagation?: boolean;
67
+ }
68
+ export declare function TableCell({ column, className, children, truncate, stopPropagation }: TableCellProps): import("react/jsx-runtime").JSX.Element;
69
+ export interface TableEmptyProps {
70
+ children?: ReactNode;
71
+ className?: string;
72
+ }
73
+ export declare function TableEmpty({ children, className }: TableEmptyProps): import("react/jsx-runtime").JSX.Element;
74
+ export declare function TableSkeletonRows({ rows }: {
75
+ rows?: number;
76
+ }): import("react/jsx-runtime").JSX.Element;
77
+ export {};
78
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/primitives/table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createContext, useContext, useMemo } from 'react';
4
+ import { Skeleton } from './skeleton';
5
+ import { useUiStrings } from '../strings';
6
+ import { cn } from '../lib/utils';
7
+ export const WIDTH_PRESETS_PX = {
8
+ narrow: 48,
9
+ compact: 120,
10
+ normal: 180,
11
+ wide: 280,
12
+ };
13
+ export const FLEX_MIN_PX_DEFAULT = 180;
14
+ export function resolveColumnPx(column) {
15
+ if (column.width === 'flex')
16
+ return column.minPx ?? FLEX_MIN_PX_DEFAULT;
17
+ return WIDTH_PRESETS_PX[column.width];
18
+ }
19
+ export function computeColumnLayout(columns) {
20
+ const resolved = columns.map((col, index) => ({
21
+ ...col,
22
+ index,
23
+ px: resolveColumnPx(col),
24
+ }));
25
+ let leftAcc = 0;
26
+ for (const col of resolved) {
27
+ if (col.sticky === 'left') {
28
+ col.leftOffsetPx = leftAcc;
29
+ leftAcc += col.px;
30
+ }
31
+ }
32
+ let rightAcc = 0;
33
+ for (let i = resolved.length - 1; i >= 0; i -= 1) {
34
+ const col = resolved[i];
35
+ if (col.sticky === 'right') {
36
+ col.rightOffsetPx = rightAcc;
37
+ rightAcc += col.px;
38
+ }
39
+ }
40
+ const minWidthPx = resolved.reduce((sum, col) => sum + col.px, 0);
41
+ const columnsByKey = {};
42
+ for (const col of resolved)
43
+ columnsByKey[col.key] = col;
44
+ return { columns: resolved, columnsByKey, minWidthPx };
45
+ }
46
+ const TableContext = createContext(null);
47
+ function useTableLayout(componentName) {
48
+ const ctx = useContext(TableContext);
49
+ if (!ctx)
50
+ throw new Error(`<${componentName}> must be rendered inside <Table>`);
51
+ return ctx;
52
+ }
53
+ function useColumn(componentName, columnKey) {
54
+ const layout = useTableLayout(componentName);
55
+ const column = layout.columnsByKey[columnKey];
56
+ if (!column) {
57
+ throw new Error(`<${componentName}> references unknown column "${columnKey}"; available keys: ${Object.keys(layout.columnsByKey).join(', ')}`);
58
+ }
59
+ return column;
60
+ }
61
+ export function Table({ columns, layout = 'fixed', className, containerClassName, containerTestId, children, }) {
62
+ const value = useMemo(() => computeColumnLayout(columns), [columns]);
63
+ return (_jsx("div", { className: cn('relative overflow-x-auto', containerClassName), "data-testid": containerTestId, children: _jsxs("table", { className: cn('w-full border-collapse text-sm', className), style: { tableLayout: layout, minWidth: `${value.minWidthPx}px` }, children: [_jsx("colgroup", { children: value.columns.map((col) => (_jsx("col", { style: col.width === 'flex' ? undefined : { width: `${col.px}px` } }, col.key))) }), _jsx(TableContext.Provider, { value: value, children: children })] }) }));
64
+ }
65
+ export function TableHeader({ className, children }) {
66
+ return (_jsx("thead", { className: cn('bg-muted text-xs uppercase tracking-wide text-muted-foreground', className), children: children }));
67
+ }
68
+ export function TableBody({ className, children }) {
69
+ return _jsx("tbody", { className: className, children: children });
70
+ }
71
+ export function TableRow({ className, selected, selectedTone = 'primary', onClick, children, ...rest }) {
72
+ const tone = selectedTone === 'canary' ? 'var(--status-canary-dot)' : 'var(--primary)';
73
+ const style = selected ? { boxShadow: `inset 3px 0 0 ${tone}` } : undefined;
74
+ return (_jsx("tr", { onClick: onClick, style: style, "data-testid": rest['data-testid'], className: cn('group border-b border-border/60 last:border-b-0 hover:bg-accent', onClick && 'cursor-pointer', className), children: children }));
75
+ }
76
+ function buildStickyStyle(col) {
77
+ if (col.sticky === 'left')
78
+ return { left: `${col.leftOffsetPx ?? 0}px` };
79
+ if (col.sticky === 'right')
80
+ return { right: `${col.rightOffsetPx ?? 0}px` };
81
+ return undefined;
82
+ }
83
+ function stickyClasses(col, layer) {
84
+ if (!col.sticky)
85
+ return '';
86
+ const z = layer === 'head' ? 'z-20' : 'z-10';
87
+ // Sticky cells must use opaque background tokens (no `/N` alpha) so
88
+ // non-sticky columns scrolling underneath are never visible through them.
89
+ const bg = layer === 'head' ? 'bg-muted' : 'bg-card group-hover:bg-accent';
90
+ const border = col.sticky === 'left' ? 'border-r border-border' : 'border-l border-border';
91
+ return cn('sticky', col.sticky === 'left' ? 'left-0' : 'right-0', z, bg, border);
92
+ }
93
+ export function shouldStopCellClickPropagation(column, explicit) {
94
+ if (explicit !== undefined)
95
+ return explicit;
96
+ return column.key === 'select' || column.key === 'actions';
97
+ }
98
+ function truncateInnerClasses(truncate) {
99
+ if (!truncate)
100
+ return undefined;
101
+ if (truncate === 2)
102
+ return 'min-w-0 overflow-hidden line-clamp-2';
103
+ return 'min-w-0 truncate';
104
+ }
105
+ export function TableHead({ column, className, children, truncate, scope = 'col' }) {
106
+ const col = useColumn('TableHead', column);
107
+ const inner = truncateInnerClasses(truncate);
108
+ return (_jsx("th", { scope: scope, style: buildStickyStyle(col), className: cn('h-9 overflow-hidden px-3 text-left align-middle font-medium', stickyClasses(col, 'head'), className), children: inner ? _jsx("div", { className: inner, children: children }) : children }));
109
+ }
110
+ export function TableCell({ column, className, children, truncate, stopPropagation }) {
111
+ const col = useColumn('TableCell', column);
112
+ const inner = truncateInnerClasses(truncate);
113
+ const shouldStopProp = shouldStopCellClickPropagation(col, stopPropagation);
114
+ return (_jsx("td", { style: buildStickyStyle(col), onClick: shouldStopProp ? (e) => e.stopPropagation() : undefined, className: cn(
115
+ // overflow-hidden is mandatory under table-layout: fixed — without it,
116
+ // any inline content (badges, mono-strings) that exceeds the column's
117
+ // configured px will visually leak into adjacent columns even though
118
+ // the column width itself is correct.
119
+ 'overflow-hidden px-3 py-2 align-middle text-foreground', stickyClasses(col, 'cell'), className), children: inner ? _jsx("div", { className: inner, children: children }) : children }));
120
+ }
121
+ export function TableEmpty({ children, className }) {
122
+ const layout = useTableLayout('TableEmpty');
123
+ const s = useUiStrings();
124
+ return (_jsx("tr", { children: _jsx("td", { colSpan: layout.columns.length, className: cn('px-3 py-8 text-center text-sm text-muted-foreground', className), children: children ?? s.tableEmpty }) }));
125
+ }
126
+ export function TableSkeletonRows({ rows = 6 }) {
127
+ const layout = useTableLayout('TableSkeletonRows');
128
+ const colSpan = layout.columns.length;
129
+ return (_jsx(_Fragment, { children: Array.from({ length: rows }).map((_, index) => (_jsx("tr", { className: "border-b border-border/60 last:border-b-0", "aria-hidden": "true", children: _jsx("td", { colSpan: colSpan, className: "px-3 py-3", children: _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(Skeleton, { className: "h-4 w-full max-w-[220px]" }), _jsx(Skeleton, { className: "hidden h-4 w-24 sm:block" }), _jsx(Skeleton, { className: "hidden h-4 w-20 lg:block" }), _jsx(Skeleton, { className: "ml-auto h-6 w-12 shrink-0" })] }) }) }, index))) }));
130
+ }
131
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/primitives/table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
3
+ declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
4
+ declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
5
+ declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
6
+ declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
8
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../src/primitives/tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAA;AAI3D,QAAA,MAAM,eAAe,iDAA4B,CAAA;AAEjD,QAAA,MAAM,OAAO,yCAAwB,CAAA;AAErC,QAAA,MAAM,cAAc,gHAA2B,CAAA;AAE/C,QAAA,MAAM,cAAc,gKAelB,CAAA;AAGF,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
5
+ import { cn } from '../lib/utils';
6
+ const TooltipProvider = TooltipPrimitive.Provider;
7
+ const Tooltip = TooltipPrimitive.Root;
8
+ const TooltipTrigger = TooltipPrimitive.Trigger;
9
+ const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]", className), ...props }) })));
10
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
11
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
12
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../src/primitives/tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,CAAA;AAEjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAA;AAErC,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAA;AAE/C,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAGrC,CAAC,EAAE,SAAS,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClD,KAAC,gBAAgB,CAAC,MAAM,cACtB,KAAC,gBAAgB,CAAC,OAAO,IACvB,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,EAAE,CACX,sbAAsb,EACtb,SAAS,CACV,KACG,KAAK,GACT,GACsB,CAC3B,CAAC,CAAA;AACF,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAA;AAEjE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface UnusedImagesBadgeProps {
3
+ tooltip: ReactNode;
4
+ size?: 'sm' | 'md';
5
+ className?: string;
6
+ 'aria-label'?: string;
7
+ }
8
+ export declare function UnusedImagesBadge({ tooltip, size, className, 'aria-label': ariaLabel, }: UnusedImagesBadgeProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=unused-images-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unused-images-badge.d.ts","sourceRoot":"","sources":["../../src/primitives/unused-images-badge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,IAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,sBAAsB,2CAwBxB"}
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ImageOff } from 'lucide-react';
4
+ import { cn } from '../lib/utils';
5
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip';
6
+ export function UnusedImagesBadge({ tooltip, size = 'md', className, 'aria-label': ariaLabel, }) {
7
+ const sizing = size === 'sm' ? { box: 'size-5', icon: 'size-3' } : { box: 'size-6', icon: 'size-3.5' };
8
+ return (_jsx(TooltipProvider, { delayDuration: 120, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "unused-images-badge", "aria-label": ariaLabel, className: cn('inline-flex shrink-0 items-center justify-center rounded-md border border-dashed border-border bg-muted text-muted-foreground', sizing.box, className), children: _jsx(ImageOff, { className: sizing.icon }) }) }), _jsx(TooltipContent, { children: tooltip })] }) }));
9
+ }
10
+ //# sourceMappingURL=unused-images-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unused-images-badge.js","sourceRoot":"","sources":["../../src/primitives/unused-images-badge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AASrF,MAAM,UAAU,iBAAiB,CAAC,EAChC,OAAO,EACP,IAAI,GAAG,IAAI,EACX,SAAS,EACT,YAAY,EAAE,SAAS,GACA;IACvB,MAAM,MAAM,GACV,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAE1F,OAAO,CACL,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YACjC,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,8BACc,qBAAqB,gBACrB,SAAS,EACrB,SAAS,EAAE,EAAE,CACX,+HAA+H,EAC/H,MAAM,CAAC,GAAG,EACV,SAAS,CACV,YAED,KAAC,QAAQ,IAAC,SAAS,EAAE,MAAM,CAAC,IAAI,GAAI,GAC/B,GACQ,EACjB,KAAC,cAAc,cAAE,OAAO,GAAkB,IAClC,GACM,CACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { UiStringsProvider, useUiStrings, DEFAULT_UI_STRINGS } from './ui-strings-context';
2
+ export type { UiStrings } from './ui-strings-context';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { UiStringsProvider, useUiStrings, DEFAULT_UI_STRINGS } from './ui-strings-context';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Injected UI string contract for @proofhound/ui primitives.
4
+ *
5
+ * Fields map 1-to-1 with every distinct t() call in the 6 coupled primitives
6
+ * (table, dialog, table-action, platform-loader, resource-pagination-footer,
7
+ * image-preview-dialog). Later tasks (T5) will replace each t() call with
8
+ * the corresponding field from useUiStrings(), eliminating the
9
+ * @proofhound/ui → @proofhound/web-ui dependency cycle.
10
+ *
11
+ * apps/web's ProofHoundWebProvider (T12) will fill these with localized t() values.
12
+ */
13
+ export interface UiStrings {
14
+ /** table.tsx: TableEmpty fallback — t('common.table.empty') */
15
+ tableEmpty: string;
16
+ /** dialog.tsx: DialogContent close button sr-only label — t('common.close') */
17
+ dialogClose: string;
18
+ /** table-action.tsx: ⋯ overflow trigger label — t('common.actions.more') */
19
+ actionsMore: string;
20
+ /** platform-loader.tsx: loader aria-label + visible text — t('common.loadingEffort') */
21
+ loaderLabel: string;
22
+ /** resource-pagination-footer.tsx: items-per-page label — t('common.itemsPerPage') */
23
+ itemsPerPage: string;
24
+ /** image-preview-dialog.tsx: failed-load fallback text — t('datasets.detail.imagePreviewFailed') */
25
+ imagePreviewFailed: string;
26
+ }
27
+ export declare const DEFAULT_UI_STRINGS: UiStrings;
28
+ export declare function UiStringsProvider({ value, children, }: {
29
+ value: Partial<UiStrings>;
30
+ children: ReactNode;
31
+ }): import("react/jsx-runtime").JSX.Element;
32
+ export declare function useUiStrings(): UiStrings;
33
+ //# sourceMappingURL=ui-strings-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-strings-context.d.ts","sourceRoot":"","sources":["../../src/strings/ui-strings-context.tsx"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,WAAW,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,kBAAkB,EAAE,SAOhC,CAAC;AAIF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAEA;AAED,wBAAgB,YAAY,IAAI,SAAS,CAExC"}
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext } from 'react';
4
+ export const DEFAULT_UI_STRINGS = {
5
+ tableEmpty: 'No data',
6
+ dialogClose: 'Close',
7
+ actionsMore: 'More actions',
8
+ loaderLabel: 'Loading…',
9
+ itemsPerPage: 'Items per page',
10
+ imagePreviewFailed: 'Preview unavailable',
11
+ };
12
+ const Ctx = createContext(DEFAULT_UI_STRINGS);
13
+ export function UiStringsProvider({ value, children, }) {
14
+ return _jsx(Ctx.Provider, { value: { ...DEFAULT_UI_STRINGS, ...value }, children: children });
15
+ }
16
+ export function useUiStrings() {
17
+ return useContext(Ctx);
18
+ }
19
+ //# sourceMappingURL=ui-strings-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-strings-context.js","sourceRoot":"","sources":["../../src/strings/ui-strings-context.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AA4BlE,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,gBAAgB;IAC9B,kBAAkB,EAAE,qBAAqB;CAC1C,CAAC;AAEF,MAAM,GAAG,GAAG,aAAa,CAAY,kBAAkB,CAAC,CAAC;AAEzD,MAAM,UAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,KAAC,GAAG,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,kBAAkB,EAAE,GAAG,KAAK,EAAE,YAAG,QAAQ,GAAgB,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@proofhound/ui",
3
+ "version": "0.1.6",
4
+ "description": "设计系统:shadcn 原子件 + cn + Main + 纯 UI hooks + UiStringsContext(被 @proofhound/web-ui 与 apps/web 复用)",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./strings": "./dist/strings/index.js",
10
+ "./primitives": "./dist/primitives/index.js",
11
+ "./lib": "./dist/lib/index.js",
12
+ "./layout": "./dist/layout/index.js",
13
+ "./hooks": "./dist/hooks/index.js",
14
+ "./brand": "./dist/brand/index.js"
15
+ },
16
+ "dependencies": {
17
+ "@radix-ui/react-avatar": "^1.1.11",
18
+ "@radix-ui/react-collapsible": "^1.1.12",
19
+ "@radix-ui/react-dialog": "^1.1.15",
20
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
21
+ "@radix-ui/react-label": "^2.1.8",
22
+ "@radix-ui/react-popover": "^1.1.15",
23
+ "@radix-ui/react-select": "^2.2.6",
24
+ "@radix-ui/react-separator": "^1.1.8",
25
+ "@radix-ui/react-slot": "^1.2.4",
26
+ "@radix-ui/react-switch": "^1.2.6",
27
+ "@radix-ui/react-tooltip": "^1.2.8",
28
+ "class-variance-authority": "^0.7.1",
29
+ "clsx": "^2.1.1",
30
+ "lucide-react": "^1.14.0",
31
+ "tailwind-merge": "^3.6.0"
32
+ },
33
+ "peerDependencies": {
34
+ "react": "^19.0.0",
35
+ "react-dom": "^19.0.0"
36
+ },
37
+ "devDependencies": {
38
+ "@testing-library/jest-dom": "^6.6.3",
39
+ "@testing-library/react": "^16.3.0",
40
+ "@types/node": "^24.12.4",
41
+ "@types/react": "^19.2.14",
42
+ "@types/react-dom": "^19.2.3",
43
+ "jsdom": "^29.1.1",
44
+ "react": "^19.2.6",
45
+ "react-dom": "^19.2.6",
46
+ "typescript": "^6.0.3",
47
+ "vitest": "^4.1.6"
48
+ },
49
+ "license": "Apache-2.0",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/proofhound/proofhound",
53
+ "directory": "packages/ui"
54
+ },
55
+ "homepage": "https://github.com/proofhound/proofhound/tree/master/packages/ui#readme",
56
+ "files": [
57
+ "dist",
58
+ "README.md",
59
+ "LICENSE"
60
+ ],
61
+ "publishConfig": {
62
+ "access": "public",
63
+ "registry": "https://registry.npmjs.org/"
64
+ },
65
+ "type": "module",
66
+ "scripts": {
67
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
68
+ "typecheck": "tsc --noEmit",
69
+ "lint": "eslint \"src/**/*.{ts,tsx}\"",
70
+ "test": "vitest run --passWithNoTests",
71
+ "test:unit": "vitest run --passWithNoTests",
72
+ "clean": "rm -rf dist .turbo"
73
+ }
74
+ }