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