@epicbagel/saas-kit 1.31.0 → 1.33.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/THIRD_PARTY_NOTICES.md +6 -5
- package/dist/chunk-2DCJ2SFU.js +20 -0
- package/dist/chunk-2FVFPGP5.js +489 -0
- package/dist/{chunk-HTPPNW74.js → chunk-AWCXVYPL.js} +1 -1
- package/dist/chunk-B54ZEKBG.cjs +63 -0
- package/dist/chunk-CXAFTEEP.cjs +20 -0
- package/dist/{chunk-MOJHETNO.cjs → chunk-F3D5HA2F.cjs} +10 -10
- package/dist/chunk-G3SF4RRA.cjs +489 -0
- package/dist/chunk-HTTRUJQU.cjs +60 -0
- package/dist/{chunk-JS6BLIWL.js → chunk-IZF4WCK6.js} +11 -11
- package/dist/{chunk-PH2TV7XI.cjs → chunk-KOR2QR7I.cjs} +5 -5
- package/dist/{chunk-BGCNGYPL.cjs → chunk-PTMZTP3V.cjs} +2 -2
- package/dist/{chunk-6O3DUMF7.js → chunk-REGA2L5S.js} +1 -1
- package/dist/{chunk-PNI354BY.cjs → chunk-SL6ECEN6.cjs} +2 -2
- package/dist/{chunk-ZGTPNSR7.js → chunk-TS4MC3B3.js} +4 -4
- package/dist/chunk-TUQVHPSI.js +60 -0
- package/dist/chunk-VWOWPNKT.js +73 -0
- package/dist/chunk-XH2I3YJ6.js +63 -0
- package/dist/chunk-Y6X6XDHE.cjs +73 -0
- package/dist/primitives/accent-theme.cjs +66 -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 +66 -0
- package/dist/primitives/activity-feed.cjs +2 -2
- package/dist/primitives/activity-feed.js +2 -2
- package/dist/primitives/agent-audio-visualizer-bar.cjs +3 -3
- package/dist/primitives/agent-audio-visualizer-bar.js +2 -2
- package/dist/primitives/alert.d.cts +1 -1
- package/dist/primitives/alert.d.ts +1 -1
- 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/archive-confirmation-dialog.cjs +2 -2
- package/dist/primitives/archive-confirmation-dialog.js +3 -3
- 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/badge.d.cts +1 -1
- package/dist/primitives/badge.d.ts +1 -1
- 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-internals.cjs +3 -3
- package/dist/primitives/board-view-internals.js +2 -2
- package/dist/primitives/board-view.cjs +8 -8
- package/dist/primitives/board-view.js +7 -7
- package/dist/primitives/brand-mark.cjs +26 -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 +26 -0
- package/dist/primitives/bubble.d.cts +1 -1
- package/dist/primitives/bubble.d.ts +1 -1
- package/dist/primitives/button.d.cts +2 -2
- package/dist/primitives/button.d.ts +2 -2
- package/dist/primitives/chat.cjs +27 -27
- package/dist/primitives/chat.js +21 -21
- package/dist/primitives/code-block.cjs +4 -4
- package/dist/primitives/code-block.js +3 -3
- 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 +6 -6
- package/dist/primitives/connection.js +8 -8
- 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/copy-button.cjs +3 -3
- package/dist/primitives/copy-button.js +2 -2
- 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/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.cjs +4 -4
- 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 +46 -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 +46 -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 +41 -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 +41 -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 +4 -4
- package/dist/primitives/notes.js +4 -4
- package/dist/primitives/page-header.cjs +3 -67
- package/dist/primitives/page-header.js +3 -67
- 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 +406 -0
- package/dist/primitives/poster.d.cts +406 -0
- package/dist/primitives/poster.d.ts +406 -0
- package/dist/primitives/poster.js +406 -0
- package/dist/primitives/resource-list.cjs +8 -8
- package/dist/primitives/resource-list.js +7 -7
- 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/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/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 +17 -17
- package/dist/primitives/theme-selector.js +5 -5
- package/dist/primitives/voice-dictation-button.cjs +5 -5
- package/dist/primitives/voice-dictation-button.js +4 -4
- package/dist/primitives/voice-session-controls.cjs +4 -4
- package/dist/primitives/voice-session-controls.js +3 -3
- package/dist/primitives/workflow-assistant.cjs +5 -5
- package/dist/primitives/workflow-assistant.js +3 -3
- package/package.json +322 -1
- package/src/styles/components/poster.css +1449 -0
- package/src/styles/components.css +1 -0
- package/src/styles/utilities.css +2 -2
- package/dist/{chunk-5OF6D3GH.js → chunk-4TJBXXUE.js} +3 -3
- package/dist/{chunk-DILYV4FI.js → chunk-7ZRFXJVN.js} +3 -3
- package/dist/{chunk-YYFVG5A6.cjs → chunk-D46FNEZ5.cjs} +2 -2
- package/dist/{chunk-NKWHDI4C.cjs → chunk-FB3VY2PL.cjs} +2 -2
- package/dist/{chunk-MW67PHAQ.cjs → chunk-GUVQAWUW.cjs} +9 -9
- package/dist/{chunk-WHDHUYS6.js → chunk-HBRVOGLA.js} +3 -3
- package/dist/{chunk-FARCLWLU.cjs → chunk-HHF5DEKM.cjs} +3 -3
- package/dist/{chunk-TWCJMFST.js → chunk-O42YC6ZQ.js} +3 -3
- package/dist/{chunk-ZJFYOXSM.cjs → chunk-SRVRNHCX.cjs} +2 -2
- package/dist/{chunk-UFFHGKI7.js → chunk-SW4T3O7M.js} +9 -9
- package/dist/{chunk-62UTAG2C.js → chunk-ULZB4A2I.js} +3 -3
- package/dist/{chunk-ZLEM2SAU.cjs → chunk-Z3JJSNR5.cjs} +2 -2
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface FixedActionBarProps {
|
|
5
|
+
title?: ReactNode;
|
|
6
|
+
description?: ReactNode;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
width?: "compact" | "narrow" | "wide" | "full";
|
|
9
|
+
actionsWidth?: "auto" | "full";
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Persistent bottom context and action for read-only or transactional pages. */
|
|
13
|
+
declare function FixedActionBar({ title, description, children, width, actionsWidth, className, }: FixedActionBarProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
export { FixedActionBar, type FixedActionBarProps };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
Text
|
|
4
|
+
} from "../chunk-EIY5LLSP.js";
|
|
5
|
+
import {
|
|
6
|
+
cn
|
|
7
|
+
} from "../chunk-G6SRSWXB.js";
|
|
8
|
+
|
|
9
|
+
// src/primitives/fixed-action-bar.tsx
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
var widthStyles = {
|
|
12
|
+
compact: "max-w-2xl",
|
|
13
|
+
narrow: "max-w-3xl",
|
|
14
|
+
wide: "max-w-5xl",
|
|
15
|
+
full: "max-w-none"
|
|
16
|
+
};
|
|
17
|
+
function FixedActionBar({
|
|
18
|
+
title,
|
|
19
|
+
description,
|
|
20
|
+
children,
|
|
21
|
+
width = "narrow",
|
|
22
|
+
actionsWidth = "auto",
|
|
23
|
+
className
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ jsx(
|
|
26
|
+
"aside",
|
|
27
|
+
{
|
|
28
|
+
"aria-label": "Page action",
|
|
29
|
+
className: cn(
|
|
30
|
+
"fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/95 backdrop-blur-sm",
|
|
31
|
+
"pb-[env(safe-area-inset-bottom)] supports-backdrop-filter:bg-background/80",
|
|
32
|
+
className
|
|
33
|
+
),
|
|
34
|
+
children: /* @__PURE__ */ jsxs("div", { className: cn("mx-auto flex items-center gap-4 px-4 py-3 md:px-6", title ? "justify-between" : "justify-end", widthStyles[width]), children: [
|
|
35
|
+
title && /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
36
|
+
/* @__PURE__ */ jsx(Text, { className: "truncate font-medium", children: title }),
|
|
37
|
+
description && /* @__PURE__ */ jsx(Text, { variant: "muted", className: "text-sm", children: description })
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ jsx("div", { className: cn("shrink-0", actionsWidth === "full" && "w-full"), children })
|
|
40
|
+
] })
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
FixedActionBar
|
|
46
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkJDEXZGIYcjs = require('../chunk-JDEXZGIY.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
9
|
+
|
|
10
|
+
// src/primitives/floating-action-button.tsx
|
|
11
|
+
var _react = require('react');
|
|
12
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
13
|
+
var FloatingActionButton = _react.forwardRef.call(void 0, function FloatingActionButton2({
|
|
14
|
+
label,
|
|
15
|
+
icon,
|
|
16
|
+
visible = true,
|
|
17
|
+
bottom = "bottom-6",
|
|
18
|
+
side = "right",
|
|
19
|
+
asChild = false,
|
|
20
|
+
children,
|
|
21
|
+
className,
|
|
22
|
+
variant = "default",
|
|
23
|
+
size,
|
|
24
|
+
...rest
|
|
25
|
+
}, ref) {
|
|
26
|
+
const iconOnly = !asChild && label == null;
|
|
27
|
+
const labelNode = !iconOnly && label != null && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: icon ? "ml-1.5" : void 0, children: label });
|
|
28
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
29
|
+
"div",
|
|
30
|
+
{
|
|
31
|
+
"aria-hidden": !visible,
|
|
32
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
33
|
+
"fixed z-40 transition-all duration-300 ease-out motion-reduce:transition-opacity",
|
|
34
|
+
bottom,
|
|
35
|
+
side === "right" && "right-6 md:right-8",
|
|
36
|
+
side === "left" && "left-6 md:left-8",
|
|
37
|
+
side === "center" && "left-1/2 -translate-x-1/2",
|
|
38
|
+
visible ? "opacity-100 translate-y-0 pointer-events-auto" : "opacity-0 translate-y-3 pointer-events-none"
|
|
39
|
+
),
|
|
40
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
41
|
+
_chunkJDEXZGIYcjs.Button,
|
|
42
|
+
{
|
|
43
|
+
ref,
|
|
44
|
+
asChild,
|
|
45
|
+
variant,
|
|
46
|
+
size: _nullishCoalesce(size, () => ( (iconOnly ? "icon" : "default"))),
|
|
47
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
48
|
+
"shadow-lg",
|
|
49
|
+
iconOnly ? "rounded-full h-14 w-14" : "rounded-full px-5 h-12",
|
|
50
|
+
className
|
|
51
|
+
),
|
|
52
|
+
tabIndex: visible ? void 0 : -1,
|
|
53
|
+
...rest,
|
|
54
|
+
children: asChild ? children : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
55
|
+
icon,
|
|
56
|
+
labelNode
|
|
57
|
+
] })
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
exports.FloatingActionButton = FloatingActionButton;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { ButtonProps } from './button.cjs';
|
|
4
|
+
import 'class-variance-authority/types';
|
|
5
|
+
import 'class-variance-authority';
|
|
6
|
+
|
|
7
|
+
interface FloatingActionButtonProps extends Omit<ButtonProps, "children"> {
|
|
8
|
+
/** Text label shown next to the icon. Pass null for icon-only. */
|
|
9
|
+
label?: ReactNode;
|
|
10
|
+
/** Leading icon (lucide-react element, normally). */
|
|
11
|
+
icon?: ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* When false, the FAB is hidden — slides out + fades out. Typically
|
|
14
|
+
* wired to the `past` boolean from `useScrollPast`. Defaults to true
|
|
15
|
+
* (always visible) so the primitive also works as a standalone FAB.
|
|
16
|
+
*/
|
|
17
|
+
visible?: boolean;
|
|
18
|
+
/** Bottom inset (Tailwind utility). Defaults to "bottom-6". */
|
|
19
|
+
bottom?: string;
|
|
20
|
+
/** Horizontal anchor. Defaults to "right". */
|
|
21
|
+
side?: "right" | "left" | "center";
|
|
22
|
+
/**
|
|
23
|
+
* When true, the FAB renders its single child as the trigger element
|
|
24
|
+
* (Radix Slot via Button). Use for next/link integrations.
|
|
25
|
+
*
|
|
26
|
+
* <FloatingActionButton asChild icon={<Plus />} label="New">
|
|
27
|
+
* <Link href="/new" />
|
|
28
|
+
* </FloatingActionButton>
|
|
29
|
+
*/
|
|
30
|
+
asChild?: boolean;
|
|
31
|
+
/** Children only used when asChild=true — should be a single element. */
|
|
32
|
+
children?: ReactNode;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Floating action button that lands in the corner with a soft rise +
|
|
36
|
+
* fade once `visible` flips true. Pair with `useScrollPast` to reveal
|
|
37
|
+
* once the page's primary CTA scrolls off-screen.
|
|
38
|
+
*
|
|
39
|
+
* Design notes:
|
|
40
|
+
* - z-40 sits above the page chrome but below modals/sheets (z-50)
|
|
41
|
+
* - rounded-full pill shape with shadow-lg for elevation cue
|
|
42
|
+
* - `pointer-events-none` while hidden so it never blocks underlying
|
|
43
|
+
* content during the fade-out
|
|
44
|
+
* - motion-reduce: skips the rise transition (still fades)
|
|
45
|
+
*
|
|
46
|
+
* For scroll containers that aren't the document, render this inside
|
|
47
|
+
* a positioned ancestor — the `fixed` positioning falls back to
|
|
48
|
+
* relative-to-nearest-transformed-ancestor in those cases.
|
|
49
|
+
*/
|
|
50
|
+
declare const FloatingActionButton: React.ForwardRefExoticComponent<FloatingActionButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
51
|
+
|
|
52
|
+
export { FloatingActionButton, type FloatingActionButtonProps };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { ButtonProps } from './button.js';
|
|
4
|
+
import 'class-variance-authority/types';
|
|
5
|
+
import 'class-variance-authority';
|
|
6
|
+
|
|
7
|
+
interface FloatingActionButtonProps extends Omit<ButtonProps, "children"> {
|
|
8
|
+
/** Text label shown next to the icon. Pass null for icon-only. */
|
|
9
|
+
label?: ReactNode;
|
|
10
|
+
/** Leading icon (lucide-react element, normally). */
|
|
11
|
+
icon?: ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* When false, the FAB is hidden — slides out + fades out. Typically
|
|
14
|
+
* wired to the `past` boolean from `useScrollPast`. Defaults to true
|
|
15
|
+
* (always visible) so the primitive also works as a standalone FAB.
|
|
16
|
+
*/
|
|
17
|
+
visible?: boolean;
|
|
18
|
+
/** Bottom inset (Tailwind utility). Defaults to "bottom-6". */
|
|
19
|
+
bottom?: string;
|
|
20
|
+
/** Horizontal anchor. Defaults to "right". */
|
|
21
|
+
side?: "right" | "left" | "center";
|
|
22
|
+
/**
|
|
23
|
+
* When true, the FAB renders its single child as the trigger element
|
|
24
|
+
* (Radix Slot via Button). Use for next/link integrations.
|
|
25
|
+
*
|
|
26
|
+
* <FloatingActionButton asChild icon={<Plus />} label="New">
|
|
27
|
+
* <Link href="/new" />
|
|
28
|
+
* </FloatingActionButton>
|
|
29
|
+
*/
|
|
30
|
+
asChild?: boolean;
|
|
31
|
+
/** Children only used when asChild=true — should be a single element. */
|
|
32
|
+
children?: ReactNode;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Floating action button that lands in the corner with a soft rise +
|
|
36
|
+
* fade once `visible` flips true. Pair with `useScrollPast` to reveal
|
|
37
|
+
* once the page's primary CTA scrolls off-screen.
|
|
38
|
+
*
|
|
39
|
+
* Design notes:
|
|
40
|
+
* - z-40 sits above the page chrome but below modals/sheets (z-50)
|
|
41
|
+
* - rounded-full pill shape with shadow-lg for elevation cue
|
|
42
|
+
* - `pointer-events-none` while hidden so it never blocks underlying
|
|
43
|
+
* content during the fade-out
|
|
44
|
+
* - motion-reduce: skips the rise transition (still fades)
|
|
45
|
+
*
|
|
46
|
+
* For scroll containers that aren't the document, render this inside
|
|
47
|
+
* a positioned ancestor — the `fixed` positioning falls back to
|
|
48
|
+
* relative-to-nearest-transformed-ancestor in those cases.
|
|
49
|
+
*/
|
|
50
|
+
declare const FloatingActionButton: React.ForwardRefExoticComponent<FloatingActionButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
51
|
+
|
|
52
|
+
export { FloatingActionButton, type FloatingActionButtonProps };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import {
|
|
4
|
+
Button
|
|
5
|
+
} from "../chunk-W326GKML.js";
|
|
6
|
+
import {
|
|
7
|
+
cn
|
|
8
|
+
} from "../chunk-G6SRSWXB.js";
|
|
9
|
+
|
|
10
|
+
// src/primitives/floating-action-button.tsx
|
|
11
|
+
import { forwardRef } from "react";
|
|
12
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
var FloatingActionButton = forwardRef(function FloatingActionButton2({
|
|
14
|
+
label,
|
|
15
|
+
icon,
|
|
16
|
+
visible = true,
|
|
17
|
+
bottom = "bottom-6",
|
|
18
|
+
side = "right",
|
|
19
|
+
asChild = false,
|
|
20
|
+
children,
|
|
21
|
+
className,
|
|
22
|
+
variant = "default",
|
|
23
|
+
size,
|
|
24
|
+
...rest
|
|
25
|
+
}, ref) {
|
|
26
|
+
const iconOnly = !asChild && label == null;
|
|
27
|
+
const labelNode = !iconOnly && label != null && /* @__PURE__ */ jsx("span", { className: icon ? "ml-1.5" : void 0, children: label });
|
|
28
|
+
return /* @__PURE__ */ jsx(
|
|
29
|
+
"div",
|
|
30
|
+
{
|
|
31
|
+
"aria-hidden": !visible,
|
|
32
|
+
className: cn(
|
|
33
|
+
"fixed z-40 transition-all duration-300 ease-out motion-reduce:transition-opacity",
|
|
34
|
+
bottom,
|
|
35
|
+
side === "right" && "right-6 md:right-8",
|
|
36
|
+
side === "left" && "left-6 md:left-8",
|
|
37
|
+
side === "center" && "left-1/2 -translate-x-1/2",
|
|
38
|
+
visible ? "opacity-100 translate-y-0 pointer-events-auto" : "opacity-0 translate-y-3 pointer-events-none"
|
|
39
|
+
),
|
|
40
|
+
children: /* @__PURE__ */ jsx(
|
|
41
|
+
Button,
|
|
42
|
+
{
|
|
43
|
+
ref,
|
|
44
|
+
asChild,
|
|
45
|
+
variant,
|
|
46
|
+
size: size ?? (iconOnly ? "icon" : "default"),
|
|
47
|
+
className: cn(
|
|
48
|
+
"shadow-lg",
|
|
49
|
+
iconOnly ? "rounded-full h-14 w-14" : "rounded-full px-5 h-12",
|
|
50
|
+
className
|
|
51
|
+
),
|
|
52
|
+
tabIndex: visible ? void 0 : -1,
|
|
53
|
+
...rest,
|
|
54
|
+
children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
|
+
icon,
|
|
56
|
+
labelNode
|
|
57
|
+
] })
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
export {
|
|
64
|
+
FloatingActionButton
|
|
65
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/form-section.tsx
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
9
|
+
function FormSection({
|
|
10
|
+
label,
|
|
11
|
+
meta,
|
|
12
|
+
children,
|
|
13
|
+
className
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "space-y-3", className), children: [
|
|
16
|
+
(label || meta) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-baseline justify-between gap-2", children: [
|
|
17
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "font-mono text-[0.65rem] uppercase tracking-[0.18em] text-muted-foreground", children: label }),
|
|
18
|
+
meta && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground", children: meta })
|
|
19
|
+
] }),
|
|
20
|
+
children
|
|
21
|
+
] });
|
|
22
|
+
}
|
|
23
|
+
function FormSectionList({ children, className }) {
|
|
24
|
+
const items = _react.Children.toArray(children).filter(Boolean);
|
|
25
|
+
if (items.length === 0) return null;
|
|
26
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "space-y-6", className), children: items.map((child, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
27
|
+
"div",
|
|
28
|
+
{
|
|
29
|
+
className: i === 0 ? void 0 : "border-t border-border pt-6",
|
|
30
|
+
children: child
|
|
31
|
+
},
|
|
32
|
+
i
|
|
33
|
+
)) });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
exports.FormSection = FormSection; exports.FormSectionList = FormSectionList;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface FormSectionProps {
|
|
5
|
+
/**
|
|
6
|
+
* Mono uppercase tracking-wide label. Distinct from
|
|
7
|
+
* <SettingsSection>'s larger h2 heading — FormSection is sized for
|
|
8
|
+
* sub-areas inside a single pane (composer right-rail, sidebar form,
|
|
9
|
+
* multi-area editor) where the label reads as a field-group caption
|
|
10
|
+
* rather than a page heading.
|
|
11
|
+
*/
|
|
12
|
+
label: ReactNode;
|
|
13
|
+
/**
|
|
14
|
+
* Right-aligned meta slot, baseline-aligned with the label. Use for
|
|
15
|
+
* small status hints: counts ("4 rules"), pending text ("Saving…"),
|
|
16
|
+
* a reset link. Heavier controls belong inside `children`.
|
|
17
|
+
*/
|
|
18
|
+
meta?: ReactNode;
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Labelled section primitive for form panes. Compose inside a
|
|
24
|
+
* <FormSectionList> to get horizontal dividers + consistent vertical
|
|
25
|
+
* rhythm between adjacent sections.
|
|
26
|
+
*/
|
|
27
|
+
declare function FormSection({ label, meta, children, className, }: FormSectionProps): react_jsx_runtime.JSX.Element;
|
|
28
|
+
interface FormSectionListProps {
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Vertical stack of <FormSection>s with a light horizontal divider
|
|
34
|
+
* between adjacent items — same structural cue as a settings page,
|
|
35
|
+
* scaled for the compact form-pane label style.
|
|
36
|
+
*
|
|
37
|
+
* Filters out null/false children, so conditional sections
|
|
38
|
+
* (`{condition && <FormSection .../>}`) don't produce empty divider
|
|
39
|
+
* rows.
|
|
40
|
+
*/
|
|
41
|
+
declare function FormSectionList({ children, className }: FormSectionListProps): react_jsx_runtime.JSX.Element | null;
|
|
42
|
+
|
|
43
|
+
export { FormSection, FormSectionList, type FormSectionListProps, type FormSectionProps };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface FormSectionProps {
|
|
5
|
+
/**
|
|
6
|
+
* Mono uppercase tracking-wide label. Distinct from
|
|
7
|
+
* <SettingsSection>'s larger h2 heading — FormSection is sized for
|
|
8
|
+
* sub-areas inside a single pane (composer right-rail, sidebar form,
|
|
9
|
+
* multi-area editor) where the label reads as a field-group caption
|
|
10
|
+
* rather than a page heading.
|
|
11
|
+
*/
|
|
12
|
+
label: ReactNode;
|
|
13
|
+
/**
|
|
14
|
+
* Right-aligned meta slot, baseline-aligned with the label. Use for
|
|
15
|
+
* small status hints: counts ("4 rules"), pending text ("Saving…"),
|
|
16
|
+
* a reset link. Heavier controls belong inside `children`.
|
|
17
|
+
*/
|
|
18
|
+
meta?: ReactNode;
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Labelled section primitive for form panes. Compose inside a
|
|
24
|
+
* <FormSectionList> to get horizontal dividers + consistent vertical
|
|
25
|
+
* rhythm between adjacent sections.
|
|
26
|
+
*/
|
|
27
|
+
declare function FormSection({ label, meta, children, className, }: FormSectionProps): react_jsx_runtime.JSX.Element;
|
|
28
|
+
interface FormSectionListProps {
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Vertical stack of <FormSection>s with a light horizontal divider
|
|
34
|
+
* between adjacent items — same structural cue as a settings page,
|
|
35
|
+
* scaled for the compact form-pane label style.
|
|
36
|
+
*
|
|
37
|
+
* Filters out null/false children, so conditional sections
|
|
38
|
+
* (`{condition && <FormSection .../>}`) don't produce empty divider
|
|
39
|
+
* rows.
|
|
40
|
+
*/
|
|
41
|
+
declare function FormSectionList({ children, className }: FormSectionListProps): react_jsx_runtime.JSX.Element | null;
|
|
42
|
+
|
|
43
|
+
export { FormSection, FormSectionList, type FormSectionListProps, type FormSectionProps };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "../chunk-G6SRSWXB.js";
|
|
5
|
+
|
|
6
|
+
// src/primitives/form-section.tsx
|
|
7
|
+
import { Children } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
function FormSection({
|
|
10
|
+
label,
|
|
11
|
+
meta,
|
|
12
|
+
children,
|
|
13
|
+
className
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ jsxs("section", { className: cn("space-y-3", className), children: [
|
|
16
|
+
(label || meta) && /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
|
|
17
|
+
/* @__PURE__ */ jsx("h2", { className: "font-mono text-[0.65rem] uppercase tracking-[0.18em] text-muted-foreground", children: label }),
|
|
18
|
+
meta && /* @__PURE__ */ jsx("div", { className: "font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground", children: meta })
|
|
19
|
+
] }),
|
|
20
|
+
children
|
|
21
|
+
] });
|
|
22
|
+
}
|
|
23
|
+
function FormSectionList({ children, className }) {
|
|
24
|
+
const items = Children.toArray(children).filter(Boolean);
|
|
25
|
+
if (items.length === 0) return null;
|
|
26
|
+
return /* @__PURE__ */ jsx("div", { className: cn("space-y-6", className), children: items.map((child, i) => /* @__PURE__ */ jsx(
|
|
27
|
+
"div",
|
|
28
|
+
{
|
|
29
|
+
className: i === 0 ? void 0 : "border-t border-border pt-6",
|
|
30
|
+
children: child
|
|
31
|
+
},
|
|
32
|
+
i
|
|
33
|
+
)) });
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
FormSection,
|
|
37
|
+
FormSectionList
|
|
38
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/key-value-grid.tsx
|
|
7
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
8
|
+
function KeyValueGrid({
|
|
9
|
+
items,
|
|
10
|
+
columns = 2,
|
|
11
|
+
size = "xs",
|
|
12
|
+
className
|
|
13
|
+
}) {
|
|
14
|
+
const colsClass = columns === 3 ? "grid-cols-3" : "grid-cols-2";
|
|
15
|
+
const textClass = size === "xs" ? "text-xs" : "text-sm";
|
|
16
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
17
|
+
"dl",
|
|
18
|
+
{
|
|
19
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
20
|
+
"grid gap-x-3 gap-y-0.5",
|
|
21
|
+
colsClass,
|
|
22
|
+
textClass,
|
|
23
|
+
className
|
|
24
|
+
),
|
|
25
|
+
children: items.map((item, i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "contents", children: [
|
|
26
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
27
|
+
"dt",
|
|
28
|
+
{
|
|
29
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
30
|
+
"text-muted-foreground",
|
|
31
|
+
item.emphasis && "font-medium text-foreground"
|
|
32
|
+
),
|
|
33
|
+
children: item.label
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
37
|
+
"dd",
|
|
38
|
+
{
|
|
39
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
40
|
+
"text-right tabular-nums",
|
|
41
|
+
item.emphasis && "font-medium"
|
|
42
|
+
),
|
|
43
|
+
children: item.value
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
] }, i))
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
exports.KeyValueGrid = KeyValueGrid;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface KeyValueGridItem {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
value: ReactNode;
|
|
7
|
+
/** Render with `font-medium` for a totals/summary row. */
|
|
8
|
+
emphasis?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface KeyValueGridProps {
|
|
11
|
+
items: KeyValueGridItem[];
|
|
12
|
+
/** Number of columns. Defaults to 2. */
|
|
13
|
+
columns?: 2 | 3;
|
|
14
|
+
/** Visual size. `xs` matches dense popovers; `sm` matches cards. */
|
|
15
|
+
size?: "xs" | "sm";
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
declare function KeyValueGrid({ items, columns, size, className, }: KeyValueGridProps): react_jsx_runtime.JSX.Element;
|
|
19
|
+
|
|
20
|
+
export { KeyValueGrid, type KeyValueGridItem, type KeyValueGridProps };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface KeyValueGridItem {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
value: ReactNode;
|
|
7
|
+
/** Render with `font-medium` for a totals/summary row. */
|
|
8
|
+
emphasis?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface KeyValueGridProps {
|
|
11
|
+
items: KeyValueGridItem[];
|
|
12
|
+
/** Number of columns. Defaults to 2. */
|
|
13
|
+
columns?: 2 | 3;
|
|
14
|
+
/** Visual size. `xs` matches dense popovers; `sm` matches cards. */
|
|
15
|
+
size?: "xs" | "sm";
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
declare function KeyValueGrid({ items, columns, size, className, }: KeyValueGridProps): react_jsx_runtime.JSX.Element;
|
|
19
|
+
|
|
20
|
+
export { KeyValueGrid, type KeyValueGridItem, type KeyValueGridProps };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "../chunk-G6SRSWXB.js";
|
|
5
|
+
|
|
6
|
+
// src/primitives/key-value-grid.tsx
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
function KeyValueGrid({
|
|
9
|
+
items,
|
|
10
|
+
columns = 2,
|
|
11
|
+
size = "xs",
|
|
12
|
+
className
|
|
13
|
+
}) {
|
|
14
|
+
const colsClass = columns === 3 ? "grid-cols-3" : "grid-cols-2";
|
|
15
|
+
const textClass = size === "xs" ? "text-xs" : "text-sm";
|
|
16
|
+
return /* @__PURE__ */ jsx(
|
|
17
|
+
"dl",
|
|
18
|
+
{
|
|
19
|
+
className: cn(
|
|
20
|
+
"grid gap-x-3 gap-y-0.5",
|
|
21
|
+
colsClass,
|
|
22
|
+
textClass,
|
|
23
|
+
className
|
|
24
|
+
),
|
|
25
|
+
children: items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "contents", children: [
|
|
26
|
+
/* @__PURE__ */ jsx(
|
|
27
|
+
"dt",
|
|
28
|
+
{
|
|
29
|
+
className: cn(
|
|
30
|
+
"text-muted-foreground",
|
|
31
|
+
item.emphasis && "font-medium text-foreground"
|
|
32
|
+
),
|
|
33
|
+
children: item.label
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
"dd",
|
|
38
|
+
{
|
|
39
|
+
className: cn(
|
|
40
|
+
"text-right tabular-nums",
|
|
41
|
+
item.emphasis && "font-medium"
|
|
42
|
+
),
|
|
43
|
+
children: item.value
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
] }, i))
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
KeyValueGrid
|
|
52
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/marketing-footer.tsx
|
|
7
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
8
|
+
function MarketingFooter({
|
|
9
|
+
brand,
|
|
10
|
+
links = [],
|
|
11
|
+
meta,
|
|
12
|
+
renderLink,
|
|
13
|
+
className
|
|
14
|
+
}) {
|
|
15
|
+
const cls = "transition-colors hover:text-foreground";
|
|
16
|
+
const link = (l) => {
|
|
17
|
+
if (renderLink)
|
|
18
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: renderLink({ href: l.href, children: l.label, className: cls }) }, l.href);
|
|
19
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "a", { href: l.href, className: cls, children: l.label }, l.href);
|
|
20
|
+
};
|
|
21
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "footer", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "border-t border-border", className), children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mx-auto flex w-full max-w-5xl flex-wrap items-center justify-between gap-4 px-4 py-6 md:px-6", children: [
|
|
22
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center", children: brand }),
|
|
23
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-4 font-mono text-xs text-muted-foreground", children: [
|
|
24
|
+
links.map(link),
|
|
25
|
+
meta && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
26
|
+
links.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground/40", children: "\xB7" }),
|
|
27
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: meta })
|
|
28
|
+
] })
|
|
29
|
+
] })
|
|
30
|
+
] }) });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
exports.MarketingFooter = MarketingFooter;
|