@fluid-app/rep-core 0.1.13 → 0.1.15
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/dist/chunk-CKQMccvm.cjs +28 -0
- package/dist/data-sources/DataAwareWidget.cjs +47 -56
- package/dist/data-sources/DataAwareWidget.cjs.map +1 -1
- package/dist/data-sources/DataAwareWidget.d.cts +27 -19
- package/dist/data-sources/DataAwareWidget.d.cts.map +1 -0
- package/dist/data-sources/DataAwareWidget.d.mts +38 -0
- package/dist/data-sources/DataAwareWidget.d.mts.map +1 -0
- package/dist/data-sources/DataAwareWidget.mjs +48 -0
- package/dist/data-sources/DataAwareWidget.mjs.map +1 -0
- package/dist/data-sources/ErrorState.cjs +18 -10
- package/dist/data-sources/ErrorState.cjs.map +1 -1
- package/dist/data-sources/ErrorState.d.cts +5 -3
- package/dist/data-sources/ErrorState.d.cts.map +1 -0
- package/dist/data-sources/ErrorState.d.mts +7 -0
- package/dist/data-sources/ErrorState.d.mts.map +1 -0
- package/dist/data-sources/ErrorState.mjs +18 -0
- package/dist/data-sources/ErrorState.mjs.map +1 -0
- package/dist/data-sources/context.cjs +22 -14
- package/dist/data-sources/context.cjs.map +1 -1
- package/dist/data-sources/context.d.cts +16 -10
- package/dist/data-sources/context.d.cts.map +1 -0
- package/dist/data-sources/context.d.mts +22 -0
- package/dist/data-sources/context.d.mts.map +1 -0
- package/dist/data-sources/context.mjs +21 -0
- package/dist/data-sources/context.mjs.map +1 -0
- package/dist/data-sources/fetchers/api.cjs +63 -10
- package/dist/data-sources/fetchers/api.cjs.map +1 -1
- package/dist/data-sources/fetchers/api.d.cts +4 -2
- package/dist/data-sources/fetchers/api.d.cts.map +1 -0
- package/dist/data-sources/fetchers/api.d.mts +10 -0
- package/dist/data-sources/fetchers/api.d.mts.map +1 -0
- package/dist/data-sources/fetchers/api.mjs +64 -0
- package/dist/data-sources/fetchers/api.mjs.map +1 -0
- package/dist/data-sources/fetchers/custom.cjs +106 -10
- package/dist/data-sources/fetchers/custom.cjs.map +1 -1
- package/dist/data-sources/fetchers/custom.d.cts +4 -2
- package/dist/data-sources/fetchers/custom.d.cts.map +1 -0
- package/dist/data-sources/fetchers/{custom.d.ts → custom.d.mts} +4 -2
- package/dist/data-sources/fetchers/custom.d.mts.map +1 -0
- package/dist/data-sources/fetchers/custom.mjs +107 -0
- package/dist/data-sources/fetchers/custom.mjs.map +1 -0
- package/dist/data-sources/fetchers/static.cjs +159 -14
- package/dist/data-sources/fetchers/static.cjs.map +1 -1
- package/dist/data-sources/fetchers/static.d.cts +12 -10
- package/dist/data-sources/fetchers/static.d.cts.map +1 -0
- package/dist/data-sources/fetchers/{static.d.ts → static.d.mts} +12 -10
- package/dist/data-sources/fetchers/static.d.mts.map +1 -0
- package/dist/data-sources/fetchers/static.mjs +158 -0
- package/dist/data-sources/fetchers/static.mjs.map +1 -0
- package/dist/data-sources/preview-context.cjs +15 -15
- package/dist/data-sources/preview-context.cjs.map +1 -1
- package/dist/data-sources/preview-context.d.cts +10 -6
- package/dist/data-sources/preview-context.d.cts.map +1 -0
- package/dist/data-sources/preview-context.d.mts +15 -0
- package/dist/data-sources/preview-context.d.mts.map +1 -0
- package/dist/data-sources/preview-context.mjs +18 -0
- package/dist/data-sources/preview-context.mjs.map +1 -0
- package/dist/data-sources/registry-context.cjs +51 -24
- package/dist/data-sources/registry-context.cjs.map +1 -1
- package/dist/data-sources/registry-context.d.cts +30 -22
- package/dist/data-sources/registry-context.d.cts.map +1 -0
- package/dist/data-sources/registry-context.d.mts +49 -0
- package/dist/data-sources/registry-context.d.mts.map +1 -0
- package/dist/data-sources/registry-context.mjs +49 -0
- package/dist/data-sources/registry-context.mjs.map +1 -0
- package/dist/data-sources/registry.cjs +29 -18
- package/dist/data-sources/registry.cjs.map +1 -1
- package/dist/data-sources/registry.d.cts +9 -7
- package/dist/data-sources/registry.d.cts.map +1 -0
- package/dist/data-sources/registry.d.mts +19 -0
- package/dist/data-sources/registry.d.mts.map +1 -0
- package/dist/data-sources/registry.mjs +29 -0
- package/dist/data-sources/registry.mjs.map +1 -0
- package/dist/data-sources/transformers.cjs +152 -10
- package/dist/data-sources/transformers.cjs.map +1 -1
- package/dist/data-sources/transformers.d.cts +4 -17
- package/dist/data-sources/transformers.d.cts.map +1 -0
- package/dist/data-sources/transformers.d.mts +10 -0
- package/dist/data-sources/transformers.d.mts.map +1 -0
- package/dist/data-sources/transformers.mjs +153 -0
- package/dist/data-sources/transformers.mjs.map +1 -0
- package/dist/data-sources/types.cjs +0 -4
- package/dist/data-sources/types.d.cts +2 -157
- package/dist/data-sources/types.d.mts +2 -0
- package/dist/data-sources/types.mjs +1 -0
- package/dist/data-sources/use-widget-data.cjs +109 -17
- package/dist/data-sources/use-widget-data.cjs.map +1 -1
- package/dist/data-sources/use-widget-data.d.cts +9 -8
- package/dist/data-sources/use-widget-data.d.cts.map +1 -0
- package/dist/data-sources/use-widget-data.d.mts +17 -0
- package/dist/data-sources/use-widget-data.d.mts.map +1 -0
- package/dist/data-sources/use-widget-data.mjs +109 -0
- package/dist/data-sources/use-widget-data.mjs.map +1 -0
- package/dist/index-Bxe_LIi8.d.cts +287 -0
- package/dist/index-Bxe_LIi8.d.cts.map +1 -0
- package/dist/index-CCAu2n19.d.mts +287 -0
- package/dist/index-CCAu2n19.d.mts.map +1 -0
- package/dist/registries/index.cjs +212 -127
- package/dist/registries/index.cjs.map +1 -1
- package/dist/registries/index.d.cts +146 -149
- package/dist/registries/index.d.cts.map +1 -0
- package/dist/registries/{index.d.ts → index.d.mts} +146 -149
- package/dist/registries/index.d.mts.map +1 -0
- package/dist/registries/index.mjs +229 -0
- package/dist/registries/index.mjs.map +1 -0
- package/dist/shell/AppShellLayout.cjs +47 -12
- package/dist/shell/AppShellLayout.cjs.map +1 -1
- package/dist/shell/AppShellLayout.d.cts +29 -19
- package/dist/shell/AppShellLayout.d.cts.map +1 -0
- package/dist/shell/AppShellLayout.d.mts +40 -0
- package/dist/shell/AppShellLayout.d.mts.map +1 -0
- package/dist/shell/AppShellLayout.mjs +46 -0
- package/dist/{chunk-45BCVWQK.cjs.map → shell/AppShellLayout.mjs.map} +1 -1
- package/dist/shell/ScreenHeader.cjs +44 -0
- package/dist/shell/ScreenHeader.cjs.map +1 -0
- package/dist/shell/ScreenHeader.d.cts +12 -0
- package/dist/shell/ScreenHeader.d.cts.map +1 -0
- package/dist/shell/ScreenHeader.d.mts +12 -0
- package/dist/shell/ScreenHeader.d.mts.map +1 -0
- package/dist/shell/ScreenHeader.mjs +42 -0
- package/dist/shell/ScreenHeader.mjs.map +1 -0
- package/dist/shell/ScreenHeaderContext.cjs +91 -0
- package/dist/shell/ScreenHeaderContext.cjs.map +1 -0
- package/dist/shell/ScreenHeaderContext.d.cts +36 -0
- package/dist/shell/ScreenHeaderContext.d.cts.map +1 -0
- package/dist/shell/ScreenHeaderContext.d.mts +36 -0
- package/dist/shell/ScreenHeaderContext.d.mts.map +1 -0
- package/dist/shell/ScreenHeaderContext.mjs +86 -0
- package/dist/shell/ScreenHeaderContext.mjs.map +1 -0
- package/dist/shell/ThemeModeContext.cjs +68 -18
- package/dist/shell/ThemeModeContext.cjs.map +1 -1
- package/dist/shell/ThemeModeContext.d.cts +23 -16
- package/dist/shell/ThemeModeContext.d.cts.map +1 -0
- package/dist/shell/ThemeModeContext.d.mts +34 -0
- package/dist/shell/ThemeModeContext.d.mts.map +1 -0
- package/dist/shell/ThemeModeContext.mjs +66 -0
- package/dist/shell/ThemeModeContext.mjs.map +1 -0
- package/dist/shell/index.cjs +43 -205
- package/dist/shell/index.d.cts +7 -43
- package/dist/shell/index.d.mts +7 -0
- package/dist/shell/index.mjs +7 -0
- package/dist/shell/sidebar.cjs +372 -87
- package/dist/shell/sidebar.cjs.map +1 -1
- package/dist/shell/sidebar.d.cts +38 -36
- package/dist/shell/sidebar.d.cts.map +1 -0
- package/dist/shell/{sidebar.d.ts → sidebar.d.mts} +38 -36
- package/dist/shell/sidebar.d.mts.map +1 -0
- package/dist/shell/sidebar.mjs +364 -0
- package/dist/{chunk-PFDBULOI.cjs.map → shell/sidebar.mjs.map} +1 -1
- package/dist/shell/use-mobile.cjs +49 -18
- package/dist/shell/use-mobile.cjs.map +1 -1
- package/dist/shell/use-mobile.d.cts +3 -1
- package/dist/shell/use-mobile.d.cts.map +1 -0
- package/dist/shell/{use-mobile.d.ts → use-mobile.d.mts} +3 -1
- package/dist/shell/use-mobile.d.mts.map +1 -0
- package/dist/shell/use-mobile.mjs +47 -0
- package/dist/shell/use-mobile.mjs.map +1 -0
- package/dist/theme/index.cjs +662 -549
- package/dist/theme/index.cjs.map +1 -1
- package/dist/theme/index.d.cts +32 -32
- package/dist/theme/index.d.cts.map +1 -0
- package/dist/theme/{index.d.ts → index.d.mts} +32 -32
- package/dist/theme/index.d.mts.map +1 -0
- package/dist/theme/index.mjs +727 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/types/index.cjs +18 -72
- package/dist/types/index.d.cts +4 -268
- package/dist/types/index.d.mts +4 -0
- package/dist/types/index.mjs +2 -0
- package/dist/types-BIXtQlHB.d.cts +155 -0
- package/dist/types-BIXtQlHB.d.cts.map +1 -0
- package/dist/types-BXFX9bXp.cjs +303 -0
- package/dist/types-BXFX9bXp.cjs.map +1 -0
- package/dist/types-Bjmd7Fdx.mjs +208 -0
- package/dist/types-Bjmd7Fdx.mjs.map +1 -0
- package/dist/types-ByG6Xy3C.d.mts +85 -0
- package/dist/types-ByG6Xy3C.d.mts.map +1 -0
- package/dist/types-C5OFJy-O.d.mts +155 -0
- package/dist/types-C5OFJy-O.d.mts.map +1 -0
- package/dist/types-Ctu-Zio6.d.cts +85 -0
- package/dist/types-Ctu-Zio6.d.cts.map +1 -0
- package/dist/{widget-schema-D-ca3--K.d.ts → widget-schema--PY1uMWx.d.cts} +38 -41
- package/dist/widget-schema--PY1uMWx.d.cts.map +1 -0
- package/dist/{widget-schema-DvJdg1-B.d.cts → widget-schema-YkD5p3v4.d.mts} +38 -41
- package/dist/widget-schema-YkD5p3v4.d.mts.map +1 -0
- package/dist/widget-utils/index.cjs +96 -89
- package/dist/widget-utils/index.cjs.map +1 -1
- package/dist/widget-utils/index.d.cts +8 -6
- package/dist/widget-utils/index.d.cts.map +1 -0
- package/dist/widget-utils/{index.d.ts → index.d.mts} +8 -6
- package/dist/widget-utils/index.d.mts.map +1 -0
- package/dist/widget-utils/index.mjs +119 -0
- package/dist/widget-utils/index.mjs.map +1 -0
- package/package.json +4 -4
- package/dist/chunk-2SPTFZRC.js +0 -72
- package/dist/chunk-2SPTFZRC.js.map +0 -1
- package/dist/chunk-3I5Y3PEO.js +0 -23
- package/dist/chunk-3I5Y3PEO.js.map +0 -1
- package/dist/chunk-3ZRE7GX6.js +0 -620
- package/dist/chunk-3ZRE7GX6.js.map +0 -1
- package/dist/chunk-45BCVWQK.cjs +0 -38
- package/dist/chunk-46PUWB7C.cjs +0 -69
- package/dist/chunk-46PUWB7C.cjs.map +0 -1
- package/dist/chunk-5NYM4UTW.cjs +0 -58
- package/dist/chunk-5NYM4UTW.cjs.map +0 -1
- package/dist/chunk-B2NTWEDF.cjs +0 -130
- package/dist/chunk-B2NTWEDF.cjs.map +0 -1
- package/dist/chunk-GDY76JA6.cjs +0 -153
- package/dist/chunk-GDY76JA6.cjs.map +0 -1
- package/dist/chunk-HGVSPZEL.cjs +0 -119
- package/dist/chunk-HGVSPZEL.cjs.map +0 -1
- package/dist/chunk-HIDJYVKJ.js +0 -54
- package/dist/chunk-HIDJYVKJ.js.map +0 -1
- package/dist/chunk-KTXGU7OP.cjs +0 -136
- package/dist/chunk-KTXGU7OP.cjs.map +0 -1
- package/dist/chunk-KW5E2H5T.js +0 -128
- package/dist/chunk-KW5E2H5T.js.map +0 -1
- package/dist/chunk-LBLHDGMT.js +0 -25
- package/dist/chunk-LBLHDGMT.js.map +0 -1
- package/dist/chunk-MNVDL4FX.js +0 -134
- package/dist/chunk-MNVDL4FX.js.map +0 -1
- package/dist/chunk-MOTOSPAO.cjs +0 -15
- package/dist/chunk-MOTOSPAO.cjs.map +0 -1
- package/dist/chunk-N2K6W7FX.cjs +0 -169
- package/dist/chunk-N2K6W7FX.cjs.map +0 -1
- package/dist/chunk-PFDBULOI.cjs +0 -665
- package/dist/chunk-PVTQWD4I.js +0 -166
- package/dist/chunk-PVTQWD4I.js.map +0 -1
- package/dist/chunk-SJQPHJL4.cjs +0 -26
- package/dist/chunk-SJQPHJL4.cjs.map +0 -1
- package/dist/chunk-TML66UEU.js +0 -13
- package/dist/chunk-TML66UEU.js.map +0 -1
- package/dist/chunk-U3CQLX2Z.cjs +0 -28
- package/dist/chunk-U3CQLX2Z.cjs.map +0 -1
- package/dist/chunk-UUNEVOA5.js +0 -36
- package/dist/chunk-UUNEVOA5.js.map +0 -1
- package/dist/chunk-VRF7QEID.js +0 -67
- package/dist/chunk-VRF7QEID.js.map +0 -1
- package/dist/chunk-VSZWXSQA.js +0 -38
- package/dist/chunk-VSZWXSQA.js.map +0 -1
- package/dist/chunk-WYOHFNNW.js +0 -117
- package/dist/chunk-WYOHFNNW.js.map +0 -1
- package/dist/chunk-YKF5ZFF5.js +0 -136
- package/dist/chunk-YKF5ZFF5.js.map +0 -1
- package/dist/chunk-YXJMBVXO.cjs +0 -76
- package/dist/chunk-YXJMBVXO.cjs.map +0 -1
- package/dist/chunk-ZA4AE7KF.cjs +0 -42
- package/dist/chunk-ZA4AE7KF.cjs.map +0 -1
- package/dist/data-sources/DataAwareWidget.d.ts +0 -30
- package/dist/data-sources/DataAwareWidget.js +0 -57
- package/dist/data-sources/DataAwareWidget.js.map +0 -1
- package/dist/data-sources/ErrorState.d.ts +0 -5
- package/dist/data-sources/ErrorState.js +0 -3
- package/dist/data-sources/ErrorState.js.map +0 -1
- package/dist/data-sources/context.d.ts +0 -16
- package/dist/data-sources/context.js +0 -3
- package/dist/data-sources/context.js.map +0 -1
- package/dist/data-sources/fetchers/api.d.ts +0 -8
- package/dist/data-sources/fetchers/api.js +0 -3
- package/dist/data-sources/fetchers/api.js.map +0 -1
- package/dist/data-sources/fetchers/custom.js +0 -3
- package/dist/data-sources/fetchers/custom.js.map +0 -1
- package/dist/data-sources/fetchers/static.js +0 -3
- package/dist/data-sources/fetchers/static.js.map +0 -1
- package/dist/data-sources/preview-context.d.ts +0 -11
- package/dist/data-sources/preview-context.js +0 -18
- package/dist/data-sources/preview-context.js.map +0 -1
- package/dist/data-sources/registry-context.d.ts +0 -41
- package/dist/data-sources/registry-context.js +0 -9
- package/dist/data-sources/registry-context.js.map +0 -1
- package/dist/data-sources/registry.d.ts +0 -17
- package/dist/data-sources/registry.js +0 -7
- package/dist/data-sources/registry.js.map +0 -1
- package/dist/data-sources/transformers.d.ts +0 -23
- package/dist/data-sources/transformers.js +0 -3
- package/dist/data-sources/transformers.js.map +0 -1
- package/dist/data-sources/types.cjs.map +0 -1
- package/dist/data-sources/types.d.ts +0 -157
- package/dist/data-sources/types.js +0 -3
- package/dist/data-sources/types.js.map +0 -1
- package/dist/data-sources/use-widget-data.d.ts +0 -16
- package/dist/data-sources/use-widget-data.js +0 -10
- package/dist/data-sources/use-widget-data.js.map +0 -1
- package/dist/registries/index.js +0 -144
- package/dist/registries/index.js.map +0 -1
- package/dist/shareable-item-DkgWpwoU.d.cts +0 -21
- package/dist/shareable-item-DkgWpwoU.d.ts +0 -21
- package/dist/shell/AppShellLayout.d.ts +0 -30
- package/dist/shell/AppShellLayout.js +0 -5
- package/dist/shell/AppShellLayout.js.map +0 -1
- package/dist/shell/ThemeModeContext.d.ts +0 -27
- package/dist/shell/ThemeModeContext.js +0 -3
- package/dist/shell/ThemeModeContext.js.map +0 -1
- package/dist/shell/index.cjs.map +0 -1
- package/dist/shell/index.d.ts +0 -43
- package/dist/shell/index.js +0 -76
- package/dist/shell/index.js.map +0 -1
- package/dist/shell/sidebar.js +0 -4
- package/dist/shell/sidebar.js.map +0 -1
- package/dist/shell/use-mobile.js +0 -3
- package/dist/shell/use-mobile.js.map +0 -1
- package/dist/theme/index.js +0 -611
- package/dist/theme/index.js.map +0 -1
- package/dist/types/index.cjs.map +0 -1
- package/dist/types/index.d.ts +0 -268
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/types-CNIhy4JD.d.cts +0 -83
- package/dist/types-CNIhy4JD.d.ts +0 -83
- package/dist/widget-utils/index.js +0 -111
- package/dist/widget-utils/index.js.map +0 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("../chunk-CKQMccvm.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
|
+
//#region src/shell/ScreenHeaderContext.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Split into separate read/write contexts so that components calling
|
|
9
|
+
* useScreenHeaderActions (writers) don't re-render when the actions
|
|
10
|
+
* state changes — only the ScreenHeader (reader) re-renders.
|
|
11
|
+
*/
|
|
12
|
+
const ScreenHeaderWriteContext = (0, react.createContext)(null);
|
|
13
|
+
const ScreenHeaderReadContext = (0, react.createContext)(null);
|
|
14
|
+
const ScreenHeaderBreadcrumbsWriteContext = (0, react.createContext)(null);
|
|
15
|
+
const ScreenHeaderBreadcrumbsReadContext = (0, react.createContext)(null);
|
|
16
|
+
function ScreenHeaderProvider({ children }) {
|
|
17
|
+
const [actions, setActions] = (0, react.useState)(null);
|
|
18
|
+
const [breadcrumbs, setBreadcrumbs] = (0, react.useState)(null);
|
|
19
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderWriteContext.Provider, {
|
|
20
|
+
value: setActions,
|
|
21
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderReadContext.Provider, {
|
|
22
|
+
value: actions,
|
|
23
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderBreadcrumbsWriteContext.Provider, {
|
|
24
|
+
value: setBreadcrumbs,
|
|
25
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderBreadcrumbsReadContext.Provider, {
|
|
26
|
+
value: breadcrumbs,
|
|
27
|
+
children
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Sets actions to display in the ScreenHeader.
|
|
35
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
36
|
+
* `false` otherwise. Pages can use this boolean to conditionally skip
|
|
37
|
+
* rendering their own PageHeader.
|
|
38
|
+
*
|
|
39
|
+
* Cleans up actions on unmount so navigating away doesn't leave stale actions.
|
|
40
|
+
*/
|
|
41
|
+
function useScreenHeaderActions(actions) {
|
|
42
|
+
const setActions = (0, react.useContext)(ScreenHeaderWriteContext);
|
|
43
|
+
const setActionsRef = (0, react.useRef)(setActions);
|
|
44
|
+
setActionsRef.current = setActions;
|
|
45
|
+
(0, react.useEffect)(() => {
|
|
46
|
+
if (!setActions) return;
|
|
47
|
+
setActions(actions);
|
|
48
|
+
}, [actions, setActions]);
|
|
49
|
+
(0, react.useEffect)(() => {
|
|
50
|
+
return () => setActionsRef.current?.(null);
|
|
51
|
+
}, []);
|
|
52
|
+
return setActions !== null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).
|
|
56
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
57
|
+
* `false` otherwise.
|
|
58
|
+
*
|
|
59
|
+
* Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.
|
|
60
|
+
*/
|
|
61
|
+
function useScreenHeaderBreadcrumbs(breadcrumbs) {
|
|
62
|
+
const setBreadcrumbs = (0, react.useContext)(ScreenHeaderBreadcrumbsWriteContext);
|
|
63
|
+
const setBreadcrumbsRef = (0, react.useRef)(setBreadcrumbs);
|
|
64
|
+
setBreadcrumbsRef.current = setBreadcrumbs;
|
|
65
|
+
(0, react.useEffect)(() => {
|
|
66
|
+
if (!setBreadcrumbs) return;
|
|
67
|
+
setBreadcrumbs(breadcrumbs);
|
|
68
|
+
}, [breadcrumbs, setBreadcrumbs]);
|
|
69
|
+
(0, react.useEffect)(() => {
|
|
70
|
+
return () => setBreadcrumbsRef.current?.(null);
|
|
71
|
+
}, []);
|
|
72
|
+
return setBreadcrumbs !== null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.
|
|
76
|
+
*/
|
|
77
|
+
function useScreenHeaderContext() {
|
|
78
|
+
const actions = (0, react.useContext)(ScreenHeaderReadContext);
|
|
79
|
+
const breadcrumbs = (0, react.useContext)(ScreenHeaderBreadcrumbsReadContext);
|
|
80
|
+
return {
|
|
81
|
+
actions: actions ?? null,
|
|
82
|
+
breadcrumbs: breadcrumbs ?? null
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
exports.ScreenHeaderProvider = ScreenHeaderProvider;
|
|
87
|
+
exports.useScreenHeaderActions = useScreenHeaderActions;
|
|
88
|
+
exports.useScreenHeaderBreadcrumbs = useScreenHeaderBreadcrumbs;
|
|
89
|
+
exports.useScreenHeaderContext = useScreenHeaderContext;
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=ScreenHeaderContext.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenHeaderContext.cjs","names":[],"sources":["../../src/shell/ScreenHeaderContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\n\ntype SetActions = (actions: ReactNode) => void;\ntype SetBreadcrumbs = (breadcrumbs: ReactNode) => void;\n\n/**\n * Split into separate read/write contexts so that components calling\n * useScreenHeaderActions (writers) don't re-render when the actions\n * state changes — only the ScreenHeader (reader) re-renders.\n */\nconst ScreenHeaderWriteContext = createContext<SetActions | null>(null);\nconst ScreenHeaderReadContext = createContext<ReactNode>(null);\n\nconst ScreenHeaderBreadcrumbsWriteContext =\n createContext<SetBreadcrumbs | null>(null);\nconst ScreenHeaderBreadcrumbsReadContext = createContext<ReactNode>(null);\n\nexport function ScreenHeaderProvider({ children }: { children: ReactNode }) {\n const [actions, setActions] = useState<ReactNode>(null);\n const [breadcrumbs, setBreadcrumbs] = useState<ReactNode>(null);\n\n return (\n <ScreenHeaderWriteContext.Provider value={setActions}>\n <ScreenHeaderReadContext.Provider value={actions}>\n <ScreenHeaderBreadcrumbsWriteContext.Provider value={setBreadcrumbs}>\n <ScreenHeaderBreadcrumbsReadContext.Provider value={breadcrumbs}>\n {children}\n </ScreenHeaderBreadcrumbsReadContext.Provider>\n </ScreenHeaderBreadcrumbsWriteContext.Provider>\n </ScreenHeaderReadContext.Provider>\n </ScreenHeaderWriteContext.Provider>\n );\n}\n\n/**\n * Sets actions to display in the ScreenHeader.\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),\n * `false` otherwise. Pages can use this boolean to conditionally skip\n * rendering their own PageHeader.\n *\n * Cleans up actions on unmount so navigating away doesn't leave stale actions.\n */\nexport function useScreenHeaderActions(actions: ReactNode): boolean {\n const setActions = useContext(ScreenHeaderWriteContext);\n const setActionsRef = useRef(setActions);\n setActionsRef.current = setActions;\n\n // Update actions when the value changes\n useEffect(() => {\n if (!setActions) return;\n setActions(actions);\n }, [actions, setActions]);\n\n // Clear actions only on unmount\n useEffect(() => {\n return () => setActionsRef.current?.(null);\n }, []);\n\n return setActions !== null;\n}\n\n/**\n * Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),\n * `false` otherwise.\n *\n * Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.\n */\nexport function useScreenHeaderBreadcrumbs(breadcrumbs: ReactNode): boolean {\n const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);\n const setBreadcrumbsRef = useRef(setBreadcrumbs);\n setBreadcrumbsRef.current = setBreadcrumbs;\n\n // Update breadcrumbs when the value changes\n useEffect(() => {\n if (!setBreadcrumbs) return;\n setBreadcrumbs(breadcrumbs);\n }, [breadcrumbs, setBreadcrumbs]);\n\n // Clear breadcrumbs only on unmount\n useEffect(() => {\n return () => setBreadcrumbsRef.current?.(null);\n }, []);\n\n return setBreadcrumbs !== null;\n}\n\n/**\n * Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.\n */\nexport function useScreenHeaderContext(): {\n actions: ReactNode;\n breadcrumbs: ReactNode;\n} {\n const actions = useContext(ScreenHeaderReadContext);\n const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);\n return { actions: actions ?? null, breadcrumbs: breadcrumbs ?? null };\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAM,4BAAA,GAAA,MAAA,eAA4D,KAAK;AACvE,MAAM,2BAAA,GAAA,MAAA,eAAmD,KAAK;AAE9D,MAAM,uCAAA,GAAA,MAAA,eACiC,KAAK;AAC5C,MAAM,sCAAA,GAAA,MAAA,eAA8D,KAAK;AAEzE,SAAgB,qBAAqB,EAAE,YAAqC;CAC1E,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAkC,KAAK;CACvD,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAsC,KAAK;AAE/D,QACE,iBAAA,GAAA,kBAAA,KAAC,yBAAyB,UAA1B;EAAmC,OAAO;YACxC,iBAAA,GAAA,kBAAA,KAAC,wBAAwB,UAAzB;GAAkC,OAAO;aACvC,iBAAA,GAAA,kBAAA,KAAC,oCAAoC,UAArC;IAA8C,OAAO;cACnD,iBAAA,GAAA,kBAAA,KAAC,mCAAmC,UAApC;KAA6C,OAAO;KACjD;KAC2C,CAAA;IACD,CAAA;GACd,CAAA;EACD,CAAA;;;;;;;;;;AAYxC,SAAgB,uBAAuB,SAA6B;CAClE,MAAM,cAAA,GAAA,MAAA,YAAwB,yBAAyB;CACvD,MAAM,iBAAA,GAAA,MAAA,QAAuB,WAAW;AACxC,eAAc,UAAU;AAGxB,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,WAAY;AACjB,aAAW,QAAQ;IAClB,CAAC,SAAS,WAAW,CAAC;AAGzB,EAAA,GAAA,MAAA,iBAAgB;AACd,eAAa,cAAc,UAAU,KAAK;IACzC,EAAE,CAAC;AAEN,QAAO,eAAe;;;;;;;;;AAUxB,SAAgB,2BAA2B,aAAiC;CAC1E,MAAM,kBAAA,GAAA,MAAA,YAA4B,oCAAoC;CACtE,MAAM,qBAAA,GAAA,MAAA,QAA2B,eAAe;AAChD,mBAAkB,UAAU;AAG5B,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,eAAgB;AACrB,iBAAe,YAAY;IAC1B,CAAC,aAAa,eAAe,CAAC;AAGjC,EAAA,GAAA,MAAA,iBAAgB;AACd,eAAa,kBAAkB,UAAU,KAAK;IAC7C,EAAE,CAAC;AAEN,QAAO,mBAAmB;;;;;AAM5B,SAAgB,yBAGd;CACA,MAAM,WAAA,GAAA,MAAA,YAAqB,wBAAwB;CACnD,MAAM,eAAA,GAAA,MAAA,YAAyB,mCAAmC;AAClE,QAAO;EAAE,SAAS,WAAW;EAAM,aAAa,eAAe;EAAM"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/shell/ScreenHeaderContext.d.ts
|
|
5
|
+
declare function ScreenHeaderProvider({
|
|
6
|
+
children
|
|
7
|
+
}: {
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}): react_jsx_runtime0.JSX.Element;
|
|
10
|
+
/**
|
|
11
|
+
* Sets actions to display in the ScreenHeader.
|
|
12
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
13
|
+
* `false` otherwise. Pages can use this boolean to conditionally skip
|
|
14
|
+
* rendering their own PageHeader.
|
|
15
|
+
*
|
|
16
|
+
* Cleans up actions on unmount so navigating away doesn't leave stale actions.
|
|
17
|
+
*/
|
|
18
|
+
declare function useScreenHeaderActions(actions: ReactNode): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).
|
|
21
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
22
|
+
* `false` otherwise.
|
|
23
|
+
*
|
|
24
|
+
* Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.
|
|
25
|
+
*/
|
|
26
|
+
declare function useScreenHeaderBreadcrumbs(breadcrumbs: ReactNode): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.
|
|
29
|
+
*/
|
|
30
|
+
declare function useScreenHeaderContext(): {
|
|
31
|
+
actions: ReactNode;
|
|
32
|
+
breadcrumbs: ReactNode;
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { ScreenHeaderProvider, useScreenHeaderActions, useScreenHeaderBreadcrumbs, useScreenHeaderContext };
|
|
36
|
+
//# sourceMappingURL=ScreenHeaderContext.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenHeaderContext.d.cts","names":[],"sources":["../../src/shell/ScreenHeaderContext.tsx"],"mappings":";;;;iBA0BgB,oBAAA,CAAA;EAAuB;AAAA;EAAc,QAAA,EAAU,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;AAA1E;;;;;;;;AAAA,iBAyBgB,sBAAA,CAAuB,OAAA,EAAS,SAAA;;;;;;;;iBA0BhC,0BAAA,CAA2B,WAAA,EAAa,SAAA;;;;iBAsBxC,sBAAA,CAAA;EACd,OAAA,EAAS,SAAA;EACT,WAAA,EAAa,SAAA;AAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/shell/ScreenHeaderContext.d.ts
|
|
5
|
+
declare function ScreenHeaderProvider({
|
|
6
|
+
children
|
|
7
|
+
}: {
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}): react_jsx_runtime0.JSX.Element;
|
|
10
|
+
/**
|
|
11
|
+
* Sets actions to display in the ScreenHeader.
|
|
12
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
13
|
+
* `false` otherwise. Pages can use this boolean to conditionally skip
|
|
14
|
+
* rendering their own PageHeader.
|
|
15
|
+
*
|
|
16
|
+
* Cleans up actions on unmount so navigating away doesn't leave stale actions.
|
|
17
|
+
*/
|
|
18
|
+
declare function useScreenHeaderActions(actions: ReactNode): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).
|
|
21
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
22
|
+
* `false` otherwise.
|
|
23
|
+
*
|
|
24
|
+
* Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.
|
|
25
|
+
*/
|
|
26
|
+
declare function useScreenHeaderBreadcrumbs(breadcrumbs: ReactNode): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.
|
|
29
|
+
*/
|
|
30
|
+
declare function useScreenHeaderContext(): {
|
|
31
|
+
actions: ReactNode;
|
|
32
|
+
breadcrumbs: ReactNode;
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { ScreenHeaderProvider, useScreenHeaderActions, useScreenHeaderBreadcrumbs, useScreenHeaderContext };
|
|
36
|
+
//# sourceMappingURL=ScreenHeaderContext.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenHeaderContext.d.mts","names":[],"sources":["../../src/shell/ScreenHeaderContext.tsx"],"mappings":";;;;iBA0BgB,oBAAA,CAAA;EAAuB;AAAA;EAAc,QAAA,EAAU,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;AAA1E;;;;;;;;AAAA,iBAyBgB,sBAAA,CAAuB,OAAA,EAAS,SAAA;;;;;;;;iBA0BhC,0BAAA,CAA2B,WAAA,EAAa,SAAA;;;;iBAsBxC,sBAAA,CAAA;EACd,OAAA,EAAS,SAAA;EACT,WAAA,EAAa,SAAA;AAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createContext, useContext, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/shell/ScreenHeaderContext.tsx
|
|
5
|
+
/**
|
|
6
|
+
* Split into separate read/write contexts so that components calling
|
|
7
|
+
* useScreenHeaderActions (writers) don't re-render when the actions
|
|
8
|
+
* state changes — only the ScreenHeader (reader) re-renders.
|
|
9
|
+
*/
|
|
10
|
+
const ScreenHeaderWriteContext = createContext(null);
|
|
11
|
+
const ScreenHeaderReadContext = createContext(null);
|
|
12
|
+
const ScreenHeaderBreadcrumbsWriteContext = createContext(null);
|
|
13
|
+
const ScreenHeaderBreadcrumbsReadContext = createContext(null);
|
|
14
|
+
function ScreenHeaderProvider({ children }) {
|
|
15
|
+
const [actions, setActions] = useState(null);
|
|
16
|
+
const [breadcrumbs, setBreadcrumbs] = useState(null);
|
|
17
|
+
return /* @__PURE__ */ jsx(ScreenHeaderWriteContext.Provider, {
|
|
18
|
+
value: setActions,
|
|
19
|
+
children: /* @__PURE__ */ jsx(ScreenHeaderReadContext.Provider, {
|
|
20
|
+
value: actions,
|
|
21
|
+
children: /* @__PURE__ */ jsx(ScreenHeaderBreadcrumbsWriteContext.Provider, {
|
|
22
|
+
value: setBreadcrumbs,
|
|
23
|
+
children: /* @__PURE__ */ jsx(ScreenHeaderBreadcrumbsReadContext.Provider, {
|
|
24
|
+
value: breadcrumbs,
|
|
25
|
+
children
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Sets actions to display in the ScreenHeader.
|
|
33
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
34
|
+
* `false` otherwise. Pages can use this boolean to conditionally skip
|
|
35
|
+
* rendering their own PageHeader.
|
|
36
|
+
*
|
|
37
|
+
* Cleans up actions on unmount so navigating away doesn't leave stale actions.
|
|
38
|
+
*/
|
|
39
|
+
function useScreenHeaderActions(actions) {
|
|
40
|
+
const setActions = useContext(ScreenHeaderWriteContext);
|
|
41
|
+
const setActionsRef = useRef(setActions);
|
|
42
|
+
setActionsRef.current = setActions;
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (!setActions) return;
|
|
45
|
+
setActions(actions);
|
|
46
|
+
}, [actions, setActions]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
return () => setActionsRef.current?.(null);
|
|
49
|
+
}, []);
|
|
50
|
+
return setActions !== null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).
|
|
54
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),
|
|
55
|
+
* `false` otherwise.
|
|
56
|
+
*
|
|
57
|
+
* Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.
|
|
58
|
+
*/
|
|
59
|
+
function useScreenHeaderBreadcrumbs(breadcrumbs) {
|
|
60
|
+
const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);
|
|
61
|
+
const setBreadcrumbsRef = useRef(setBreadcrumbs);
|
|
62
|
+
setBreadcrumbsRef.current = setBreadcrumbs;
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!setBreadcrumbs) return;
|
|
65
|
+
setBreadcrumbs(breadcrumbs);
|
|
66
|
+
}, [breadcrumbs, setBreadcrumbs]);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
return () => setBreadcrumbsRef.current?.(null);
|
|
69
|
+
}, []);
|
|
70
|
+
return setBreadcrumbs !== null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.
|
|
74
|
+
*/
|
|
75
|
+
function useScreenHeaderContext() {
|
|
76
|
+
const actions = useContext(ScreenHeaderReadContext);
|
|
77
|
+
const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);
|
|
78
|
+
return {
|
|
79
|
+
actions: actions ?? null,
|
|
80
|
+
breadcrumbs: breadcrumbs ?? null
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { ScreenHeaderProvider, useScreenHeaderActions, useScreenHeaderBreadcrumbs, useScreenHeaderContext };
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=ScreenHeaderContext.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenHeaderContext.mjs","names":[],"sources":["../../src/shell/ScreenHeaderContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\n\ntype SetActions = (actions: ReactNode) => void;\ntype SetBreadcrumbs = (breadcrumbs: ReactNode) => void;\n\n/**\n * Split into separate read/write contexts so that components calling\n * useScreenHeaderActions (writers) don't re-render when the actions\n * state changes — only the ScreenHeader (reader) re-renders.\n */\nconst ScreenHeaderWriteContext = createContext<SetActions | null>(null);\nconst ScreenHeaderReadContext = createContext<ReactNode>(null);\n\nconst ScreenHeaderBreadcrumbsWriteContext =\n createContext<SetBreadcrumbs | null>(null);\nconst ScreenHeaderBreadcrumbsReadContext = createContext<ReactNode>(null);\n\nexport function ScreenHeaderProvider({ children }: { children: ReactNode }) {\n const [actions, setActions] = useState<ReactNode>(null);\n const [breadcrumbs, setBreadcrumbs] = useState<ReactNode>(null);\n\n return (\n <ScreenHeaderWriteContext.Provider value={setActions}>\n <ScreenHeaderReadContext.Provider value={actions}>\n <ScreenHeaderBreadcrumbsWriteContext.Provider value={setBreadcrumbs}>\n <ScreenHeaderBreadcrumbsReadContext.Provider value={breadcrumbs}>\n {children}\n </ScreenHeaderBreadcrumbsReadContext.Provider>\n </ScreenHeaderBreadcrumbsWriteContext.Provider>\n </ScreenHeaderReadContext.Provider>\n </ScreenHeaderWriteContext.Provider>\n );\n}\n\n/**\n * Sets actions to display in the ScreenHeader.\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),\n * `false` otherwise. Pages can use this boolean to conditionally skip\n * rendering their own PageHeader.\n *\n * Cleans up actions on unmount so navigating away doesn't leave stale actions.\n */\nexport function useScreenHeaderActions(actions: ReactNode): boolean {\n const setActions = useContext(ScreenHeaderWriteContext);\n const setActionsRef = useRef(setActions);\n setActionsRef.current = setActions;\n\n // Update actions when the value changes\n useEffect(() => {\n if (!setActions) return;\n setActions(actions);\n }, [actions, setActions]);\n\n // Clear actions only on unmount\n useEffect(() => {\n return () => setActionsRef.current?.(null);\n }, []);\n\n return setActions !== null;\n}\n\n/**\n * Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the rep shell),\n * `false` otherwise.\n *\n * Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.\n */\nexport function useScreenHeaderBreadcrumbs(breadcrumbs: ReactNode): boolean {\n const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);\n const setBreadcrumbsRef = useRef(setBreadcrumbs);\n setBreadcrumbsRef.current = setBreadcrumbs;\n\n // Update breadcrumbs when the value changes\n useEffect(() => {\n if (!setBreadcrumbs) return;\n setBreadcrumbs(breadcrumbs);\n }, [breadcrumbs, setBreadcrumbs]);\n\n // Clear breadcrumbs only on unmount\n useEffect(() => {\n return () => setBreadcrumbsRef.current?.(null);\n }, []);\n\n return setBreadcrumbs !== null;\n}\n\n/**\n * Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.\n */\nexport function useScreenHeaderContext(): {\n actions: ReactNode;\n breadcrumbs: ReactNode;\n} {\n const actions = useContext(ScreenHeaderReadContext);\n const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);\n return { actions: actions ?? null, breadcrumbs: breadcrumbs ?? null };\n}\n"],"mappings":";;;;;;;;;AAmBA,MAAM,2BAA2B,cAAiC,KAAK;AACvE,MAAM,0BAA0B,cAAyB,KAAK;AAE9D,MAAM,sCACJ,cAAqC,KAAK;AAC5C,MAAM,qCAAqC,cAAyB,KAAK;AAEzE,SAAgB,qBAAqB,EAAE,YAAqC;CAC1E,MAAM,CAAC,SAAS,cAAc,SAAoB,KAAK;CACvD,MAAM,CAAC,aAAa,kBAAkB,SAAoB,KAAK;AAE/D,QACE,oBAAC,yBAAyB,UAA1B;EAAmC,OAAO;YACxC,oBAAC,wBAAwB,UAAzB;GAAkC,OAAO;aACvC,oBAAC,oCAAoC,UAArC;IAA8C,OAAO;cACnD,oBAAC,mCAAmC,UAApC;KAA6C,OAAO;KACjD;KAC2C,CAAA;IACD,CAAA;GACd,CAAA;EACD,CAAA;;;;;;;;;;AAYxC,SAAgB,uBAAuB,SAA6B;CAClE,MAAM,aAAa,WAAW,yBAAyB;CACvD,MAAM,gBAAgB,OAAO,WAAW;AACxC,eAAc,UAAU;AAGxB,iBAAgB;AACd,MAAI,CAAC,WAAY;AACjB,aAAW,QAAQ;IAClB,CAAC,SAAS,WAAW,CAAC;AAGzB,iBAAgB;AACd,eAAa,cAAc,UAAU,KAAK;IACzC,EAAE,CAAC;AAEN,QAAO,eAAe;;;;;;;;;AAUxB,SAAgB,2BAA2B,aAAiC;CAC1E,MAAM,iBAAiB,WAAW,oCAAoC;CACtE,MAAM,oBAAoB,OAAO,eAAe;AAChD,mBAAkB,UAAU;AAG5B,iBAAgB;AACd,MAAI,CAAC,eAAgB;AACrB,iBAAe,YAAY;IAC1B,CAAC,aAAa,eAAe,CAAC;AAGjC,iBAAgB;AACd,eAAa,kBAAkB,UAAU,KAAK;IAC7C,EAAE,CAAC;AAEN,QAAO,mBAAmB;;;;;AAM5B,SAAgB,yBAGd;CACA,MAAM,UAAU,WAAW,wBAAwB;CACnD,MAAM,cAAc,WAAW,mCAAmC;AAClE,QAAO;EAAE,SAAS,WAAW;EAAM,aAAa,eAAe;EAAM"}
|
|
@@ -1,20 +1,70 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("../chunk-CKQMccvm.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
|
+
//#region src/shell/ThemeModeContext.tsx
|
|
7
|
+
const ThemeModeContext = (0, react.createContext)(null);
|
|
8
|
+
const darkMediaQuery = typeof window !== "undefined" ? window.matchMedia("(prefers-color-scheme: dark)") : null;
|
|
9
|
+
function subscribeToPrefersColorScheme(callback) {
|
|
10
|
+
darkMediaQuery?.addEventListener("change", callback);
|
|
11
|
+
return () => darkMediaQuery?.removeEventListener("change", callback);
|
|
12
|
+
}
|
|
13
|
+
function getSystemPrefersDark() {
|
|
14
|
+
return darkMediaQuery?.matches ?? false;
|
|
15
|
+
}
|
|
16
|
+
function getServerSnapshot() {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
function ThemeModeProvider({ children, mode, onModeChange, autoModeEnabled = true }) {
|
|
20
|
+
const systemMode = (0, react.useSyncExternalStore)(subscribeToPrefersColorScheme, getSystemPrefersDark, getServerSnapshot) ? "dark" : "light";
|
|
21
|
+
const displayMode = mode === "auto" ? systemMode : mode;
|
|
22
|
+
const cycleMode = (0, react.useCallback)(() => {
|
|
23
|
+
if (autoModeEnabled) {
|
|
24
|
+
const target = displayMode === "light" ? "dark" : "light";
|
|
25
|
+
onModeChange(target === systemMode ? "auto" : target);
|
|
26
|
+
} else onModeChange(mode === "light" ? "dark" : "light");
|
|
27
|
+
}, [
|
|
28
|
+
mode,
|
|
29
|
+
displayMode,
|
|
30
|
+
systemMode,
|
|
31
|
+
onModeChange,
|
|
32
|
+
autoModeEnabled
|
|
33
|
+
]);
|
|
34
|
+
const dataAttribute = getThemeModeAttribute(mode);
|
|
35
|
+
const value = (0, react.useMemo)(() => ({
|
|
36
|
+
mode,
|
|
37
|
+
displayMode,
|
|
38
|
+
setMode: onModeChange,
|
|
39
|
+
autoModeEnabled,
|
|
40
|
+
cycleMode,
|
|
41
|
+
dataAttribute
|
|
42
|
+
}), [
|
|
43
|
+
mode,
|
|
44
|
+
displayMode,
|
|
45
|
+
onModeChange,
|
|
46
|
+
autoModeEnabled,
|
|
47
|
+
cycleMode,
|
|
48
|
+
dataAttribute
|
|
49
|
+
]);
|
|
50
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ThemeModeContext.Provider, {
|
|
51
|
+
value,
|
|
52
|
+
children
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Access the current theme mode, setter, and cycle helper. Must be used within a `ThemeModeProvider`. */
|
|
56
|
+
function useThemeMode() {
|
|
57
|
+
const ctx = (0, react.useContext)(ThemeModeContext);
|
|
58
|
+
if (!ctx) throw new Error("useThemeMode must be used within a ThemeModeProvider");
|
|
59
|
+
return ctx;
|
|
60
|
+
}
|
|
61
|
+
/** Maps a ThemeMode to the value for `data-theme-mode`. Returns undefined for "auto". */
|
|
62
|
+
function getThemeModeAttribute(mode) {
|
|
63
|
+
return mode === "auto" ? void 0 : mode;
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
exports.ThemeModeProvider = ThemeModeProvider;
|
|
67
|
+
exports.getThemeModeAttribute = getThemeModeAttribute;
|
|
68
|
+
exports.useThemeMode = useThemeMode;
|
|
2
69
|
|
|
3
|
-
var chunkYXJMBVXO_cjs = require('../chunk-YXJMBVXO.cjs');
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "ThemeModeProvider", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
get: function () { return chunkYXJMBVXO_cjs.ThemeModeProvider; }
|
|
10
|
-
});
|
|
11
|
-
Object.defineProperty(exports, "getThemeModeAttribute", {
|
|
12
|
-
enumerable: true,
|
|
13
|
-
get: function () { return chunkYXJMBVXO_cjs.getThemeModeAttribute; }
|
|
14
|
-
});
|
|
15
|
-
Object.defineProperty(exports, "useThemeMode", {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
get: function () { return chunkYXJMBVXO_cjs.useThemeMode; }
|
|
18
|
-
});
|
|
19
|
-
//# sourceMappingURL=ThemeModeContext.cjs.map
|
|
20
70
|
//# sourceMappingURL=ThemeModeContext.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ThemeModeContext.cjs","names":[],"sources":["../../src/shell/ThemeModeContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\n\nexport type ThemeMode = \"auto\" | \"light\" | \"dark\";\n\nexport type DisplayMode = \"light\" | \"dark\";\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n displayMode: DisplayMode;\n setMode: (mode: ThemeMode) => void;\n autoModeEnabled: boolean;\n cycleMode: () => void;\n dataAttribute: string | undefined;\n}\n\nconst ThemeModeContext = createContext<ThemeModeContextValue | null>(null);\n\nconst darkMediaQuery =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : null;\n\nfunction subscribeToPrefersColorScheme(callback: () => void) {\n darkMediaQuery?.addEventListener(\"change\", callback);\n return () => darkMediaQuery?.removeEventListener(\"change\", callback);\n}\n\nfunction getSystemPrefersDark(): boolean {\n return darkMediaQuery?.matches ?? false;\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n\ninterface ThemeModeProviderProps {\n children: ReactNode;\n mode: ThemeMode;\n onModeChange: (mode: ThemeMode) => void;\n /** When false, auto mode is skipped in the cycle (light↔dark only). Default true. */\n autoModeEnabled?: boolean;\n}\n\nexport function ThemeModeProvider({\n children,\n mode,\n onModeChange,\n autoModeEnabled = true,\n}: ThemeModeProviderProps) {\n const systemPrefersDark = useSyncExternalStore(\n subscribeToPrefersColorScheme,\n getSystemPrefersDark,\n getServerSnapshot,\n );\n\n const systemMode: DisplayMode = systemPrefersDark ? \"dark\" : \"light\";\n\n const displayMode: DisplayMode = mode === \"auto\" ? systemMode : mode;\n\n const cycleMode = useCallback(() => {\n if (autoModeEnabled) {\n // Toggle displayed mode. If target matches system preference, use \"auto\".\n const target: DisplayMode = displayMode === \"light\" ? \"dark\" : \"light\";\n onModeChange(target === systemMode ? \"auto\" : target);\n } else {\n // light ↔ dark\n onModeChange(mode === \"light\" ? \"dark\" : \"light\");\n }\n }, [mode, displayMode, systemMode, onModeChange, autoModeEnabled]);\n\n const dataAttribute = getThemeModeAttribute(mode);\n\n const value = useMemo(\n () => ({\n mode,\n displayMode,\n setMode: onModeChange,\n autoModeEnabled,\n cycleMode,\n dataAttribute,\n }),\n [\n mode,\n displayMode,\n onModeChange,\n autoModeEnabled,\n cycleMode,\n dataAttribute,\n ],\n );\n\n return (\n <ThemeModeContext.Provider value={value}>\n {children}\n </ThemeModeContext.Provider>\n );\n}\n\n/** Access the current theme mode, setter, and cycle helper. Must be used within a `ThemeModeProvider`. */\nexport function useThemeMode(): ThemeModeContextValue {\n const ctx = useContext(ThemeModeContext);\n if (!ctx) {\n throw new Error(\"useThemeMode must be used within a ThemeModeProvider\");\n }\n return ctx;\n}\n\n/** Maps a ThemeMode to the value for `data-theme-mode`. Returns undefined for \"auto\". */\nexport function getThemeModeAttribute(mode: ThemeMode): string | undefined {\n return mode === \"auto\" ? undefined : mode;\n}\n"],"mappings":";;;;;;AAwBA,MAAM,oBAAA,GAAA,MAAA,eAA+D,KAAK;AAE1E,MAAM,iBACJ,OAAO,WAAW,cACd,OAAO,WAAW,+BAA+B,GACjD;AAEN,SAAS,8BAA8B,UAAsB;AAC3D,iBAAgB,iBAAiB,UAAU,SAAS;AACpD,cAAa,gBAAgB,oBAAoB,UAAU,SAAS;;AAGtE,SAAS,uBAAgC;AACvC,QAAO,gBAAgB,WAAW;;AAGpC,SAAS,oBAA6B;AACpC,QAAO;;AAWT,SAAgB,kBAAkB,EAChC,UACA,MACA,cACA,kBAAkB,QACO;CAOzB,MAAM,cAAA,GAAA,MAAA,sBALJ,+BACA,sBACA,kBACD,GAEmD,SAAS;CAE7D,MAAM,cAA2B,SAAS,SAAS,aAAa;CAEhE,MAAM,aAAA,GAAA,MAAA,mBAA8B;AAClC,MAAI,iBAAiB;GAEnB,MAAM,SAAsB,gBAAgB,UAAU,SAAS;AAC/D,gBAAa,WAAW,aAAa,SAAS,OAAO;QAGrD,cAAa,SAAS,UAAU,SAAS,QAAQ;IAElD;EAAC;EAAM;EAAa;EAAY;EAAc;EAAgB,CAAC;CAElE,MAAM,gBAAgB,sBAAsB,KAAK;CAEjD,MAAM,SAAA,GAAA,MAAA,gBACG;EACL;EACA;EACA,SAAS;EACT;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,iBAAA,GAAA,kBAAA,KAAC,iBAAiB,UAAlB;EAAkC;EAC/B;EACyB,CAAA;;;AAKhC,SAAgB,eAAsC;CACpD,MAAM,OAAA,GAAA,MAAA,YAAiB,iBAAiB;AACxC,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAO;;;AAIT,SAAgB,sBAAsB,MAAqC;AACzE,QAAO,SAAS,SAAS,KAAA,IAAY"}
|
|
@@ -1,27 +1,34 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import { ReactNode } from
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
3
|
|
|
4
|
+
//#region src/shell/ThemeModeContext.d.ts
|
|
4
5
|
type ThemeMode = "auto" | "light" | "dark";
|
|
5
6
|
type DisplayMode = "light" | "dark";
|
|
6
7
|
interface ThemeModeContextValue {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
mode: ThemeMode;
|
|
9
|
+
displayMode: DisplayMode;
|
|
10
|
+
setMode: (mode: ThemeMode) => void;
|
|
11
|
+
autoModeEnabled: boolean;
|
|
12
|
+
cycleMode: () => void;
|
|
13
|
+
dataAttribute: string | undefined;
|
|
13
14
|
}
|
|
14
15
|
interface ThemeModeProviderProps {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
mode: ThemeMode;
|
|
18
|
+
onModeChange: (mode: ThemeMode) => void;
|
|
19
|
+
/** When false, auto mode is skipped in the cycle (light↔dark only). Default true. */
|
|
20
|
+
autoModeEnabled?: boolean;
|
|
20
21
|
}
|
|
21
|
-
declare function ThemeModeProvider({
|
|
22
|
+
declare function ThemeModeProvider({
|
|
23
|
+
children,
|
|
24
|
+
mode,
|
|
25
|
+
onModeChange,
|
|
26
|
+
autoModeEnabled
|
|
27
|
+
}: ThemeModeProviderProps): react_jsx_runtime0.JSX.Element;
|
|
22
28
|
/** Access the current theme mode, setter, and cycle helper. Must be used within a `ThemeModeProvider`. */
|
|
23
29
|
declare function useThemeMode(): ThemeModeContextValue;
|
|
24
30
|
/** Maps a ThemeMode to the value for `data-theme-mode`. Returns undefined for "auto". */
|
|
25
31
|
declare function getThemeModeAttribute(mode: ThemeMode): string | undefined;
|
|
26
|
-
|
|
27
|
-
export {
|
|
32
|
+
//#endregion
|
|
33
|
+
export { DisplayMode, ThemeMode, ThemeModeContextValue, ThemeModeProvider, getThemeModeAttribute, useThemeMode };
|
|
34
|
+
//# sourceMappingURL=ThemeModeContext.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeModeContext.d.cts","names":[],"sources":["../../src/shell/ThemeModeContext.tsx"],"mappings":";;;;KAWY,SAAA;AAAA,KAEA,WAAA;AAAA,UAEK,qBAAA;EACf,IAAA,EAAM,SAAA;EACN,WAAA,EAAa,WAAA;EACb,OAAA,GAAU,IAAA,EAAM,SAAA;EAChB,eAAA;EACA,SAAA;EACA,aAAA;AAAA;AAAA,UAuBQ,sBAAA;EACR,QAAA,EAAU,SAAA;EACV,IAAA,EAAM,SAAA;EACN,YAAA,GAAe,IAAA,EAAM,SAAA;EAhCe;EAkCpC,eAAA;AAAA;AAAA,iBAGc,iBAAA,CAAA;EACd,QAAA;EACA,IAAA;EACA,YAAA;EACA;AAAA,GACC,sBAAA,GAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA;;iBAmDT,YAAA,CAAA,GAAgB,qBAAA;;iBAShB,qBAAA,CAAsB,IAAA,EAAM,SAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/shell/ThemeModeContext.d.ts
|
|
5
|
+
type ThemeMode = "auto" | "light" | "dark";
|
|
6
|
+
type DisplayMode = "light" | "dark";
|
|
7
|
+
interface ThemeModeContextValue {
|
|
8
|
+
mode: ThemeMode;
|
|
9
|
+
displayMode: DisplayMode;
|
|
10
|
+
setMode: (mode: ThemeMode) => void;
|
|
11
|
+
autoModeEnabled: boolean;
|
|
12
|
+
cycleMode: () => void;
|
|
13
|
+
dataAttribute: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
interface ThemeModeProviderProps {
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
mode: ThemeMode;
|
|
18
|
+
onModeChange: (mode: ThemeMode) => void;
|
|
19
|
+
/** When false, auto mode is skipped in the cycle (light↔dark only). Default true. */
|
|
20
|
+
autoModeEnabled?: boolean;
|
|
21
|
+
}
|
|
22
|
+
declare function ThemeModeProvider({
|
|
23
|
+
children,
|
|
24
|
+
mode,
|
|
25
|
+
onModeChange,
|
|
26
|
+
autoModeEnabled
|
|
27
|
+
}: ThemeModeProviderProps): react_jsx_runtime0.JSX.Element;
|
|
28
|
+
/** Access the current theme mode, setter, and cycle helper. Must be used within a `ThemeModeProvider`. */
|
|
29
|
+
declare function useThemeMode(): ThemeModeContextValue;
|
|
30
|
+
/** Maps a ThemeMode to the value for `data-theme-mode`. Returns undefined for "auto". */
|
|
31
|
+
declare function getThemeModeAttribute(mode: ThemeMode): string | undefined;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { DisplayMode, ThemeMode, ThemeModeContextValue, ThemeModeProvider, getThemeModeAttribute, useThemeMode };
|
|
34
|
+
//# sourceMappingURL=ThemeModeContext.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeModeContext.d.mts","names":[],"sources":["../../src/shell/ThemeModeContext.tsx"],"mappings":";;;;KAWY,SAAA;AAAA,KAEA,WAAA;AAAA,UAEK,qBAAA;EACf,IAAA,EAAM,SAAA;EACN,WAAA,EAAa,WAAA;EACb,OAAA,GAAU,IAAA,EAAM,SAAA;EAChB,eAAA;EACA,SAAA;EACA,aAAA;AAAA;AAAA,UAuBQ,sBAAA;EACR,QAAA,EAAU,SAAA;EACV,IAAA,EAAM,SAAA;EACN,YAAA,GAAe,IAAA,EAAM,SAAA;EAhCe;EAkCpC,eAAA;AAAA;AAAA,iBAGc,iBAAA,CAAA;EACd,QAAA;EACA,IAAA;EACA,YAAA;EACA;AAAA,GACC,sBAAA,GAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA;;iBAmDT,YAAA,CAAA,GAAgB,qBAAA;;iBAShB,qBAAA,CAAsB,IAAA,EAAM,SAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createContext, useCallback, useContext, useMemo, useSyncExternalStore } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/shell/ThemeModeContext.tsx
|
|
5
|
+
const ThemeModeContext = createContext(null);
|
|
6
|
+
const darkMediaQuery = typeof window !== "undefined" ? window.matchMedia("(prefers-color-scheme: dark)") : null;
|
|
7
|
+
function subscribeToPrefersColorScheme(callback) {
|
|
8
|
+
darkMediaQuery?.addEventListener("change", callback);
|
|
9
|
+
return () => darkMediaQuery?.removeEventListener("change", callback);
|
|
10
|
+
}
|
|
11
|
+
function getSystemPrefersDark() {
|
|
12
|
+
return darkMediaQuery?.matches ?? false;
|
|
13
|
+
}
|
|
14
|
+
function getServerSnapshot() {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
function ThemeModeProvider({ children, mode, onModeChange, autoModeEnabled = true }) {
|
|
18
|
+
const systemMode = useSyncExternalStore(subscribeToPrefersColorScheme, getSystemPrefersDark, getServerSnapshot) ? "dark" : "light";
|
|
19
|
+
const displayMode = mode === "auto" ? systemMode : mode;
|
|
20
|
+
const cycleMode = useCallback(() => {
|
|
21
|
+
if (autoModeEnabled) {
|
|
22
|
+
const target = displayMode === "light" ? "dark" : "light";
|
|
23
|
+
onModeChange(target === systemMode ? "auto" : target);
|
|
24
|
+
} else onModeChange(mode === "light" ? "dark" : "light");
|
|
25
|
+
}, [
|
|
26
|
+
mode,
|
|
27
|
+
displayMode,
|
|
28
|
+
systemMode,
|
|
29
|
+
onModeChange,
|
|
30
|
+
autoModeEnabled
|
|
31
|
+
]);
|
|
32
|
+
const dataAttribute = getThemeModeAttribute(mode);
|
|
33
|
+
const value = useMemo(() => ({
|
|
34
|
+
mode,
|
|
35
|
+
displayMode,
|
|
36
|
+
setMode: onModeChange,
|
|
37
|
+
autoModeEnabled,
|
|
38
|
+
cycleMode,
|
|
39
|
+
dataAttribute
|
|
40
|
+
}), [
|
|
41
|
+
mode,
|
|
42
|
+
displayMode,
|
|
43
|
+
onModeChange,
|
|
44
|
+
autoModeEnabled,
|
|
45
|
+
cycleMode,
|
|
46
|
+
dataAttribute
|
|
47
|
+
]);
|
|
48
|
+
return /* @__PURE__ */ jsx(ThemeModeContext.Provider, {
|
|
49
|
+
value,
|
|
50
|
+
children
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Access the current theme mode, setter, and cycle helper. Must be used within a `ThemeModeProvider`. */
|
|
54
|
+
function useThemeMode() {
|
|
55
|
+
const ctx = useContext(ThemeModeContext);
|
|
56
|
+
if (!ctx) throw new Error("useThemeMode must be used within a ThemeModeProvider");
|
|
57
|
+
return ctx;
|
|
58
|
+
}
|
|
59
|
+
/** Maps a ThemeMode to the value for `data-theme-mode`. Returns undefined for "auto". */
|
|
60
|
+
function getThemeModeAttribute(mode) {
|
|
61
|
+
return mode === "auto" ? void 0 : mode;
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { ThemeModeProvider, getThemeModeAttribute, useThemeMode };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=ThemeModeContext.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeModeContext.mjs","names":[],"sources":["../../src/shell/ThemeModeContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\n\nexport type ThemeMode = \"auto\" | \"light\" | \"dark\";\n\nexport type DisplayMode = \"light\" | \"dark\";\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n displayMode: DisplayMode;\n setMode: (mode: ThemeMode) => void;\n autoModeEnabled: boolean;\n cycleMode: () => void;\n dataAttribute: string | undefined;\n}\n\nconst ThemeModeContext = createContext<ThemeModeContextValue | null>(null);\n\nconst darkMediaQuery =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : null;\n\nfunction subscribeToPrefersColorScheme(callback: () => void) {\n darkMediaQuery?.addEventListener(\"change\", callback);\n return () => darkMediaQuery?.removeEventListener(\"change\", callback);\n}\n\nfunction getSystemPrefersDark(): boolean {\n return darkMediaQuery?.matches ?? false;\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n\ninterface ThemeModeProviderProps {\n children: ReactNode;\n mode: ThemeMode;\n onModeChange: (mode: ThemeMode) => void;\n /** When false, auto mode is skipped in the cycle (light↔dark only). Default true. */\n autoModeEnabled?: boolean;\n}\n\nexport function ThemeModeProvider({\n children,\n mode,\n onModeChange,\n autoModeEnabled = true,\n}: ThemeModeProviderProps) {\n const systemPrefersDark = useSyncExternalStore(\n subscribeToPrefersColorScheme,\n getSystemPrefersDark,\n getServerSnapshot,\n );\n\n const systemMode: DisplayMode = systemPrefersDark ? \"dark\" : \"light\";\n\n const displayMode: DisplayMode = mode === \"auto\" ? systemMode : mode;\n\n const cycleMode = useCallback(() => {\n if (autoModeEnabled) {\n // Toggle displayed mode. If target matches system preference, use \"auto\".\n const target: DisplayMode = displayMode === \"light\" ? \"dark\" : \"light\";\n onModeChange(target === systemMode ? \"auto\" : target);\n } else {\n // light ↔ dark\n onModeChange(mode === \"light\" ? \"dark\" : \"light\");\n }\n }, [mode, displayMode, systemMode, onModeChange, autoModeEnabled]);\n\n const dataAttribute = getThemeModeAttribute(mode);\n\n const value = useMemo(\n () => ({\n mode,\n displayMode,\n setMode: onModeChange,\n autoModeEnabled,\n cycleMode,\n dataAttribute,\n }),\n [\n mode,\n displayMode,\n onModeChange,\n autoModeEnabled,\n cycleMode,\n dataAttribute,\n ],\n );\n\n return (\n <ThemeModeContext.Provider value={value}>\n {children}\n </ThemeModeContext.Provider>\n );\n}\n\n/** Access the current theme mode, setter, and cycle helper. Must be used within a `ThemeModeProvider`. */\nexport function useThemeMode(): ThemeModeContextValue {\n const ctx = useContext(ThemeModeContext);\n if (!ctx) {\n throw new Error(\"useThemeMode must be used within a ThemeModeProvider\");\n }\n return ctx;\n}\n\n/** Maps a ThemeMode to the value for `data-theme-mode`. Returns undefined for \"auto\". */\nexport function getThemeModeAttribute(mode: ThemeMode): string | undefined {\n return mode === \"auto\" ? undefined : mode;\n}\n"],"mappings":";;;;AAwBA,MAAM,mBAAmB,cAA4C,KAAK;AAE1E,MAAM,iBACJ,OAAO,WAAW,cACd,OAAO,WAAW,+BAA+B,GACjD;AAEN,SAAS,8BAA8B,UAAsB;AAC3D,iBAAgB,iBAAiB,UAAU,SAAS;AACpD,cAAa,gBAAgB,oBAAoB,UAAU,SAAS;;AAGtE,SAAS,uBAAgC;AACvC,QAAO,gBAAgB,WAAW;;AAGpC,SAAS,oBAA6B;AACpC,QAAO;;AAWT,SAAgB,kBAAkB,EAChC,UACA,MACA,cACA,kBAAkB,QACO;CAOzB,MAAM,aANoB,qBACxB,+BACA,sBACA,kBACD,GAEmD,SAAS;CAE7D,MAAM,cAA2B,SAAS,SAAS,aAAa;CAEhE,MAAM,YAAY,kBAAkB;AAClC,MAAI,iBAAiB;GAEnB,MAAM,SAAsB,gBAAgB,UAAU,SAAS;AAC/D,gBAAa,WAAW,aAAa,SAAS,OAAO;QAGrD,cAAa,SAAS,UAAU,SAAS,QAAQ;IAElD;EAAC;EAAM;EAAa;EAAY;EAAc;EAAgB,CAAC;CAElE,MAAM,gBAAgB,sBAAsB,KAAK;CAEjD,MAAM,QAAQ,eACL;EACL;EACA;EACA,SAAS;EACT;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,oBAAC,iBAAiB,UAAlB;EAAkC;EAC/B;EACyB,CAAA;;;AAKhC,SAAgB,eAAsC;CACpD,MAAM,MAAM,WAAW,iBAAiB;AACxC,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAO;;;AAIT,SAAgB,sBAAsB,MAAqC;AACzE,QAAO,SAAS,SAAS,KAAA,IAAY"}
|