@fluixi/core 1.0.0-alpha.92 → 1.0.0-alpha.94
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/cdn/core.global.js +2 -2
- package/dist/src/cdn/{chunk-MDJLC3PE.mjs → chunk-7XM7Q5VR.mjs} +271 -229
- package/dist/src/cdn/core.cjs +360 -253
- package/dist/src/cdn/core.mjs +92 -20
- package/dist/src/cdn/{router-JYFZP3EZ.mjs → router-VOY43YNM.mjs} +7 -3
- package/dist/src/index.cjs +548 -232
- package/dist/src/index.mjs +549 -224
- package/dist/src/lib/client/chunk-TSXM2PNY.mjs +53 -0
- package/dist/src/lib/client/index.cjs +310 -176
- package/dist/src/lib/client/index.d.ts.map +1 -1
- package/dist/src/lib/client/index.js +33 -18
- package/dist/src/lib/client/index.mjs +86 -15
- package/dist/src/lib/client/{router-PHLUYVQU.mjs → router-BDVPLLYX.mjs} +244 -99
- package/dist/src/lib/context/context.cjs +35 -72
- package/dist/src/lib/context/context.d.ts +45 -291
- package/dist/src/lib/context/context.d.ts.map +1 -1
- package/dist/src/lib/context/context.js +65 -397
- package/dist/src/lib/context/context.mjs +38 -73
- package/dist/src/lib/context/index.cjs +35 -72
- package/dist/src/lib/context/index.d.ts +2 -2
- package/dist/src/lib/context/index.d.ts.map +1 -1
- package/dist/src/lib/context/index.js +1 -5
- package/dist/src/lib/context/index.mjs +38 -73
- package/dist/src/lib/core.cjs +547 -231
- package/dist/src/lib/core.d.ts +5 -3
- package/dist/src/lib/core.d.ts.map +1 -1
- package/dist/src/lib/core.js +6 -4
- package/dist/src/lib/core.mjs +548 -223
- package/dist/src/lib/env/index.cjs +1 -17
- package/dist/src/lib/env/index.d.ts +2 -14
- package/dist/src/lib/env/index.d.ts.map +1 -1
- package/dist/src/lib/env/index.js +2 -26
- package/dist/src/lib/env/index.mjs +1 -17
- package/dist/src/lib/i18n/index.cjs +17 -2
- package/dist/src/lib/i18n/index.d.ts +10 -0
- package/dist/src/lib/i18n/index.d.ts.map +1 -1
- package/dist/src/lib/i18n/index.js +17 -1
- package/dist/src/lib/i18n/index.mjs +17 -2
- package/dist/src/lib/index.cjs +64 -99
- package/dist/src/lib/index.mjs +43 -76
- package/dist/src/lib/isomorphic.cjs +9 -4
- package/dist/src/lib/isomorphic.d.ts +9 -2
- package/dist/src/lib/isomorphic.d.ts.map +1 -1
- package/dist/src/lib/isomorphic.js +11 -4
- package/dist/src/lib/isomorphic.mjs +9 -4
- package/dist/src/lib/jsx-runtime/index.cjs +1 -1
- package/dist/src/lib/jsx-runtime/index.mjs +1 -1
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.cjs +1 -1
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.mjs +1 -1
- package/dist/src/lib/plugins/fluixi-routes-plugin.cjs +2 -2
- package/dist/src/lib/plugins/fluixi-routes-plugin.mjs +2 -2
- package/dist/src/lib/plugins/index.cjs +3 -3
- package/dist/src/lib/plugins/index.mjs +3 -3
- package/dist/src/lib/plugins/route-codegen.cjs +2 -2
- package/dist/src/lib/plugins/route-codegen.js +1 -1
- package/dist/src/lib/plugins/route-codegen.mjs +2 -2
- package/dist/src/lib/render/index.cjs +1 -1
- package/dist/src/lib/render/index.mjs +1 -1
- package/dist/src/lib/render/versions.cjs +1 -1
- package/dist/src/lib/render/versions.mjs +1 -1
- package/dist/src/lib/router/data.cjs +113 -115
- package/dist/src/lib/router/data.d.ts +63 -10
- package/dist/src/lib/router/data.d.ts.map +1 -1
- package/dist/src/lib/router/data.js +158 -68
- package/dist/src/lib/router/data.mjs +112 -112
- package/dist/src/lib/router/index.cjs +260 -163
- package/dist/src/lib/router/index.d.ts +22 -2
- package/dist/src/lib/router/index.d.ts.map +1 -1
- package/dist/src/lib/router/index.js +165 -22
- package/dist/src/lib/router/index.mjs +244 -143
- package/dist/src/lib/server/index.cjs +1 -1
- package/dist/src/lib/server/index.mjs +1 -1
- package/dist/src/lib/storage/cache.cjs +51 -0
- package/dist/src/lib/storage/cache.d.ts +18 -0
- package/dist/src/lib/storage/cache.d.ts.map +1 -0
- package/dist/src/lib/storage/cache.js +42 -0
- package/dist/src/lib/storage/cache.mjs +30 -0
- package/dist/src/lib/storage/index.cjs +246 -0
- package/dist/src/lib/storage/index.d.ts +83 -0
- package/dist/src/lib/storage/index.d.ts.map +1 -0
- package/dist/src/lib/storage/index.js +179 -0
- package/dist/src/lib/storage/index.mjs +231 -0
- package/dist/src/lib/storage/persisted.cjs +91 -0
- package/dist/src/lib/storage/persisted.d.ts +53 -0
- package/dist/src/lib/storage/persisted.d.ts.map +1 -0
- package/dist/src/lib/storage/persisted.js +75 -0
- package/dist/src/lib/storage/persisted.mjs +70 -0
- package/dist/src/lib/theme/color-scheme.cjs +281 -0
- package/dist/src/lib/theme/color-scheme.d.ts +61 -0
- package/dist/src/lib/theme/color-scheme.d.ts.map +1 -0
- package/dist/src/lib/theme/color-scheme.js +120 -0
- package/dist/src/lib/theme/color-scheme.mjs +265 -0
- package/dist/src/lib/theme/index.cjs +194 -37
- package/dist/src/lib/theme/index.d.ts +23 -11
- package/dist/src/lib/theme/index.d.ts.map +1 -1
- package/dist/src/lib/theme/index.js +73 -32
- package/dist/src/lib/theme/index.mjs +197 -35
- package/dist/src/lib/theme/provider.cjs +346 -0
- package/dist/src/lib/theme/provider.d.ts +34 -0
- package/dist/src/lib/theme/provider.d.ts.map +1 -0
- package/dist/src/lib/theme/provider.js +60 -0
- package/dist/src/lib/theme/provider.mjs +332 -0
- package/dist/src/routes.cjs +1 -1
- package/dist/src/routes.mjs +1 -1
- package/dist/src/utils.cjs +1 -1
- package/dist/src/utils.mjs +1 -1
- package/dist/src/version.generated.cjs +1 -1
- package/dist/src/version.generated.d.ts +1 -1
- package/dist/src/version.generated.js +1 -1
- package/dist/src/version.generated.mjs +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +18 -11
- package/dist/src/lib/client/chunk-VB567ABU.mjs +0 -133
package/dist/src/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @fluixi/core v1.0.0-alpha.
|
|
1
|
+
/*! @fluixi/core v1.0.0-alpha.94 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -24,6 +24,7 @@ __export(index_exports, {
|
|
|
24
24
|
$component: () => $component,
|
|
25
25
|
Await: () => Await,
|
|
26
26
|
ClientOnly: () => import_dom16.ClientOnly,
|
|
27
|
+
ColorSchemeProvider: () => ColorSchemeProvider,
|
|
27
28
|
Dynamic: () => import_dom16.Dynamic,
|
|
28
29
|
ErrorBoundary: () => import_dom16.ErrorBoundary,
|
|
29
30
|
FRAMEWORK_NAME: () => FRAMEWORK_NAME,
|
|
@@ -40,46 +41,46 @@ __export(index_exports, {
|
|
|
40
41
|
Suspense: () => Suspense,
|
|
41
42
|
SuspenseList: () => SuspenseList,
|
|
42
43
|
Switch: () => import_dom16.Switch,
|
|
44
|
+
ThemeProvider: () => ThemeProvider,
|
|
43
45
|
VERSION: () => VERSION,
|
|
44
46
|
addClass: () => import_dom18.addClass,
|
|
45
47
|
appendChildren: () => import_dom18.appendChildren,
|
|
46
|
-
batch: () =>
|
|
48
|
+
batch: () => import_signal18.batch,
|
|
47
49
|
classMap: () => import_dom19.classMap,
|
|
48
50
|
cleanupDelegation: () => cleanupDelegation,
|
|
49
51
|
clientOnly: () => clientOnly,
|
|
50
52
|
closest: () => import_dom18.closest,
|
|
51
53
|
composeProviders: () => composeProviders,
|
|
54
|
+
createColorScheme: () => createColorScheme,
|
|
52
55
|
createComponent: () => createComponent,
|
|
53
|
-
createComputed: () =>
|
|
54
|
-
createConsumer: () => createConsumer,
|
|
56
|
+
createComputed: () => import_signal18.createComputed,
|
|
55
57
|
createContext: () => createContext3,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
createEffect: () => import_signal15.createEffect,
|
|
58
|
+
createDebounce: () => import_signal19.createDebounce,
|
|
59
|
+
createDebouncedResource: () => import_signal19.createDebouncedResource,
|
|
60
|
+
createDebouncedSignal: () => import_signal19.createDebouncedSignal,
|
|
61
|
+
createDeferred: () => import_signal18.createDeferred,
|
|
62
|
+
createEffect: () => import_signal18.createEffect,
|
|
62
63
|
createIsomorphicState: () => createIsomorphicState,
|
|
63
64
|
createIsomorphicStore: () => createIsomorphicStore,
|
|
64
|
-
createMemo: () =>
|
|
65
|
-
createMemoryStorage: () => createMemoryStorage,
|
|
65
|
+
createMemo: () => import_signal18.createMemo,
|
|
66
66
|
createProvider: () => createProvider,
|
|
67
|
-
createRenderEffect: () =>
|
|
68
|
-
createResource: () =>
|
|
69
|
-
createRoot: () =>
|
|
70
|
-
createSelector: () =>
|
|
71
|
-
createSignal: () =>
|
|
67
|
+
createRenderEffect: () => import_signal18.createRenderEffect,
|
|
68
|
+
createResource: () => import_signal18.createResource,
|
|
69
|
+
createRoot: () => import_signal18.createRoot,
|
|
70
|
+
createSelector: () => import_signal19.createSelector,
|
|
71
|
+
createSignal: () => import_signal18.createSignal,
|
|
72
72
|
createStore: () => import_store.createStore,
|
|
73
73
|
createTheme: () => createTheme,
|
|
74
|
+
css: () => import_dom17.css,
|
|
74
75
|
default: () => core_default,
|
|
75
76
|
deferred: () => deferred,
|
|
76
77
|
delegate: () => import_dom18.delegate,
|
|
77
78
|
domCreateElement: () => import_dom18.createElement,
|
|
78
|
-
effect: () =>
|
|
79
|
+
effect: () => import_signal18.effect,
|
|
79
80
|
env: () => env,
|
|
80
81
|
getAttribute: () => import_dom18.getAttribute,
|
|
81
82
|
getOffset: () => import_dom18.getOffset,
|
|
82
|
-
getOwner: () =>
|
|
83
|
+
getOwner: () => import_signal18.getOwner,
|
|
83
84
|
getStyle: () => import_dom18.getStyle,
|
|
84
85
|
hasClass: () => import_dom18.hasClass,
|
|
85
86
|
html: () => import_dom17.html,
|
|
@@ -93,11 +94,11 @@ __export(index_exports, {
|
|
|
93
94
|
isServer: () => import_dom12.isServer,
|
|
94
95
|
isVisible: () => import_dom18.isVisible,
|
|
95
96
|
lazy: () => lazy,
|
|
96
|
-
memo: () =>
|
|
97
|
+
memo: () => import_signal18.memo,
|
|
97
98
|
mergeProps: () => import_dom19.mergeProps,
|
|
98
99
|
observeIntersection: () => import_dom18.observeIntersection,
|
|
99
100
|
observeResize: () => import_dom18.observeResize,
|
|
100
|
-
onCleanup: () =>
|
|
101
|
+
onCleanup: () => import_signal18.onCleanup,
|
|
101
102
|
onMount: () => onMount,
|
|
102
103
|
onUnmount: () => onUnmount,
|
|
103
104
|
portal: () => portal,
|
|
@@ -109,22 +110,23 @@ __export(index_exports, {
|
|
|
109
110
|
removeChildren: () => import_dom18.removeChildren,
|
|
110
111
|
removeClass: () => import_dom18.removeClass,
|
|
111
112
|
render: () => render,
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
requireContext: () => requireContext,
|
|
114
|
+
resource: () => import_signal18.resource,
|
|
115
|
+
runWithOwner: () => import_signal18.runWithOwner,
|
|
114
116
|
scrollIntoView: () => import_dom18.scrollIntoView,
|
|
115
117
|
setAttribute: () => import_dom18.setAttribute,
|
|
116
|
-
setOwner: () =>
|
|
118
|
+
setOwner: () => import_signal18.setOwner,
|
|
117
119
|
setStyles: () => import_dom18.setStyles,
|
|
118
|
-
signal: () =>
|
|
120
|
+
signal: () => import_signal18.signal,
|
|
119
121
|
splitProps: () => import_dom19.splitProps,
|
|
120
|
-
storage: () => storage,
|
|
121
122
|
styleMap: () => import_dom19.styleMap,
|
|
122
123
|
svg: () => import_dom17.svg,
|
|
123
124
|
toggleClass: () => import_dom18.toggleClass,
|
|
124
|
-
untrack: () =>
|
|
125
|
+
untrack: () => import_signal18.untrack,
|
|
125
126
|
untrackStore: () => import_store.untrackStore,
|
|
126
127
|
unwrap: () => import_store.unwrap,
|
|
127
128
|
useCallback: () => useCallback,
|
|
129
|
+
useColorScheme: () => useColorScheme,
|
|
128
130
|
useContext: () => useContext3,
|
|
129
131
|
useEffect: () => useEffect,
|
|
130
132
|
useEventListener: () => useEventListener,
|
|
@@ -132,20 +134,20 @@ __export(index_exports, {
|
|
|
132
134
|
useMemo: () => useMemo,
|
|
133
135
|
useNavigate: () => useNavigate,
|
|
134
136
|
useParams: () => useParams,
|
|
135
|
-
useProvide: () => useProvide,
|
|
136
137
|
useReducer: () => useReducer,
|
|
137
138
|
useRef: () => useRef,
|
|
138
139
|
useRouter: () => useRouter,
|
|
140
|
+
useTheme: () => useTheme,
|
|
139
141
|
waitForElement: () => import_dom18.waitForElement
|
|
140
142
|
});
|
|
141
143
|
module.exports = __toCommonJS(index_exports);
|
|
142
144
|
|
|
143
145
|
// src/version.generated.ts
|
|
144
|
-
var VERSION = "1.0.0-alpha.
|
|
146
|
+
var VERSION = "1.0.0-alpha.94";
|
|
145
147
|
|
|
146
148
|
// src/lib/core.ts
|
|
147
|
-
var
|
|
148
|
-
var
|
|
149
|
+
var import_signal18 = require("@fluixi/reactive/signal");
|
|
150
|
+
var import_signal19 = require("@fluixi/reactive/signal");
|
|
149
151
|
var import_operators = require("@fluixi/reactive/operators");
|
|
150
152
|
|
|
151
153
|
// src/lib/render/index.ts
|
|
@@ -647,81 +649,20 @@ function cleanupDelegation() {
|
|
|
647
649
|
// src/lib/context/context.ts
|
|
648
650
|
var import_dom10 = require("@fluixi/dom");
|
|
649
651
|
var import_signal7 = require("@fluixi/reactive/signal");
|
|
650
|
-
var import_signal8 = require("@fluixi/reactive/signal");
|
|
651
|
-
var _warnedEagerProvider = false;
|
|
652
|
-
function warnEagerProvider() {
|
|
653
|
-
if (_warnedEagerProvider) return;
|
|
654
|
-
_warnedEagerProvider = true;
|
|
655
|
-
if (typeof process !== "undefined" && true) return;
|
|
656
|
-
console.warn(
|
|
657
|
-
"[fluixi] createProvider({ context, value, children }) reads `children` eagerly: the object literal materialises `children` BEFORE the context is stamped, so a routed <Outlet/> that has siblings inside the provider renders detached and its descendants see no context under SSR. Use the lazy form instead:\n createProvider(Context, value, props) // children stays a getter\n // or JSX: <Context.Provider value={...}>{props.children}</Context.Provider>"
|
|
658
|
-
);
|
|
659
|
-
}
|
|
660
|
-
function createProvider(a, value, childProps) {
|
|
661
|
-
const isLazyForm = !!a?.Provider;
|
|
662
|
-
const context = isLazyForm ? a : a.context;
|
|
663
|
-
const rawValue = isLazyForm ? value : a.value;
|
|
664
|
-
const debug = isLazyForm ? false : a.debug ?? false;
|
|
665
|
-
if (!isLazyForm) warnEagerProvider();
|
|
666
|
-
const resolvedValue = typeof rawValue === "function" ? rawValue() : rawValue;
|
|
667
|
-
const sourceProps = isLazyForm ? childProps : a;
|
|
668
|
-
return context.Provider({
|
|
669
|
-
value: resolvedValue,
|
|
670
|
-
get children() {
|
|
671
|
-
return sourceProps?.children;
|
|
672
|
-
},
|
|
673
|
-
debug
|
|
674
|
-
});
|
|
675
|
-
}
|
|
676
|
-
function createContextWithProvider(defaultValue) {
|
|
677
|
-
const context = createContext3(defaultValue);
|
|
678
|
-
const provider = (props) => {
|
|
679
|
-
return createProvider(context, props.value, props);
|
|
680
|
-
};
|
|
681
|
-
return [context, provider];
|
|
682
|
-
}
|
|
683
|
-
function composeProviders(contexts, children) {
|
|
684
|
-
if (contexts.length === 0) {
|
|
685
|
-
return (0, import_signal8.readChildren)(() => children);
|
|
686
|
-
}
|
|
687
|
-
const [context, value] = contexts[0];
|
|
688
|
-
const remaining = contexts.slice(1);
|
|
689
|
-
return createProvider(context, value, {
|
|
690
|
-
get children() {
|
|
691
|
-
return composeProviders(remaining, children);
|
|
692
|
-
}
|
|
693
|
-
});
|
|
694
|
-
}
|
|
695
|
-
function createConsumer(context) {
|
|
696
|
-
return (props) => {
|
|
697
|
-
const value = useContext3(context);
|
|
698
|
-
return props.children(value);
|
|
699
|
-
};
|
|
700
|
-
}
|
|
701
|
-
function useProvide(context, factory) {
|
|
702
|
-
const existing = useContext3(context);
|
|
703
|
-
if (existing === context.defaultValue) {
|
|
704
|
-
return factory();
|
|
705
|
-
}
|
|
706
|
-
return existing;
|
|
707
|
-
}
|
|
708
652
|
function createContext3(defaultValue, name) {
|
|
709
653
|
const context = (0, import_signal7.createContext)(defaultValue, name);
|
|
710
|
-
const Provider = (props) =>
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
654
|
+
const Provider = (props) => (
|
|
655
|
+
// Children stay a getter: the reactive Provider reads them after stamping the value on
|
|
656
|
+
// its owner. Reading `props.children` here would render them, and any <Outlet/> in them,
|
|
657
|
+
// before the context exists.
|
|
658
|
+
context.Provider({
|
|
714
659
|
value: props.value,
|
|
715
660
|
get children() {
|
|
716
661
|
return props.children;
|
|
717
662
|
},
|
|
718
663
|
debug: props.debug
|
|
719
|
-
})
|
|
720
|
-
|
|
721
|
-
if (typeof Symbol !== "undefined" && Symbol.for) {
|
|
722
|
-
Provider.$$typeof = /* @__PURE__ */ Symbol.for("react.provider");
|
|
723
|
-
}
|
|
724
|
-
Provider.$$typeof = /* @__PURE__ */ Symbol.for("react.provider");
|
|
664
|
+
})
|
|
665
|
+
);
|
|
725
666
|
return {
|
|
726
667
|
id: context.id,
|
|
727
668
|
Provider: (0, import_dom10.asProvider)(Provider),
|
|
@@ -732,10 +673,38 @@ function useContext3(context) {
|
|
|
732
673
|
const value = (0, import_signal7.useContext)(context);
|
|
733
674
|
return value !== void 0 ? value : context.defaultValue;
|
|
734
675
|
}
|
|
676
|
+
function createProvider(context, value, props) {
|
|
677
|
+
const resolved = typeof value === "function" ? value() : value;
|
|
678
|
+
return context.Provider({
|
|
679
|
+
value: resolved,
|
|
680
|
+
get children() {
|
|
681
|
+
return props.children;
|
|
682
|
+
}
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
function composeProviders(providers, props) {
|
|
686
|
+
const outermost = providers.reduceRight(
|
|
687
|
+
(inner, [context, value]) => ({
|
|
688
|
+
get children() {
|
|
689
|
+
return createProvider(context, value, inner);
|
|
690
|
+
}
|
|
691
|
+
}),
|
|
692
|
+
props
|
|
693
|
+
);
|
|
694
|
+
return outermost.children;
|
|
695
|
+
}
|
|
696
|
+
function requireContext(context, message) {
|
|
697
|
+
for (let owner = (0, import_signal7.getOwner)(); owner; owner = owner.parent) {
|
|
698
|
+
if (owner.contexts?.has(context.id)) return useContext3(context);
|
|
699
|
+
}
|
|
700
|
+
throw new Error(message ?? `[fluixi] No Provider for ${context.id.description ?? "this context"} above this component.`);
|
|
701
|
+
}
|
|
735
702
|
|
|
736
703
|
// src/lib/isomorphic.ts
|
|
737
|
-
var
|
|
704
|
+
var import_signal8 = require("@fluixi/reactive/signal");
|
|
738
705
|
var import_dom11 = require("@fluixi/dom");
|
|
706
|
+
var import_storage = require("@fluixi/storage");
|
|
707
|
+
var import_browser = require("@fluixi/storage/browser");
|
|
739
708
|
var REGISTRY_KEY = "__fluixi_iso_states__";
|
|
740
709
|
var SEED_PREFIX = "__iso:";
|
|
741
710
|
function registry() {
|
|
@@ -749,7 +718,7 @@ function readSeed(key) {
|
|
|
749
718
|
function createIsomorphicState(key, options) {
|
|
750
719
|
const seed = readSeed(key);
|
|
751
720
|
const initial = seed !== void 0 ? seed : typeof window !== "undefined" && options.client ? options.client() : options.fallback;
|
|
752
|
-
const [value, set] = (0,
|
|
721
|
+
const [value, set] = (0, import_signal8.createSignal)(initial, { name: key });
|
|
753
722
|
registry().set(key, { server: options.server, set });
|
|
754
723
|
return { value, set, key };
|
|
755
724
|
}
|
|
@@ -761,9 +730,12 @@ function createIsomorphicStore(key, options) {
|
|
|
761
730
|
});
|
|
762
731
|
const value = () => base.value() ?? options.fallback;
|
|
763
732
|
const persistWrite = (v) => {
|
|
764
|
-
|
|
733
|
+
const target = options.persist;
|
|
734
|
+
if (!target) return;
|
|
735
|
+
if (typeof target === "string" && typeof window === "undefined") return;
|
|
765
736
|
try {
|
|
766
|
-
|
|
737
|
+
const { storage, key: key2 } = typeof target === "string" ? { storage: (0, import_storage.createSyncStorage)({ adapter: (0, import_browser.localStorageAdapter)() }), key: target } : target;
|
|
738
|
+
storage.set(key2, v);
|
|
767
739
|
} catch {
|
|
768
740
|
}
|
|
769
741
|
};
|
|
@@ -776,7 +748,7 @@ function createIsomorphicStore(key, options) {
|
|
|
776
748
|
};
|
|
777
749
|
const fields = {};
|
|
778
750
|
for (const k of Object.keys(options.fallback)) {
|
|
779
|
-
fields[k] = (0,
|
|
751
|
+
fields[k] = (0, import_signal8.createMemo)(() => value()[k], void 0, { name: `${key}.${String(k)}` });
|
|
780
752
|
}
|
|
781
753
|
let initPromise = null;
|
|
782
754
|
const ensureInit = () => {
|
|
@@ -800,20 +772,6 @@ var import_dom13 = require("@fluixi/dom");
|
|
|
800
772
|
function isClient() {
|
|
801
773
|
return !(0, import_dom13.isServer)();
|
|
802
774
|
}
|
|
803
|
-
function createMemoryStorage() {
|
|
804
|
-
const mem = /* @__PURE__ */ new Map();
|
|
805
|
-
return {
|
|
806
|
-
getItem: (k) => mem.has(k) ? mem.get(k) : null,
|
|
807
|
-
setItem: (k, v) => void mem.set(k, String(v)),
|
|
808
|
-
removeItem: (k) => void mem.delete(k),
|
|
809
|
-
clear: () => mem.clear(),
|
|
810
|
-
key: (i) => Array.from(mem.keys())[i] ?? null,
|
|
811
|
-
get length() {
|
|
812
|
-
return mem.size;
|
|
813
|
-
}
|
|
814
|
-
};
|
|
815
|
-
}
|
|
816
|
-
var storage = typeof localStorage !== "undefined" ? localStorage : createMemoryStorage();
|
|
817
775
|
var env = {
|
|
818
776
|
get window() {
|
|
819
777
|
return typeof window !== "undefined" ? window : void 0;
|
|
@@ -827,36 +785,205 @@ function clientOnly(fn, fallback) {
|
|
|
827
785
|
}
|
|
828
786
|
|
|
829
787
|
// src/lib/theme/index.ts
|
|
788
|
+
var import_head = require("@fluixi/head");
|
|
789
|
+
var import_signal11 = require("@fluixi/reactive/signal");
|
|
790
|
+
var import_storage3 = require("@fluixi/storage");
|
|
791
|
+
|
|
792
|
+
// src/lib/storage/persisted.ts
|
|
793
|
+
var import_signal9 = require("@fluixi/reactive/signal");
|
|
794
|
+
var isAsync = (storage) => "encryption" in storage;
|
|
795
|
+
function persisted(storage, key, options = {}) {
|
|
796
|
+
const fallback = options.fallback ?? null;
|
|
797
|
+
const name = options.name ?? `storage:${storage.keyPrefix}${key}`;
|
|
798
|
+
const state = (0, import_signal9.signal)(isAsync(storage) ? fallback : storage.get(key) ?? fallback, { name });
|
|
799
|
+
const put = (value) => state.set(() => value);
|
|
800
|
+
const resolve = (next) => typeof next === "function" ? next((0, import_signal9.untrack)(state)) : next;
|
|
801
|
+
const writeOptions = (extra) => ({
|
|
802
|
+
...options.ttl !== void 0 ? { ttl: options.ttl } : {},
|
|
803
|
+
...options.encrypt ? { encrypt: true } : {},
|
|
804
|
+
...extra
|
|
805
|
+
});
|
|
806
|
+
if (!isAsync(storage)) {
|
|
807
|
+
const off2 = storage.subscribe(key, (event) => {
|
|
808
|
+
if (event.type !== "set") return put(fallback);
|
|
809
|
+
if (event.value !== void 0) put(event.value);
|
|
810
|
+
});
|
|
811
|
+
if ((0, import_signal9.getOwner)()) (0, import_signal9.onCleanup)(off2);
|
|
812
|
+
return Object.assign(() => state(), {
|
|
813
|
+
set(next, extra) {
|
|
814
|
+
const value = resolve(next);
|
|
815
|
+
storage.set(key, value, writeOptions(extra));
|
|
816
|
+
put(value);
|
|
817
|
+
},
|
|
818
|
+
remove() {
|
|
819
|
+
storage.remove(key);
|
|
820
|
+
put(fallback);
|
|
821
|
+
}
|
|
822
|
+
});
|
|
823
|
+
}
|
|
824
|
+
let written = false;
|
|
825
|
+
const reread = () => storage.get(key).then(
|
|
826
|
+
(value) => put(value ?? fallback),
|
|
827
|
+
() => void 0
|
|
828
|
+
);
|
|
829
|
+
const off = storage.subscribe(key, (event) => {
|
|
830
|
+
if (event.type !== "set") return put(fallback);
|
|
831
|
+
if (event.value !== void 0) put(event.value);
|
|
832
|
+
else void reread();
|
|
833
|
+
});
|
|
834
|
+
if ((0, import_signal9.getOwner)()) (0, import_signal9.onCleanup)(off);
|
|
835
|
+
const ready = storage.get(key).then((value) => {
|
|
836
|
+
if (!written) put(value ?? fallback);
|
|
837
|
+
});
|
|
838
|
+
return Object.assign(() => state(), {
|
|
839
|
+
ready,
|
|
840
|
+
async set(next, extra) {
|
|
841
|
+
const previous = (0, import_signal9.untrack)(state);
|
|
842
|
+
const value = resolve(next);
|
|
843
|
+
written = true;
|
|
844
|
+
put(value);
|
|
845
|
+
try {
|
|
846
|
+
await storage.set(key, value, writeOptions(extra));
|
|
847
|
+
} catch (error) {
|
|
848
|
+
put(previous);
|
|
849
|
+
throw error;
|
|
850
|
+
}
|
|
851
|
+
},
|
|
852
|
+
async remove() {
|
|
853
|
+
written = true;
|
|
854
|
+
await storage.remove(key);
|
|
855
|
+
put(fallback);
|
|
856
|
+
}
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// src/lib/storage/index.ts
|
|
861
|
+
var import_dom14 = require("@fluixi/dom");
|
|
830
862
|
var import_signal10 = require("@fluixi/reactive/signal");
|
|
863
|
+
var import_storage2 = require("@fluixi/storage");
|
|
864
|
+
var import_browser2 = require("@fluixi/storage/browser");
|
|
865
|
+
var import_server = require("@fluixi/storage/server");
|
|
866
|
+
var StorageContext = (0, import_signal10.createContext)(void 0, "storage");
|
|
867
|
+
var AsyncStorageContext = (0, import_signal10.createContext)(void 0, "asyncStorage");
|
|
868
|
+
var isBrowser = () => typeof window !== "undefined" && typeof document !== "undefined";
|
|
869
|
+
var perRequest = /* @__PURE__ */ new WeakMap();
|
|
870
|
+
var perPage = /* @__PURE__ */ new Map();
|
|
871
|
+
function cached(scope, id, make) {
|
|
872
|
+
let adapter = scope.get(id);
|
|
873
|
+
if (!adapter) scope.set(id, adapter = make());
|
|
874
|
+
return adapter;
|
|
875
|
+
}
|
|
876
|
+
function requestRequired(scope) {
|
|
877
|
+
throw new import_storage2.StorageUnavailableError(
|
|
878
|
+
`useStorage({ scope: '${scope}' }) on the server needs a request: call it during a render, a loader or a server function, or provide a storage with <StorageProvider>.`
|
|
879
|
+
);
|
|
880
|
+
}
|
|
881
|
+
function adapterFor(scope, cookie = {}) {
|
|
882
|
+
const ctx = (0, import_dom14.getRequestContext)();
|
|
883
|
+
const options = { httpOnly: false, ...cookie };
|
|
884
|
+
switch (scope) {
|
|
885
|
+
case "local":
|
|
886
|
+
return (0, import_browser2.localStorageAdapter)();
|
|
887
|
+
case "session":
|
|
888
|
+
return (0, import_browser2.sessionStorageAdapter)();
|
|
889
|
+
case "request":
|
|
890
|
+
if (isBrowser()) return cached(perPage, "request", import_storage2.memoryStorage);
|
|
891
|
+
if (!ctx) requestRequired(scope);
|
|
892
|
+
return cached(perRequest.get(ctx) ?? perRequest.set(ctx, /* @__PURE__ */ new Map()).get(ctx), "request", import_server.requestStorage);
|
|
893
|
+
case "cookie": {
|
|
894
|
+
const id = `cookie:${JSON.stringify(options)}`;
|
|
895
|
+
if (isBrowser()) {
|
|
896
|
+
const { httpOnly: _ignored, ...browser } = options;
|
|
897
|
+
return cached(perPage, id, () => (0, import_browser2.documentCookieAdapter)(browser));
|
|
898
|
+
}
|
|
899
|
+
if (!ctx) requestRequired(scope);
|
|
900
|
+
const raw = ctx.event.request;
|
|
901
|
+
const target = raw && typeof raw === "object" ? raw : void 0;
|
|
902
|
+
return cached(
|
|
903
|
+
perRequest.get(ctx) ?? perRequest.set(ctx, /* @__PURE__ */ new Map()).get(ctx),
|
|
904
|
+
id,
|
|
905
|
+
() => (0, import_server.cookieStorage)({
|
|
906
|
+
...options,
|
|
907
|
+
request: raw && typeof raw === "object" && ("headers" in raw || "getHeader" in raw) ? (0, import_server.toStorageRequest)(raw) : void 0,
|
|
908
|
+
response: {
|
|
909
|
+
appendHeader(name, value) {
|
|
910
|
+
if (!(0, import_dom14.appendResponseHeader)(name, value, target)) {
|
|
911
|
+
throw new import_storage2.StorageUnavailableError("The response headers were already sent, so this cookie cannot reach the browser. Write it before the page head goes out: in middleware, a loader, a server function or the render before its first chunk.");
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
})
|
|
916
|
+
);
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
function useStorage(options = {}) {
|
|
921
|
+
const { scope = "auto", cookie, ...storageOptions } = options;
|
|
922
|
+
if (scope === "auto") {
|
|
923
|
+
const provided = (0, import_signal10.useContext)(StorageContext);
|
|
924
|
+
if (provided) return options.namespace ? provided.namespace(options.namespace) : provided;
|
|
925
|
+
}
|
|
926
|
+
return (0, import_storage2.createSyncStorage)({ ...storageOptions, adapter: resolveAdapter(scope, cookie) });
|
|
927
|
+
}
|
|
928
|
+
function resolveAdapter(scope, cookie) {
|
|
929
|
+
if (scope !== "auto") return adapterFor(scope, cookie);
|
|
930
|
+
if (isBrowser()) return adapterFor("local");
|
|
931
|
+
if (!(0, import_dom14.getRequestContext)()) requestRequired(scope);
|
|
932
|
+
return adapterFor("request");
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
// src/lib/theme/index.ts
|
|
831
936
|
function systemMap(system) {
|
|
832
937
|
if (!system) return null;
|
|
833
938
|
if (system === true) return { dark: "dark", light: "light" };
|
|
834
939
|
return system;
|
|
835
940
|
}
|
|
941
|
+
var YEAR = 60 * 60 * 24 * 365;
|
|
942
|
+
function defaultStorage() {
|
|
943
|
+
try {
|
|
944
|
+
return useStorage({ scope: "cookie", cookie: { maxAge: YEAR, sameSite: "lax" } });
|
|
945
|
+
} catch (error) {
|
|
946
|
+
if (error instanceof import_storage3.StorageUnavailableError) return null;
|
|
947
|
+
throw error;
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
function storedLookup(storage, key) {
|
|
951
|
+
if (!storage) return null;
|
|
952
|
+
const full = storage.keyPrefix + key;
|
|
953
|
+
if (storage.scope === "cookie") {
|
|
954
|
+
return { from: "cookie", name: encodeURIComponent(full).replace(/[()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`) };
|
|
955
|
+
}
|
|
956
|
+
if (storage.scope === "local") return { from: "local", name: full };
|
|
957
|
+
return null;
|
|
958
|
+
}
|
|
836
959
|
function createTheme(options) {
|
|
837
960
|
const storageKey = options.storageKey ?? "theme";
|
|
838
961
|
const attribute = options.attribute ?? "data-theme";
|
|
839
962
|
const sys = systemMap(options.system);
|
|
840
|
-
const
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
963
|
+
const storage = options.storage === void 0 ? defaultStorage() : options.storage;
|
|
964
|
+
const valid = (t) => typeof t === "string" && options.themes.includes(t);
|
|
965
|
+
const fallback = sys && env.window?.matchMedia?.("(prefers-color-scheme: dark)")?.matches ? sys.dark : sys ? sys.light : options.default;
|
|
966
|
+
const stored = storage ? persisted(storage, storageKey) : null;
|
|
967
|
+
const [unsaved, setUnsaved] = (0, import_signal11.createSignal)(null);
|
|
968
|
+
const value = () => {
|
|
969
|
+
const local = unsaved();
|
|
970
|
+
if (local !== null) return local;
|
|
971
|
+
const saved = stored?.();
|
|
972
|
+
return valid(saved) ? saved : fallback;
|
|
846
973
|
};
|
|
847
|
-
const [
|
|
848
|
-
const [isLoading, setLoading] = (0, import_signal10.createSignal)(false);
|
|
974
|
+
const [isLoading, setLoading] = (0, import_signal11.createSignal)(false);
|
|
849
975
|
const apply = (t) => {
|
|
850
976
|
env.document?.documentElement.setAttribute(attribute, t);
|
|
851
|
-
try {
|
|
852
|
-
storage.setItem(storageKey, t);
|
|
853
|
-
} catch {
|
|
854
|
-
}
|
|
855
977
|
};
|
|
856
978
|
const set = (t) => {
|
|
857
979
|
if (!options.themes.includes(t)) return;
|
|
858
980
|
const prev = value();
|
|
859
|
-
|
|
981
|
+
try {
|
|
982
|
+
stored?.set(t);
|
|
983
|
+
setUnsaved(stored ? null : t);
|
|
984
|
+
} catch {
|
|
985
|
+
setUnsaved(() => t);
|
|
986
|
+
}
|
|
860
987
|
apply(t);
|
|
861
988
|
options.onChange?.(t, prev);
|
|
862
989
|
if (options.load) {
|
|
@@ -873,20 +1000,130 @@ function createTheme(options) {
|
|
|
873
1000
|
set(options.themes[(i + 1) % options.themes.length]);
|
|
874
1001
|
};
|
|
875
1002
|
const init = () => apply(value());
|
|
876
|
-
const
|
|
877
|
-
const cfg = JSON.stringify({
|
|
878
|
-
|
|
879
|
-
a: attribute,
|
|
880
|
-
d: options.default,
|
|
881
|
-
sys
|
|
882
|
-
});
|
|
883
|
-
return `<script>(function(){try{var c=${cfg},t=localStorage.getItem(c.k);if(!t&&c.sys)t=matchMedia('(prefers-color-scheme: dark)').matches?c.sys.dark:c.sys.light;if(!t)t=c.d;document.documentElement.setAttribute(c.a,t);}catch(e){}})();<\/script>`;
|
|
1003
|
+
const scriptBody = () => {
|
|
1004
|
+
const cfg = JSON.stringify({ s: storedLookup(storage, storageKey), a: attribute, d: options.default, sys, ts: options.themes }).replace(/</g, "\\u003c");
|
|
1005
|
+
return `(function(){try{var c=${cfg},t=null,s=c.s,r=null;if(s&&s.from==='local')r=localStorage.getItem(s.name);if(s&&s.from==='cookie')document.cookie.split('; ').forEach(function(p){var i=p.indexOf('=');if(p.slice(0,i)===s.name)r=decodeURIComponent(p.slice(i+1));});if(r){var e=JSON.parse(r);t=e&&e.v===1?e.value:e;}if(c.ts.indexOf(t)<0)t=null;if(!t&&c.sys)t=matchMedia('(prefers-color-scheme: dark)').matches?c.sys.dark:c.sys.light;if(!t)t=c.d;document.documentElement.setAttribute(c.a,t);}catch(e){}})();`;
|
|
884
1006
|
};
|
|
1007
|
+
const headScript = () => `<script>${scriptBody()}<\/script>`;
|
|
1008
|
+
if ((0, import_head.getActiveHead)()) {
|
|
1009
|
+
(0, import_head.useHead)({
|
|
1010
|
+
htmlAttrs: { [attribute]: () => value() },
|
|
1011
|
+
...options.script === false ? {} : { script: [{ children: scriptBody() }] }
|
|
1012
|
+
});
|
|
1013
|
+
}
|
|
885
1014
|
return { value, isLoading, set, toggle, init, headScript };
|
|
886
1015
|
}
|
|
887
1016
|
|
|
888
|
-
// src/lib/
|
|
1017
|
+
// src/lib/theme/color-scheme.ts
|
|
1018
|
+
var import_head2 = require("@fluixi/head");
|
|
889
1019
|
var import_signal12 = require("@fluixi/reactive/signal");
|
|
1020
|
+
var CHOICES = ["system", "light", "dark"];
|
|
1021
|
+
var DARK = "(prefers-color-scheme: dark)";
|
|
1022
|
+
function createColorScheme(options = {}) {
|
|
1023
|
+
const storageKey = options.storageKey ?? "color-scheme";
|
|
1024
|
+
const attribute = options.attribute ?? "data-theme";
|
|
1025
|
+
const systemAs = options.systemAs ?? "resolved";
|
|
1026
|
+
const storage = options.storage === void 0 ? defaultStorage() : options.storage;
|
|
1027
|
+
const saved = storage ? persisted(storage, storageKey) : null;
|
|
1028
|
+
const [unsaved, setUnsaved] = (0, import_signal12.createSignal)(null);
|
|
1029
|
+
const value = () => {
|
|
1030
|
+
const local = unsaved();
|
|
1031
|
+
if (local) return local;
|
|
1032
|
+
const stored = saved?.();
|
|
1033
|
+
return CHOICES.includes(stored) ? stored : "system";
|
|
1034
|
+
};
|
|
1035
|
+
const media = env.window?.matchMedia?.(DARK);
|
|
1036
|
+
const [osDark, setOsDark] = (0, import_signal12.createSignal)(media?.matches ?? false);
|
|
1037
|
+
if (media) {
|
|
1038
|
+
const onChange = () => setOsDark(media.matches);
|
|
1039
|
+
media.addEventListener?.("change", onChange);
|
|
1040
|
+
if ((0, import_signal12.getOwner)()) (0, import_signal12.onCleanup)(() => media.removeEventListener?.("change", onChange));
|
|
1041
|
+
}
|
|
1042
|
+
const resolved = () => {
|
|
1043
|
+
const choice = value();
|
|
1044
|
+
return choice === "system" ? osDark() ? "dark" : "light" : choice;
|
|
1045
|
+
};
|
|
1046
|
+
const shown = () => systemAs === "system" && value() === "system" ? "system" : resolved();
|
|
1047
|
+
const apply = () => {
|
|
1048
|
+
env.document?.documentElement.setAttribute(attribute, shown());
|
|
1049
|
+
};
|
|
1050
|
+
const set = (choice) => {
|
|
1051
|
+
if (!CHOICES.includes(choice)) return;
|
|
1052
|
+
if (!saved) setUnsaved(choice);
|
|
1053
|
+
else {
|
|
1054
|
+
try {
|
|
1055
|
+
saved.set(choice);
|
|
1056
|
+
setUnsaved(null);
|
|
1057
|
+
} catch {
|
|
1058
|
+
setUnsaved(choice);
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
apply();
|
|
1062
|
+
options.onChange?.(choice);
|
|
1063
|
+
};
|
|
1064
|
+
const scriptBody = () => {
|
|
1065
|
+
const cfg = JSON.stringify({ s: storedLookup(storage, storageKey), a: attribute, sys: systemAs === "system", tc: options.themeColor ?? null, cs: options.colorSchemeMeta !== false }).replace(/</g, "\\u003c");
|
|
1066
|
+
return `(function(){try{var c=${cfg},t=null,s=c.s,r=null;if(s&&s.from==='local')r=localStorage.getItem(s.name);if(s&&s.from==='cookie')document.cookie.split('; ').forEach(function(p){var i=p.indexOf('=');if(p.slice(0,i)===s.name)r=decodeURIComponent(p.slice(i+1));});if(r){var e=JSON.parse(r);t=e&&e.v===1?e.value:e;}var chosen=t==='light'||t==='dark'?t:null;if(!chosen)t=c.sys?'system':(matchMedia('${DARK}').matches?'dark':'light');document.documentElement.setAttribute(c.a,t);if(chosen&&c.tc)document.querySelectorAll('meta[name="theme-color"]').forEach(function(m){m.setAttribute('content',c.tc[chosen]);m.removeAttribute('media');});if(chosen&&c.cs){var m=document.querySelector('meta[name="color-scheme"]');if(m)m.setAttribute('content',chosen);}}catch(e){}})();`;
|
|
1067
|
+
};
|
|
1068
|
+
if ((0, import_head2.getActiveHead)()) {
|
|
1069
|
+
const colors = options.themeColor;
|
|
1070
|
+
(0, import_head2.useHead)({
|
|
1071
|
+
htmlAttrs: { [attribute]: shown },
|
|
1072
|
+
...colors ? {
|
|
1073
|
+
themeColor: () => value() === "system" ? [
|
|
1074
|
+
{ color: colors.light, media: "(prefers-color-scheme: light)" },
|
|
1075
|
+
{ color: colors.dark, media: DARK }
|
|
1076
|
+
] : colors[resolved()]
|
|
1077
|
+
} : {},
|
|
1078
|
+
...options.colorSchemeMeta === false ? {} : { colorScheme: () => value() === "system" ? "light dark" : resolved() },
|
|
1079
|
+
...options.script === false ? {} : { script: [{ children: scriptBody() }] }
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
if (env.document && (0, import_signal12.getOwner)()) (0, import_signal12.createEffect)(apply);
|
|
1083
|
+
return {
|
|
1084
|
+
value,
|
|
1085
|
+
resolved,
|
|
1086
|
+
set,
|
|
1087
|
+
toggle: () => set(resolved() === "dark" ? "light" : "dark"),
|
|
1088
|
+
init: apply,
|
|
1089
|
+
headScript: () => `<script>${scriptBody()}<\/script>`
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// src/lib/theme/provider.ts
|
|
1094
|
+
var ThemesContext = createContext3(void 0, "themes");
|
|
1095
|
+
function ThemeProvider(props) {
|
|
1096
|
+
const outer = useContext3(ThemesContext);
|
|
1097
|
+
return ThemesContext.Provider({
|
|
1098
|
+
// A nested provider adds to the axes above it rather than hiding them.
|
|
1099
|
+
value: outer ? { ...outer, ...props.themes } : props.themes,
|
|
1100
|
+
get children() {
|
|
1101
|
+
return props.children;
|
|
1102
|
+
}
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1105
|
+
function useTheme(name) {
|
|
1106
|
+
const themes = useContext3(ThemesContext);
|
|
1107
|
+
if (!themes || !(name in themes)) {
|
|
1108
|
+
throw new Error(`[fluixi] No theme named "${name}" above this component: provide it with <ThemeProvider> or <ColorSchemeProvider>.`);
|
|
1109
|
+
}
|
|
1110
|
+
return themes[name];
|
|
1111
|
+
}
|
|
1112
|
+
function ColorSchemeProvider(props) {
|
|
1113
|
+
const scheme = createColorScheme(props);
|
|
1114
|
+
return ThemeProvider({
|
|
1115
|
+
themes: { scheme },
|
|
1116
|
+
get children() {
|
|
1117
|
+
return props.children;
|
|
1118
|
+
}
|
|
1119
|
+
});
|
|
1120
|
+
}
|
|
1121
|
+
function useColorScheme() {
|
|
1122
|
+
return useTheme("scheme");
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
// src/lib/router/index.ts
|
|
1126
|
+
var import_signal15 = require("@fluixi/reactive/signal");
|
|
890
1127
|
|
|
891
1128
|
// src/lib/router/transition.ts
|
|
892
1129
|
function supportsViewTransitions() {
|
|
@@ -938,76 +1175,95 @@ function runTransition(mode, commit) {
|
|
|
938
1175
|
|
|
939
1176
|
// src/lib/router/index.ts
|
|
940
1177
|
var import_dom15 = require("@fluixi/dom");
|
|
941
|
-
var
|
|
1178
|
+
var import_signal16 = require("@fluixi/reactive/signal");
|
|
942
1179
|
var import_object = require("@fluixi/utils/object");
|
|
943
1180
|
var import_compare = require("@fluixi/utils/compare");
|
|
944
1181
|
var import_router = require("@fluixi/router");
|
|
945
|
-
var import_router2 = require("@fluixi/router");
|
|
946
1182
|
|
|
947
1183
|
// src/lib/router/data.ts
|
|
948
|
-
var
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
hydrationDataMap.clear();
|
|
1184
|
+
var import_signal13 = require("@fluixi/reactive/signal");
|
|
1185
|
+
var import_signal14 = require("@fluixi/reactive/signal");
|
|
1186
|
+
var revalidationListeners = /* @__PURE__ */ new Set();
|
|
1187
|
+
function onRevalidate(listener) {
|
|
1188
|
+
revalidationListeners.add(listener);
|
|
1189
|
+
return () => void revalidationListeners.delete(listener);
|
|
955
1190
|
}
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
const
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
if (text.startsWith("#") || text.startsWith("/")) {
|
|
975
|
-
comments.push(comment);
|
|
976
|
-
}
|
|
1191
|
+
var reloadMounted = () => {
|
|
1192
|
+
for (const listener of [...revalidationListeners]) listener();
|
|
1193
|
+
};
|
|
1194
|
+
function revalidate(key, store) {
|
|
1195
|
+
const names = typeof key === "string" ? [key] : Array.isArray(key) ? key : null;
|
|
1196
|
+
drop(names ?? key, store ?? (0, import_signal14.currentResourceCache)());
|
|
1197
|
+
if (names && !store) tellOtherTabs(names);
|
|
1198
|
+
}
|
|
1199
|
+
function drop(what, store) {
|
|
1200
|
+
const matches = Array.isArray(what) ? (k) => what.some((n) => k === n || k.startsWith(n + ":")) : what;
|
|
1201
|
+
for (const k of [...store.keys()]) if (matches(k)) store.delete(k);
|
|
1202
|
+
reloadMounted();
|
|
1203
|
+
}
|
|
1204
|
+
var TABS_KEY = "fluixi:revalidate";
|
|
1205
|
+
function tellOtherTabs(names) {
|
|
1206
|
+
try {
|
|
1207
|
+
localStorage.setItem(TABS_KEY, JSON.stringify({ names, at: Date.now() + Math.random() }));
|
|
1208
|
+
} catch {
|
|
977
1209
|
}
|
|
978
|
-
comments.forEach((comment) => comment.remove());
|
|
979
|
-
clearHydrationData();
|
|
980
1210
|
}
|
|
981
1211
|
if (typeof window !== "undefined") {
|
|
982
|
-
window.addEventListener("
|
|
983
|
-
|
|
1212
|
+
window.addEventListener("storage", (event) => {
|
|
1213
|
+
if (event.key !== TABS_KEY || !event.newValue) return;
|
|
1214
|
+
try {
|
|
1215
|
+
const names = JSON.parse(event.newValue).names;
|
|
1216
|
+
if (Array.isArray(names) && names.every((n) => typeof n === "string")) drop(names, (0, import_signal14.currentResourceCache)());
|
|
1217
|
+
} catch {
|
|
1218
|
+
}
|
|
984
1219
|
});
|
|
985
1220
|
}
|
|
986
|
-
|
|
987
|
-
// src/lib/router/data.ts
|
|
988
|
-
var [revalidationVersion, setRevalidationVersion] = (0, import_signal11.createSignal)(0);
|
|
1221
|
+
globalThis[/* @__PURE__ */ Symbol.for("fluixi.revalidate")] = (names) => revalidate(names);
|
|
989
1222
|
var RouteDataContext = createContext3(void 0, "route-data");
|
|
990
1223
|
var RouteDataProvider = RouteDataContext.Provider;
|
|
991
1224
|
|
|
992
1225
|
// src/lib/router/index.ts
|
|
993
|
-
var
|
|
994
|
-
var
|
|
995
|
-
var
|
|
996
|
-
var
|
|
997
|
-
var
|
|
1226
|
+
var import_router2 = require("@fluixi/router");
|
|
1227
|
+
var import_signal17 = require("@fluixi/reactive/signal");
|
|
1228
|
+
var RouterContext = (0, import_signal16.createContext)(void 0, "router");
|
|
1229
|
+
var OutletContext = (0, import_signal16.createContext)(void 0, "outlet");
|
|
1230
|
+
var LevelParamsContext = (0, import_signal16.createContext)(void 0, "route-params");
|
|
1231
|
+
var RouteDataContext2 = (0, import_signal16.createContext)(void 0, "route-data");
|
|
998
1232
|
function renderLayer(m, depth, base) {
|
|
999
1233
|
let data;
|
|
1000
1234
|
const loader = m.route.data;
|
|
1001
1235
|
if (typeof loader === "function") {
|
|
1002
1236
|
let cancelled = false;
|
|
1003
|
-
(0,
|
|
1237
|
+
(0, import_signal15.onCleanup)(() => {
|
|
1004
1238
|
cancelled = true;
|
|
1005
1239
|
});
|
|
1006
|
-
const owner = (0,
|
|
1007
|
-
const
|
|
1008
|
-
|
|
1009
|
-
)
|
|
1010
|
-
|
|
1240
|
+
const owner = (0, import_signal15.getOwner)();
|
|
1241
|
+
const router = (0, import_signal16.useContext)(RouterContext);
|
|
1242
|
+
let watching = false;
|
|
1243
|
+
const trackDeps = (deps) => {
|
|
1244
|
+
if (watching || cancelled) return;
|
|
1245
|
+
watching = true;
|
|
1246
|
+
(0, import_signal15.runWithOwner)(owner, () => {
|
|
1247
|
+
let first = true;
|
|
1248
|
+
(0, import_signal15.createEffect)(() => {
|
|
1249
|
+
deps();
|
|
1250
|
+
if (first) first = false;
|
|
1251
|
+
else (0, import_signal15.untrack)(() => void refetch());
|
|
1252
|
+
});
|
|
1253
|
+
});
|
|
1254
|
+
};
|
|
1255
|
+
const [resource2, { refetch }] = (0, import_signal15.createResource)(() => {
|
|
1256
|
+
const result = loader({ params: base.params, location: base.location }, owner, () => cancelled, trackDeps);
|
|
1257
|
+
return router ? router.trackLoad(result) : result;
|
|
1258
|
+
});
|
|
1259
|
+
(0, import_signal15.onCleanup)(onRevalidate(() => void refetch()));
|
|
1260
|
+
data = () => {
|
|
1261
|
+
const error = resource2.error;
|
|
1262
|
+
if (error !== void 0 && error !== null) throw error;
|
|
1263
|
+
return resource2();
|
|
1264
|
+
};
|
|
1265
|
+
Object.defineProperty(data, "loading", { get: () => resource2.loading });
|
|
1266
|
+
Object.defineProperty(data, "state", { get: () => resource2.state });
|
|
1011
1267
|
}
|
|
1012
1268
|
const buildPage = () => RouteDataContext2.Provider({
|
|
1013
1269
|
value: data,
|
|
@@ -1025,33 +1281,62 @@ function renderLayer(m, depth, base) {
|
|
|
1025
1281
|
});
|
|
1026
1282
|
}
|
|
1027
1283
|
});
|
|
1028
|
-
if (!data) return buildPage();
|
|
1284
|
+
if (!data) return { view: buildPage(), ready: () => true };
|
|
1029
1285
|
const res = data;
|
|
1030
|
-
const isLoading = () =>
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1286
|
+
const isLoading = () => {
|
|
1287
|
+
const state = res.state;
|
|
1288
|
+
return state === void 0 ? res.loading : state === "pending" || state === "unresolved";
|
|
1289
|
+
};
|
|
1290
|
+
const [ready, setReady] = (0, import_signal15.createSignal)((0, import_signal15.untrack)(() => !isLoading()));
|
|
1291
|
+
(0, import_signal15.createEffect)(() => setReady(!isLoading()));
|
|
1292
|
+
return { view: (0, import_signal15.createMemo)(() => ready() ? buildPage() : null), ready };
|
|
1034
1293
|
}
|
|
1035
1294
|
function renderChild(ctx) {
|
|
1036
1295
|
const childIdx = ctx.depth + 1;
|
|
1037
|
-
const [childComp, setChildComp] = (0,
|
|
1038
|
-
(0,
|
|
1296
|
+
const [childComp, setChildComp] = (0, import_signal15.createSignal)(
|
|
1297
|
+
(0, import_signal15.untrack)(() => ctx.matched()[childIdx]?.component)
|
|
1039
1298
|
);
|
|
1040
|
-
(0,
|
|
1299
|
+
(0, import_signal15.createEffect)(() => {
|
|
1041
1300
|
const c = ctx.matched()[childIdx]?.component;
|
|
1042
|
-
if ((0,
|
|
1301
|
+
if ((0, import_signal15.untrack)(childComp) !== c) setChildComp(() => c);
|
|
1043
1302
|
});
|
|
1044
|
-
|
|
1303
|
+
const owner = (0, import_signal15.getOwner)();
|
|
1304
|
+
let shown = null;
|
|
1305
|
+
let pending = null;
|
|
1306
|
+
const drop2 = (layer) => layer?.dispose();
|
|
1307
|
+
(0, import_signal15.onCleanup)(() => {
|
|
1308
|
+
drop2(shown);
|
|
1309
|
+
drop2(pending);
|
|
1310
|
+
shown = pending = null;
|
|
1311
|
+
});
|
|
1312
|
+
const incoming = (0, import_signal15.createMemo)(() => {
|
|
1045
1313
|
const component = childComp();
|
|
1046
|
-
if (!component)
|
|
1314
|
+
if (!component) return null;
|
|
1315
|
+
const m = (0, import_signal15.untrack)(() => ctx.matched())[childIdx];
|
|
1316
|
+
return (0, import_signal15.runWithOwner)(
|
|
1317
|
+
owner,
|
|
1318
|
+
() => (0, import_signal15.createRoot)((dispose) => ({
|
|
1319
|
+
...renderLayer(m, childIdx, { matched: ctx.matched, params: ctx.params, location: ctx.location }),
|
|
1320
|
+
dispose
|
|
1321
|
+
}))
|
|
1322
|
+
);
|
|
1323
|
+
});
|
|
1324
|
+
return (0, import_signal15.createMemo)(() => {
|
|
1325
|
+
const next = incoming();
|
|
1326
|
+
if (!next) {
|
|
1327
|
+
drop2(shown);
|
|
1328
|
+
drop2(pending);
|
|
1329
|
+
shown = pending = null;
|
|
1047
1330
|
return ctx.notFound ? ctx.notFound() : null;
|
|
1048
1331
|
}
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1332
|
+
if (next === shown) return shown.view;
|
|
1333
|
+
if (pending && pending !== next) drop2(pending);
|
|
1334
|
+
pending = next;
|
|
1335
|
+
if (shown && !next.ready()) return shown.view;
|
|
1336
|
+
drop2(shown);
|
|
1337
|
+
shown = next;
|
|
1338
|
+
pending = null;
|
|
1339
|
+
return shown.view;
|
|
1055
1340
|
});
|
|
1056
1341
|
}
|
|
1057
1342
|
function renderNotFound(notFound) {
|
|
@@ -1085,7 +1370,9 @@ function Router(props) {
|
|
|
1085
1370
|
base: props.base,
|
|
1086
1371
|
history
|
|
1087
1372
|
});
|
|
1088
|
-
const [state, setState] = (0,
|
|
1373
|
+
const [state, setState] = (0, import_signal15.createSignal)(router.state());
|
|
1374
|
+
const [navigating, setNavigating] = (0, import_signal15.createSignal)(false);
|
|
1375
|
+
const [loads, setLoads] = (0, import_signal15.createSignal)(0);
|
|
1089
1376
|
let navigationId = 0;
|
|
1090
1377
|
const takeMode = () => {
|
|
1091
1378
|
const mode = pendingTransitionMode ?? (props.transition ?? "auto");
|
|
@@ -1095,12 +1382,15 @@ function Router(props) {
|
|
|
1095
1382
|
const unsub = router.subscribe((next) => {
|
|
1096
1383
|
const id = ++navigationId;
|
|
1097
1384
|
const mode = takeMode();
|
|
1385
|
+
setNavigating(true);
|
|
1098
1386
|
const prepared = prepareComponents(
|
|
1099
1387
|
(next.match?.matched ?? []).map((m) => m.component).filter(Boolean)
|
|
1100
1388
|
);
|
|
1101
1389
|
const commit = () => {
|
|
1102
1390
|
setState(next);
|
|
1103
|
-
|
|
1391
|
+
const flushed = (0, import_signal15.flush)();
|
|
1392
|
+
if (id === navigationId) setNavigating(false);
|
|
1393
|
+
return flushed;
|
|
1104
1394
|
};
|
|
1105
1395
|
if (!prepared) {
|
|
1106
1396
|
void runTransition(mode, commit);
|
|
@@ -1111,18 +1401,29 @@ function Router(props) {
|
|
|
1111
1401
|
return runTransition(mode, commit);
|
|
1112
1402
|
});
|
|
1113
1403
|
});
|
|
1114
|
-
(0,
|
|
1404
|
+
(0, import_signal15.onCleanup)(() => {
|
|
1115
1405
|
unsub();
|
|
1116
1406
|
router.destroy();
|
|
1117
1407
|
navigationId++;
|
|
1118
1408
|
});
|
|
1119
|
-
const matched = (0,
|
|
1409
|
+
const matched = (0, import_signal15.createMemo)(
|
|
1120
1410
|
() => (state().match?.matched ?? []).filter((m) => m.component)
|
|
1121
1411
|
);
|
|
1122
1412
|
const ctx = {
|
|
1123
1413
|
router,
|
|
1124
|
-
location: (0,
|
|
1125
|
-
params: (0,
|
|
1414
|
+
location: (0, import_signal15.createMemo)(() => state().location),
|
|
1415
|
+
params: (0, import_signal15.createMemo)(() => state().match?.params ?? {}),
|
|
1416
|
+
isRouting: () => navigating() || loads() > 0,
|
|
1417
|
+
// Counted by the promise, not by an owner: a load a newer navigation superseded still
|
|
1418
|
+
// settles and uncounts itself, and a resource seeded from the server never calls it.
|
|
1419
|
+
trackLoad(result) {
|
|
1420
|
+
if (result && typeof result.finally === "function") {
|
|
1421
|
+
setLoads((n) => n + 1);
|
|
1422
|
+
void result.finally(() => setLoads((n) => n - 1)).catch(() => {
|
|
1423
|
+
});
|
|
1424
|
+
}
|
|
1425
|
+
return result;
|
|
1426
|
+
}
|
|
1126
1427
|
};
|
|
1127
1428
|
const root = {
|
|
1128
1429
|
depth: -1,
|
|
@@ -1144,17 +1445,19 @@ var _ssrRouterStub = {
|
|
|
1144
1445
|
router: { navigate: () => {
|
|
1145
1446
|
} },
|
|
1146
1447
|
location: () => ({ pathname: "", search: "", hash: "", query: {} }),
|
|
1147
|
-
params: () => ({})
|
|
1448
|
+
params: () => ({}),
|
|
1449
|
+
isRouting: () => false,
|
|
1450
|
+
trackLoad: (result) => result
|
|
1148
1451
|
};
|
|
1149
1452
|
function useRouter() {
|
|
1150
|
-
const ctx = (0,
|
|
1453
|
+
const ctx = (0, import_signal16.useContext)(RouterContext);
|
|
1151
1454
|
if (ctx) return ctx;
|
|
1152
1455
|
if (typeof window === "undefined") return _ssrRouterStub;
|
|
1153
1456
|
throw new Error("[router] useRouter must be used within <Router>");
|
|
1154
1457
|
}
|
|
1155
1458
|
function useParams() {
|
|
1156
1459
|
const params = useRouter().params;
|
|
1157
|
-
return (0,
|
|
1460
|
+
return (0, import_signal15.createMemo)(() => params(), {}, {
|
|
1158
1461
|
equals: (a, b) => JSON.stringify(a) === JSON.stringify(b)
|
|
1159
1462
|
});
|
|
1160
1463
|
}
|
|
@@ -1186,19 +1489,32 @@ var LINK_OWN_PROPS = /* @__PURE__ */ new Set([
|
|
|
1186
1489
|
"children"
|
|
1187
1490
|
]);
|
|
1188
1491
|
function Link(props) {
|
|
1189
|
-
const ctx = (0,
|
|
1190
|
-
const navigate = () => ctx
|
|
1492
|
+
const ctx = (0, import_signal16.useContext)(RouterContext);
|
|
1493
|
+
const navigate = () => ctx.router.navigate(read(props.href) ?? "", { replace: read(props.replace) });
|
|
1191
1494
|
const a = (0, import_dom15.createNativeElement)("a");
|
|
1192
1495
|
(0, import_dom15.setAttribute)(a, "href", read(props.href) ?? "");
|
|
1193
1496
|
if (props.slot) (0, import_dom15.setAttribute)(a, "slot", read(props.slot));
|
|
1194
1497
|
for (const k of Object.keys(props)) {
|
|
1195
1498
|
if (LINK_OWN_PROPS.has(k)) continue;
|
|
1196
1499
|
const v = props[k];
|
|
1197
|
-
if (
|
|
1500
|
+
if (typeof v === "function") {
|
|
1501
|
+
if (/^on[A-Z]/.test(k)) continue;
|
|
1502
|
+
const read3 = v;
|
|
1503
|
+
const apply = () => {
|
|
1504
|
+
const value = read3();
|
|
1505
|
+
if (value == null || value === false) a.removeAttribute?.(k);
|
|
1506
|
+
else (0, import_dom15.setAttribute)(a, k, String(value));
|
|
1507
|
+
};
|
|
1508
|
+
if (typeof a.addEventListener === "function") (0, import_signal15.createEffect)(apply);
|
|
1509
|
+
else apply();
|
|
1510
|
+
continue;
|
|
1511
|
+
}
|
|
1512
|
+
if (v != null) (0, import_dom15.setAttribute)(a, k, String(v));
|
|
1198
1513
|
}
|
|
1199
1514
|
if (typeof a.addEventListener === "function") {
|
|
1200
1515
|
a.addEventListener("click", (e) => {
|
|
1201
1516
|
if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|
1517
|
+
if (!ctx) return;
|
|
1202
1518
|
e.preventDefault();
|
|
1203
1519
|
navigate();
|
|
1204
1520
|
});
|
|
@@ -1207,7 +1523,7 @@ function Link(props) {
|
|
|
1207
1523
|
if (base) (0, import_dom15.setAttribute)(a, "class", base);
|
|
1208
1524
|
}
|
|
1209
1525
|
if (typeof a.addEventListener === "function") {
|
|
1210
|
-
(0,
|
|
1526
|
+
(0, import_signal15.createEffect)(() => {
|
|
1211
1527
|
const href = read(props.href) ?? "";
|
|
1212
1528
|
a.setAttribute("href", href);
|
|
1213
1529
|
const base = read(props.className ?? props.class) ?? "";
|
|
@@ -1239,22 +1555,22 @@ var core_default = {
|
|
|
1239
1555
|
// render,
|
|
1240
1556
|
onMount,
|
|
1241
1557
|
onUnmount,
|
|
1242
|
-
createEffect:
|
|
1243
|
-
createMemo:
|
|
1244
|
-
createSignal:
|
|
1558
|
+
createEffect: import_signal18.createEffect,
|
|
1559
|
+
createMemo: import_signal18.createMemo,
|
|
1560
|
+
createSignal: import_signal18.createSignal,
|
|
1245
1561
|
createContext: createContext3,
|
|
1246
|
-
createRoot:
|
|
1247
|
-
createDeferred:
|
|
1248
|
-
createComputed:
|
|
1249
|
-
createRenderEffect:
|
|
1250
|
-
createSelector:
|
|
1251
|
-
onCleanup:
|
|
1252
|
-
getOwner:
|
|
1253
|
-
runWithOwner:
|
|
1254
|
-
batch:
|
|
1255
|
-
untrack:
|
|
1562
|
+
createRoot: import_signal18.createRoot,
|
|
1563
|
+
createDeferred: import_signal18.createDeferred,
|
|
1564
|
+
createComputed: import_signal18.createComputed,
|
|
1565
|
+
createRenderEffect: import_signal18.createRenderEffect,
|
|
1566
|
+
createSelector: import_signal19.createSelector,
|
|
1567
|
+
onCleanup: import_signal18.onCleanup,
|
|
1568
|
+
getOwner: import_signal18.getOwner,
|
|
1569
|
+
runWithOwner: import_signal18.runWithOwner,
|
|
1570
|
+
batch: import_signal18.batch,
|
|
1571
|
+
untrack: import_signal18.untrack,
|
|
1256
1572
|
useContext: useContext3,
|
|
1257
|
-
setOwner:
|
|
1573
|
+
setOwner: import_signal18.setOwner,
|
|
1258
1574
|
// Control Flow
|
|
1259
1575
|
// Show,
|
|
1260
1576
|
// For,
|