@epicbagel/saas-kit 1.32.0 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/THIRD_PARTY_NOTICES.md +6 -5
- package/dist/chunk-2BNEE3U6.cjs +36 -0
- package/dist/chunk-2DCJ2SFU.js +20 -0
- package/dist/chunk-5GFMSK27.js +489 -0
- package/dist/chunk-5PHOKJCT.cjs +42 -0
- package/dist/chunk-B54ZEKBG.cjs +63 -0
- package/dist/chunk-BB7PO2BW.js +67 -0
- package/dist/chunk-BOMVE7QO.cjs +47 -0
- package/dist/{chunk-FPOJ2NGG.js → chunk-C3VZMTVB.js} +1 -1
- package/dist/chunk-CXAFTEEP.cjs +20 -0
- package/dist/chunk-EXHF3QUY.js +36 -0
- package/dist/chunk-FYNHRHVY.cjs +47 -0
- package/dist/chunk-HTTRUJQU.cjs +60 -0
- package/dist/chunk-I3GBXIFL.cjs +67 -0
- package/dist/chunk-O3G3TVPU.js +27 -0
- package/dist/{chunk-JS6BLIWL.js → chunk-ROUWBWEQ.js} +7 -7
- package/dist/chunk-TDCVZKMX.cjs +27 -0
- package/dist/{chunk-E2UVQXBO.cjs → chunk-TP74SBRH.cjs} +6 -6
- package/dist/chunk-TUQVHPSI.js +60 -0
- package/dist/chunk-UKYUWSF2.cjs +489 -0
- package/dist/{chunk-MOJHETNO.cjs → chunk-VUMLLKWY.cjs} +5 -5
- package/dist/chunk-VWOWPNKT.js +73 -0
- package/dist/chunk-W5L6LQI3.js +42 -0
- package/dist/chunk-WMTCL463.js +47 -0
- package/dist/chunk-WTVL2FK7.js +47 -0
- package/dist/chunk-XH2I3YJ6.js +63 -0
- package/dist/chunk-Y6X6XDHE.cjs +73 -0
- package/dist/primitives/accent-theme.cjs +7 -0
- package/dist/primitives/accent-theme.d.cts +32 -0
- package/dist/primitives/accent-theme.d.ts +32 -0
- package/dist/primitives/accent-theme.js +7 -0
- package/dist/primitives/activity-feed.cjs +3 -3
- package/dist/primitives/activity-feed.js +4 -4
- package/dist/primitives/anchor.cjs +3 -30
- package/dist/primitives/anchor.js +3 -30
- package/dist/primitives/app-layout.cjs +114 -0
- package/dist/primitives/app-layout.d.cts +47 -0
- package/dist/primitives/app-layout.d.ts +47 -0
- package/dist/primitives/app-layout.js +114 -0
- package/dist/primitives/app-sidebar.cjs +52 -0
- package/dist/primitives/app-sidebar.d.cts +105 -0
- package/dist/primitives/app-sidebar.d.ts +105 -0
- package/dist/primitives/app-sidebar.js +52 -0
- package/dist/primitives/back-bar.cjs +37 -0
- package/dist/primitives/back-bar.d.cts +31 -0
- package/dist/primitives/back-bar.d.ts +31 -0
- package/dist/primitives/back-bar.js +37 -0
- package/dist/primitives/batch-action-bar.cjs +134 -0
- package/dist/primitives/batch-action-bar.d.cts +27 -0
- package/dist/primitives/batch-action-bar.d.ts +27 -0
- package/dist/primitives/batch-action-bar.js +134 -0
- package/dist/primitives/board-view.cjs +7 -7
- package/dist/primitives/board-view.js +6 -6
- package/dist/primitives/brand-mark.cjs +8 -0
- package/dist/primitives/brand-mark.d.cts +10 -0
- package/dist/primitives/brand-mark.d.ts +10 -0
- package/dist/primitives/brand-mark.js +8 -0
- package/dist/primitives/branded-page.cjs +201 -0
- package/dist/primitives/branded-page.d.cts +118 -0
- package/dist/primitives/branded-page.d.ts +118 -0
- package/dist/primitives/branded-page.js +201 -0
- package/dist/primitives/call-card.cjs +2 -2
- package/dist/primitives/call-card.js +3 -3
- package/dist/primitives/chat.cjs +21 -21
- package/dist/primitives/chat.js +17 -17
- package/dist/primitives/command.cjs +129 -0
- package/dist/primitives/command.d.cts +60 -0
- package/dist/primitives/command.d.ts +60 -0
- package/dist/primitives/command.js +129 -0
- package/dist/primitives/compact-list.cjs +24 -0
- package/dist/primitives/compact-list.d.cts +18 -0
- package/dist/primitives/compact-list.d.ts +18 -0
- package/dist/primitives/compact-list.js +24 -0
- package/dist/primitives/connection.cjs +2 -2
- package/dist/primitives/connection.js +2 -2
- package/dist/primitives/context-bar.cjs +57 -0
- package/dist/primitives/context-bar.d.cts +50 -0
- package/dist/primitives/context-bar.d.ts +50 -0
- package/dist/primitives/context-bar.js +57 -0
- package/dist/primitives/cycling-prompt.cjs +102 -0
- package/dist/primitives/cycling-prompt.d.cts +24 -0
- package/dist/primitives/cycling-prompt.d.ts +24 -0
- package/dist/primitives/cycling-prompt.js +102 -0
- package/dist/primitives/dialog.d.cts +9 -9
- package/dist/primitives/dialog.d.ts +9 -9
- package/dist/primitives/document-preview.cjs +5 -5
- package/dist/primitives/document-preview.js +3 -3
- package/dist/primitives/dotted-list.cjs +41 -0
- package/dist/primitives/dotted-list.d.cts +28 -0
- package/dist/primitives/dotted-list.d.ts +28 -0
- package/dist/primitives/dotted-list.js +41 -0
- package/dist/primitives/drawer.d.cts +6 -6
- package/dist/primitives/drawer.d.ts +6 -6
- package/dist/primitives/field.cjs +3 -3
- package/dist/primitives/field.js +2 -2
- package/dist/primitives/file-dropzone.cjs +3 -3
- package/dist/primitives/file-dropzone.js +2 -2
- package/dist/primitives/file-preview-internals.cjs +4 -4
- package/dist/primitives/file-preview-internals.js +3 -3
- package/dist/primitives/file-preview.cjs +12 -12
- package/dist/primitives/file-preview.js +3 -3
- package/dist/primitives/filter-bar.cjs +4 -4
- package/dist/primitives/filter-bar.js +3 -3
- package/dist/primitives/fixed-action-bar.cjs +9 -0
- package/dist/primitives/fixed-action-bar.d.cts +15 -0
- package/dist/primitives/fixed-action-bar.d.ts +15 -0
- package/dist/primitives/fixed-action-bar.js +9 -0
- package/dist/primitives/floating-action-button.cjs +65 -0
- package/dist/primitives/floating-action-button.d.cts +52 -0
- package/dist/primitives/floating-action-button.d.ts +52 -0
- package/dist/primitives/floating-action-button.js +65 -0
- package/dist/primitives/form-section.cjs +38 -0
- package/dist/primitives/form-section.d.cts +43 -0
- package/dist/primitives/form-section.d.ts +43 -0
- package/dist/primitives/form-section.js +38 -0
- package/dist/primitives/key-value-grid.cjs +52 -0
- package/dist/primitives/key-value-grid.d.cts +20 -0
- package/dist/primitives/key-value-grid.d.ts +20 -0
- package/dist/primitives/key-value-grid.js +52 -0
- package/dist/primitives/marketing-footer.cjs +34 -0
- package/dist/primitives/marketing-footer.d.cts +29 -0
- package/dist/primitives/marketing-footer.d.ts +29 -0
- package/dist/primitives/marketing-footer.js +34 -0
- package/dist/primitives/marketing-header.cjs +8 -0
- package/dist/primitives/marketing-header.d.cts +31 -0
- package/dist/primitives/marketing-header.d.ts +31 -0
- package/dist/primitives/marketing-header.js +8 -0
- package/dist/primitives/marketing-section.cjs +8 -0
- package/dist/primitives/marketing-section.d.cts +35 -0
- package/dist/primitives/marketing-section.d.ts +35 -0
- package/dist/primitives/marketing-section.js +8 -0
- package/dist/primitives/marketing-shell.cjs +28 -0
- package/dist/primitives/marketing-shell.d.cts +14 -0
- package/dist/primitives/marketing-shell.d.ts +14 -0
- package/dist/primitives/marketing-shell.js +28 -0
- package/dist/primitives/notes.cjs +3 -3
- package/dist/primitives/notes.js +3 -3
- package/dist/primitives/page-header.cjs +3 -67
- package/dist/primitives/page-header.js +3 -67
- package/dist/primitives/page-shell.cjs +3 -41
- package/dist/primitives/page-shell.js +3 -41
- package/dist/primitives/page-tabs.cjs +4 -57
- package/dist/primitives/page-tabs.js +4 -57
- package/dist/primitives/pager.cjs +85 -0
- package/dist/primitives/pager.d.cts +39 -0
- package/dist/primitives/pager.d.ts +39 -0
- package/dist/primitives/pager.js +85 -0
- package/dist/primitives/pagination.cjs +119 -0
- package/dist/primitives/pagination.d.cts +41 -0
- package/dist/primitives/pagination.d.ts +41 -0
- package/dist/primitives/pagination.js +119 -0
- package/dist/primitives/poster.cjs +11 -1
- package/dist/primitives/poster.d.cts +12 -1
- package/dist/primitives/poster.d.ts +12 -1
- package/dist/primitives/poster.js +10 -0
- package/dist/primitives/resource-list.cjs +7 -7
- package/dist/primitives/resource-list.js +6 -6
- package/dist/primitives/responsive-dialog.cjs +3 -3
- package/dist/primitives/responsive-dialog.js +2 -2
- package/dist/primitives/responsive-embed.cjs +29 -0
- package/dist/primitives/responsive-embed.d.cts +14 -0
- package/dist/primitives/responsive-embed.d.ts +14 -0
- package/dist/primitives/responsive-embed.js +29 -0
- package/dist/primitives/save-bar.cjs +91 -0
- package/dist/primitives/save-bar.d.cts +55 -0
- package/dist/primitives/save-bar.d.ts +55 -0
- package/dist/primitives/save-bar.js +91 -0
- package/dist/primitives/section.cjs +2 -2
- package/dist/primitives/section.js +3 -3
- package/dist/primitives/settings-list.cjs +10 -0
- package/dist/primitives/settings-list.d.cts +31 -0
- package/dist/primitives/settings-list.d.ts +31 -0
- package/dist/primitives/settings-list.js +10 -0
- package/dist/primitives/settings-section.cjs +34 -0
- package/dist/primitives/settings-section.d.cts +44 -0
- package/dist/primitives/settings-section.d.ts +44 -0
- package/dist/primitives/settings-section.js +34 -0
- package/dist/primitives/sheet.d.cts +9 -9
- package/dist/primitives/sheet.d.ts +9 -9
- package/dist/primitives/short-video.cjs +110 -0
- package/dist/primitives/short-video.d.cts +30 -0
- package/dist/primitives/short-video.d.ts +30 -0
- package/dist/primitives/short-video.js +110 -0
- package/dist/primitives/stats-card.cjs +46 -0
- package/dist/primitives/stats-card.d.cts +19 -0
- package/dist/primitives/stats-card.d.ts +19 -0
- package/dist/primitives/stats-card.js +46 -0
- package/dist/primitives/stats-strip.cjs +38 -0
- package/dist/primitives/stats-strip.d.cts +24 -0
- package/dist/primitives/stats-strip.d.ts +24 -0
- package/dist/primitives/stats-strip.js +38 -0
- package/dist/primitives/step-list.cjs +32 -0
- package/dist/primitives/step-list.d.cts +19 -0
- package/dist/primitives/step-list.d.ts +19 -0
- package/dist/primitives/step-list.js +32 -0
- package/dist/primitives/steps.cjs +77 -0
- package/dist/primitives/steps.d.cts +35 -0
- package/dist/primitives/steps.d.ts +35 -0
- package/dist/primitives/steps.js +77 -0
- package/dist/primitives/switch-field.cjs +3 -3
- package/dist/primitives/switch-field.js +3 -3
- package/dist/primitives/tabbed-page-header.cjs +53 -0
- package/dist/primitives/tabbed-page-header.d.cts +26 -0
- package/dist/primitives/tabbed-page-header.d.ts +26 -0
- package/dist/primitives/tabbed-page-header.js +53 -0
- package/dist/primitives/theme-selector.cjs +15 -15
- package/dist/primitives/theme-selector.js +2 -2
- package/dist/primitives/voice-dictation-button.cjs +3 -3
- package/dist/primitives/voice-dictation-button.js +2 -2
- package/dist/primitives/voice-session-controls.cjs +3 -3
- package/dist/primitives/voice-session-controls.js +2 -2
- package/dist/primitives/workflow-assistant.cjs +4 -4
- package/dist/primitives/workflow-assistant.js +2 -2
- package/package.json +322 -1
- package/src/styles/components/poster.css +42 -1
- package/dist/{chunk-PH2TV7XI.cjs → chunk-2YW5VA2V.cjs} +2 -2
- package/dist/{chunk-UFFHGKI7.js → chunk-6LB37JWO.js} +8 -8
- package/dist/{chunk-AO56ET4F.cjs → chunk-BTHYGHOH.cjs} +2 -2
- package/dist/{chunk-WHDHUYS6.js → chunk-HBRVOGLA.js} +3 -3
- package/dist/{chunk-6O3DUMF7.js → chunk-HTUYUMAH.js} +3 -3
- package/dist/{chunk-PNI354BY.cjs → chunk-JMNDFISN.cjs} +2 -2
- package/dist/{chunk-CRZ4INEJ.js → chunk-JTI4244T.js} +10 -10
- package/dist/{chunk-ZGTPNSR7.js → chunk-NNEV5RHQ.js} +3 -3
- package/dist/{chunk-TWCJMFST.js → chunk-O42YC6ZQ.js} +3 -3
- package/dist/{chunk-MW67PHAQ.cjs → chunk-S2IMM37Q.cjs} +6 -6
- package/dist/{chunk-ZJFYOXSM.cjs → chunk-SRVRNHCX.cjs} +2 -2
- package/dist/{chunk-ZLEM2SAU.cjs → chunk-Z3JJSNR5.cjs} +2 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
SettingsListContext
|
|
4
|
+
} from "../chunk-2DCJ2SFU.js";
|
|
5
|
+
import {
|
|
6
|
+
cn
|
|
7
|
+
} from "../chunk-G6SRSWXB.js";
|
|
8
|
+
|
|
9
|
+
// src/primitives/settings-section.tsx
|
|
10
|
+
import { useContext } from "react";
|
|
11
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
function SettingsSection({
|
|
13
|
+
heading,
|
|
14
|
+
description,
|
|
15
|
+
action,
|
|
16
|
+
children,
|
|
17
|
+
className
|
|
18
|
+
}) {
|
|
19
|
+
const { single } = useContext(SettingsListContext);
|
|
20
|
+
const showHeader = !single && (heading || action || description);
|
|
21
|
+
return /* @__PURE__ */ jsxs("section", { className: cn("space-y-4", className), children: [
|
|
22
|
+
showHeader && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
23
|
+
(heading || action) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
|
|
24
|
+
heading && /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium tracking-tight min-w-0", children: heading }),
|
|
25
|
+
action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
|
|
26
|
+
] }),
|
|
27
|
+
description && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: description })
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ jsx("div", { children })
|
|
30
|
+
] });
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
SettingsSection
|
|
34
|
+
};
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
-
import * as
|
|
3
|
+
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
4
4
|
import { VariantProps } from 'class-variance-authority';
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
|
|
7
|
-
declare const Sheet: React.FC<
|
|
8
|
-
declare const SheetTrigger: React.ForwardRefExoticComponent<
|
|
9
|
-
declare const SheetClose: React.ForwardRefExoticComponent<
|
|
10
|
-
declare const SheetPortal: React.FC<
|
|
11
|
-
declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<
|
|
7
|
+
declare const Sheet: React.FC<SheetPrimitive.DialogProps>;
|
|
8
|
+
declare const SheetTrigger: React.ForwardRefExoticComponent<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
9
|
+
declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
10
|
+
declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
11
|
+
declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
12
12
|
declare const sheetVariants: (props?: ({
|
|
13
13
|
side?: "left" | "right" | "bottom" | "top" | null | undefined;
|
|
14
14
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
15
|
-
interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof
|
|
15
|
+
interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
|
|
16
16
|
/**
|
|
17
17
|
* Suppress the default top-right close (×) button. Useful when the
|
|
18
18
|
* consumer renders its own close affordance or relies on overlay-tap /
|
|
@@ -39,10 +39,10 @@ declare const SheetFooter: {
|
|
|
39
39
|
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
40
40
|
displayName: string;
|
|
41
41
|
};
|
|
42
|
-
interface SheetTitleProps extends React.ComponentPropsWithoutRef<typeof
|
|
42
|
+
interface SheetTitleProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title> {
|
|
43
43
|
display?: "block" | "inline-flex";
|
|
44
44
|
}
|
|
45
45
|
declare const SheetTitle: React.ForwardRefExoticComponent<SheetTitleProps & React.RefAttributes<HTMLHeadingElement>>;
|
|
46
|
-
declare const SheetDescription: React.ForwardRefExoticComponent<Omit<
|
|
46
|
+
declare const SheetDescription: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
47
47
|
|
|
48
48
|
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, type SheetHeaderProps, SheetOverlay, SheetPortal, SheetTitle, type SheetTitleProps, SheetTrigger };
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
-
import * as
|
|
3
|
+
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
4
4
|
import { VariantProps } from 'class-variance-authority';
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
|
|
7
|
-
declare const Sheet: React.FC<
|
|
8
|
-
declare const SheetTrigger: React.ForwardRefExoticComponent<
|
|
9
|
-
declare const SheetClose: React.ForwardRefExoticComponent<
|
|
10
|
-
declare const SheetPortal: React.FC<
|
|
11
|
-
declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<
|
|
7
|
+
declare const Sheet: React.FC<SheetPrimitive.DialogProps>;
|
|
8
|
+
declare const SheetTrigger: React.ForwardRefExoticComponent<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
9
|
+
declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
10
|
+
declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
11
|
+
declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
12
12
|
declare const sheetVariants: (props?: ({
|
|
13
13
|
side?: "left" | "right" | "bottom" | "top" | null | undefined;
|
|
14
14
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
15
|
-
interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof
|
|
15
|
+
interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
|
|
16
16
|
/**
|
|
17
17
|
* Suppress the default top-right close (×) button. Useful when the
|
|
18
18
|
* consumer renders its own close affordance or relies on overlay-tap /
|
|
@@ -39,10 +39,10 @@ declare const SheetFooter: {
|
|
|
39
39
|
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
40
40
|
displayName: string;
|
|
41
41
|
};
|
|
42
|
-
interface SheetTitleProps extends React.ComponentPropsWithoutRef<typeof
|
|
42
|
+
interface SheetTitleProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title> {
|
|
43
43
|
display?: "block" | "inline-flex";
|
|
44
44
|
}
|
|
45
45
|
declare const SheetTitle: React.ForwardRefExoticComponent<SheetTitleProps & React.RefAttributes<HTMLHeadingElement>>;
|
|
46
|
-
declare const SheetDescription: React.ForwardRefExoticComponent<Omit<
|
|
46
|
+
declare const SheetDescription: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
47
47
|
|
|
48
48
|
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, type SheetHeaderProps, SheetOverlay, SheetPortal, SheetTitle, type SheetTitleProps, SheetTrigger };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
6
|
+
|
|
7
|
+
// src/primitives/short-video.tsx
|
|
8
|
+
var _react = require('react');
|
|
9
|
+
var _lucidereact = require('lucide-react');
|
|
10
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
11
|
+
function formatDuration(sec) {
|
|
12
|
+
const m = Math.floor(sec / 60);
|
|
13
|
+
const s = Math.floor(sec % 60);
|
|
14
|
+
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
15
|
+
}
|
|
16
|
+
function ShortVideo({
|
|
17
|
+
src,
|
|
18
|
+
poster,
|
|
19
|
+
durationSec,
|
|
20
|
+
orientation = "portrait",
|
|
21
|
+
caption,
|
|
22
|
+
maxWidth = 320,
|
|
23
|
+
className
|
|
24
|
+
}) {
|
|
25
|
+
const videoRef = _react.useRef.call(void 0, null);
|
|
26
|
+
const [playing, setPlaying] = _react.useState.call(void 0, false);
|
|
27
|
+
const [muted, setMuted] = _react.useState.call(void 0, false);
|
|
28
|
+
const [started, setStarted] = _react.useState.call(void 0, false);
|
|
29
|
+
const togglePlay = () => {
|
|
30
|
+
const el = videoRef.current;
|
|
31
|
+
if (!el) return;
|
|
32
|
+
if (el.paused) {
|
|
33
|
+
void el.play();
|
|
34
|
+
setStarted(true);
|
|
35
|
+
} else {
|
|
36
|
+
el.pause();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const toggleMute = () => {
|
|
40
|
+
const el = videoRef.current;
|
|
41
|
+
if (!el) return;
|
|
42
|
+
el.muted = !el.muted;
|
|
43
|
+
setMuted(el.muted);
|
|
44
|
+
};
|
|
45
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "figure", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex flex-col gap-2", className), style: { maxWidth }, children: [
|
|
46
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
50
|
+
"group relative overflow-hidden rounded-2xl border bg-muted",
|
|
51
|
+
orientation === "portrait" ? "aspect-[9/16]" : "aspect-video"
|
|
52
|
+
),
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
55
|
+
"video",
|
|
56
|
+
{
|
|
57
|
+
ref: videoRef,
|
|
58
|
+
src,
|
|
59
|
+
poster,
|
|
60
|
+
preload: "metadata",
|
|
61
|
+
playsInline: true,
|
|
62
|
+
className: "h-full w-full object-cover",
|
|
63
|
+
onPlay: () => setPlaying(true),
|
|
64
|
+
onPause: () => setPlaying(false),
|
|
65
|
+
onEnded: () => setPlaying(false),
|
|
66
|
+
onClick: togglePlay
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
!started && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: togglePlay,
|
|
74
|
+
"aria-label": "Play video",
|
|
75
|
+
className: "absolute inset-0 flex items-center justify-center bg-black/20 transition-colors hover:bg-black/30",
|
|
76
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex size-16 items-center justify-center rounded-full bg-background/90 shadow-lg backdrop-blur-sm transition-transform group-hover:scale-105", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Play, { className: "ml-1 size-7 text-foreground" }) })
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
!started && durationSec ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "absolute bottom-3 right-3 rounded-full bg-black/60 px-2 py-0.5 font-mono text-[11px] font-medium text-white", children: formatDuration(durationSec) }) : null,
|
|
80
|
+
started && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "absolute inset-x-0 bottom-0 flex items-center justify-between gap-2 bg-gradient-to-t from-black/60 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100", children: [
|
|
81
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
82
|
+
"button",
|
|
83
|
+
{
|
|
84
|
+
type: "button",
|
|
85
|
+
onClick: togglePlay,
|
|
86
|
+
"aria-label": playing ? "Pause" : "Play",
|
|
87
|
+
className: "flex size-9 items-center justify-center rounded-full bg-background/90 text-foreground",
|
|
88
|
+
children: playing ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Pause, { className: "size-4" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Play, { className: "ml-0.5 size-4" })
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
92
|
+
"button",
|
|
93
|
+
{
|
|
94
|
+
type: "button",
|
|
95
|
+
onClick: toggleMute,
|
|
96
|
+
"aria-label": muted ? "Unmute" : "Mute",
|
|
97
|
+
className: "flex size-9 items-center justify-center rounded-full bg-background/90 text-foreground",
|
|
98
|
+
children: muted ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.VolumeX, { className: "size-4" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Volume2, { className: "size-4" })
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
] })
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
caption && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "figcaption", { className: "text-sm text-muted-foreground", children: caption })
|
|
106
|
+
] });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
exports.ShortVideo = ShortVideo;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface ShortVideoProps {
|
|
5
|
+
/** Video source (mp4/webm). */
|
|
6
|
+
src: string;
|
|
7
|
+
/** Poster frame shown before play. */
|
|
8
|
+
poster?: string;
|
|
9
|
+
/** Duration in seconds — rendered as a small badge. */
|
|
10
|
+
durationSec?: number;
|
|
11
|
+
/** 9:16 by default; "landscape" switches to 16:9. */
|
|
12
|
+
orientation?: "portrait" | "landscape";
|
|
13
|
+
/** Optional caption under the player. */
|
|
14
|
+
caption?: ReactNode;
|
|
15
|
+
/** Constrain width (portrait videos get tall fast). Default 320px. */
|
|
16
|
+
maxWidth?: number;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ShortVideo — an inline, vertical-first video player for marketing /
|
|
21
|
+
* portal feeds (the "Shorts-style" clip). Tap-to-play with a poster
|
|
22
|
+
* frame, a play/pause affordance and a mute toggle. Lazy (preload
|
|
23
|
+
* metadata only) so a feed of these stays light. Portrait by default;
|
|
24
|
+
* pass orientation="landscape" for 16:9.
|
|
25
|
+
*
|
|
26
|
+
* Caller owns the source + poster; render captions via `caption`.
|
|
27
|
+
*/
|
|
28
|
+
declare function ShortVideo({ src, poster, durationSec, orientation, caption, maxWidth, className, }: ShortVideoProps): react_jsx_runtime.JSX.Element;
|
|
29
|
+
|
|
30
|
+
export { ShortVideo, type ShortVideoProps };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface ShortVideoProps {
|
|
5
|
+
/** Video source (mp4/webm). */
|
|
6
|
+
src: string;
|
|
7
|
+
/** Poster frame shown before play. */
|
|
8
|
+
poster?: string;
|
|
9
|
+
/** Duration in seconds — rendered as a small badge. */
|
|
10
|
+
durationSec?: number;
|
|
11
|
+
/** 9:16 by default; "landscape" switches to 16:9. */
|
|
12
|
+
orientation?: "portrait" | "landscape";
|
|
13
|
+
/** Optional caption under the player. */
|
|
14
|
+
caption?: ReactNode;
|
|
15
|
+
/** Constrain width (portrait videos get tall fast). Default 320px. */
|
|
16
|
+
maxWidth?: number;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ShortVideo — an inline, vertical-first video player for marketing /
|
|
21
|
+
* portal feeds (the "Shorts-style" clip). Tap-to-play with a poster
|
|
22
|
+
* frame, a play/pause affordance and a mute toggle. Lazy (preload
|
|
23
|
+
* metadata only) so a feed of these stays light. Portrait by default;
|
|
24
|
+
* pass orientation="landscape" for 16:9.
|
|
25
|
+
*
|
|
26
|
+
* Caller owns the source + poster; render captions via `caption`.
|
|
27
|
+
*/
|
|
28
|
+
declare function ShortVideo({ src, poster, durationSec, orientation, caption, maxWidth, className, }: ShortVideoProps): react_jsx_runtime.JSX.Element;
|
|
29
|
+
|
|
30
|
+
export { ShortVideo, type ShortVideoProps };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import {
|
|
4
|
+
cn
|
|
5
|
+
} from "../chunk-G6SRSWXB.js";
|
|
6
|
+
|
|
7
|
+
// src/primitives/short-video.tsx
|
|
8
|
+
import { useRef, useState } from "react";
|
|
9
|
+
import { Play, Pause, Volume2, VolumeX } from "lucide-react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
function formatDuration(sec) {
|
|
12
|
+
const m = Math.floor(sec / 60);
|
|
13
|
+
const s = Math.floor(sec % 60);
|
|
14
|
+
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
15
|
+
}
|
|
16
|
+
function ShortVideo({
|
|
17
|
+
src,
|
|
18
|
+
poster,
|
|
19
|
+
durationSec,
|
|
20
|
+
orientation = "portrait",
|
|
21
|
+
caption,
|
|
22
|
+
maxWidth = 320,
|
|
23
|
+
className
|
|
24
|
+
}) {
|
|
25
|
+
const videoRef = useRef(null);
|
|
26
|
+
const [playing, setPlaying] = useState(false);
|
|
27
|
+
const [muted, setMuted] = useState(false);
|
|
28
|
+
const [started, setStarted] = useState(false);
|
|
29
|
+
const togglePlay = () => {
|
|
30
|
+
const el = videoRef.current;
|
|
31
|
+
if (!el) return;
|
|
32
|
+
if (el.paused) {
|
|
33
|
+
void el.play();
|
|
34
|
+
setStarted(true);
|
|
35
|
+
} else {
|
|
36
|
+
el.pause();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const toggleMute = () => {
|
|
40
|
+
const el = videoRef.current;
|
|
41
|
+
if (!el) return;
|
|
42
|
+
el.muted = !el.muted;
|
|
43
|
+
setMuted(el.muted);
|
|
44
|
+
};
|
|
45
|
+
return /* @__PURE__ */ jsxs("figure", { className: cn("flex flex-col gap-2", className), style: { maxWidth }, children: [
|
|
46
|
+
/* @__PURE__ */ jsxs(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: cn(
|
|
50
|
+
"group relative overflow-hidden rounded-2xl border bg-muted",
|
|
51
|
+
orientation === "portrait" ? "aspect-[9/16]" : "aspect-video"
|
|
52
|
+
),
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"video",
|
|
56
|
+
{
|
|
57
|
+
ref: videoRef,
|
|
58
|
+
src,
|
|
59
|
+
poster,
|
|
60
|
+
preload: "metadata",
|
|
61
|
+
playsInline: true,
|
|
62
|
+
className: "h-full w-full object-cover",
|
|
63
|
+
onPlay: () => setPlaying(true),
|
|
64
|
+
onPause: () => setPlaying(false),
|
|
65
|
+
onEnded: () => setPlaying(false),
|
|
66
|
+
onClick: togglePlay
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
!started && /* @__PURE__ */ jsx(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: togglePlay,
|
|
74
|
+
"aria-label": "Play video",
|
|
75
|
+
className: "absolute inset-0 flex items-center justify-center bg-black/20 transition-colors hover:bg-black/30",
|
|
76
|
+
children: /* @__PURE__ */ jsx("span", { className: "flex size-16 items-center justify-center rounded-full bg-background/90 shadow-lg backdrop-blur-sm transition-transform group-hover:scale-105", children: /* @__PURE__ */ jsx(Play, { className: "ml-1 size-7 text-foreground" }) })
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
!started && durationSec ? /* @__PURE__ */ jsx("span", { className: "absolute bottom-3 right-3 rounded-full bg-black/60 px-2 py-0.5 font-mono text-[11px] font-medium text-white", children: formatDuration(durationSec) }) : null,
|
|
80
|
+
started && /* @__PURE__ */ jsxs("div", { className: "absolute inset-x-0 bottom-0 flex items-center justify-between gap-2 bg-gradient-to-t from-black/60 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100", children: [
|
|
81
|
+
/* @__PURE__ */ jsx(
|
|
82
|
+
"button",
|
|
83
|
+
{
|
|
84
|
+
type: "button",
|
|
85
|
+
onClick: togglePlay,
|
|
86
|
+
"aria-label": playing ? "Pause" : "Play",
|
|
87
|
+
className: "flex size-9 items-center justify-center rounded-full bg-background/90 text-foreground",
|
|
88
|
+
children: playing ? /* @__PURE__ */ jsx(Pause, { className: "size-4" }) : /* @__PURE__ */ jsx(Play, { className: "ml-0.5 size-4" })
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ jsx(
|
|
92
|
+
"button",
|
|
93
|
+
{
|
|
94
|
+
type: "button",
|
|
95
|
+
onClick: toggleMute,
|
|
96
|
+
"aria-label": muted ? "Unmute" : "Mute",
|
|
97
|
+
className: "flex size-9 items-center justify-center rounded-full bg-background/90 text-foreground",
|
|
98
|
+
children: muted ? /* @__PURE__ */ jsx(VolumeX, { className: "size-4" }) : /* @__PURE__ */ jsx(Volume2, { className: "size-4" })
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
] })
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
caption && /* @__PURE__ */ jsx("figcaption", { className: "text-sm text-muted-foreground", children: caption })
|
|
106
|
+
] });
|
|
107
|
+
}
|
|
108
|
+
export {
|
|
109
|
+
ShortVideo
|
|
110
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkR3DQS6U4cjs = require('../chunk-R3DQS6U4.cjs');
|
|
8
|
+
require('../chunk-KWLSBTB2.cjs');
|
|
9
|
+
|
|
10
|
+
// src/primitives/stats-card.tsx
|
|
11
|
+
var _react = require('react');
|
|
12
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
13
|
+
function StatsCard({
|
|
14
|
+
title,
|
|
15
|
+
value,
|
|
16
|
+
icon,
|
|
17
|
+
change,
|
|
18
|
+
changeType
|
|
19
|
+
}) {
|
|
20
|
+
const iconNode = _react.isValidElement.call(void 0, icon) ? icon : /* @__PURE__ */ (() => {
|
|
21
|
+
const Icon = icon;
|
|
22
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Icon, { className: "h-4 w-4 text-muted-foreground" });
|
|
23
|
+
})();
|
|
24
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.Card, { children: [
|
|
25
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [
|
|
26
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR3DQS6U4cjs.CardTitle, { className: "text-sm font-medium", children: title }),
|
|
27
|
+
iconNode
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.CardContent, { children: [
|
|
30
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-2xl font-bold", children: value }),
|
|
31
|
+
change && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
32
|
+
"p",
|
|
33
|
+
{
|
|
34
|
+
className: `text-xs ${changeType === "positive" ? "text-green-500" : "text-red-500"}`,
|
|
35
|
+
children: [
|
|
36
|
+
change,
|
|
37
|
+
" from last month"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
] })
|
|
42
|
+
] });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
exports.StatsCard = StatsCard;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { LucideIcon } from 'lucide-react';
|
|
4
|
+
|
|
5
|
+
interface StatsCardProps {
|
|
6
|
+
title: string;
|
|
7
|
+
value: string;
|
|
8
|
+
/**
|
|
9
|
+
* Lucide component reference OR an instantiated element. Pass an
|
|
10
|
+
* element when calling from a server component (component references
|
|
11
|
+
* can't cross the server→client boundary).
|
|
12
|
+
*/
|
|
13
|
+
icon: LucideIcon | ReactNode;
|
|
14
|
+
change?: string;
|
|
15
|
+
changeType?: "positive" | "negative";
|
|
16
|
+
}
|
|
17
|
+
declare function StatsCard({ title, value, icon, change, changeType, }: StatsCardProps): react_jsx_runtime.JSX.Element;
|
|
18
|
+
|
|
19
|
+
export { StatsCard };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { LucideIcon } from 'lucide-react';
|
|
4
|
+
|
|
5
|
+
interface StatsCardProps {
|
|
6
|
+
title: string;
|
|
7
|
+
value: string;
|
|
8
|
+
/**
|
|
9
|
+
* Lucide component reference OR an instantiated element. Pass an
|
|
10
|
+
* element when calling from a server component (component references
|
|
11
|
+
* can't cross the server→client boundary).
|
|
12
|
+
*/
|
|
13
|
+
icon: LucideIcon | ReactNode;
|
|
14
|
+
change?: string;
|
|
15
|
+
changeType?: "positive" | "negative";
|
|
16
|
+
}
|
|
17
|
+
declare function StatsCard({ title, value, icon, change, changeType, }: StatsCardProps): react_jsx_runtime.JSX.Element;
|
|
18
|
+
|
|
19
|
+
export { StatsCard };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
Card,
|
|
4
|
+
CardContent,
|
|
5
|
+
CardHeader,
|
|
6
|
+
CardTitle
|
|
7
|
+
} from "../chunk-35YMAIEL.js";
|
|
8
|
+
import "../chunk-G6SRSWXB.js";
|
|
9
|
+
|
|
10
|
+
// src/primitives/stats-card.tsx
|
|
11
|
+
import { isValidElement } from "react";
|
|
12
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
function StatsCard({
|
|
14
|
+
title,
|
|
15
|
+
value,
|
|
16
|
+
icon,
|
|
17
|
+
change,
|
|
18
|
+
changeType
|
|
19
|
+
}) {
|
|
20
|
+
const iconNode = isValidElement(icon) ? icon : /* @__PURE__ */ (() => {
|
|
21
|
+
const Icon = icon;
|
|
22
|
+
return /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 text-muted-foreground" });
|
|
23
|
+
})();
|
|
24
|
+
return /* @__PURE__ */ jsxs(Card, { children: [
|
|
25
|
+
/* @__PURE__ */ jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [
|
|
26
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-sm font-medium", children: title }),
|
|
27
|
+
iconNode
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ jsxs(CardContent, { children: [
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "text-2xl font-bold", children: value }),
|
|
31
|
+
change && /* @__PURE__ */ jsxs(
|
|
32
|
+
"p",
|
|
33
|
+
{
|
|
34
|
+
className: `text-xs ${changeType === "positive" ? "text-green-500" : "text-red-500"}`,
|
|
35
|
+
children: [
|
|
36
|
+
change,
|
|
37
|
+
" from last month"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
] })
|
|
42
|
+
] });
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
StatsCard
|
|
46
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkR3DQS6U4cjs = require('../chunk-R3DQS6U4.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkEJP2L5QVcjs = require('../chunk-EJP2L5QV.cjs');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
12
|
+
|
|
13
|
+
// src/primitives/stats-strip.tsx
|
|
14
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
15
|
+
var COLS = {
|
|
16
|
+
3: "sm:grid-cols-3",
|
|
17
|
+
4: "sm:grid-cols-4",
|
|
18
|
+
5: "sm:grid-cols-5",
|
|
19
|
+
6: "sm:grid-cols-6"
|
|
20
|
+
};
|
|
21
|
+
function StatsStrip({ items, columns = 5, className }) {
|
|
22
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "grid grid-cols-2 gap-2", _nullishCoalesce(COLS[columns], () => ( COLS[5])), className), children: items.map((item, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR3DQS6U4cjs.Card, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.CardContent, { className: "py-3 px-4", children: [
|
|
23
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: item.label }),
|
|
24
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
25
|
+
"div",
|
|
26
|
+
{
|
|
27
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
28
|
+
"text-2xl font-semibold",
|
|
29
|
+
item.tone ? _chunkEJP2L5QVcjs.statusColors[item.tone].icon : "text-foreground"
|
|
30
|
+
),
|
|
31
|
+
children: item.value
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
] }) }, i)) });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
exports.StatsStrip = StatsStrip;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { StatusColorKey } from '../lib/status-colors.cjs';
|
|
4
|
+
|
|
5
|
+
interface StatsStripItem {
|
|
6
|
+
label: ReactNode;
|
|
7
|
+
value: ReactNode;
|
|
8
|
+
/** Tone for the value text. Maps to the kit's standard token palette. */
|
|
9
|
+
tone?: StatusColorKey;
|
|
10
|
+
}
|
|
11
|
+
interface StatsStripProps {
|
|
12
|
+
items: StatsStripItem[];
|
|
13
|
+
/** Columns at the `sm:` breakpoint. Mobile is always 2 cols. */
|
|
14
|
+
columns?: 3 | 4 | 5 | 6;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Horizontal strip of metric cards — useful for "X total / Y this week
|
|
19
|
+
* / Z verified" page headers. Each card is composed of `Card` +
|
|
20
|
+
* `CardContent`; coloured tones map to `status-colors`.
|
|
21
|
+
*/
|
|
22
|
+
declare function StatsStrip({ items, columns, className }: StatsStripProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
|
|
24
|
+
export { StatsStrip, type StatsStripItem, type StatsStripProps };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { StatusColorKey } from '../lib/status-colors.js';
|
|
4
|
+
|
|
5
|
+
interface StatsStripItem {
|
|
6
|
+
label: ReactNode;
|
|
7
|
+
value: ReactNode;
|
|
8
|
+
/** Tone for the value text. Maps to the kit's standard token palette. */
|
|
9
|
+
tone?: StatusColorKey;
|
|
10
|
+
}
|
|
11
|
+
interface StatsStripProps {
|
|
12
|
+
items: StatsStripItem[];
|
|
13
|
+
/** Columns at the `sm:` breakpoint. Mobile is always 2 cols. */
|
|
14
|
+
columns?: 3 | 4 | 5 | 6;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Horizontal strip of metric cards — useful for "X total / Y this week
|
|
19
|
+
* / Z verified" page headers. Each card is composed of `Card` +
|
|
20
|
+
* `CardContent`; coloured tones map to `status-colors`.
|
|
21
|
+
*/
|
|
22
|
+
declare function StatsStrip({ items, columns, className }: StatsStripProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
|
|
24
|
+
export { StatsStrip, type StatsStripItem, type StatsStripProps };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
Card,
|
|
4
|
+
CardContent
|
|
5
|
+
} from "../chunk-35YMAIEL.js";
|
|
6
|
+
import {
|
|
7
|
+
statusColors
|
|
8
|
+
} from "../chunk-F7JHSZNT.js";
|
|
9
|
+
import {
|
|
10
|
+
cn
|
|
11
|
+
} from "../chunk-G6SRSWXB.js";
|
|
12
|
+
|
|
13
|
+
// src/primitives/stats-strip.tsx
|
|
14
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
+
var COLS = {
|
|
16
|
+
3: "sm:grid-cols-3",
|
|
17
|
+
4: "sm:grid-cols-4",
|
|
18
|
+
5: "sm:grid-cols-5",
|
|
19
|
+
6: "sm:grid-cols-6"
|
|
20
|
+
};
|
|
21
|
+
function StatsStrip({ items, columns = 5, className }) {
|
|
22
|
+
return /* @__PURE__ */ jsx("div", { className: cn("grid grid-cols-2 gap-2", COLS[columns] ?? COLS[5], className), children: items.map((item, i) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "py-3 px-4", children: [
|
|
23
|
+
/* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: item.label }),
|
|
24
|
+
/* @__PURE__ */ jsx(
|
|
25
|
+
"div",
|
|
26
|
+
{
|
|
27
|
+
className: cn(
|
|
28
|
+
"text-2xl font-semibold",
|
|
29
|
+
item.tone ? statusColors[item.tone].icon : "text-foreground"
|
|
30
|
+
),
|
|
31
|
+
children: item.value
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
] }) }, i)) });
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
StatsStrip
|
|
38
|
+
};
|