@fluixi/core 1.0.0-alpha.100
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/LICENSE +21 -0
- package/README.md +334 -0
- package/dist/cdn/core.global.js +2 -0
- package/dist/cli/generate.cjs +5639 -0
- package/dist/cli/generate.d.ts +7 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +2580 -0
- package/dist/cli/generate.mjs +5644 -0
- package/dist/cli/index.cjs +5639 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2580 -0
- package/dist/cli/index.mjs +5644 -0
- package/dist/cli/run.cjs +64 -0
- package/dist/cli/run.d.ts +3 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +62 -0
- package/dist/cli/run.mjs +40 -0
- package/dist/fluixi.d.ts +5 -0
- package/dist/src/cdn/chunk-RKBFEFZP.mjs +987 -0
- package/dist/src/cdn/core.cjs +1592 -0
- package/dist/src/cdn/core.d.ts +16 -0
- package/dist/src/cdn/core.d.ts.map +1 -0
- package/dist/src/cdn/core.js +15 -0
- package/dist/src/cdn/core.mjs +714 -0
- package/dist/src/cdn/router-V2THK27H.mjs +74 -0
- package/dist/src/index.cjs +1711 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.mjs +1833 -0
- package/dist/src/jsx-dev-runtime.cjs +26 -0
- package/dist/src/jsx-dev-runtime.d.ts +2 -0
- package/dist/src/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/src/jsx-dev-runtime.js +1 -0
- package/dist/src/jsx-dev-runtime.mjs +24 -0
- package/dist/src/jsx-runtime.cjs +26 -0
- package/dist/src/jsx-runtime.d.ts +7 -0
- package/dist/src/jsx-runtime.d.ts.map +1 -0
- package/dist/src/jsx-runtime.js +8 -0
- package/dist/src/jsx-runtime.mjs +24 -0
- package/dist/src/lib/client/chunk-FDOPDB6Z.mjs +53 -0
- package/dist/src/lib/client/index.cjs +1210 -0
- package/dist/src/lib/client/index.d.ts +51 -0
- package/dist/src/lib/client/index.d.ts.map +1 -0
- package/dist/src/lib/client/index.js +174 -0
- package/dist/src/lib/client/index.mjs +293 -0
- package/dist/src/lib/client/router-4PTBPZLQ.mjs +891 -0
- package/dist/src/lib/context/context.cjs +81 -0
- package/dist/src/lib/context/context.d.ts +73 -0
- package/dist/src/lib/context/context.d.ts.map +1 -0
- package/dist/src/lib/context/context.js +93 -0
- package/dist/src/lib/context/context.mjs +64 -0
- package/dist/src/lib/context/index.cjs +83 -0
- package/dist/src/lib/context/index.d.ts +3 -0
- package/dist/src/lib/context/index.d.ts.map +1 -0
- package/dist/src/lib/context/index.js +1 -0
- package/dist/src/lib/context/index.mjs +64 -0
- package/dist/src/lib/control-flow.cjs +35 -0
- package/dist/src/lib/control-flow.d.ts +4 -0
- package/dist/src/lib/control-flow.d.ts.map +1 -0
- package/dist/src/lib/control-flow.js +1 -0
- package/dist/src/lib/control-flow.mjs +25 -0
- package/dist/src/lib/core.cjs +1710 -0
- package/dist/src/lib/core.d.ts +91 -0
- package/dist/src/lib/core.d.ts.map +1 -0
- package/dist/src/lib/core.js +158 -0
- package/dist/src/lib/core.mjs +1833 -0
- package/dist/src/lib/env/index.cjs +44 -0
- package/dist/src/lib/env/index.d.ts +26 -0
- package/dist/src/lib/env/index.d.ts.map +1 -0
- package/dist/src/lib/env/index.js +31 -0
- package/dist/src/lib/env/index.mjs +23 -0
- package/dist/src/lib/i18n/index.cjs +123 -0
- package/dist/src/lib/i18n/index.d.ts +110 -0
- package/dist/src/lib/i18n/index.d.ts.map +1 -0
- package/dist/src/lib/i18n/index.js +164 -0
- package/dist/src/lib/i18n/index.mjs +103 -0
- package/dist/src/lib/index.cjs +598 -0
- package/dist/src/lib/index.d.ts +81 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +130 -0
- package/dist/src/lib/index.mjs +688 -0
- package/dist/src/lib/isomorphic.cjs +90 -0
- package/dist/src/lib/isomorphic.d.ts +114 -0
- package/dist/src/lib/isomorphic.d.ts.map +1 -0
- package/dist/src/lib/isomorphic.js +132 -0
- package/dist/src/lib/isomorphic.mjs +69 -0
- package/dist/src/lib/jsx-runtime/index.cjs +21 -0
- package/dist/src/lib/jsx-runtime/index.d.ts +13 -0
- package/dist/src/lib/jsx-runtime/index.d.ts.map +1 -0
- package/dist/src/lib/jsx-runtime/index.js +13 -0
- package/dist/src/lib/jsx-runtime/index.mjs +4 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.cjs +21 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.d.ts +2 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.js +1 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.mjs +4 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.cjs +302 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts +35 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts.map +1 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.js +118 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.mjs +271 -0
- package/dist/src/lib/plugins/index.cjs +311 -0
- package/dist/src/lib/plugins/index.d.ts +6 -0
- package/dist/src/lib/plugins/index.d.ts.map +1 -0
- package/dist/src/lib/plugins/index.js +7 -0
- package/dist/src/lib/plugins/index.mjs +279 -0
- package/dist/src/lib/plugins/route-codegen.cjs +73 -0
- package/dist/src/lib/plugins/route-codegen.d.ts +12 -0
- package/dist/src/lib/plugins/route-codegen.d.ts.map +1 -0
- package/dist/src/lib/plugins/route-codegen.js +80 -0
- package/dist/src/lib/plugins/route-codegen.mjs +52 -0
- package/dist/src/lib/plugins/route-scanner.cjs +189 -0
- package/dist/src/lib/plugins/route-scanner.d.ts +38 -0
- package/dist/src/lib/plugins/route-scanner.d.ts.map +1 -0
- package/dist/src/lib/plugins/route-scanner.js +215 -0
- package/dist/src/lib/plugins/route-scanner.mjs +158 -0
- package/dist/src/lib/plugins/vite.cjs +27 -0
- package/dist/src/lib/plugins/vite.d.ts +3 -0
- package/dist/src/lib/plugins/vite.d.ts.map +1 -0
- package/dist/src/lib/plugins/vite.js +1 -0
- package/dist/src/lib/plugins/vite.mjs +6 -0
- package/dist/src/lib/render/await.cjs +38 -0
- package/dist/src/lib/render/await.d.ts +26 -0
- package/dist/src/lib/render/await.d.ts.map +1 -0
- package/dist/src/lib/render/await.js +45 -0
- package/dist/src/lib/render/await.mjs +17 -0
- package/dist/src/lib/render/component.cjs +221 -0
- package/dist/src/lib/render/component.d.ts +296 -0
- package/dist/src/lib/render/component.d.ts.map +1 -0
- package/dist/src/lib/render/component.js +514 -0
- package/dist/src/lib/render/component.mjs +214 -0
- package/dist/src/lib/render/deferred.cjs +175 -0
- package/dist/src/lib/render/deferred.d.ts +36 -0
- package/dist/src/lib/render/deferred.d.ts.map +1 -0
- package/dist/src/lib/render/deferred.js +141 -0
- package/dist/src/lib/render/deferred.mjs +158 -0
- package/dist/src/lib/render/index.cjs +573 -0
- package/dist/src/lib/render/index.d.ts +98 -0
- package/dist/src/lib/render/index.d.ts.map +1 -0
- package/dist/src/lib/render/index.js +180 -0
- package/dist/src/lib/render/index.mjs +590 -0
- package/dist/src/lib/render/lazy.cjs +67 -0
- package/dist/src/lib/render/lazy.d.ts +49 -0
- package/dist/src/lib/render/lazy.d.ts.map +1 -0
- package/dist/src/lib/render/lazy.js +105 -0
- package/dist/src/lib/render/lazy.mjs +50 -0
- package/dist/src/lib/render/suspense.cjs +141 -0
- package/dist/src/lib/render/suspense.d.ts +65 -0
- package/dist/src/lib/render/suspense.d.ts.map +1 -0
- package/dist/src/lib/render/suspense.js +196 -0
- package/dist/src/lib/render/suspense.mjs +136 -0
- package/dist/src/lib/render/versions.cjs +35 -0
- package/dist/src/lib/render/versions.d.ts +2 -0
- package/dist/src/lib/render/versions.d.ts.map +1 -0
- package/dist/src/lib/render/versions.js +21 -0
- package/dist/src/lib/render/versions.mjs +14 -0
- package/dist/src/lib/router/data.cjs +228 -0
- package/dist/src/lib/router/data.d.ts +142 -0
- package/dist/src/lib/router/data.d.ts.map +1 -0
- package/dist/src/lib/router/data.js +258 -0
- package/dist/src/lib/router/data.mjs +214 -0
- package/dist/src/lib/router/index.cjs +921 -0
- package/dist/src/lib/router/index.d.ts +274 -0
- package/dist/src/lib/router/index.d.ts.map +1 -0
- package/dist/src/lib/router/index.js +904 -0
- package/dist/src/lib/router/index.mjs +938 -0
- package/dist/src/lib/router/scroll.cjs +79 -0
- package/dist/src/lib/router/scroll.d.ts +19 -0
- package/dist/src/lib/router/scroll.d.ts.map +1 -0
- package/dist/src/lib/router/scroll.js +68 -0
- package/dist/src/lib/router/scroll.mjs +58 -0
- package/dist/src/lib/router/transition.cjs +75 -0
- package/dist/src/lib/router/transition.d.ts +81 -0
- package/dist/src/lib/router/transition.d.ts.map +1 -0
- package/dist/src/lib/router/transition.js +136 -0
- package/dist/src/lib/router/transition.mjs +54 -0
- package/dist/src/lib/server/hydration.cjs +169 -0
- package/dist/src/lib/server/hydration.d.ts +198 -0
- package/dist/src/lib/server/hydration.d.ts.map +1 -0
- package/dist/src/lib/server/hydration.js +345 -0
- package/dist/src/lib/server/hydration.mjs +148 -0
- package/dist/src/lib/server/index.cjs +406 -0
- package/dist/src/lib/server/index.d.ts +115 -0
- package/dist/src/lib/server/index.d.ts.map +1 -0
- package/dist/src/lib/server/index.js +164 -0
- package/dist/src/lib/server/index.mjs +384 -0
- package/dist/src/lib/server/reactive.cjs +197 -0
- package/dist/src/lib/server/reactive.d.ts +239 -0
- package/dist/src/lib/server/reactive.d.ts.map +1 -0
- package/dist/src/lib/server/reactive.js +413 -0
- package/dist/src/lib/server/reactive.mjs +176 -0
- 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 +267 -0
- package/dist/src/lib/theme/index.d.ts +78 -0
- package/dist/src/lib/theme/index.d.ts.map +1 -0
- package/dist/src/lib/theme/index.js +135 -0
- package/dist/src/lib/theme/index.mjs +251 -0
- 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/lib/utils/index.cjs +209 -0
- package/dist/src/lib/utils/index.d.ts +286 -0
- package/dist/src/lib/utils/index.d.ts.map +1 -0
- package/dist/src/lib/utils/index.js +434 -0
- package/dist/src/lib/utils/index.mjs +188 -0
- package/dist/src/routes.cjs +37 -0
- package/dist/src/routes.d.ts +22 -0
- package/dist/src/routes.d.ts.map +1 -0
- package/dist/src/routes.js +20 -0
- package/dist/src/routes.mjs +17 -0
- package/dist/src/server.cjs +405 -0
- package/dist/src/server.d.ts +63 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +62 -0
- package/dist/src/server.mjs +382 -0
- package/dist/src/utils.cjs +21 -0
- package/dist/src/utils.d.ts +10 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +9 -0
- package/dist/src/utils.mjs +4 -0
- package/dist/src/version.generated.cjs +26 -0
- package/dist/src/version.generated.d.ts +3 -0
- package/dist/src/version.generated.d.ts.map +1 -0
- package/dist/src/version.generated.js +3 -0
- package/dist/src/version.generated.mjs +5 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +164 -0
- package/src/index.ts +19 -0
- package/types/fluixi.d.ts +5 -0
- package/types/vinxi.d.ts +50 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/lib/theme/color-scheme.ts
|
|
21
|
+
var color_scheme_exports = {};
|
|
22
|
+
__export(color_scheme_exports, {
|
|
23
|
+
createColorScheme: () => createColorScheme
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(color_scheme_exports);
|
|
26
|
+
var import_head2 = require("@fluixi/head");
|
|
27
|
+
var import_signal4 = require("@fluixi/reactive/signal");
|
|
28
|
+
|
|
29
|
+
// src/lib/env/index.ts
|
|
30
|
+
var import_dom = require("@fluixi/dom");
|
|
31
|
+
var import_dom2 = require("@fluixi/dom");
|
|
32
|
+
var env = {
|
|
33
|
+
get window() {
|
|
34
|
+
return typeof window !== "undefined" ? window : void 0;
|
|
35
|
+
},
|
|
36
|
+
get document() {
|
|
37
|
+
return typeof document !== "undefined" ? document : void 0;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// src/lib/storage/persisted.ts
|
|
42
|
+
var import_signal = require("@fluixi/reactive/signal");
|
|
43
|
+
var isAsync = (storage) => "encryption" in storage;
|
|
44
|
+
function persisted(storage, key, options = {}) {
|
|
45
|
+
const fallback = options.fallback ?? null;
|
|
46
|
+
const name = options.name ?? `storage:${storage.keyPrefix}${key}`;
|
|
47
|
+
const state = (0, import_signal.signal)(isAsync(storage) ? fallback : storage.get(key) ?? fallback, { name });
|
|
48
|
+
const put = (value) => state.set(() => value);
|
|
49
|
+
const resolve = (next) => typeof next === "function" ? next((0, import_signal.untrack)(state)) : next;
|
|
50
|
+
const writeOptions = (extra) => ({
|
|
51
|
+
...options.ttl !== void 0 ? { ttl: options.ttl } : {},
|
|
52
|
+
...options.encrypt ? { encrypt: true } : {},
|
|
53
|
+
...extra
|
|
54
|
+
});
|
|
55
|
+
if (!isAsync(storage)) {
|
|
56
|
+
const off2 = storage.subscribe(key, (event) => {
|
|
57
|
+
if (event.type !== "set") return put(fallback);
|
|
58
|
+
if (event.value !== void 0) put(event.value);
|
|
59
|
+
});
|
|
60
|
+
if ((0, import_signal.getOwner)()) (0, import_signal.onCleanup)(off2);
|
|
61
|
+
return Object.assign(() => state(), {
|
|
62
|
+
set(next, extra) {
|
|
63
|
+
const value = resolve(next);
|
|
64
|
+
storage.set(key, value, writeOptions(extra));
|
|
65
|
+
put(value);
|
|
66
|
+
},
|
|
67
|
+
remove() {
|
|
68
|
+
storage.remove(key);
|
|
69
|
+
put(fallback);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
let written = false;
|
|
74
|
+
const reread = () => storage.get(key).then(
|
|
75
|
+
(value) => put(value ?? fallback),
|
|
76
|
+
() => void 0
|
|
77
|
+
);
|
|
78
|
+
const off = storage.subscribe(key, (event) => {
|
|
79
|
+
if (event.type !== "set") return put(fallback);
|
|
80
|
+
if (event.value !== void 0) put(event.value);
|
|
81
|
+
else void reread();
|
|
82
|
+
});
|
|
83
|
+
if ((0, import_signal.getOwner)()) (0, import_signal.onCleanup)(off);
|
|
84
|
+
const ready = storage.get(key).then((value) => {
|
|
85
|
+
if (!written) put(value ?? fallback);
|
|
86
|
+
});
|
|
87
|
+
return Object.assign(() => state(), {
|
|
88
|
+
ready,
|
|
89
|
+
async set(next, extra) {
|
|
90
|
+
const previous = (0, import_signal.untrack)(state);
|
|
91
|
+
const value = resolve(next);
|
|
92
|
+
written = true;
|
|
93
|
+
put(value);
|
|
94
|
+
try {
|
|
95
|
+
await storage.set(key, value, writeOptions(extra));
|
|
96
|
+
} catch (error) {
|
|
97
|
+
put(previous);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
async remove() {
|
|
102
|
+
written = true;
|
|
103
|
+
await storage.remove(key);
|
|
104
|
+
put(fallback);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/lib/theme/index.ts
|
|
110
|
+
var import_head = require("@fluixi/head");
|
|
111
|
+
var import_signal3 = require("@fluixi/reactive/signal");
|
|
112
|
+
var import_storage2 = require("@fluixi/storage");
|
|
113
|
+
|
|
114
|
+
// src/lib/storage/index.ts
|
|
115
|
+
var import_dom3 = require("@fluixi/dom");
|
|
116
|
+
var import_signal2 = require("@fluixi/reactive/signal");
|
|
117
|
+
var import_storage = require("@fluixi/storage");
|
|
118
|
+
var import_browser = require("@fluixi/storage/browser");
|
|
119
|
+
var import_server = require("@fluixi/storage/server");
|
|
120
|
+
var StorageContext = (0, import_signal2.createContext)(void 0, "storage");
|
|
121
|
+
var AsyncStorageContext = (0, import_signal2.createContext)(void 0, "asyncStorage");
|
|
122
|
+
var isBrowser = () => typeof window !== "undefined" && typeof document !== "undefined";
|
|
123
|
+
var perRequest = /* @__PURE__ */ new WeakMap();
|
|
124
|
+
var perPage = /* @__PURE__ */ new Map();
|
|
125
|
+
function cached(scope, id, make) {
|
|
126
|
+
let adapter = scope.get(id);
|
|
127
|
+
if (!adapter) scope.set(id, adapter = make());
|
|
128
|
+
return adapter;
|
|
129
|
+
}
|
|
130
|
+
function requestRequired(scope) {
|
|
131
|
+
throw new import_storage.StorageUnavailableError(
|
|
132
|
+
`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>.`
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
function adapterFor(scope, cookie = {}) {
|
|
136
|
+
const ctx = (0, import_dom3.getRequestContext)();
|
|
137
|
+
const options = { httpOnly: false, ...cookie };
|
|
138
|
+
switch (scope) {
|
|
139
|
+
case "local":
|
|
140
|
+
return (0, import_browser.localStorageAdapter)();
|
|
141
|
+
case "session":
|
|
142
|
+
return (0, import_browser.sessionStorageAdapter)();
|
|
143
|
+
case "request":
|
|
144
|
+
if (isBrowser()) return cached(perPage, "request", import_storage.memoryStorage);
|
|
145
|
+
if (!ctx) requestRequired(scope);
|
|
146
|
+
return cached(perRequest.get(ctx) ?? perRequest.set(ctx, /* @__PURE__ */ new Map()).get(ctx), "request", import_server.requestStorage);
|
|
147
|
+
case "cookie": {
|
|
148
|
+
const id = `cookie:${JSON.stringify(options)}`;
|
|
149
|
+
if (isBrowser()) {
|
|
150
|
+
const { httpOnly: _ignored, ...browser } = options;
|
|
151
|
+
return cached(perPage, id, () => (0, import_browser.documentCookieAdapter)(browser));
|
|
152
|
+
}
|
|
153
|
+
if (!ctx) requestRequired(scope);
|
|
154
|
+
const raw = ctx.event.request;
|
|
155
|
+
const target = raw && typeof raw === "object" ? raw : void 0;
|
|
156
|
+
return cached(
|
|
157
|
+
perRequest.get(ctx) ?? perRequest.set(ctx, /* @__PURE__ */ new Map()).get(ctx),
|
|
158
|
+
id,
|
|
159
|
+
() => (0, import_server.cookieStorage)({
|
|
160
|
+
...options,
|
|
161
|
+
request: raw && typeof raw === "object" && ("headers" in raw || "getHeader" in raw) ? (0, import_server.toStorageRequest)(raw) : void 0,
|
|
162
|
+
response: {
|
|
163
|
+
appendHeader(name, value) {
|
|
164
|
+
if (!(0, import_dom3.appendResponseHeader)(name, value, target)) {
|
|
165
|
+
throw new import_storage.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.");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function useStorage(options = {}) {
|
|
175
|
+
const { scope = "auto", cookie, ...storageOptions } = options;
|
|
176
|
+
if (scope === "auto") {
|
|
177
|
+
const provided = (0, import_signal2.useContext)(StorageContext);
|
|
178
|
+
if (provided) return options.namespace ? provided.namespace(options.namespace) : provided;
|
|
179
|
+
}
|
|
180
|
+
return (0, import_storage.createSyncStorage)({ ...storageOptions, adapter: resolveAdapter(scope, cookie) });
|
|
181
|
+
}
|
|
182
|
+
function resolveAdapter(scope, cookie) {
|
|
183
|
+
if (scope !== "auto") return adapterFor(scope, cookie);
|
|
184
|
+
if (isBrowser()) return adapterFor("local");
|
|
185
|
+
if (!(0, import_dom3.getRequestContext)()) requestRequired(scope);
|
|
186
|
+
return adapterFor("request");
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// src/lib/theme/index.ts
|
|
190
|
+
var YEAR = 60 * 60 * 24 * 365;
|
|
191
|
+
function defaultStorage() {
|
|
192
|
+
try {
|
|
193
|
+
return useStorage({ scope: "cookie", cookie: { maxAge: YEAR, sameSite: "lax" } });
|
|
194
|
+
} catch (error) {
|
|
195
|
+
if (error instanceof import_storage2.StorageUnavailableError) return null;
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function storedLookup(storage, key) {
|
|
200
|
+
if (!storage) return null;
|
|
201
|
+
const full = storage.keyPrefix + key;
|
|
202
|
+
if (storage.scope === "cookie") {
|
|
203
|
+
return { from: "cookie", name: encodeURIComponent(full).replace(/[()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`) };
|
|
204
|
+
}
|
|
205
|
+
if (storage.scope === "local") return { from: "local", name: full };
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/lib/theme/color-scheme.ts
|
|
210
|
+
var CHOICES = ["system", "light", "dark"];
|
|
211
|
+
var DARK = "(prefers-color-scheme: dark)";
|
|
212
|
+
function createColorScheme(options = {}) {
|
|
213
|
+
const storageKey = options.storageKey ?? "color-scheme";
|
|
214
|
+
const attribute = options.attribute ?? "data-theme";
|
|
215
|
+
const systemAs = options.systemAs ?? "resolved";
|
|
216
|
+
const storage = options.storage === void 0 ? defaultStorage() : options.storage;
|
|
217
|
+
const saved = storage ? persisted(storage, storageKey) : null;
|
|
218
|
+
const [unsaved, setUnsaved] = (0, import_signal4.createSignal)(null);
|
|
219
|
+
const value = () => {
|
|
220
|
+
const local = unsaved();
|
|
221
|
+
if (local) return local;
|
|
222
|
+
const stored = saved?.();
|
|
223
|
+
return CHOICES.includes(stored) ? stored : "system";
|
|
224
|
+
};
|
|
225
|
+
const media = env.window?.matchMedia?.(DARK);
|
|
226
|
+
const [osDark, setOsDark] = (0, import_signal4.createSignal)(media?.matches ?? false);
|
|
227
|
+
if (media) {
|
|
228
|
+
const onChange = () => setOsDark(media.matches);
|
|
229
|
+
media.addEventListener?.("change", onChange);
|
|
230
|
+
if ((0, import_signal4.getOwner)()) (0, import_signal4.onCleanup)(() => media.removeEventListener?.("change", onChange));
|
|
231
|
+
}
|
|
232
|
+
const resolved = () => {
|
|
233
|
+
const choice = value();
|
|
234
|
+
return choice === "system" ? osDark() ? "dark" : "light" : choice;
|
|
235
|
+
};
|
|
236
|
+
const shown = () => systemAs === "system" && value() === "system" ? "system" : resolved();
|
|
237
|
+
const apply = () => {
|
|
238
|
+
env.document?.documentElement.setAttribute(attribute, shown());
|
|
239
|
+
};
|
|
240
|
+
const set = (choice) => {
|
|
241
|
+
if (!CHOICES.includes(choice)) return;
|
|
242
|
+
if (!saved) setUnsaved(choice);
|
|
243
|
+
else {
|
|
244
|
+
try {
|
|
245
|
+
saved.set(choice);
|
|
246
|
+
setUnsaved(null);
|
|
247
|
+
} catch {
|
|
248
|
+
setUnsaved(choice);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
apply();
|
|
252
|
+
options.onChange?.(choice);
|
|
253
|
+
};
|
|
254
|
+
const scriptBody = () => {
|
|
255
|
+
const cfg = JSON.stringify({ s: storedLookup(storage, storageKey), a: attribute, sys: systemAs === "system", tc: options.themeColor ?? null, cs: options.colorSchemeMeta !== false }).replace(/</g, "\\u003c");
|
|
256
|
+
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){}})();`;
|
|
257
|
+
};
|
|
258
|
+
if ((0, import_head2.getActiveHead)()) {
|
|
259
|
+
const colors = options.themeColor;
|
|
260
|
+
(0, import_head2.useHead)({
|
|
261
|
+
htmlAttrs: { [attribute]: shown },
|
|
262
|
+
...colors ? {
|
|
263
|
+
themeColor: () => value() === "system" ? [
|
|
264
|
+
{ color: colors.light, media: "(prefers-color-scheme: light)" },
|
|
265
|
+
{ color: colors.dark, media: DARK }
|
|
266
|
+
] : colors[resolved()]
|
|
267
|
+
} : {},
|
|
268
|
+
...options.colorSchemeMeta === false ? {} : { colorScheme: () => value() === "system" ? "light dark" : resolved() },
|
|
269
|
+
...options.script === false ? {} : { script: [{ children: scriptBody() }] }
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
if (env.document && (0, import_signal4.getOwner)()) (0, import_signal4.createEffect)(apply);
|
|
273
|
+
return {
|
|
274
|
+
value,
|
|
275
|
+
resolved,
|
|
276
|
+
set,
|
|
277
|
+
toggle: () => set(resolved() === "dark" ? "light" : "dark"),
|
|
278
|
+
init: apply,
|
|
279
|
+
headScript: () => `<script>${scriptBody()}<\/script>`
|
|
280
|
+
};
|
|
281
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type Accessor } from '@fluixi/reactive/signal';
|
|
2
|
+
import type { TypedStorage } from '@fluixi/storage';
|
|
3
|
+
export type ColorSchemeChoice = 'system' | 'light' | 'dark';
|
|
4
|
+
export interface ColorSchemeOptions {
|
|
5
|
+
/** Key the choice is stored under. Default `color-scheme`. */
|
|
6
|
+
storageKey?: string;
|
|
7
|
+
/** Attribute set on `<html>`. Default `data-theme`. */
|
|
8
|
+
attribute?: string;
|
|
9
|
+
/** Where the choice is kept: a cookie for a year by default, `null` for memory only. */
|
|
10
|
+
storage?: TypedStorage<any> | null;
|
|
11
|
+
/**
|
|
12
|
+
* What the attribute says while following the OS. `resolved` (default) writes `light` or
|
|
13
|
+
* `dark`, for CSS that selects on `[data-theme="dark"]`. `system` writes `system`, for CSS
|
|
14
|
+
* that follows the OS by itself (`color-scheme`, a media query): a page without JavaScript
|
|
15
|
+
* then still matches the OS.
|
|
16
|
+
*/
|
|
17
|
+
systemAs?: 'resolved' | 'system';
|
|
18
|
+
/**
|
|
19
|
+
* The browser UI colour for each scheme: Chrome's address and app bar on Android, Safari's bars
|
|
20
|
+
* on iOS. While following the OS both are sent, each under its media query, and the browser
|
|
21
|
+
* picks; after a choice, the chosen one.
|
|
22
|
+
*/
|
|
23
|
+
themeColor?: {
|
|
24
|
+
light: string;
|
|
25
|
+
dark: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Send `<meta name="color-scheme">` too (`light dark` while following the OS, else the
|
|
29
|
+
* choice), so form controls, scrollbars and the page behind the CSS match. Default true.
|
|
30
|
+
*/
|
|
31
|
+
colorSchemeMeta?: boolean;
|
|
32
|
+
/** Send the before-paint script with the page during a render. Default true. */
|
|
33
|
+
script?: boolean;
|
|
34
|
+
onChange?: (choice: ColorSchemeChoice) => void;
|
|
35
|
+
}
|
|
36
|
+
export interface ColorScheme {
|
|
37
|
+
/** The choice: `system`, `light` or `dark`. */
|
|
38
|
+
value: Accessor<ColorSchemeChoice>;
|
|
39
|
+
/** What is shown: the choice, or the OS's scheme while the choice is `system`. */
|
|
40
|
+
resolved: Accessor<'light' | 'dark'>;
|
|
41
|
+
set: (choice: ColorSchemeChoice) => void;
|
|
42
|
+
/** Flips light and dark, from what is shown. */
|
|
43
|
+
toggle: () => void;
|
|
44
|
+
/** Writes the attribute now; the head and the scheme's own effect keep it current after. */
|
|
45
|
+
init: () => void;
|
|
46
|
+
/** The before-paint script, for a page you write yourself. */
|
|
47
|
+
headScript: () => string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A light/dark scheme with the OS as the default. Create it during a render (a provider at the
|
|
51
|
+
* app root does), so the server reads the visitor's cookie.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const scheme = createColorScheme({ storageKey: 'app-scheme' });
|
|
56
|
+
* scheme.toggle(); // dark if the page shows light, and remembered
|
|
57
|
+
* scheme.resolved(); // 'dark'
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function createColorScheme(options?: ColorSchemeOptions): ColorScheme;
|
|
61
|
+
//# sourceMappingURL=color-scheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-scheme.d.ts","sourceRoot":"","sources":["../../../../src/lib/theme/color-scheme.ts"],"names":[],"mappings":"AASA,OAAO,EAAmD,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACnC,kFAAkF;IAClF,QAAQ,EAAE,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IACrC,GAAG,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACzC,gDAAgD;IAChD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,4FAA4F;IAC5F,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,MAAM,CAAC;CAC1B;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAkG/E"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Light, dark, or whatever the operating system says: the theme axis almost every app has.
|
|
3
|
+
*
|
|
4
|
+
* Built on the same pieces as `createTheme` (a cookie by default, the attribute and a
|
|
5
|
+
* before-paint script sent through the head during a render), with what a scheme needs on top:
|
|
6
|
+
* `system` as a choice, `resolved()` for what is actually shown, which follows the OS live, and
|
|
7
|
+
* a `toggle` that flips from what the reader sees.
|
|
8
|
+
*/
|
|
9
|
+
import { getActiveHead, useHead } from '@fluixi/head';
|
|
10
|
+
import { createEffect, createSignal, getOwner, onCleanup } from '@fluixi/reactive/signal';
|
|
11
|
+
import { env } from '../env/index.js';
|
|
12
|
+
import { persisted } from '../storage/persisted.js';
|
|
13
|
+
import { defaultStorage, storedLookup } from './index.js';
|
|
14
|
+
const CHOICES = ['system', 'light', 'dark'];
|
|
15
|
+
const DARK = '(prefers-color-scheme: dark)';
|
|
16
|
+
/**
|
|
17
|
+
* A light/dark scheme with the OS as the default. Create it during a render (a provider at the
|
|
18
|
+
* app root does), so the server reads the visitor's cookie.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const scheme = createColorScheme({ storageKey: 'app-scheme' });
|
|
23
|
+
* scheme.toggle(); // dark if the page shows light, and remembered
|
|
24
|
+
* scheme.resolved(); // 'dark'
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function createColorScheme(options = {}) {
|
|
28
|
+
const storageKey = options.storageKey ?? 'color-scheme';
|
|
29
|
+
const attribute = options.attribute ?? 'data-theme';
|
|
30
|
+
const systemAs = options.systemAs ?? 'resolved';
|
|
31
|
+
const storage = options.storage === undefined ? defaultStorage() : options.storage;
|
|
32
|
+
const saved = storage ? persisted(storage, storageKey) : null;
|
|
33
|
+
const [unsaved, setUnsaved] = createSignal(null);
|
|
34
|
+
const value = () => {
|
|
35
|
+
const local = unsaved();
|
|
36
|
+
if (local)
|
|
37
|
+
return local;
|
|
38
|
+
const stored = saved?.();
|
|
39
|
+
return CHOICES.includes(stored) ? stored : 'system';
|
|
40
|
+
};
|
|
41
|
+
// The OS scheme, followed live in the browser. The server cannot know it: light there, and the
|
|
42
|
+
// script corrects it before paint.
|
|
43
|
+
const media = env.window?.matchMedia?.(DARK);
|
|
44
|
+
const [osDark, setOsDark] = createSignal(media?.matches ?? false);
|
|
45
|
+
if (media) {
|
|
46
|
+
const onChange = () => setOsDark(media.matches);
|
|
47
|
+
media.addEventListener?.('change', onChange);
|
|
48
|
+
if (getOwner())
|
|
49
|
+
onCleanup(() => media.removeEventListener?.('change', onChange));
|
|
50
|
+
}
|
|
51
|
+
const resolved = () => {
|
|
52
|
+
const choice = value();
|
|
53
|
+
return choice === 'system' ? (osDark() ? 'dark' : 'light') : choice;
|
|
54
|
+
};
|
|
55
|
+
const shown = () => (systemAs === 'system' && value() === 'system' ? 'system' : resolved());
|
|
56
|
+
const apply = () => {
|
|
57
|
+
env.document?.documentElement.setAttribute(attribute, shown());
|
|
58
|
+
};
|
|
59
|
+
const set = (choice) => {
|
|
60
|
+
if (!CHOICES.includes(choice))
|
|
61
|
+
return;
|
|
62
|
+
if (!saved)
|
|
63
|
+
setUnsaved(choice);
|
|
64
|
+
else {
|
|
65
|
+
try {
|
|
66
|
+
saved.set(choice);
|
|
67
|
+
setUnsaved(null);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Not saved (the response already went out, storage blocked): the page still switches.
|
|
71
|
+
setUnsaved(choice);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
apply();
|
|
75
|
+
options.onChange?.(choice);
|
|
76
|
+
};
|
|
77
|
+
const scriptBody = () => {
|
|
78
|
+
const cfg = JSON.stringify({ s: storedLookup(storage, storageKey), a: attribute, sys: systemAs === 'system', tc: options.themeColor ?? null, cs: options.colorSchemeMeta !== false }).replace(/</g, '\\u003c');
|
|
79
|
+
return (`(function(){try{var c=${cfg},t=null,s=c.s,r=null;` +
|
|
80
|
+
`if(s&&s.from==='local')r=localStorage.getItem(s.name);` +
|
|
81
|
+
`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));});` +
|
|
82
|
+
`if(r){var e=JSON.parse(r);t=e&&e.v===1?e.value:e;}` +
|
|
83
|
+
`var chosen=t==='light'||t==='dark'?t:null;` +
|
|
84
|
+
`if(!chosen)t=c.sys?'system':(matchMedia('${DARK}').matches?'dark':'light');` +
|
|
85
|
+
`document.documentElement.setAttribute(c.a,t);` +
|
|
86
|
+
// A chosen scheme also decides the browser's bars and controls, which the page sent for the OS.
|
|
87
|
+
`if(chosen&&c.tc)document.querySelectorAll('meta[name="theme-color"]').forEach(function(m){m.setAttribute('content',c.tc[chosen]);m.removeAttribute('media');});` +
|
|
88
|
+
`if(chosen&&c.cs){var m=document.querySelector('meta[name="color-scheme"]');if(m)m.setAttribute('content',chosen);}` +
|
|
89
|
+
`}catch(e){}})();`);
|
|
90
|
+
};
|
|
91
|
+
if (getActiveHead()) {
|
|
92
|
+
const colors = options.themeColor;
|
|
93
|
+
useHead({
|
|
94
|
+
htmlAttrs: { [attribute]: shown },
|
|
95
|
+
...(colors
|
|
96
|
+
? {
|
|
97
|
+
themeColor: () => value() === 'system'
|
|
98
|
+
? [
|
|
99
|
+
{ color: colors.light, media: '(prefers-color-scheme: light)' },
|
|
100
|
+
{ color: colors.dark, media: DARK },
|
|
101
|
+
]
|
|
102
|
+
: colors[resolved()],
|
|
103
|
+
}
|
|
104
|
+
: {}),
|
|
105
|
+
...(options.colorSchemeMeta === false ? {} : { colorScheme: () => (value() === 'system' ? 'light dark' : resolved()) }),
|
|
106
|
+
...(options.script === false ? {} : { script: [{ children: scriptBody() }] }),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// In the browser the attribute follows the OS while the choice is `system`.
|
|
110
|
+
if (env.document && getOwner())
|
|
111
|
+
createEffect(apply);
|
|
112
|
+
return {
|
|
113
|
+
value,
|
|
114
|
+
resolved,
|
|
115
|
+
set,
|
|
116
|
+
toggle: () => set(resolved() === 'dark' ? 'light' : 'dark'),
|
|
117
|
+
init: apply,
|
|
118
|
+
headScript: () => `<script>${scriptBody()}</script>`,
|
|
119
|
+
};
|
|
120
|
+
}
|