@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.
- package/LICENSE +190 -0
- package/dist/brand/index.d.ts +2 -0
- package/dist/brand/index.d.ts.map +1 -0
- package/dist/brand/index.js +2 -0
- package/dist/brand/index.js.map +1 -0
- package/dist/brand/proofhound-logo.d.ts +21 -0
- package/dist/brand/proofhound-logo.d.ts.map +1 -0
- package/dist/brand/proofhound-logo.js +58 -0
- package/dist/brand/proofhound-logo.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +20 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/index.d.ts +2 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +2 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/main.d.ts +9 -0
- package/dist/layout/main.d.ts.map +1 -0
- package/dist/layout/main.js +6 -0
- package/dist/layout/main.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/primitives/avatar.d.ts +7 -0
- package/dist/primitives/avatar.d.ts.map +1 -0
- package/dist/primitives/avatar.js +13 -0
- package/dist/primitives/avatar.js.map +1 -0
- package/dist/primitives/badge.d.ts +10 -0
- package/dist/primitives/badge.d.ts.map +1 -0
- package/dist/primitives/badge.js +21 -0
- package/dist/primitives/badge.js.map +1 -0
- package/dist/primitives/button.d.ts +12 -0
- package/dist/primitives/button.d.ts.map +1 -0
- package/dist/primitives/button.js +34 -0
- package/dist/primitives/button.js.map +1 -0
- package/dist/primitives/collapsible.d.ts +6 -0
- package/dist/primitives/collapsible.d.ts.map +1 -0
- package/dist/primitives/collapsible.js +7 -0
- package/dist/primitives/collapsible.js.map +1 -0
- package/dist/primitives/date-range-segmented.d.ts +50 -0
- package/dist/primitives/date-range-segmented.d.ts.map +1 -0
- package/dist/primitives/date-range-segmented.js +214 -0
- package/dist/primitives/date-range-segmented.js.map +1 -0
- package/dist/primitives/detail-page-skeleton.d.ts +9 -0
- package/dist/primitives/detail-page-skeleton.d.ts.map +1 -0
- package/dist/primitives/detail-page-skeleton.js +8 -0
- package/dist/primitives/detail-page-skeleton.js.map +1 -0
- package/dist/primitives/dialog.d.ts +20 -0
- package/dist/primitives/dialog.d.ts.map +1 -0
- package/dist/primitives/dialog.js +32 -0
- package/dist/primitives/dialog.js.map +1 -0
- package/dist/primitives/dropdown-menu.d.ts +28 -0
- package/dist/primitives/dropdown-menu.d.ts.map +1 -0
- package/dist/primitives/dropdown-menu.js +37 -0
- package/dist/primitives/dropdown-menu.js.map +1 -0
- package/dist/primitives/image-preview-dialog.d.ts +11 -0
- package/dist/primitives/image-preview-dialog.d.ts.map +1 -0
- package/dist/primitives/image-preview-dialog.js +34 -0
- package/dist/primitives/image-preview-dialog.js.map +1 -0
- package/dist/primitives/index.d.ts +32 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +32 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/input.d.ts +4 -0
- package/dist/primitives/input.d.ts.map +1 -0
- package/dist/primitives/input.js +9 -0
- package/dist/primitives/input.js.map +1 -0
- package/dist/primitives/kanban-scroll-area.d.ts +5 -0
- package/dist/primitives/kanban-scroll-area.d.ts.map +1 -0
- package/dist/primitives/kanban-scroll-area.js +6 -0
- package/dist/primitives/kanban-scroll-area.js.map +1 -0
- package/dist/primitives/label.d.ts +6 -0
- package/dist/primitives/label.d.ts.map +1 -0
- package/dist/primitives/label.js +11 -0
- package/dist/primitives/label.js.map +1 -0
- package/dist/primitives/list-page-skeleton.d.ts +13 -0
- package/dist/primitives/list-page-skeleton.d.ts.map +1 -0
- package/dist/primitives/list-page-skeleton.js +11 -0
- package/dist/primitives/list-page-skeleton.js.map +1 -0
- package/dist/primitives/modality-icon.d.ts +22 -0
- package/dist/primitives/modality-icon.d.ts.map +1 -0
- package/dist/primitives/modality-icon.js +45 -0
- package/dist/primitives/modality-icon.js.map +1 -0
- package/dist/primitives/multi-select.d.ts +20 -0
- package/dist/primitives/multi-select.d.ts.map +1 -0
- package/dist/primitives/multi-select.js +60 -0
- package/dist/primitives/multi-select.js.map +1 -0
- package/dist/primitives/platform-loader.d.ts +18 -0
- package/dist/primitives/platform-loader.d.ts.map +1 -0
- package/dist/primitives/platform-loader.js +27 -0
- package/dist/primitives/platform-loader.js.map +1 -0
- package/dist/primitives/popover.d.ts +8 -0
- package/dist/primitives/popover.d.ts.map +1 -0
- package/dist/primitives/popover.js +12 -0
- package/dist/primitives/popover.js.map +1 -0
- package/dist/primitives/progress.d.ts +20 -0
- package/dist/primitives/progress.d.ts.map +1 -0
- package/dist/primitives/progress.js +28 -0
- package/dist/primitives/progress.js.map +1 -0
- package/dist/primitives/resource-pagination-footer.d.ts +13 -0
- package/dist/primitives/resource-pagination-footer.d.ts.map +1 -0
- package/dist/primitives/resource-pagination-footer.js +11 -0
- package/dist/primitives/resource-pagination-footer.js.map +1 -0
- package/dist/primitives/segmented.d.ts +15 -0
- package/dist/primitives/segmented.d.ts.map +1 -0
- package/dist/primitives/segmented.js +15 -0
- package/dist/primitives/segmented.js.map +1 -0
- package/dist/primitives/select.d.ts +14 -0
- package/dist/primitives/select.d.ts.map +1 -0
- package/dist/primitives/select.js +27 -0
- package/dist/primitives/select.js.map +1 -0
- package/dist/primitives/separator.d.ts +5 -0
- package/dist/primitives/separator.d.ts.map +1 -0
- package/dist/primitives/separator.js +9 -0
- package/dist/primitives/separator.js.map +1 -0
- package/dist/primitives/sheet.d.ts +27 -0
- package/dist/primitives/sheet.d.ts.map +1 -0
- package/dist/primitives/sheet.js +38 -0
- package/dist/primitives/sheet.js.map +1 -0
- package/dist/primitives/sidebar.d.ts +68 -0
- package/dist/primitives/sidebar.d.ts.map +1 -0
- package/dist/primitives/sidebar.js +224 -0
- package/dist/primitives/sidebar.js.map +1 -0
- package/dist/primitives/skeleton.d.ts +3 -0
- package/dist/primitives/skeleton.d.ts.map +1 -0
- package/dist/primitives/skeleton.js +7 -0
- package/dist/primitives/skeleton.js.map +1 -0
- package/dist/primitives/sliding-view-toggle.d.ts +14 -0
- package/dist/primitives/sliding-view-toggle.d.ts.map +1 -0
- package/dist/primitives/sliding-view-toggle.js +12 -0
- package/dist/primitives/sliding-view-toggle.js.map +1 -0
- package/dist/primitives/switch.d.ts +5 -0
- package/dist/primitives/switch.d.ts.map +1 -0
- package/dist/primitives/switch.js +9 -0
- package/dist/primitives/switch.js.map +1 -0
- package/dist/primitives/table-action.d.ts +52 -0
- package/dist/primitives/table-action.d.ts.map +1 -0
- package/dist/primitives/table-action.js +47 -0
- package/dist/primitives/table-action.js.map +1 -0
- package/dist/primitives/table.d.ts +78 -0
- package/dist/primitives/table.d.ts.map +1 -0
- package/dist/primitives/table.js +131 -0
- package/dist/primitives/table.js.map +1 -0
- package/dist/primitives/tooltip.d.ts +8 -0
- package/dist/primitives/tooltip.d.ts.map +1 -0
- package/dist/primitives/tooltip.js +12 -0
- package/dist/primitives/tooltip.js.map +1 -0
- package/dist/primitives/unused-images-badge.d.ts +9 -0
- package/dist/primitives/unused-images-badge.d.ts.map +1 -0
- package/dist/primitives/unused-images-badge.js +10 -0
- package/dist/primitives/unused-images-badge.js.map +1 -0
- package/dist/strings/index.d.ts +3 -0
- package/dist/strings/index.d.ts.map +1 -0
- package/dist/strings/index.js +2 -0
- package/dist/strings/index.js.map +1 -0
- package/dist/strings/ui-strings-context.d.ts +33 -0
- package/dist/strings/ui-strings-context.d.ts.map +1 -0
- package/dist/strings/ui-strings-context.js +19 -0
- package/dist/strings/ui-strings-context.js.map +1 -0
- package/package.json +74 -0
|
@@ -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.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
declare const Input: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
|
|
3
|
+
export { Input };
|
|
4
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/primitives/input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,QAAA,MAAM,KAAK,8KAcV,CAAA;AAGD,OAAO,EAAE,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from '../lib/utils';
|
|
4
|
+
const Input = React.forwardRef(({ className, type, ...props }, ref) => {
|
|
5
|
+
return (_jsx("input", { type: type, className: cn("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", className), ref: ref, ...props }));
|
|
6
|
+
});
|
|
7
|
+
Input.displayName = "Input";
|
|
8
|
+
export { Input };
|
|
9
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/primitives/input.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAC5B,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACrC,OAAO,CACL,gBACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CACX,gYAAgY,EAChY,SAAS,CACV,EACD,GAAG,EAAE,GAAG,KACJ,KAAK,GACT,CACH,CAAA;AACH,CAAC,CACF,CAAA;AACD,KAAK,CAAC,WAAW,GAAG,OAAO,CAAA;AAE3B,OAAO,EAAE,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ComponentProps } from 'react';
|
|
2
|
+
type KanbanScrollAreaProps = ComponentProps<'div'>;
|
|
3
|
+
export declare function KanbanScrollArea({ className, ...props }: KanbanScrollAreaProps): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=kanban-scroll-area.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-scroll-area.d.ts","sourceRoot":"","sources":["../../src/primitives/kanban-scroll-area.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,KAAK,qBAAqB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAEnD,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,qBAAqB,2CAU9E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/utils';
|
|
3
|
+
export function KanbanScrollArea({ className, ...props }) {
|
|
4
|
+
return (_jsx("div", { className: cn('max-h-[min(720px,calc(100vh-16rem))] overflow-auto overscroll-contain p-4', className), ...props }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=kanban-scroll-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-scroll-area.js","sourceRoot":"","sources":["../../src/primitives/kanban-scroll-area.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAIlC,MAAM,UAAU,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyB;IAC7E,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,2EAA2E,EAC3E,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
3
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
4
|
+
declare const Label: React.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & VariantProps<(props?: import("class-variance-authority/types").ClassProp | undefined) => string> & React.RefAttributes<HTMLLabelElement>>;
|
|
5
|
+
export { Label };
|
|
6
|
+
//# sourceMappingURL=label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/primitives/label.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQlE,QAAA,MAAM,KAAK,4PAKT,CAAC;AAGH,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { cn } from '../lib/utils';
|
|
7
|
+
const labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70');
|
|
8
|
+
const Label = React.forwardRef(({ className, ...props }, ref) => (_jsx(LabelPrimitive.Root, { ref: ref, className: cn(labelVariants(), className), ...props })));
|
|
9
|
+
Label.displayName = LabelPrimitive.Root.displayName;
|
|
10
|
+
export { Label };
|
|
11
|
+
//# sourceMappingURL=label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/primitives/label.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,aAAa,GAAG,GAAG,CACvB,4FAA4F,CAC7F,CAAC;AAEF,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAG5B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,cAAc,CAAC,IAAI,IAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CACxF,CAAC,CAAC;AACH,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;AAEpD,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface ListRowsSkeletonProps {
|
|
2
|
+
className?: string;
|
|
3
|
+
rows?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function ListRowsSkeleton({ className, rows }: ListRowsSkeletonProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
interface ListPageSkeletonProps {
|
|
7
|
+
className?: string;
|
|
8
|
+
rows?: number;
|
|
9
|
+
showSubtitle?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function ListPageSkeleton({ className, rows, showSubtitle }: ListPageSkeletonProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=list-page-skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-page-skeleton.d.ts","sourceRoot":"","sources":["../../src/primitives/list-page-skeleton.tsx"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAQ,EAAE,EAAE,qBAAqB,2CAc9E;AAED,UAAU,qBAAqB;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAQ,EAAE,YAAmB,EAAE,EAAE,qBAAqB,2CAgCnG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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 ListRowsSkeleton({ className, rows = 8 }) {
|
|
6
|
+
return (_jsx("div", { className: cn('divide-y', className), "aria-hidden": "true", children: Array.from({ length: rows }).map((_, index) => (_jsxs("div", { className: "flex items-center gap-4 p-4", children: [_jsx(Skeleton, { className: "size-4 shrink-0 rounded" }), _jsx(Skeleton, { className: "h-4 w-full max-w-[240px]" }), _jsx(Skeleton, { className: "hidden h-4 w-24 sm:block" }), _jsx(Skeleton, { className: "hidden h-4 w-20 md:block" }), _jsx(Skeleton, { className: "ml-auto h-7 w-16 shrink-0" })] }, index))) }));
|
|
7
|
+
}
|
|
8
|
+
export function ListPageSkeleton({ className, rows = 8, showSubtitle = true }) {
|
|
9
|
+
return (_jsxs("div", { className: cn('relative', className), "aria-busy": "true", children: [_jsxs("div", { className: "mb-5 flex flex-col gap-4 xl:flex-row xl:items-start xl:justify-between", children: [_jsxs("div", { className: "min-w-0 space-y-2", children: [_jsx(Skeleton, { className: "h-7 w-44" }), showSubtitle ? _jsx(Skeleton, { className: "h-3.5 w-72" }) : null] }), _jsx(Skeleton, { className: "h-9 w-28 self-start" })] }), _jsxs("section", { className: "rounded-lg border bg-card", children: [_jsxs("div", { className: "flex flex-col gap-3 border-b p-4 xl:flex-row xl:items-center xl:justify-between", children: [_jsxs("div", { className: "flex flex-1 flex-wrap items-center gap-2", children: [_jsx(Skeleton, { className: "h-9 w-full sm:w-[320px]" }), _jsx(Skeleton, { className: "h-9 w-20" }), _jsx(Skeleton, { className: "h-9 w-20" })] }), _jsx(Skeleton, { className: "h-9 w-28" })] }), _jsx(ListRowsSkeleton, { rows: rows }), _jsxs("div", { className: "flex items-center justify-between border-t p-4", children: [_jsx(Skeleton, { className: "h-4 w-40" }), _jsx(Skeleton, { className: "h-8 w-56" })] })] }), _jsx(PlatformLoaderOverlay, {})] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=list-page-skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-page-skeleton.js","sourceRoot":"","sources":["../../src/primitives/list-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;AAOlC,MAAM,UAAU,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,EAAyB;IAC7E,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,iBAAc,MAAM,YAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAC9C,eAAiB,SAAS,EAAC,6BAA6B,aACtD,KAAC,QAAQ,IAAC,SAAS,EAAC,yBAAyB,GAAG,EAChD,KAAC,QAAQ,IAAC,SAAS,EAAC,0BAA0B,GAAG,EACjD,KAAC,QAAQ,IAAC,SAAS,EAAC,0BAA0B,GAAG,EACjD,KAAC,QAAQ,IAAC,SAAS,EAAC,0BAA0B,GAAG,EACjD,KAAC,QAAQ,IAAC,SAAS,EAAC,2BAA2B,GAAG,KAL1C,KAAK,CAMT,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,EAAyB;IAClG,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,eAAY,MAAM,aACzD,eAAK,SAAS,EAAC,wEAAwE,aACrF,eAAK,SAAS,EAAC,mBAAmB,aAChC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EAChC,YAAY,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,IACtD,EACN,KAAC,QAAQ,IAAC,SAAS,EAAC,qBAAqB,GAAG,IACxC,EAEN,mBAAS,SAAS,EAAC,2BAA2B,aAC5C,eAAK,SAAS,EAAC,iFAAiF,aAC9F,eAAK,SAAS,EAAC,0CAA0C,aACvD,KAAC,QAAQ,IAAC,SAAS,EAAC,yBAAyB,GAAG,EAChD,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACjC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,IAC7B,EACN,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,IAC7B,EAEN,KAAC,gBAAgB,IAAC,IAAI,EAAE,IAAI,GAAI,EAEhC,eAAK,SAAS,EAAC,gDAAgD,aAC7D,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,EACjC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,IAC7B,IACE,EAEV,KAAC,qBAAqB,KAAG,IACrB,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export type ModalityKind = 'text' | 'image' | 'number';
|
|
3
|
+
export declare const MODALITY_KIND_ORDER: Record<ModalityKind, number>;
|
|
4
|
+
export declare function sortModalityKinds(kinds: ReadonlyArray<ModalityKind>): ModalityKind[];
|
|
5
|
+
export interface ModalityIconProps {
|
|
6
|
+
kind: ModalityKind;
|
|
7
|
+
supported?: boolean;
|
|
8
|
+
tooltip?: ReactNode;
|
|
9
|
+
size?: 'sm' | 'md';
|
|
10
|
+
className?: string;
|
|
11
|
+
'aria-label'?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function ModalityIcon({ kind, supported, tooltip, size, className, 'aria-label': ariaLabel, }: ModalityIconProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export interface ModalityIconGroupProps {
|
|
15
|
+
kinds: ModalityKind[];
|
|
16
|
+
tooltips?: Partial<Record<ModalityKind, ReactNode>>;
|
|
17
|
+
ariaLabels?: Partial<Record<ModalityKind, string>>;
|
|
18
|
+
size?: 'sm' | 'md';
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function ModalityIconGroup({ kinds, tooltips, ariaLabels, size, className, }: ModalityIconGroupProps): import("react/jsx-runtime").JSX.Element | null;
|
|
22
|
+
//# sourceMappingURL=modality-icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modality-icon.d.ts","sourceRoot":"","sources":["../../src/primitives/modality-icon.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAI5D,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,EAAE,CAEpF;AAmBD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,SAAgB,EAChB,OAAO,EACP,IAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,iBAAiB,2CAkCnB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,SAAS,GACV,EAAE,sBAAsB,kDAiBxB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Hash, Image as ImageIcon, Type } from 'lucide-react';
|
|
4
|
+
import { cn } from '../lib/utils';
|
|
5
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip';
|
|
6
|
+
export const MODALITY_KIND_ORDER = {
|
|
7
|
+
text: 0,
|
|
8
|
+
image: 1,
|
|
9
|
+
number: 2,
|
|
10
|
+
};
|
|
11
|
+
export function sortModalityKinds(kinds) {
|
|
12
|
+
return Array.from(new Set(kinds)).sort((a, b) => MODALITY_KIND_ORDER[a] - MODALITY_KIND_ORDER[b]);
|
|
13
|
+
}
|
|
14
|
+
const KIND_ICON = {
|
|
15
|
+
text: Type,
|
|
16
|
+
image: ImageIcon,
|
|
17
|
+
number: Hash,
|
|
18
|
+
};
|
|
19
|
+
const KIND_TOKEN_CLASSES = {
|
|
20
|
+
text: 'border-[var(--modality-text-bd)] bg-[var(--modality-text-bg)] text-[var(--modality-text-fg)]',
|
|
21
|
+
image: 'border-[var(--modality-image-bd)] bg-[var(--modality-image-bg)] text-[var(--modality-image-fg)]',
|
|
22
|
+
number: 'border-[var(--modality-number-bd)] bg-[var(--modality-number-bg)] text-[var(--modality-number-fg)]',
|
|
23
|
+
};
|
|
24
|
+
const SIZE_CLASSES = {
|
|
25
|
+
sm: { box: 'size-5', icon: 'size-3' },
|
|
26
|
+
md: { box: 'size-6', icon: 'size-3.5' },
|
|
27
|
+
};
|
|
28
|
+
export function ModalityIcon({ kind, supported = true, tooltip, size = 'md', className, 'aria-label': ariaLabel, }) {
|
|
29
|
+
const Icon = KIND_ICON[kind];
|
|
30
|
+
const sizing = SIZE_CLASSES[size];
|
|
31
|
+
const tone = supported
|
|
32
|
+
? KIND_TOKEN_CLASSES[kind]
|
|
33
|
+
: 'border-border bg-muted text-muted-foreground opacity-40';
|
|
34
|
+
const badge = (_jsx("span", { "data-testid": "modality-icon", "data-kind": kind, "data-supported": supported ? 'true' : 'false', "aria-label": ariaLabel, className: cn('inline-flex shrink-0 items-center justify-center rounded-md border', sizing.box, tone, className), children: _jsx(Icon, { className: sizing.icon }) }));
|
|
35
|
+
if (!tooltip)
|
|
36
|
+
return badge;
|
|
37
|
+
return (_jsx(TooltipProvider, { delayDuration: 120, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: badge }), _jsx(TooltipContent, { children: tooltip })] }) }));
|
|
38
|
+
}
|
|
39
|
+
export function ModalityIconGroup({ kinds, tooltips, ariaLabels, size, className, }) {
|
|
40
|
+
if (kinds.length === 0)
|
|
41
|
+
return null;
|
|
42
|
+
const ordered = sortModalityKinds(kinds);
|
|
43
|
+
return (_jsx("span", { className: cn('inline-flex items-center gap-1.5', className), children: ordered.map((kind) => (_jsx(ModalityIcon, { kind: kind, size: size, tooltip: tooltips?.[kind], "aria-label": ariaLabels?.[kind] }, kind))) }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=modality-icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modality-icon.js","sourceRoot":"","sources":["../../src/primitives/modality-icon.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface MultiSelectOption {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
meta?: string;
|
|
5
|
+
logoText?: string;
|
|
6
|
+
logoStyle?: React.CSSProperties;
|
|
7
|
+
}
|
|
8
|
+
export interface MultiSelectProps {
|
|
9
|
+
label: string;
|
|
10
|
+
options: ReadonlyArray<MultiSelectOption>;
|
|
11
|
+
value: ReadonlyArray<string>;
|
|
12
|
+
onChange: (next: string[]) => void;
|
|
13
|
+
searchPlaceholder?: string;
|
|
14
|
+
emptyText?: string;
|
|
15
|
+
footnote?: string;
|
|
16
|
+
totalLabel?: string;
|
|
17
|
+
iconAdornment?: React.ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export declare function MultiSelect({ label, options, value, onChange, searchPlaceholder, emptyText, footnote, totalLabel, iconAdornment, }: MultiSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=multi-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select.d.ts","sourceRoot":"","sources":["../../src/primitives/multi-select.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC1C,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACjC;AAGD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,iBAAyB,EACzB,SAAmB,EACnB,QAAQ,EACR,UAAU,EACV,aAAa,GACd,EAAE,gBAAgB,2CAmJlB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
import { Check, ChevronDown, Search } from 'lucide-react';
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger } from './popover';
|
|
6
|
+
import { cn } from '../lib/utils';
|
|
7
|
+
// Project / model multi-select popover (used by the design's filter bar)
|
|
8
|
+
export function MultiSelect({ label, options, value, onChange, searchPlaceholder = '搜索…', emptyText = '没有匹配项', footnote, totalLabel, iconAdornment, }) {
|
|
9
|
+
const [open, setOpen] = useState(false);
|
|
10
|
+
const [query, setQuery] = useState('');
|
|
11
|
+
const selectedSet = useMemo(() => new Set(value), [value]);
|
|
12
|
+
const filtered = useMemo(() => {
|
|
13
|
+
const q = query.trim().toLowerCase();
|
|
14
|
+
if (!q)
|
|
15
|
+
return options;
|
|
16
|
+
return options.filter((o) => o.label.toLowerCase().includes(q) ||
|
|
17
|
+
o.value.toLowerCase().includes(q) ||
|
|
18
|
+
(o.meta?.toLowerCase().includes(q) ?? false));
|
|
19
|
+
}, [options, query]);
|
|
20
|
+
const allChecked = options.length > 0 && value.length === options.length;
|
|
21
|
+
const someChecked = value.length > 0 && !allChecked;
|
|
22
|
+
function toggle(v) {
|
|
23
|
+
if (selectedSet.has(v)) {
|
|
24
|
+
onChange(value.filter((x) => x !== v));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
onChange([...value, v]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", "aria-label": label, className: cn('inline-flex items-center gap-1.5 rounded-lg border bg-background px-2.5 h-8 text-[12.5px] font-medium text-foreground cursor-pointer transition-colors', 'hover:bg-accent', open && 'border-ring shadow-[0_0_0_3px_color-mix(in_srgb,var(--ring)_18%,transparent)]'), children: [iconAdornment, _jsx("span", { children: label }), _jsx(CountPill, { count: value.length, total: options.length, tone: value.length === 0 || allChecked ? 'muted' : 'primary' }), _jsx(ChevronDown, { className: "size-3.5 text-muted-foreground" })] }) }), _jsxs(PopoverContent, { align: "start", sideOffset: 6, className: "w-[300px] p-0 overflow-hidden", children: [_jsxs("div", { className: "flex items-center gap-2 border-b px-2.5 py-2", children: [_jsx(Search, { className: "size-3.5 text-muted-foreground" }), _jsx("input", { value: query, onChange: (e) => setQuery(e.target.value), placeholder: searchPlaceholder, className: "flex-1 bg-transparent text-[13px] outline-none placeholder:text-muted-foreground", "aria-label": `${label}-搜索` })] }), _jsxs("div", { className: "flex items-center justify-between border-b bg-muted/40 px-2.5 py-1.5 text-[11.5px] text-muted-foreground", children: [_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(CheckBox, { state: allChecked ? 'checked' : someChecked ? 'indeterminate' : 'unchecked', onToggle: () => onChange(allChecked ? [] : options.map((o) => o.value)), ariaLabel: `全选 ${label}` }), _jsx("span", { className: "text-foreground", children: totalLabel ?? `已选 ${value.length} / ${options.length}` })] }), _jsxs("span", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", className: "text-foreground hover:underline cursor-pointer", onClick: () => onChange(options.map((o) => o.value)), children: "\u5168\u9009" }), _jsx("span", { className: "opacity-40", children: "\u00B7" }), _jsx("button", { type: "button", className: "text-foreground hover:underline cursor-pointer", onClick: () => onChange([]), children: "\u6E05\u9664" })] })] }), _jsx("div", { className: "max-h-[260px] overflow-y-auto", children: filtered.length === 0 ? (_jsx("div", { className: "py-6 text-center text-[12px] text-muted-foreground", children: emptyText })) : (filtered.map((opt) => {
|
|
31
|
+
const checked = selectedSet.has(opt.value);
|
|
32
|
+
return (_jsxs("button", { type: "button", onClick: () => toggle(opt.value), className: cn('flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-[13px] cursor-pointer hover:bg-accent', checked && 'bg-primary/5'), children: [_jsx(CheckBox, { state: checked ? 'checked' : 'unchecked', ariaLabel: `选择 ${opt.label}` }), opt.logoText && (_jsx("span", { style: opt.logoStyle, className: "inline-flex size-[22px] items-center justify-center rounded font-mono text-[9.5px] font-semibold shrink-0", children: opt.logoText })), _jsx("span", { className: "flex-1 min-w-0 truncate", children: opt.label }), opt.meta && (_jsx("span", { className: "shrink-0 font-mono text-[10.5px] text-muted-foreground", children: opt.meta }))] }, opt.value));
|
|
33
|
+
})) }), footnote && (_jsx("div", { className: "flex items-center justify-between border-t bg-muted/40 px-2.5 py-2 text-[11.5px] text-muted-foreground", children: _jsx("span", { children: footnote }) }))] })] }));
|
|
34
|
+
}
|
|
35
|
+
function CountPill({ count, total, tone, }) {
|
|
36
|
+
if (count === 0 || count === total) {
|
|
37
|
+
return (_jsxs("span", { className: cn('inline-flex h-[18px] min-w-[18px] items-center justify-center rounded-full px-1.5 font-mono text-[10.5px] font-semibold', 'bg-muted text-muted-foreground'), children: [count, tone === 'muted' && total > 0 ? ` / ${total}` : ''] }));
|
|
38
|
+
}
|
|
39
|
+
return (_jsxs("span", { className: "inline-flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-primary px-1.5 font-mono text-[10.5px] font-semibold text-primary-foreground", children: [count, " / ", total] }));
|
|
40
|
+
}
|
|
41
|
+
function CheckBox({ state, onToggle, ariaLabel, }) {
|
|
42
|
+
const className = cn('inline-flex size-[14px] items-center justify-center rounded-[3px] border-[1.5px]', state === 'unchecked'
|
|
43
|
+
? 'border-muted-foreground/60 bg-background'
|
|
44
|
+
: 'border-primary bg-primary text-primary-foreground');
|
|
45
|
+
if (onToggle) {
|
|
46
|
+
return (_jsx("button", { type: "button", "aria-label": ariaLabel, "aria-checked": state === 'checked', role: "checkbox", onClick: (e) => {
|
|
47
|
+
e.stopPropagation();
|
|
48
|
+
onToggle();
|
|
49
|
+
}, className: cn(className, 'cursor-pointer'), children: _jsx(CheckBoxInner, { state: state }) }));
|
|
50
|
+
}
|
|
51
|
+
return (_jsx("span", { "aria-hidden": true, className: className, children: _jsx(CheckBoxInner, { state: state }) }));
|
|
52
|
+
}
|
|
53
|
+
function CheckBoxInner({ state }) {
|
|
54
|
+
if (state === 'checked')
|
|
55
|
+
return (_jsx(Check, { className: "size-2.5", strokeWidth: 3 }));
|
|
56
|
+
if (state === 'indeterminate')
|
|
57
|
+
return _jsx("span", { className: "h-[1.6px] w-[7px] rounded bg-primary-foreground", "aria-hidden": true });
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=multi-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select.js","sourceRoot":"","sources":["../../src/primitives/multi-select.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type PlatformLoaderSize = 'sm' | 'md' | 'lg';
|
|
2
|
+
interface PlatformLoaderProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
size?: PlatformLoaderSize;
|
|
5
|
+
}
|
|
6
|
+
export declare function PlatformLoader({ className, size }: PlatformLoaderProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
interface PlatformLoadingScreenProps {
|
|
8
|
+
/** Delay the loader's appearance by 300ms so a fast route transition doesn't flash a full-screen loader. */
|
|
9
|
+
delayReveal?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function PlatformLoadingScreen({ delayReveal }?: PlatformLoadingScreenProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
interface PlatformLoaderOverlayProps {
|
|
13
|
+
className?: string;
|
|
14
|
+
size?: PlatformLoaderSize;
|
|
15
|
+
}
|
|
16
|
+
export declare function PlatformLoaderOverlay({ className, size }: PlatformLoaderOverlayProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=platform-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-loader.d.ts","sourceRoot":"","sources":["../../src/primitives/platform-loader.tsx"],"names":[],"mappings":"AAMA,KAAK,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAcD,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,IAAW,EAAE,EAAE,mBAAmB,2CAgB7E;AAED,UAAU,0BAA0B;IAClC,4GAA4G;IAC5G,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,WAAmB,EAAE,GAAE,0BAA+B,2CAW7F;AAED,UAAU,0BAA0B;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAED,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,EAAE,IAAW,EAAE,EAAE,0BAA0B,2CAW3F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ProofHoundMarkTile } from '../brand/proofhound-logo';
|
|
4
|
+
import { useUiStrings } from '../strings';
|
|
5
|
+
import { cn } from '../lib/utils';
|
|
6
|
+
const loaderLogoSize = {
|
|
7
|
+
sm: 'md',
|
|
8
|
+
md: 'lg',
|
|
9
|
+
lg: 'xl',
|
|
10
|
+
};
|
|
11
|
+
const labelSizeClass = {
|
|
12
|
+
sm: 'text-xs',
|
|
13
|
+
md: 'text-sm',
|
|
14
|
+
lg: 'text-sm',
|
|
15
|
+
};
|
|
16
|
+
export function PlatformLoader({ className, size = 'lg' }) {
|
|
17
|
+
const s = useUiStrings();
|
|
18
|
+
const label = s.loaderLabel;
|
|
19
|
+
return (_jsxs("div", { role: "status", "aria-live": "polite", "aria-label": label, "data-testid": "platform-loader", className: cn('flex flex-col items-center justify-center gap-4 text-center', className), children: [_jsx(ProofHoundMarkTile, { size: loaderLogoSize[size], className: "ph-loader-wobble shadow-sm" }), _jsx("span", { className: cn('font-medium text-muted-foreground', labelSizeClass[size]), children: label })] }));
|
|
20
|
+
}
|
|
21
|
+
export function PlatformLoadingScreen({ delayReveal = false } = {}) {
|
|
22
|
+
return (_jsx("main", { className: cn('flex min-h-screen items-center justify-center bg-background px-4', delayReveal && 'ph-loader-delayed-reveal'), children: _jsx(PlatformLoader, {}) }));
|
|
23
|
+
}
|
|
24
|
+
export function PlatformLoaderOverlay({ className, size = 'md' }) {
|
|
25
|
+
return (_jsx("div", { className: cn('absolute inset-0 z-10 flex items-center justify-center rounded-[inherit] bg-background/55 backdrop-blur-[1px]', className), children: _jsx(PlatformLoader, { size: size }) }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=platform-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-loader.js","sourceRoot":"","sources":["../../src/primitives/platform-loader.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AASlC,MAAM,cAAc,GAAmD;IACrE,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;CACT,CAAC;AAEF,MAAM,cAAc,GAAuC;IACzD,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;CACd,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAuB;IAC5E,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC;IAE5B,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,eACH,QAAQ,gBACN,KAAK,iBACL,iBAAiB,EAC7B,SAAS,EAAE,EAAE,CAAC,6DAA6D,EAAE,SAAS,CAAC,aAEvF,KAAC,kBAAkB,IAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,EAAC,4BAA4B,GAAG,EACzF,eAAM,SAAS,EAAE,EAAE,CAAC,mCAAmC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,YAAG,KAAK,GAAQ,IAC1F,CACP,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,qBAAqB,CAAC,EAAE,WAAW,GAAG,KAAK,KAAiC,EAAE;IAC5F,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,kEAAkE,EAClE,WAAW,IAAI,0BAA0B,CAC1C,YAED,KAAC,cAAc,KAAG,GACb,CACR,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,qBAAqB,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAA8B;IAC1F,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,+GAA+G,EAC/G,SAAS,CACV,YAED,KAAC,cAAc,IAAC,IAAI,EAAE,IAAI,GAAI,GAC1B,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as PopoverPrimitive from "@radix-ui/react-popover";
|
|
3
|
+
declare const Popover: React.FC<PopoverPrimitive.PopoverProps>;
|
|
4
|
+
declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
5
|
+
declare const PopoverAnchor: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>>;
|
|
6
|
+
declare const PopoverContent: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
7
|
+
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };
|
|
8
|
+
//# sourceMappingURL=popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/primitives/popover.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAA;AAI3D,QAAA,MAAM,OAAO,yCAAwB,CAAA;AAErC,QAAA,MAAM,cAAc,gHAA2B,CAAA;AAE/C,QAAA,MAAM,aAAa,4GAA0B,CAAA;AAE7C,QAAA,MAAM,cAAc,gKAgBlB,CAAA;AAGF,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,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 PopoverPrimitive from "@radix-ui/react-popover";
|
|
5
|
+
import { cn } from '../lib/utils';
|
|
6
|
+
const Popover = PopoverPrimitive.Root;
|
|
7
|
+
const PopoverTrigger = PopoverPrimitive.Trigger;
|
|
8
|
+
const PopoverAnchor = PopoverPrimitive.Anchor;
|
|
9
|
+
const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { ref: ref, align: align, sideOffset: sideOffset, className: cn("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none 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", className), ...props }) })));
|
|
10
|
+
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
|
|
11
|
+
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };
|
|
12
|
+
//# sourceMappingURL=popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/primitives/popover.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,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAA;AAErC,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAA;AAE/C,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAA;AAE7C,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAGrC,CAAC,EAAE,SAAS,EAAE,KAAK,GAAG,QAAQ,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACpE,KAAC,gBAAgB,CAAC,MAAM,cACtB,KAAC,gBAAgB,CAAC,OAAO,IACvB,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,EAAE,CACX,4aAA4a,EAC5a,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,aAAa,EAAE,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function getProgressPercent(value: number, max?: number): number;
|
|
2
|
+
export declare function formatProgressNumber(value: number): string;
|
|
3
|
+
export declare function formatProgressLabel({ value, max, percent, fractionDigits, valueLabel, maxLabel, }: {
|
|
4
|
+
value: number;
|
|
5
|
+
max: number;
|
|
6
|
+
percent?: number | null;
|
|
7
|
+
fractionDigits?: number;
|
|
8
|
+
valueLabel?: string;
|
|
9
|
+
maxLabel?: string;
|
|
10
|
+
}): string;
|
|
11
|
+
export declare function Progress({ value, max, indeterminate, label, className, indicatorClassName, ariaLabel, }: {
|
|
12
|
+
value: number;
|
|
13
|
+
max?: number;
|
|
14
|
+
indeterminate?: boolean;
|
|
15
|
+
label?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
indicatorClassName?: string;
|
|
18
|
+
ariaLabel?: string;
|
|
19
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/primitives/progress.tsx"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAM,UAI1D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,UAGjD;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,GAAG,EACH,OAAO,EACP,cAAkB,EAClB,UAAU,EACV,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,UAMA;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,GAAS,EACT,aAAqB,EACrB,KAAK,EACL,SAAS,EACT,kBAAkB,EAClB,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAsCA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/utils';
|
|
3
|
+
function safeMax(max) {
|
|
4
|
+
return Number.isFinite(max) && max > 0 ? max : 100;
|
|
5
|
+
}
|
|
6
|
+
export function getProgressPercent(value, max = 100) {
|
|
7
|
+
const resolvedMax = safeMax(max);
|
|
8
|
+
if (!Number.isFinite(value))
|
|
9
|
+
return 0;
|
|
10
|
+
return Math.min(100, Math.max(0, (value / resolvedMax) * 100));
|
|
11
|
+
}
|
|
12
|
+
export function formatProgressNumber(value) {
|
|
13
|
+
if (!Number.isFinite(value))
|
|
14
|
+
return '—';
|
|
15
|
+
return value.toLocaleString('en-US').replace(/,/g, ' ');
|
|
16
|
+
}
|
|
17
|
+
export function formatProgressLabel({ value, max, percent, fractionDigits = 0, valueLabel, maxLabel, }) {
|
|
18
|
+
const resolvedPercent = percent ?? getProgressPercent(value, max);
|
|
19
|
+
const safePercent = Math.min(100, Math.max(0, resolvedPercent));
|
|
20
|
+
return `${safePercent.toFixed(fractionDigits)}% · ${valueLabel ?? formatProgressNumber(value)} / ${maxLabel ?? formatProgressNumber(max)}`;
|
|
21
|
+
}
|
|
22
|
+
export function Progress({ value, max = 100, indeterminate = false, label, className, indicatorClassName, ariaLabel, }) {
|
|
23
|
+
const resolvedMax = safeMax(max);
|
|
24
|
+
const safeValue = Math.min(resolvedMax, Math.max(0, Number.isFinite(value) ? value : 0));
|
|
25
|
+
const percent = getProgressPercent(safeValue, resolvedMax);
|
|
26
|
+
return (_jsxs("div", { className: cn('relative h-6 w-full overflow-hidden rounded-full border border-border bg-muted', className), role: "progressbar", "aria-label": ariaLabel ?? label, "aria-valuemin": 0, "aria-valuemax": resolvedMax, "aria-valuenow": indeterminate ? undefined : safeValue, children: [label && (_jsx("span", { className: "pointer-events-none absolute inset-0 flex items-center justify-center px-3 text-[13px] font-medium leading-none tabular-nums text-foreground", children: label })), _jsxs("div", { className: "absolute inset-0 transition-[clip-path] duration-300 ease-out", style: indeterminate ? undefined : { clipPath: `inset(0 ${100 - percent}% 0 0)` }, children: [_jsx("span", { className: cn('absolute inset-y-0 left-0 right-0 bg-primary', indeterminate && 'right-auto w-1/3 animate-pulse opacity-70', indicatorClassName) }), label && !indeterminate && (_jsx("span", { className: "pointer-events-none absolute inset-0 flex items-center justify-center px-3 text-[13px] font-medium leading-none tabular-nums text-primary-foreground", children: label }))] })] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/primitives/progress.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export declare function ResourcePaginationFooter({ summary, pageIndex, pageCount, pageSize, pageSizeOptions, previousPageLabel, nextPageLabel, onPageChange, onPageSizeChange, }: {
|
|
3
|
+
summary?: ReactNode;
|
|
4
|
+
pageIndex: number;
|
|
5
|
+
pageCount: number;
|
|
6
|
+
pageSize: number;
|
|
7
|
+
pageSizeOptions: number[];
|
|
8
|
+
previousPageLabel: string;
|
|
9
|
+
nextPageLabel: string;
|
|
10
|
+
onPageChange: (pageIndex: number) => void;
|
|
11
|
+
onPageSizeChange: (pageSize: number) => void;
|
|
12
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=resource-pagination-footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-pagination-footer.d.ts","sourceRoot":"","sources":["../../src/primitives/resource-pagination-footer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,SAAS,EACT,SAAS,EACT,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,gBAAgB,GACjB,EAAE;IACD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,2CAsDA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ChevronLeft, ChevronRight } from 'lucide-react';
|
|
3
|
+
import { Button } from './button';
|
|
4
|
+
import { useUiStrings } from '../strings';
|
|
5
|
+
export function ResourcePaginationFooter({ summary, pageIndex, pageCount, pageSize, pageSizeOptions, previousPageLabel, nextPageLabel, onPageChange, onPageSizeChange, }) {
|
|
6
|
+
const s = useUiStrings();
|
|
7
|
+
const safePageCount = Math.max(1, pageCount);
|
|
8
|
+
const safePageIndex = Math.min(pageIndex, safePageCount - 1);
|
|
9
|
+
return (_jsxs("div", { className: "flex flex-col gap-3 border-t px-4 py-3 text-xs text-muted-foreground lg:flex-row lg:items-center lg:justify-between", children: [summary ? _jsx("div", { children: summary }) : _jsx("div", {}), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs("label", { className: "flex items-center gap-2", children: [_jsx("span", { children: s.itemsPerPage }), _jsx("select", { value: pageSize, "aria-label": s.itemsPerPage, onChange: (event) => onPageSizeChange(Number(event.target.value)), className: "h-8 rounded-md border border-input bg-background px-2 font-mono text-xs text-foreground outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring", children: pageSizeOptions.map((option) => (_jsx("option", { value: option, children: option }, option))) })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-7", disabled: safePageIndex === 0, "aria-label": previousPageLabel, onClick: () => onPageChange(Math.max(0, safePageIndex - 1)), children: _jsx(ChevronLeft, { className: "size-3.5" }) }), _jsxs("span", { className: "px-2 font-mono", children: [safePageIndex + 1, " / ", safePageCount] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-7", disabled: safePageIndex >= safePageCount - 1, "aria-label": nextPageLabel, onClick: () => onPageChange(Math.min(safePageCount - 1, safePageIndex + 1)), children: _jsx(ChevronRight, { className: "size-3.5" }) })] })] })] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=resource-pagination-footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-pagination-footer.js","sourceRoot":"","sources":["../../src/primitives/resource-pagination-footer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,wBAAwB,CAAC,EACvC,OAAO,EACP,SAAS,EACT,SAAS,EACT,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,gBAAgB,GAWjB;IACC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;IAE7D,OAAO,CACL,eAAK,SAAS,EAAC,qHAAqH,aACjI,OAAO,CAAC,CAAC,CAAC,wBAAM,OAAO,GAAO,CAAC,CAAC,CAAC,eAAO,EACzC,eAAK,SAAS,EAAC,mCAAmC,aAChD,iBAAO,SAAS,EAAC,yBAAyB,aACxC,yBAAO,CAAC,CAAC,YAAY,GAAQ,EAC7B,iBACE,KAAK,EAAE,QAAQ,gBACH,CAAC,CAAC,YAAY,EAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACjE,SAAS,EAAC,qKAAqK,YAE9K,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC/B,iBAAqB,KAAK,EAAE,MAAM,YAC/B,MAAM,IADI,MAAM,CAEV,CACV,CAAC,GACK,IACH,EACR,eAAK,SAAS,EAAC,2BAA2B,aACxC,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,QAAQ,EAClB,QAAQ,EAAE,aAAa,KAAK,CAAC,gBACjB,iBAAiB,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,YAE3D,KAAC,WAAW,IAAC,SAAS,EAAC,UAAU,GAAG,GAC7B,EACT,gBAAM,SAAS,EAAC,gBAAgB,aAC7B,aAAa,GAAG,CAAC,SAAK,aAAa,IAC/B,EACP,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,QAAQ,EAClB,QAAQ,EAAE,aAAa,IAAI,aAAa,GAAG,CAAC,gBAChC,aAAa,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,YAE3E,KAAC,YAAY,IAAC,SAAS,EAAC,UAAU,GAAG,GAC9B,IACL,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface SegmentedOption<TValue extends string> {
|
|
3
|
+
value: TValue;
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
icon?: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function Segmented<TValue extends string>({ value, options, ariaLabel, onChange, size, className, }: {
|
|
8
|
+
value: TValue;
|
|
9
|
+
options: ReadonlyArray<SegmentedOption<TValue>>;
|
|
10
|
+
ariaLabel: string;
|
|
11
|
+
onChange: (value: TValue) => void;
|
|
12
|
+
size?: 'sm' | 'md';
|
|
13
|
+
className?: string;
|
|
14
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=segmented.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segmented.d.ts","sourceRoot":"","sources":["../../src/primitives/segmented.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,eAAe,CAAC,MAAM,SAAS,MAAM;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAID,wBAAgB,SAAS,CAAC,MAAM,SAAS,MAAM,EAAE,EAC/C,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,IAAW,EACX,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAkCA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../lib/utils';
|
|
4
|
+
// N-option segmented control (used by the design's "Last 1h / Last 24h / Last 7d / Last 30d / Custom"
|
|
5
|
+
// and the ranking table header switch between "Calls / Cost / Hit rate / Failure rate")
|
|
6
|
+
export function Segmented({ value, options, ariaLabel, onChange, size = 'md', className, }) {
|
|
7
|
+
const padX = size === 'sm' ? 'px-2.5' : 'px-3';
|
|
8
|
+
const padY = size === 'sm' ? 'py-1' : 'py-1.5';
|
|
9
|
+
const text = size === 'sm' ? 'text-[12px]' : 'text-[12.5px]';
|
|
10
|
+
return (_jsx("div", { role: "group", "aria-label": ariaLabel, className: cn('inline-flex items-center gap-0.5 rounded-lg border bg-muted p-0.5', className), children: options.map((opt) => {
|
|
11
|
+
const active = opt.value === value;
|
|
12
|
+
return (_jsxs("button", { type: "button", onClick: () => onChange(opt.value), "aria-pressed": active, className: cn('inline-flex items-center gap-1.5 rounded-md font-medium transition-colors cursor-pointer', text, padX, padY, active ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'), children: [opt.icon ? _jsx("span", { className: "inline-flex shrink-0 items-center", "aria-hidden": true, children: opt.icon }) : null, opt.label] }, opt.value));
|
|
13
|
+
}) }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=segmented.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segmented.js","sourceRoot":"","sources":["../../src/primitives/segmented.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAQlC,sGAAsG;AACtG,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAwB,EAC/C,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,IAAI,GAAG,IAAI,EACX,SAAS,GAQV;IACC,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC;IAE7D,OAAO,CACL,cACE,IAAI,EAAC,OAAO,gBACA,SAAS,EACrB,SAAS,EAAE,EAAE,CAAC,mEAAmE,EAAE,SAAS,CAAC,YAE5F,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;YACnC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,kBACpB,MAAM,EACpB,SAAS,EAAE,EAAE,CACX,0FAA0F,EAC1F,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,MAAM,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,6CAA6C,CACnG,aAEA,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,mCAAmC,iCAAc,GAAG,CAAC,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,EACnG,GAAG,CAAC,KAAK,KAbL,GAAG,CAAC,KAAK,CAcP,CACV,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|