@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
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
13
|
-
require('../chunk-WDXEJDMO.cjs');
|
|
12
|
+
var _chunkBTHYGHOHcjs = require('../chunk-BTHYGHOH.cjs');
|
|
14
13
|
require('../chunk-2BHI5ZWJ.cjs');
|
|
14
|
+
require('../chunk-WDXEJDMO.cjs');
|
|
15
15
|
require('../chunk-KWLSBTB2.cjs');
|
|
16
16
|
|
|
17
17
|
|
|
@@ -23,4 +23,4 @@ require('../chunk-KWLSBTB2.cjs');
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
exports.ResponsiveDialog =
|
|
26
|
+
exports.ResponsiveDialog = _chunkBTHYGHOHcjs.ResponsiveDialog; exports.ResponsiveDialogBody = _chunkBTHYGHOHcjs.ResponsiveDialogBody; exports.ResponsiveDialogClose = _chunkBTHYGHOHcjs.ResponsiveDialogClose; exports.ResponsiveDialogContent = _chunkBTHYGHOHcjs.ResponsiveDialogContent; exports.ResponsiveDialogDescription = _chunkBTHYGHOHcjs.ResponsiveDialogDescription; exports.ResponsiveDialogFooter = _chunkBTHYGHOHcjs.ResponsiveDialogFooter; exports.ResponsiveDialogHeader = _chunkBTHYGHOHcjs.ResponsiveDialogHeader; exports.ResponsiveDialogTitle = _chunkBTHYGHOHcjs.ResponsiveDialogTitle; exports.ResponsiveDialogTrigger = _chunkBTHYGHOHcjs.ResponsiveDialogTrigger;
|
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
ResponsiveDialogHeader,
|
|
10
10
|
ResponsiveDialogTitle,
|
|
11
11
|
ResponsiveDialogTrigger
|
|
12
|
-
} from "../chunk-
|
|
13
|
-
import "../chunk-3QT5VYZ3.js";
|
|
12
|
+
} from "../chunk-JTI4244T.js";
|
|
14
13
|
import "../chunk-4HWCNRK4.js";
|
|
14
|
+
import "../chunk-3QT5VYZ3.js";
|
|
15
15
|
import "../chunk-G6SRSWXB.js";
|
|
16
16
|
export {
|
|
17
17
|
ResponsiveDialog,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/responsive-embed.tsx
|
|
7
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
8
|
+
function ResponsiveEmbed({
|
|
9
|
+
src,
|
|
10
|
+
title,
|
|
11
|
+
allow,
|
|
12
|
+
allowFullScreen = true,
|
|
13
|
+
marginTop = "none",
|
|
14
|
+
className
|
|
15
|
+
}) {
|
|
16
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "aspect-video overflow-hidden rounded-lg border border-border bg-muted", marginTop === "md" && "mt-4", className), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
17
|
+
"iframe",
|
|
18
|
+
{
|
|
19
|
+
src,
|
|
20
|
+
title,
|
|
21
|
+
allow,
|
|
22
|
+
allowFullScreen,
|
|
23
|
+
className: "h-full w-full border-0"
|
|
24
|
+
}
|
|
25
|
+
) });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
exports.ResponsiveEmbed = ResponsiveEmbed;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ResponsiveEmbedProps {
|
|
4
|
+
src: string;
|
|
5
|
+
title: string;
|
|
6
|
+
allow?: string;
|
|
7
|
+
allowFullScreen?: boolean;
|
|
8
|
+
className?: string;
|
|
9
|
+
marginTop?: "none" | "md";
|
|
10
|
+
}
|
|
11
|
+
/** Generic 16:9 iframe container for trusted external media embeds. */
|
|
12
|
+
declare function ResponsiveEmbed({ src, title, allow, allowFullScreen, marginTop, className, }: ResponsiveEmbedProps): react_jsx_runtime.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { ResponsiveEmbed, type ResponsiveEmbedProps };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ResponsiveEmbedProps {
|
|
4
|
+
src: string;
|
|
5
|
+
title: string;
|
|
6
|
+
allow?: string;
|
|
7
|
+
allowFullScreen?: boolean;
|
|
8
|
+
className?: string;
|
|
9
|
+
marginTop?: "none" | "md";
|
|
10
|
+
}
|
|
11
|
+
/** Generic 16:9 iframe container for trusted external media embeds. */
|
|
12
|
+
declare function ResponsiveEmbed({ src, title, allow, allowFullScreen, marginTop, className, }: ResponsiveEmbedProps): react_jsx_runtime.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { ResponsiveEmbed, type ResponsiveEmbedProps };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "../chunk-G6SRSWXB.js";
|
|
5
|
+
|
|
6
|
+
// src/primitives/responsive-embed.tsx
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
function ResponsiveEmbed({
|
|
9
|
+
src,
|
|
10
|
+
title,
|
|
11
|
+
allow,
|
|
12
|
+
allowFullScreen = true,
|
|
13
|
+
marginTop = "none",
|
|
14
|
+
className
|
|
15
|
+
}) {
|
|
16
|
+
return /* @__PURE__ */ jsx("div", { className: cn("aspect-video overflow-hidden rounded-lg border border-border bg-muted", marginTop === "md" && "mt-4", className), children: /* @__PURE__ */ jsx(
|
|
17
|
+
"iframe",
|
|
18
|
+
{
|
|
19
|
+
src,
|
|
20
|
+
title,
|
|
21
|
+
allow,
|
|
22
|
+
allowFullScreen,
|
|
23
|
+
className: "h-full w-full border-0"
|
|
24
|
+
}
|
|
25
|
+
) });
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
ResponsiveEmbed
|
|
29
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
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/save-bar.tsx
|
|
11
|
+
var _react = require('react');
|
|
12
|
+
var _reactdom = require('react-dom');
|
|
13
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
14
|
+
function SaveBar({
|
|
15
|
+
isDirty,
|
|
16
|
+
saving = false,
|
|
17
|
+
onSave,
|
|
18
|
+
onDiscard,
|
|
19
|
+
saveLabel = "Save changes",
|
|
20
|
+
savingLabel = "Saving\u2026",
|
|
21
|
+
discardLabel = "Discard",
|
|
22
|
+
status,
|
|
23
|
+
containerClassName,
|
|
24
|
+
className,
|
|
25
|
+
width = "wide"
|
|
26
|
+
}) {
|
|
27
|
+
const [mounted, setMounted] = _react.useState.call(void 0, false);
|
|
28
|
+
_react.useEffect.call(void 0, () => setMounted(true), []);
|
|
29
|
+
if (!mounted) return null;
|
|
30
|
+
const bar = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
31
|
+
"div",
|
|
32
|
+
{
|
|
33
|
+
role: "region",
|
|
34
|
+
"aria-label": "Save changes",
|
|
35
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
36
|
+
"fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/95 backdrop-blur-sm",
|
|
37
|
+
// Lift above iOS home indicator / Safari URL bar
|
|
38
|
+
"pb-[env(safe-area-inset-bottom)]",
|
|
39
|
+
className
|
|
40
|
+
),
|
|
41
|
+
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
45
|
+
"mx-auto px-4 md:px-6 py-3 flex items-center justify-between gap-3",
|
|
46
|
+
_nullishCoalesce(containerClassName, () => ( (width === "narrow" ? "max-w-3xl" : "max-w-5xl")))
|
|
47
|
+
),
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
50
|
+
"span",
|
|
51
|
+
{
|
|
52
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
53
|
+
"text-sm truncate transition-colors",
|
|
54
|
+
isDirty ? "text-foreground" : "text-muted-foreground"
|
|
55
|
+
),
|
|
56
|
+
children: _nullishCoalesce(status, () => ( (isDirty ? "Unsaved changes" : "All changes saved")))
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
60
|
+
onDiscard && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
61
|
+
_chunkJDEXZGIYcjs.Button,
|
|
62
|
+
{
|
|
63
|
+
type: "button",
|
|
64
|
+
variant: "ghost",
|
|
65
|
+
size: "sm",
|
|
66
|
+
onClick: onDiscard,
|
|
67
|
+
disabled: saving || !isDirty,
|
|
68
|
+
children: discardLabel
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
72
|
+
_chunkJDEXZGIYcjs.Button,
|
|
73
|
+
{
|
|
74
|
+
type: "button",
|
|
75
|
+
size: "sm",
|
|
76
|
+
onClick: onSave,
|
|
77
|
+
disabled: saving || !isDirty,
|
|
78
|
+
children: saving ? savingLabel : saveLabel
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
] })
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
return _reactdom.createPortal.call(void 0, bar, document.body);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
exports.SaveBar = SaveBar;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SaveBarProps {
|
|
5
|
+
/**
|
|
6
|
+
* Whether the form has unsaved changes. Controls the bar's active
|
|
7
|
+
* vs muted visual state and the enabled state of Save / Discard.
|
|
8
|
+
*/
|
|
9
|
+
isDirty: boolean;
|
|
10
|
+
/** Whether a save is in flight. Disables both buttons. */
|
|
11
|
+
saving?: boolean;
|
|
12
|
+
/** Primary action — wired to your save handler. */
|
|
13
|
+
onSave: () => void;
|
|
14
|
+
/**
|
|
15
|
+
* Optional discard handler. When provided, renders a ghost "Discard"
|
|
16
|
+
* button alongside the save. Typically resets controlled state back to
|
|
17
|
+
* the initial server-supplied values.
|
|
18
|
+
*/
|
|
19
|
+
onDiscard?: () => void;
|
|
20
|
+
saveLabel?: ReactNode;
|
|
21
|
+
/** Label shown while `saving` is true. Defaults to "Saving…". */
|
|
22
|
+
savingLabel?: ReactNode;
|
|
23
|
+
discardLabel?: ReactNode;
|
|
24
|
+
/**
|
|
25
|
+
* Status caption shown on the left. Defaults to "Unsaved changes"
|
|
26
|
+
* (when dirty) or "All changes saved" (when clean). Override for
|
|
27
|
+
* app-specific copy.
|
|
28
|
+
*/
|
|
29
|
+
status?: ReactNode;
|
|
30
|
+
/** Outer container max-width class. Defaults to `max-w-5xl`. */
|
|
31
|
+
containerClassName?: string;
|
|
32
|
+
className?: string;
|
|
33
|
+
width?: "narrow" | "wide";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Sticky bottom action bar for editable form pages. ALWAYS visible on
|
|
37
|
+
* settings/form pages — a muted "All changes saved" state when clean,
|
|
38
|
+
* an active "Unsaved changes" state when dirty. One bar per page —
|
|
39
|
+
* fragmenting saves between sections forces users to think about
|
|
40
|
+
* partial commits.
|
|
41
|
+
*
|
|
42
|
+
* Why always-visible: users need to know a page is editable without
|
|
43
|
+
* having to type something first to discover the save affordance.
|
|
44
|
+
*
|
|
45
|
+
* For read-only pages (e.g. an API token display + rotate button), do
|
|
46
|
+
* NOT use this — use inline action buttons next to their context.
|
|
47
|
+
*
|
|
48
|
+
* The component is positioned `fixed inset-x-0 bottom-0` with safe-area
|
|
49
|
+
* padding for iOS home indicator / browser chrome. Add `pb-28` (or
|
|
50
|
+
* similar) to the page content so the bar doesn't cover the last
|
|
51
|
+
* section.
|
|
52
|
+
*/
|
|
53
|
+
declare function SaveBar({ isDirty, saving, onSave, onDiscard, saveLabel, savingLabel, discardLabel, status, containerClassName, className, width, }: SaveBarProps): React.ReactPortal | null;
|
|
54
|
+
|
|
55
|
+
export { SaveBar, type SaveBarProps };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SaveBarProps {
|
|
5
|
+
/**
|
|
6
|
+
* Whether the form has unsaved changes. Controls the bar's active
|
|
7
|
+
* vs muted visual state and the enabled state of Save / Discard.
|
|
8
|
+
*/
|
|
9
|
+
isDirty: boolean;
|
|
10
|
+
/** Whether a save is in flight. Disables both buttons. */
|
|
11
|
+
saving?: boolean;
|
|
12
|
+
/** Primary action — wired to your save handler. */
|
|
13
|
+
onSave: () => void;
|
|
14
|
+
/**
|
|
15
|
+
* Optional discard handler. When provided, renders a ghost "Discard"
|
|
16
|
+
* button alongside the save. Typically resets controlled state back to
|
|
17
|
+
* the initial server-supplied values.
|
|
18
|
+
*/
|
|
19
|
+
onDiscard?: () => void;
|
|
20
|
+
saveLabel?: ReactNode;
|
|
21
|
+
/** Label shown while `saving` is true. Defaults to "Saving…". */
|
|
22
|
+
savingLabel?: ReactNode;
|
|
23
|
+
discardLabel?: ReactNode;
|
|
24
|
+
/**
|
|
25
|
+
* Status caption shown on the left. Defaults to "Unsaved changes"
|
|
26
|
+
* (when dirty) or "All changes saved" (when clean). Override for
|
|
27
|
+
* app-specific copy.
|
|
28
|
+
*/
|
|
29
|
+
status?: ReactNode;
|
|
30
|
+
/** Outer container max-width class. Defaults to `max-w-5xl`. */
|
|
31
|
+
containerClassName?: string;
|
|
32
|
+
className?: string;
|
|
33
|
+
width?: "narrow" | "wide";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Sticky bottom action bar for editable form pages. ALWAYS visible on
|
|
37
|
+
* settings/form pages — a muted "All changes saved" state when clean,
|
|
38
|
+
* an active "Unsaved changes" state when dirty. One bar per page —
|
|
39
|
+
* fragmenting saves between sections forces users to think about
|
|
40
|
+
* partial commits.
|
|
41
|
+
*
|
|
42
|
+
* Why always-visible: users need to know a page is editable without
|
|
43
|
+
* having to type something first to discover the save affordance.
|
|
44
|
+
*
|
|
45
|
+
* For read-only pages (e.g. an API token display + rotate button), do
|
|
46
|
+
* NOT use this — use inline action buttons next to their context.
|
|
47
|
+
*
|
|
48
|
+
* The component is positioned `fixed inset-x-0 bottom-0` with safe-area
|
|
49
|
+
* padding for iOS home indicator / browser chrome. Add `pb-28` (or
|
|
50
|
+
* similar) to the page content so the bar doesn't cover the last
|
|
51
|
+
* section.
|
|
52
|
+
*/
|
|
53
|
+
declare function SaveBar({ isDirty, saving, onSave, onDiscard, saveLabel, savingLabel, discardLabel, status, containerClassName, className, width, }: SaveBarProps): React.ReactPortal | null;
|
|
54
|
+
|
|
55
|
+
export { SaveBar, type SaveBarProps };
|
|
@@ -0,0 +1,91 @@
|
|
|
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/save-bar.tsx
|
|
11
|
+
import { useEffect, useState } from "react";
|
|
12
|
+
import { createPortal } from "react-dom";
|
|
13
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
function SaveBar({
|
|
15
|
+
isDirty,
|
|
16
|
+
saving = false,
|
|
17
|
+
onSave,
|
|
18
|
+
onDiscard,
|
|
19
|
+
saveLabel = "Save changes",
|
|
20
|
+
savingLabel = "Saving\u2026",
|
|
21
|
+
discardLabel = "Discard",
|
|
22
|
+
status,
|
|
23
|
+
containerClassName,
|
|
24
|
+
className,
|
|
25
|
+
width = "wide"
|
|
26
|
+
}) {
|
|
27
|
+
const [mounted, setMounted] = useState(false);
|
|
28
|
+
useEffect(() => setMounted(true), []);
|
|
29
|
+
if (!mounted) return null;
|
|
30
|
+
const bar = /* @__PURE__ */ jsx(
|
|
31
|
+
"div",
|
|
32
|
+
{
|
|
33
|
+
role: "region",
|
|
34
|
+
"aria-label": "Save changes",
|
|
35
|
+
className: cn(
|
|
36
|
+
"fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/95 backdrop-blur-sm",
|
|
37
|
+
// Lift above iOS home indicator / Safari URL bar
|
|
38
|
+
"pb-[env(safe-area-inset-bottom)]",
|
|
39
|
+
className
|
|
40
|
+
),
|
|
41
|
+
children: /* @__PURE__ */ jsxs(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
className: cn(
|
|
45
|
+
"mx-auto px-4 md:px-6 py-3 flex items-center justify-between gap-3",
|
|
46
|
+
containerClassName ?? (width === "narrow" ? "max-w-3xl" : "max-w-5xl")
|
|
47
|
+
),
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx(
|
|
50
|
+
"span",
|
|
51
|
+
{
|
|
52
|
+
className: cn(
|
|
53
|
+
"text-sm truncate transition-colors",
|
|
54
|
+
isDirty ? "text-foreground" : "text-muted-foreground"
|
|
55
|
+
),
|
|
56
|
+
children: status ?? (isDirty ? "Unsaved changes" : "All changes saved")
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
60
|
+
onDiscard && /* @__PURE__ */ jsx(
|
|
61
|
+
Button,
|
|
62
|
+
{
|
|
63
|
+
type: "button",
|
|
64
|
+
variant: "ghost",
|
|
65
|
+
size: "sm",
|
|
66
|
+
onClick: onDiscard,
|
|
67
|
+
disabled: saving || !isDirty,
|
|
68
|
+
children: discardLabel
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ jsx(
|
|
72
|
+
Button,
|
|
73
|
+
{
|
|
74
|
+
type: "button",
|
|
75
|
+
size: "sm",
|
|
76
|
+
onClick: onSave,
|
|
77
|
+
disabled: saving || !isDirty,
|
|
78
|
+
children: saving ? savingLabel : saveLabel
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
] })
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
return createPortal(bar, document.body);
|
|
88
|
+
}
|
|
89
|
+
export {
|
|
90
|
+
SaveBar
|
|
91
|
+
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunk373W6VADcjs = require('../chunk-373W6VAD.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkLELBCBDTcjs = require('../chunk-LELBCBDT.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkCXAFTEEPcjs = require('../chunk-CXAFTEEP.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
exports.SettingsList = _chunkCXAFTEEPcjs.SettingsList; exports.SettingsListContext = _chunkCXAFTEEPcjs.SettingsListContext;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
declare const SettingsListContext: React.Context<{
|
|
6
|
+
/**
|
|
7
|
+
* True when the parent `<SettingsList>` contains exactly one section.
|
|
8
|
+
* Sections check this to suppress their own heading — the page's
|
|
9
|
+
* `<PageHeader>` already serves as the heading for a single-section
|
|
10
|
+
* page, and rendering a second one is "nested headers".
|
|
11
|
+
*/
|
|
12
|
+
single: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
interface SettingsListProps {
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Wraps a vertical list of `<SettingsSection>`s.
|
|
20
|
+
*
|
|
21
|
+
* - One section: renders the section's content alone (heading suppressed
|
|
22
|
+
* via context — the `<PageHeader>` already names the page).
|
|
23
|
+
* - Two or more: renders each section with `py-8` breathing room and a
|
|
24
|
+
* `divide-y` horizontal line between them.
|
|
25
|
+
*
|
|
26
|
+
* Use this for EVERY settings/form page, even when there's only one
|
|
27
|
+
* section — the component decides whether to show structure.
|
|
28
|
+
*/
|
|
29
|
+
declare function SettingsList({ children, className }: SettingsListProps): react_jsx_runtime.JSX.Element | null;
|
|
30
|
+
|
|
31
|
+
export { SettingsList, SettingsListContext, type SettingsListProps };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
declare const SettingsListContext: React.Context<{
|
|
6
|
+
/**
|
|
7
|
+
* True when the parent `<SettingsList>` contains exactly one section.
|
|
8
|
+
* Sections check this to suppress their own heading — the page's
|
|
9
|
+
* `<PageHeader>` already serves as the heading for a single-section
|
|
10
|
+
* page, and rendering a second one is "nested headers".
|
|
11
|
+
*/
|
|
12
|
+
single: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
interface SettingsListProps {
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Wraps a vertical list of `<SettingsSection>`s.
|
|
20
|
+
*
|
|
21
|
+
* - One section: renders the section's content alone (heading suppressed
|
|
22
|
+
* via context — the `<PageHeader>` already names the page).
|
|
23
|
+
* - Two or more: renders each section with `py-8` breathing room and a
|
|
24
|
+
* `divide-y` horizontal line between them.
|
|
25
|
+
*
|
|
26
|
+
* Use this for EVERY settings/form page, even when there's only one
|
|
27
|
+
* section — the component decides whether to show structure.
|
|
28
|
+
*/
|
|
29
|
+
declare function SettingsList({ children, className }: SettingsListProps): react_jsx_runtime.JSX.Element | null;
|
|
30
|
+
|
|
31
|
+
export { SettingsList, SettingsListContext, type SettingsListProps };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkCXAFTEEPcjs = require('../chunk-CXAFTEEP.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
|
|
8
|
+
|
|
9
|
+
// src/primitives/settings-section.tsx
|
|
10
|
+
var _react = require('react');
|
|
11
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
12
|
+
function SettingsSection({
|
|
13
|
+
heading,
|
|
14
|
+
description,
|
|
15
|
+
action,
|
|
16
|
+
children,
|
|
17
|
+
className
|
|
18
|
+
}) {
|
|
19
|
+
const { single } = _react.useContext.call(void 0, _chunkCXAFTEEPcjs.SettingsListContext);
|
|
20
|
+
const showHeader = !single && (heading || action || description);
|
|
21
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "space-y-4", className), children: [
|
|
22
|
+
showHeader && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-2", children: [
|
|
23
|
+
(heading || action) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-between gap-4", children: [
|
|
24
|
+
heading && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-lg font-medium tracking-tight min-w-0", children: heading }),
|
|
25
|
+
action && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "shrink-0", children: action })
|
|
26
|
+
] }),
|
|
27
|
+
description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-sm text-muted-foreground", children: description })
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children })
|
|
30
|
+
] });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
exports.SettingsSection = SettingsSection;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SettingsSectionProps {
|
|
5
|
+
/**
|
|
6
|
+
* Section heading. Sentence-case, scannable, h2-level. Rendered to the
|
|
7
|
+
* LEFT of the action slot. Suppressed automatically when this section
|
|
8
|
+
* is the only child of a `<SettingsList>` — the page's `<PageHeader>`
|
|
9
|
+
* already serves that role in that case.
|
|
10
|
+
*/
|
|
11
|
+
heading?: ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* One-line context shown under the heading. Use sparingly — most
|
|
14
|
+
* sections explain themselves through their input labels.
|
|
15
|
+
*/
|
|
16
|
+
description?: ReactNode;
|
|
17
|
+
/**
|
|
18
|
+
* Right-aligned action slot, vertically aligned with the heading.
|
|
19
|
+
* Typically a `<CopyButton>`, link, or small icon button.
|
|
20
|
+
*/
|
|
21
|
+
action?: ReactNode;
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The atom for every settings/form page. ALWAYS this shape:
|
|
27
|
+
*
|
|
28
|
+
* ┌─────────────────────────────────────┐
|
|
29
|
+
* │ heading [action right] │
|
|
30
|
+
* │ description (optional) │
|
|
31
|
+
* └─────────────────────────────────────┘
|
|
32
|
+
* content below
|
|
33
|
+
*
|
|
34
|
+
* Wrap one or more of these in a `<SettingsList>` so dividers, padding,
|
|
35
|
+
* and single-section heading suppression all flow from one place.
|
|
36
|
+
*
|
|
37
|
+
* Pages that have only one concern should still wrap their single
|
|
38
|
+
* section in `<SettingsList>` — the list quietly hides the heading and
|
|
39
|
+
* the PageHeader handles it instead. Keeps the consumer code uniform
|
|
40
|
+
* regardless of how many sections the page ends up with.
|
|
41
|
+
*/
|
|
42
|
+
declare function SettingsSection({ heading, description, action, children, className, }: SettingsSectionProps): react_jsx_runtime.JSX.Element;
|
|
43
|
+
|
|
44
|
+
export { SettingsSection, type SettingsSectionProps };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SettingsSectionProps {
|
|
5
|
+
/**
|
|
6
|
+
* Section heading. Sentence-case, scannable, h2-level. Rendered to the
|
|
7
|
+
* LEFT of the action slot. Suppressed automatically when this section
|
|
8
|
+
* is the only child of a `<SettingsList>` — the page's `<PageHeader>`
|
|
9
|
+
* already serves that role in that case.
|
|
10
|
+
*/
|
|
11
|
+
heading?: ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* One-line context shown under the heading. Use sparingly — most
|
|
14
|
+
* sections explain themselves through their input labels.
|
|
15
|
+
*/
|
|
16
|
+
description?: ReactNode;
|
|
17
|
+
/**
|
|
18
|
+
* Right-aligned action slot, vertically aligned with the heading.
|
|
19
|
+
* Typically a `<CopyButton>`, link, or small icon button.
|
|
20
|
+
*/
|
|
21
|
+
action?: ReactNode;
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The atom for every settings/form page. ALWAYS this shape:
|
|
27
|
+
*
|
|
28
|
+
* ┌─────────────────────────────────────┐
|
|
29
|
+
* │ heading [action right] │
|
|
30
|
+
* │ description (optional) │
|
|
31
|
+
* └─────────────────────────────────────┘
|
|
32
|
+
* content below
|
|
33
|
+
*
|
|
34
|
+
* Wrap one or more of these in a `<SettingsList>` so dividers, padding,
|
|
35
|
+
* and single-section heading suppression all flow from one place.
|
|
36
|
+
*
|
|
37
|
+
* Pages that have only one concern should still wrap their single
|
|
38
|
+
* section in `<SettingsList>` — the list quietly hides the heading and
|
|
39
|
+
* the PageHeader handles it instead. Keeps the consumer code uniform
|
|
40
|
+
* regardless of how many sections the page ends up with.
|
|
41
|
+
*/
|
|
42
|
+
declare function SettingsSection({ heading, description, action, children, className, }: SettingsSectionProps): react_jsx_runtime.JSX.Element;
|
|
43
|
+
|
|
44
|
+
export { SettingsSection, type SettingsSectionProps };
|