@omerdlw/base-framework 1.0.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/atoms/index.js +1 -103
  2. package/dist/atoms/index.js.map +1 -1
  3. package/dist/chunk-3BUP64Q6.js +105 -0
  4. package/dist/chunk-3BUP64Q6.js.map +1 -0
  5. package/dist/chunk-3MSK4XGK.js +9888 -0
  6. package/dist/chunk-3MSK4XGK.js.map +1 -0
  7. package/dist/chunk-4GMQKD6F.js +353 -0
  8. package/dist/chunk-4GMQKD6F.js.map +1 -0
  9. package/dist/chunk-65ZB4QTQ.js +888 -0
  10. package/dist/chunk-65ZB4QTQ.js.map +1 -0
  11. package/dist/chunk-6SG7V77J.js +577 -0
  12. package/dist/chunk-6SG7V77J.js.map +1 -0
  13. package/dist/chunk-7HQMXTNP.js +419 -0
  14. package/dist/chunk-7HQMXTNP.js.map +1 -0
  15. package/dist/chunk-7TAVYJ3A.js +371 -0
  16. package/dist/chunk-7TAVYJ3A.js.map +1 -0
  17. package/dist/chunk-AQ4BNXA2.js +349 -0
  18. package/dist/chunk-AQ4BNXA2.js.map +1 -0
  19. package/dist/chunk-CGHZSSFR.js +2166 -0
  20. package/dist/chunk-CGHZSSFR.js.map +1 -0
  21. package/dist/chunk-DGCQWQLZ.js +61 -0
  22. package/dist/chunk-DGCQWQLZ.js.map +1 -0
  23. package/dist/chunk-FIMPHODX.js +67 -0
  24. package/dist/chunk-FIMPHODX.js.map +1 -0
  25. package/dist/chunk-GF7TUX5I.js +1889 -0
  26. package/dist/chunk-GF7TUX5I.js.map +1 -0
  27. package/dist/chunk-JELG4JLT.js +454 -0
  28. package/dist/chunk-JELG4JLT.js.map +1 -0
  29. package/dist/chunk-K676GL7Z.js +51 -0
  30. package/dist/chunk-K676GL7Z.js.map +1 -0
  31. package/dist/chunk-KKQT46TP.js +26 -0
  32. package/dist/chunk-KKQT46TP.js.map +1 -0
  33. package/dist/chunk-QI3ALLIB.js +38 -0
  34. package/dist/chunk-QI3ALLIB.js.map +1 -0
  35. package/dist/chunk-QXR55VVS.js +1139 -0
  36. package/dist/chunk-QXR55VVS.js.map +1 -0
  37. package/dist/chunk-R2YGFJDJ.js +408 -0
  38. package/dist/chunk-R2YGFJDJ.js.map +1 -0
  39. package/dist/chunk-RFZQWLC5.js +27 -0
  40. package/dist/chunk-RFZQWLC5.js.map +1 -0
  41. package/dist/chunk-SYAVGTOX.js +521 -0
  42. package/dist/chunk-SYAVGTOX.js.map +1 -0
  43. package/dist/chunk-TV3WEF5G.js +784 -0
  44. package/dist/chunk-TV3WEF5G.js.map +1 -0
  45. package/dist/chunk-XASQT4CQ.js +280 -0
  46. package/dist/chunk-XASQT4CQ.js.map +1 -0
  47. package/dist/error/index.js +5 -682
  48. package/dist/error/index.js.map +1 -1
  49. package/dist/error/reporter.d.ts.map +1 -1
  50. package/dist/error/theme.d.ts +1 -1
  51. package/dist/error/theme.d.ts.map +1 -1
  52. package/dist/events.js +1 -7
  53. package/dist/events.js.map +1 -1
  54. package/dist/hooks/index.js +1 -358
  55. package/dist/hooks/index.js.map +1 -1
  56. package/dist/hooks/use-global-event.d.ts +1 -1
  57. package/dist/index.js +18 -20019
  58. package/dist/index.js.map +1 -1
  59. package/dist/kernel/index.js +2 -2035
  60. package/dist/kernel/index.js.map +1 -1
  61. package/dist/kernel/types.d.ts +1 -1
  62. package/dist/modules/ambient/analyze.d.ts +46 -0
  63. package/dist/modules/ambient/analyze.d.ts.map +1 -0
  64. package/dist/modules/ambient/constants.d.ts +1 -5
  65. package/dist/modules/ambient/constants.d.ts.map +1 -1
  66. package/dist/modules/ambient/context.d.ts.map +1 -1
  67. package/dist/modules/ambient/dom.d.ts +11 -12
  68. package/dist/modules/ambient/dom.d.ts.map +1 -1
  69. package/dist/modules/ambient/extractor.d.ts +12 -4
  70. package/dist/modules/ambient/extractor.d.ts.map +1 -1
  71. package/dist/modules/ambient/hooks.d.ts +1 -1
  72. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  73. package/dist/modules/ambient/index.d.ts +6 -4
  74. package/dist/modules/ambient/index.d.ts.map +1 -1
  75. package/dist/modules/ambient/index.js +7 -753
  76. package/dist/modules/ambient/index.js.map +1 -1
  77. package/dist/modules/ambient/module.d.ts +1 -1
  78. package/dist/modules/ambient/module.d.ts.map +1 -1
  79. package/dist/modules/ambient/oklab.d.ts +36 -0
  80. package/dist/modules/ambient/oklab.d.ts.map +1 -0
  81. package/dist/modules/ambient/pipeline.d.ts +28 -0
  82. package/dist/modules/ambient/pipeline.d.ts.map +1 -0
  83. package/dist/modules/ambient/quantize.d.ts +22 -0
  84. package/dist/modules/ambient/quantize.d.ts.map +1 -0
  85. package/dist/modules/ambient/server/address.d.ts +8 -0
  86. package/dist/modules/ambient/server/address.d.ts.map +1 -0
  87. package/dist/modules/ambient/server/index.d.ts +53 -0
  88. package/dist/modules/ambient/server/index.d.ts.map +1 -0
  89. package/dist/modules/ambient/server/index.js +221 -0
  90. package/dist/modules/ambient/server/index.js.map +1 -0
  91. package/dist/modules/ambient/settings.d.ts +19 -0
  92. package/dist/modules/ambient/settings.d.ts.map +1 -0
  93. package/dist/modules/ambient/types.d.ts +105 -9
  94. package/dist/modules/ambient/types.d.ts.map +1 -1
  95. package/dist/modules/ambient/worker/index.d.ts +15 -0
  96. package/dist/modules/ambient/worker/index.d.ts.map +1 -0
  97. package/dist/modules/ambient/worker/index.js +114 -0
  98. package/dist/modules/ambient/worker/index.js.map +1 -0
  99. package/dist/modules/background/constants.d.ts +2 -2
  100. package/dist/modules/background/constants.d.ts.map +1 -1
  101. package/dist/modules/background/hooks.d.ts +1 -1
  102. package/dist/modules/background/index.js +6 -3078
  103. package/dist/modules/background/index.js.map +1 -1
  104. package/dist/modules/background/motion.d.ts +9 -7
  105. package/dist/modules/background/motion.d.ts.map +1 -1
  106. package/dist/modules/background/overlay.d.ts +3 -8
  107. package/dist/modules/background/overlay.d.ts.map +1 -1
  108. package/dist/modules/background/types.d.ts +16 -2
  109. package/dist/modules/background/types.d.ts.map +1 -1
  110. package/dist/modules/context-menu/constants.d.ts +2 -2
  111. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  112. package/dist/modules/context-menu/hooks.d.ts +1 -1
  113. package/dist/modules/context-menu/index.js +10 -1896
  114. package/dist/modules/context-menu/index.js.map +1 -1
  115. package/dist/modules/context-menu/motion.d.ts +1 -8
  116. package/dist/modules/context-menu/motion.d.ts.map +1 -1
  117. package/dist/modules/context-menu/overlay.d.ts.map +1 -1
  118. package/dist/modules/context-menu/types.d.ts +16 -2
  119. package/dist/modules/context-menu/types.d.ts.map +1 -1
  120. package/dist/modules/controls/constants.d.ts +1 -1
  121. package/dist/modules/controls/constants.d.ts.map +1 -1
  122. package/dist/modules/controls/entries.d.ts +1 -1
  123. package/dist/modules/controls/hooks.d.ts +1 -1
  124. package/dist/modules/controls/index.js +4 -1110
  125. package/dist/modules/controls/index.js.map +1 -1
  126. package/dist/modules/controls/overlay.d.ts +1 -1
  127. package/dist/modules/controls/types.d.ts +2 -2
  128. package/dist/modules/dock/cards.d.ts +708 -24
  129. package/dist/modules/dock/cards.d.ts.map +1 -1
  130. package/dist/modules/dock/constants.d.ts +2 -2
  131. package/dist/modules/dock/constants.d.ts.map +1 -1
  132. package/dist/modules/dock/helpers.d.ts +2 -2
  133. package/dist/modules/dock/hooks.d.ts +2 -2
  134. package/dist/modules/dock/index.d.ts +1 -1
  135. package/dist/modules/dock/index.d.ts.map +1 -1
  136. package/dist/modules/dock/index.js +9 -12130
  137. package/dist/modules/dock/index.js.map +1 -1
  138. package/dist/modules/dock/module.d.ts +1 -1
  139. package/dist/modules/dock/motion.d.ts +41 -915
  140. package/dist/modules/dock/motion.d.ts.map +1 -1
  141. package/dist/modules/dock/overlay.d.ts.map +1 -1
  142. package/dist/modules/dock/runtime/dock.d.ts +1 -23
  143. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  144. package/dist/modules/dock/styles.d.ts +4 -4
  145. package/dist/modules/dock/surface/context.d.ts.map +1 -1
  146. package/dist/modules/dock/surface/hooks.d.ts +10 -23
  147. package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
  148. package/dist/modules/dock/surface/machine.d.ts +4 -3
  149. package/dist/modules/dock/surface/machine.d.ts.map +1 -1
  150. package/dist/modules/dock/surface/stack.d.ts.map +1 -1
  151. package/dist/modules/dock/types.d.ts +158 -3
  152. package/dist/modules/dock/types.d.ts.map +1 -1
  153. package/dist/modules/index.js +16 -17873
  154. package/dist/modules/index.js.map +1 -1
  155. package/dist/modules/loading/constants.d.ts +1 -1
  156. package/dist/modules/loading/constants.d.ts.map +1 -1
  157. package/dist/modules/loading/context.d.ts +1 -1
  158. package/dist/modules/loading/hooks.d.ts +1 -1
  159. package/dist/modules/loading/index.js +5 -1153
  160. package/dist/modules/loading/index.js.map +1 -1
  161. package/dist/modules/loading/types.d.ts +2 -2
  162. package/dist/modules/media/context.d.ts +1 -1
  163. package/dist/modules/media/index.js +3 -570
  164. package/dist/modules/media/index.js.map +1 -1
  165. package/dist/modules/media/types.d.ts +2 -2
  166. package/dist/modules/modal/constants.d.ts +2 -2
  167. package/dist/modules/modal/constants.d.ts.map +1 -1
  168. package/dist/modules/modal/context.d.ts +1 -1
  169. package/dist/modules/modal/hooks.d.ts +3 -3
  170. package/dist/modules/modal/index.js +8 -2355
  171. package/dist/modules/modal/index.js.map +1 -1
  172. package/dist/modules/modal/motion.d.ts +3 -8
  173. package/dist/modules/modal/motion.d.ts.map +1 -1
  174. package/dist/modules/modal/overlay.d.ts.map +1 -1
  175. package/dist/modules/modal/types.d.ts +21 -0
  176. package/dist/modules/modal/types.d.ts.map +1 -1
  177. package/dist/modules/notification/constants.d.ts +2 -2
  178. package/dist/modules/notification/constants.d.ts.map +1 -1
  179. package/dist/modules/notification/context.d.ts +1 -1
  180. package/dist/modules/notification/hooks.d.ts +1 -1
  181. package/dist/modules/notification/index.js +4 -828
  182. package/dist/modules/notification/index.js.map +1 -1
  183. package/dist/modules/notification/motion.d.ts +1 -7
  184. package/dist/modules/notification/motion.d.ts.map +1 -1
  185. package/dist/modules/notification/overlay.d.ts.map +1 -1
  186. package/dist/modules/notification/types.d.ts +9 -1
  187. package/dist/modules/notification/types.d.ts.map +1 -1
  188. package/dist/overlay-TZ6L52A5.js +9 -0
  189. package/dist/overlay-TZ6L52A5.js.map +1 -0
  190. package/dist/provider.d.ts +1 -1
  191. package/dist/provider.d.ts.map +1 -1
  192. package/dist/provider.js +6 -1968
  193. package/dist/provider.js.map +1 -1
  194. package/dist/result.js +2 -63
  195. package/dist/result.js.map +1 -1
  196. package/dist/theme.d.ts +45 -8
  197. package/dist/theme.d.ts.map +1 -1
  198. package/dist/theme.js +3 -41
  199. package/dist/theme.js.map +1 -1
  200. package/dist/tokens/index.d.ts +1 -0
  201. package/dist/tokens/index.d.ts.map +1 -1
  202. package/dist/tokens/index.js +126 -155
  203. package/dist/tokens/index.js.map +1 -1
  204. package/dist/tokens/motion-config.d.ts +44 -0
  205. package/dist/tokens/motion-config.d.ts.map +1 -0
  206. package/dist/tokens/motion.d.ts +23 -174
  207. package/dist/tokens/motion.d.ts.map +1 -1
  208. package/dist/utils/index.js +4 -82
  209. package/dist/utils/index.js.map +1 -1
  210. package/dist/utils/report.d.ts.map +1 -1
  211. package/docs/README.md +1 -0
  212. package/docs/architecture-and-rules.md +4 -3
  213. package/docs/core-engine.md +7 -10
  214. package/docs/getting-started.md +4 -2
  215. package/docs/modules/ambient.md +194 -80
  216. package/docs/modules/background.md +3 -3
  217. package/docs/modules/context-menu.md +2 -2
  218. package/docs/modules/dock.md +8 -5
  219. package/docs/modules/modal.md +2 -2
  220. package/docs/modules/notification.md +2 -2
  221. package/docs/theming.md +81 -9
  222. package/package.json +22 -5
  223. package/templates/AGENTS.md +1 -1
  224. package/templates/motion/background.ts +17 -0
  225. package/templates/motion/context-menu.ts +63 -0
  226. package/templates/motion/dock.ts +327 -0
  227. package/templates/motion/modal.ts +79 -0
  228. package/templates/motion/notification.ts +27 -0
  229. package/templates/motion/tokens.ts +47 -0
  230. package/templates/tsconfig.json +7 -0
  231. package/dist/modules/ambient/color.d.ts +0 -16
  232. package/dist/modules/ambient/color.d.ts.map +0 -1
@@ -1,756 +1,10 @@
1
1
  "use client";
2
- import { createContext, useState, useMemo, useEffect, use, useRef, useContext, useCallback, useSyncExternalStore } from 'react';
3
- import { jsx } from 'react/jsx-runtime';
4
- import 'next/navigation';
5
-
6
- function getOrCreateGlobalContext(name, defaultValue) {
7
- const sym = /* @__PURE__ */ Symbol.for(`@omerdlw/base-framework/context/${name}`);
8
- const store = globalThis;
9
- if (!store[sym]) {
10
- store[sym] = createContext(defaultValue);
11
- }
12
- return store[sym];
13
- }
14
-
15
- // src/utils/object.ts
16
- function shallowEqual(a, b) {
17
- if (Object.is(a, b)) return true;
18
- if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
19
- return false;
20
- }
21
- const keysA = Object.keys(a);
22
- const keysB = Object.keys(b);
23
- if (keysA.length !== keysB.length) return false;
24
- for (const key of keysA) {
25
- if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(
26
- a[key],
27
- b[key]
28
- )) {
29
- return false;
30
- }
31
- }
32
- return true;
33
- }
34
- function report(scope, error, level = "error") {
35
- if (process.env.NODE_ENV === "production" && typeof window !== "undefined") {
36
- return;
37
- }
38
- console[level](`[${scope}]`, error);
39
- }
40
-
41
- // src/utils/store.ts
42
- function freezeStoreSnapshot(state) {
43
- if (process.env.NODE_ENV === "production" || !state || typeof state !== "object") {
44
- return state;
45
- }
46
- const seen = /* @__PURE__ */ new WeakSet();
47
- const freeze = (value) => {
48
- if (seen.has(value) || Object.isFrozen(value)) return;
49
- seen.add(value);
50
- const prototype = Object.getPrototypeOf(value);
51
- if (Array.isArray(value) || prototype === Object.prototype || prototype === null) {
52
- for (const key of Reflect.ownKeys(value)) {
53
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
54
- if (descriptor && "value" in descriptor && descriptor.value !== null) {
55
- if (typeof descriptor.value === "object") freeze(descriptor.value);
56
- }
57
- }
58
- }
59
- Object.freeze(value);
60
- };
61
- freeze(state);
62
- return state;
63
- }
64
- function createStore(initialState, { freezeSnapshots = true } = {}) {
65
- const listeners = /* @__PURE__ */ new Set();
66
- const prepare = freezeSnapshots ? freezeStoreSnapshot : (state) => state;
67
- let snapshot = prepare(initialState);
68
- const publish = (nextStateOrUpdater) => {
69
- const nextState = typeof nextStateOrUpdater === "function" ? nextStateOrUpdater(snapshot) : nextStateOrUpdater;
70
- if (Object.is(snapshot, nextState)) return false;
71
- snapshot = prepare(nextState);
72
- for (const listener of listeners) {
73
- try {
74
- listener();
75
- } catch (error) {
76
- report("CoreStore subscriber", error, "warn");
77
- }
78
- }
79
- return true;
80
- };
81
- const setState = (updater) => {
82
- if (typeof updater === "function") {
83
- return publish(updater);
84
- }
85
- if (snapshot && typeof snapshot === "object" && updater && typeof updater === "object") {
86
- return publish({ ...snapshot, ...updater });
87
- }
88
- return publish(updater);
89
- };
90
- return Object.freeze({
91
- getSnapshot() {
92
- return snapshot;
93
- },
94
- publish,
95
- setState,
96
- subscribe(listener) {
97
- if (typeof listener !== "function") return () => {
98
- };
99
- listeners.add(listener);
100
- return () => listeners.delete(listener);
101
- }
102
- });
103
- }
104
- function useRequiredContext(context, hookName, providerName) {
105
- const value = use(context);
106
- if (value === null) {
107
- throw new Error(`${hookName} must be used within ${providerName}`);
108
- }
109
- return value;
110
- }
111
- function useStore(store, selector = (state) => state, isEqual = Object.is) {
112
- const cacheRef = useRef({
113
- isEqual: null,
114
- selected: void 0,
115
- selector: null,
116
- snapshot: null
117
- });
118
- const getSelectedSnapshot = useCallback(() => {
119
- const snapshot = store.getSnapshot();
120
- const cache = cacheRef.current;
121
- if (cache.snapshot === snapshot && cache.selector === selector && cache.isEqual === isEqual) {
122
- return cache.selected;
123
- }
124
- const selected = selector(snapshot);
125
- if (cache.snapshot !== null && cache.isEqual === isEqual && isEqual(cache.selected, selected)) {
126
- cache.snapshot = snapshot;
127
- cache.selector = selector;
128
- return cache.selected;
129
- }
130
- cacheRef.current = {
131
- isEqual,
132
- selected,
133
- selector,
134
- snapshot
135
- };
136
- return selected;
137
- }, [isEqual, selector, store]);
138
- return useSyncExternalStore(
139
- store.subscribe,
140
- getSelectedSnapshot,
141
- getSelectedSnapshot
142
- );
143
- }
144
- function defineModule(coreModule) {
145
- return Object.freeze({ ...coreModule });
146
- }
147
- createStore(void 0);
148
-
149
- // src/theme.tsx
150
- function defineThemeSpec(id) {
151
- return Object.freeze({ id });
152
- }
153
- var EMPTY = /* @__PURE__ */ new Map();
154
- var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
155
- function useTheme(spec) {
156
- const config = useContext(ThemeContext).get(spec.id);
157
- if (!config) {
158
- throw new Error(
159
- `Theme "${spec.id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
160
- );
161
- }
162
- return {
163
- slots: config.slots,
164
- styles: config.styles ?? {}
165
- };
166
- }
167
-
168
- // src/modules/ambient/constants.ts
169
- var AMBIENT_DEFAULTS = Object.freeze({
170
- primary: "#101010",
171
- black: "#0b0b0b"
172
- });
173
- var ambientTheme = defineThemeSpec("ambient");
174
-
175
- // src/modules/ambient/color.ts
176
- var COLOR_EXTRACT_CONFIG = Object.freeze({
177
- blackChromaFactor: 0.35,
178
- primaryLightness: 0.74,
179
- maxBlackChroma: 0.055,
180
- blackLightness: 0.15,
181
- cacheLimit: 100,
182
- maxChroma: 0.28,
183
- minChroma: 0.03,
184
- sampleSize: 32
185
- });
186
- function srgbToLinear(c) {
187
- const v = c / 255;
188
- return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
189
- }
190
- function rgbToOklch(r, g, b) {
191
- const lr = srgbToLinear(r);
192
- const lg = srgbToLinear(g);
193
- const lb = srgbToLinear(b);
194
- const l = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb;
195
- const m = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb;
196
- const s = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb;
197
- const l_ = Math.cbrt(l);
198
- const m_ = Math.cbrt(m);
199
- const s_ = Math.cbrt(s);
200
- const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
201
- const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
202
- const bOklab = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
203
- const C = Math.sqrt(a * a + bOklab * bOklab);
204
- const H = (Math.atan2(bOklab, a) * (180 / Math.PI) + 360) % 360;
205
- return {
206
- c: Math.max(0, Number(C.toFixed(3))),
207
- h: Math.max(0, Number(H.toFixed(1))),
208
- l: Math.max(0, Math.min(1, Number(L.toFixed(3))))
209
- };
210
- }
211
- function oklchToString(l, c, h, alpha = 1) {
212
- const safeL = Math.max(0, Math.min(1, Number(l) || 0)).toFixed(3);
213
- const safeC = Math.max(0, Number(c) || 0).toFixed(3);
214
- const safeH = (Number(h) || 0).toFixed(1);
215
- const numericAlpha = Number(alpha);
216
- if (Number.isFinite(numericAlpha) && numericAlpha < 1 && numericAlpha >= 0) {
217
- return `oklch(${safeL} ${safeC} ${safeH} / ${numericAlpha})`;
218
- }
219
- return `oklch(${safeL} ${safeC} ${safeH})`;
220
- }
221
- function derivePalette(sampled) {
222
- const {
223
- blackChromaFactor,
224
- blackLightness,
225
- maxBlackChroma,
226
- maxChroma,
227
- minChroma,
228
- primaryLightness
229
- } = COLOR_EXTRACT_CONFIG;
230
- const chroma = Math.max(minChroma, Math.min(maxChroma, sampled.c));
231
- const blackChroma = Math.min(
232
- maxBlackChroma,
233
- Math.max(0.025, chroma * blackChromaFactor)
234
- );
235
- const primaryChroma = Math.max(
236
- 0.15,
237
- Math.min(0.24, Math.max(chroma * 1.15, 0.18))
238
- );
239
- return {
240
- black: oklchToString(blackLightness, blackChroma, sampled.h),
241
- primary: oklchToString(primaryLightness, primaryChroma, sampled.h)
242
- };
243
- }
244
-
245
- // src/modules/ambient/extractor.ts
246
- function sampleImageData(imageData) {
247
- const data = imageData.data;
248
- const len = data.length;
249
- const numBins = 24;
250
- const binAngle = 360 / numBins;
251
- const bins = Array.from({ length: numBins }, () => ({
252
- count: 0,
253
- sumC: 0,
254
- sumCos: 0,
255
- sumL: 0,
256
- sumSin: 0
257
- }));
258
- let neutralCount = 0;
259
- let neutralSumL = 0;
260
- let chromaticCount = 0;
261
- for (let i = 0; i < len; i += 4) {
262
- const alpha = data[i + 3];
263
- if (alpha < 128) continue;
264
- const r = data[i];
265
- const g = data[i + 1];
266
- const b = data[i + 2];
267
- const oklch = rgbToOklch(r, g, b);
268
- if (oklch.l < 0.04 || oklch.l > 0.96 || oklch.c < 0.02) {
269
- neutralCount++;
270
- neutralSumL += oklch.l;
271
- continue;
272
- }
273
- const binIndex = Math.floor(oklch.h / binAngle) % numBins;
274
- const rad = oklch.h * (Math.PI / 180);
275
- const bin = bins[binIndex];
276
- bin.count++;
277
- bin.sumL += oklch.l;
278
- bin.sumC += oklch.c;
279
- bin.sumCos += Math.cos(rad);
280
- bin.sumSin += Math.sin(rad);
281
- chromaticCount++;
282
- }
283
- if (chromaticCount === 0) {
284
- const avgL2 = neutralCount > 0 ? neutralSumL / neutralCount : 0.55;
285
- return { c: 0.03, h: 252, l: avgL2 };
286
- }
287
- let bestIndex = 0;
288
- let maxWindowCount = -1;
289
- for (let i = 0; i < numBins; i++) {
290
- const prev2 = bins[(i - 1 + numBins) % numBins];
291
- const curr2 = bins[i];
292
- const next2 = bins[(i + 1) % numBins];
293
- const windowCount = prev2.count * 0.5 + curr2.count + next2.count * 0.5;
294
- if (windowCount > maxWindowCount) {
295
- maxWindowCount = windowCount;
296
- bestIndex = i;
297
- }
298
- }
299
- const prev = bins[(bestIndex - 1 + numBins) % numBins];
300
- const curr = bins[bestIndex];
301
- const next = bins[(bestIndex + 1) % numBins];
302
- const totalCount = prev.count + curr.count + next.count;
303
- if (totalCount === 0) {
304
- return { c: 0.19, h: 252, l: 0.55 };
305
- }
306
- const avgL = (prev.sumL + curr.sumL + next.sumL) / totalCount;
307
- const avgC = (prev.sumC + curr.sumC + next.sumC) / totalCount;
308
- const avgSin = prev.sumSin + curr.sumSin + next.sumSin;
309
- const avgCos = prev.sumCos + curr.sumCos + next.sumCos;
310
- const avgH = (Math.atan2(avgSin, avgCos) * (180 / Math.PI) + 360) % 360;
311
- return {
312
- c: Number(avgC.toFixed(3)),
313
- h: Number(avgH.toFixed(1)),
314
- l: Number(avgL.toFixed(3))
315
- };
316
- }
317
- function createDefaultPalette(fallback) {
318
- return {
319
- black: fallback?.black || AMBIENT_DEFAULTS.black,
320
- primary: fallback?.primary || AMBIENT_DEFAULTS.primary
321
- };
322
- }
323
- var paletteCache = /* @__PURE__ */ new Map();
324
- var inFlight = /* @__PURE__ */ new Map();
325
- async function fetchObjectUrl(src) {
326
- if (typeof fetch !== "function" || !src.startsWith("http")) return null;
327
- const corsUrl = src.includes("cors=") ? src : `${src}${src.includes("?") ? "&" : "?"}cors=1`;
328
- const attempts = [
329
- [corsUrl, { mode: "cors" }],
330
- [`/api/ambient/proxy?url=${encodeURIComponent(src)}`]
331
- ];
332
- for (const [url, init] of attempts) {
333
- try {
334
- const response = await fetch(url, init);
335
- if (response.ok) return URL.createObjectURL(await response.blob());
336
- } catch {
337
- }
338
- }
339
- return null;
340
- }
341
- function loadImage(url, crossOrigin) {
342
- return new Promise((resolve) => {
343
- const image = new Image();
344
- if (crossOrigin) image.crossOrigin = "anonymous";
345
- image.onload = () => resolve(image);
346
- image.onerror = () => resolve(null);
347
- image.src = url;
348
- });
349
- }
350
- function readPalette(image) {
351
- const size = COLOR_EXTRACT_CONFIG.sampleSize;
352
- const canvas = document.createElement("canvas");
353
- canvas.width = size;
354
- canvas.height = size;
355
- const context = canvas.getContext("2d", { willReadFrequently: true });
356
- if (!context) return null;
357
- context.drawImage(image, 0, 0, size, size);
358
- return derivePalette(sampleImageData(context.getImageData(0, 0, size, size)));
359
- }
360
- async function extractPalette(src) {
361
- const objectUrl = await fetchObjectUrl(src);
362
- try {
363
- const image = await loadImage(objectUrl ?? src, !objectUrl);
364
- return image ? readPalette(image) : null;
365
- } catch {
366
- return null;
367
- } finally {
368
- if (objectUrl) URL.revokeObjectURL(objectUrl);
369
- }
370
- }
371
- function cachePalette(src, palette) {
372
- if (paletteCache.size >= COLOR_EXTRACT_CONFIG.cacheLimit) {
373
- const oldest = paletteCache.keys().next().value;
374
- if (oldest) paletteCache.delete(oldest);
375
- }
376
- paletteCache.set(src, palette);
377
- }
378
- async function extractPaletteFromImage(imageSource, options = {}) {
379
- const fallback = createDefaultPalette(
380
- options.initialPalette || options.fallbackPalette
381
- );
382
- const src = typeof imageSource === "string" ? imageSource : imageSource?.src;
383
- if (!src || typeof window === "undefined") return fallback;
384
- const cached = paletteCache.get(src);
385
- if (cached) return cached;
386
- let pending = inFlight.get(src);
387
- if (!pending) {
388
- pending = extractPalette(src).then((palette) => {
389
- if (palette) cachePalette(src, palette);
390
- return palette;
391
- }).finally(() => inFlight.delete(src));
392
- inFlight.set(src, pending);
393
- }
394
- return await pending ?? fallback;
395
- }
396
-
397
- // src/modules/ambient/dom.ts
398
- var AMBIENT_CSS_VARS = Object.freeze({
399
- ambientGlow: "--color-ambient-glow",
400
- colorPrimary: "--color-primary",
401
- primary: "--primary",
402
- black: "--black",
403
- white: "--white"
404
- });
405
- function resolveTargetElement(target) {
406
- if (typeof document === "undefined") return null;
407
- if (!target) return document.documentElement;
408
- if (typeof target === "string") {
409
- return document.querySelector(target);
410
- }
411
- return "current" in target ? target.current : target;
412
- }
413
- function normalizeColorMap(colors) {
414
- const cssVars = AMBIENT_CSS_VARS;
415
- const result = {};
416
- for (const [key, value] of Object.entries(colors)) {
417
- if (!value) continue;
418
- const name = cssVars[key] || (key.startsWith("--") ? key : cssVars[key.toLowerCase()] || `--color-${key}`);
419
- result[name] = value;
420
- }
421
- return result;
422
- }
423
- function applyScopedCssVariables(element, varMap) {
424
- const previous = /* @__PURE__ */ new Map();
425
- for (const [name, value] of Object.entries(varMap)) {
426
- if (!name || !value) continue;
427
- previous.set(name, {
428
- priority: element.style.getPropertyPriority(name),
429
- value: element.style.getPropertyValue(name)
430
- });
431
- element.style.setProperty(name, value);
432
- }
433
- return () => {
434
- for (const [name, { priority, value }] of previous) {
435
- if (value) element.style.setProperty(name, value, priority);
436
- else element.style.removeProperty(name);
437
- }
438
- };
439
- }
440
- function resolveAmbientVarMap({
441
- colors = null,
442
- extractedBlack = "",
443
- extractedPrimary = "",
444
- image = null,
445
- tintGlobals = true
446
- }) {
447
- const varMap = {};
448
- if (image) {
449
- if (extractedPrimary) {
450
- varMap[AMBIENT_CSS_VARS.primary] = extractedPrimary;
451
- varMap[AMBIENT_CSS_VARS.ambientGlow] = extractedPrimary;
452
- if (tintGlobals) varMap[AMBIENT_CSS_VARS.colorPrimary] = extractedPrimary;
453
- }
454
- if (extractedBlack) varMap[AMBIENT_CSS_VARS.black] = extractedBlack;
455
- }
456
- if (colors) Object.assign(varMap, normalizeColorMap(colors));
457
- return varMap;
458
- }
459
-
460
- // src/modules/background/state.ts
461
- var DEFAULT_BACKGROUND = Object.freeze({
462
- animation: null,
463
- className: "",
464
- fadeEdges: null,
465
- fit: null,
466
- image: null,
467
- imageStyle: {},
468
- isPlaying: false,
469
- noiseStyle: {},
470
- overlay: false,
471
- overlayColor: "var(--black)",
472
- overlayOpacity: 0,
473
- position: "center",
474
- video: null,
475
- videoClassName: "",
476
- videoElement: null,
477
- videoOptions: {
478
- autoplay: true,
479
- className: "",
480
- corp: 0,
481
- loop: false,
482
- muted: true,
483
- playbackRate: 1,
484
- width: null
485
- },
486
- videoStyle: {},
487
- width: null
488
- });
489
- var DEFAULT_BACKGROUND_COMPUTED = Object.freeze({
490
- ...DEFAULT_BACKGROUND,
491
- hasBackground: false,
492
- isVideo: false,
493
- isYouTube: false,
494
- posterUrl: null,
495
- youtubeVideoId: null
496
- });
497
- var BackgroundContext = getOrCreateGlobalContext(
498
- "BackgroundContext",
499
- null
500
- );
501
-
502
- // src/modules/background/hooks.ts
503
- var NOOP_BACKGROUND_STORE = createStore(
504
- DEFAULT_BACKGROUND_COMPUTED
505
- );
506
- function useOptionalBackgroundState(selector, isEqual) {
507
- const ctx = useContext(BackgroundContext);
508
- return useStore(
509
- ctx?.store ?? NOOP_BACKGROUND_STORE,
510
- selector,
511
- isEqual
512
- );
513
- }
514
- var AmbientContext = getOrCreateGlobalContext("AmbientContext", null);
515
- function AmbientProvider({
516
- children,
517
- initialPalette = null
518
- }) {
519
- const [store] = useState(
520
- () => createStore(
521
- { isExtracting: false, palette: initialPalette || AMBIENT_DEFAULTS },
522
- { freezeSnapshots: false }
523
- )
524
- );
525
- const value = useMemo(
526
- () => ({
527
- actions: {
528
- setIsExtracting: (next) => store.publish((state) => {
529
- const isExtracting = typeof next === "function" ? next(state.isExtracting) : next;
530
- return isExtracting === state.isExtracting ? state : { ...state, isExtracting };
531
- }),
532
- setPalette: (next) => store.publish((state) => {
533
- const palette = typeof next === "function" ? next(state.palette) : next;
534
- return palette === state.palette ? state : { ...state, palette };
535
- })
536
- },
537
- store
538
- }),
539
- [store]
540
- );
541
- return /* @__PURE__ */ jsx(AmbientContext, { value, children });
542
- }
543
- function useStableObject(value) {
544
- const ref = useRef(value);
545
- if (!shallowEqual(ref.current, value)) {
546
- ref.current = value;
547
- }
548
- return ref.current;
549
- }
550
- function useAmbientColor(imageSource, options = null) {
551
- const stableOptions = useStableObject(options);
552
- const initialPalette = useStableObject(
553
- options?.initialPalette || options?.fallbackPalette || null
554
- );
555
- const [extractedData, setExtractedData] = useState(
556
- () => initialPalette
557
- );
558
- const srcKey = typeof imageSource === "string" ? imageSource : imageSource?.src;
559
- const isExtracting = Boolean(
560
- imageSource && (!extractedData || extractedData.source !== srcKey)
561
- );
562
- useEffect(() => {
563
- if (!imageSource) return;
564
- let active = true;
565
- void extractPaletteFromImage(imageSource, {
566
- fallbackPalette: initialPalette,
567
- ...stableOptions || {}
568
- }).then((extracted) => {
569
- if (active) {
570
- setExtractedData({ ...extracted, source: srcKey });
571
- }
572
- }).catch(() => {
573
- if (active) {
574
- setExtractedData({
575
- black: initialPalette?.black || AMBIENT_DEFAULTS.black,
576
- primary: initialPalette?.primary || AMBIENT_DEFAULTS.primary,
577
- source: srcKey
578
- });
579
- }
580
- });
581
- return () => {
582
- active = false;
583
- };
584
- }, [imageSource, initialPalette, srcKey, stableOptions]);
585
- const palette = imageSource && extractedData && extractedData.source === srcKey ? extractedData : initialPalette || AMBIENT_DEFAULTS;
586
- return { isExtracting, palette };
587
- }
588
- function useAmbientTheme(config = null) {
589
- const ambientActions = use(AmbientContext)?.actions ?? null;
590
- const normalizedConfig = typeof config === "string" ? { image: config } : config || {};
591
- const {
592
- colors = null,
593
- image = null,
594
- initialPalette = null,
595
- options = null,
596
- scope = null,
597
- tintGlobals = true,
598
- transition = true
599
- } = normalizedConfig;
600
- const stableInitialPalette = useStableObject(initialPalette);
601
- const stableOptions = useStableObject(options);
602
- const stableColors = useStableObject(colors);
603
- const resolvedOptions = useMemo(
604
- () => ({
605
- ...stableOptions || {},
606
- ...stableInitialPalette ? { initialPalette: stableInitialPalette } : {}
607
- }),
608
- [stableInitialPalette, stableOptions]
609
- );
610
- const { palette: extractedPalette, isExtracting } = useAmbientColor(
611
- image,
612
- resolvedOptions
613
- );
614
- const hasActiveConfig = Boolean(image || stableColors);
615
- useEffect(() => {
616
- if (!hasActiveConfig || !ambientActions) return;
617
- ambientActions.setIsExtracting(isExtracting);
618
- ambientActions.setPalette(
619
- (prev) => shallowEqual(prev, extractedPalette) ? prev : extractedPalette
620
- );
621
- }, [ambientActions, extractedPalette, hasActiveConfig, isExtracting]);
622
- const extractedPrimary = extractedPalette?.primary || "";
623
- const extractedBlack = extractedPalette?.black || "";
624
- const transitionClasses = useTheme(ambientTheme).slots.transition.split(/\s+/).filter(Boolean);
625
- const transitionKey = transitionClasses.join(" ");
626
- const resolvedVarMap = useMemo(
627
- () => resolveAmbientVarMap({
628
- colors: stableColors,
629
- extractedBlack,
630
- extractedPrimary,
631
- image,
632
- tintGlobals
633
- }),
634
- [extractedBlack, extractedPrimary, image, stableColors, tintGlobals]
635
- );
636
- useEffect(() => {
637
- if (Object.keys(resolvedVarMap).length === 0) return;
638
- const targetEl = resolveTargetElement(scope);
639
- if (!targetEl) return;
640
- if (transition) {
641
- targetEl.classList.add(...transitionKey.split(" ").filter(Boolean));
642
- }
643
- const restoreVariables = applyScopedCssVariables(targetEl, resolvedVarMap);
644
- return () => {
645
- restoreVariables();
646
- if (transition && scope) {
647
- targetEl.classList.remove(...transitionKey.split(" ").filter(Boolean));
648
- }
649
- };
650
- }, [resolvedVarMap, scope, transition, transitionKey]);
651
- return { isExtracting, palette: extractedPalette };
652
- }
653
- function useAmbient(configOrImage) {
654
- const { actions, store } = useRequiredContext(
655
- AmbientContext,
656
- "useAmbient",
657
- "AmbientProvider"
658
- );
659
- const shared = useStore(store);
660
- const ctx = useMemo(
661
- () => ({ ...shared, ...actions }),
662
- [actions, shared]
663
- );
664
- const { isExtracting, palette } = useAmbientTheme(configOrImage ?? null);
665
- const themeState = useMemo(
666
- () => ({ isExtracting, palette }),
667
- [isExtracting, palette]
668
- );
669
- return useMemo(
670
- () => configOrImage ? { ...ctx, ...themeState } : ctx,
671
- [configOrImage, ctx, themeState]
672
- );
673
- }
674
-
675
- // src/modules/ambient/module.tsx
676
- var firstString = (...values) => values.find((value) => typeof value === "string" && value) ?? null;
677
- function resolvePageAmbientTheme(slice, posterUrl) {
678
- const ambient = slice?.ambient;
679
- const banner = slice?.banner ?? null;
680
- const defaultImage = banner ?? posterUrl;
681
- if (ambient === false) return null;
682
- if (ambient === true || typeof ambient === "string") {
683
- return {
684
- image: typeof ambient === "string" ? ambient : defaultImage,
685
- tintGlobals: true
686
- };
687
- }
688
- if (ambient && typeof ambient === "object") {
689
- return { image: ambient.image ?? defaultImage, ...ambient };
690
- }
691
- if (banner && !posterUrl) return { image: banner, tintGlobals: true };
692
- return null;
693
- }
694
- function selectPageAmbient(config) {
695
- return {
696
- ambient: config.ambient,
697
- banner: firstString(config.dock?.banner, config.dock?.bannerUrl)
698
- };
699
- }
700
- function useAmbientPage(slice, page) {
701
- const posterUrl = useOptionalBackgroundState(
702
- (background) => background.posterUrl
703
- );
704
- const theme = useMemo(
705
- () => resolvePageAmbientTheme(slice, posterUrl),
706
- [posterUrl, slice]
707
- );
708
- useAmbientTheme(theme);
709
- return useMemo(
710
- () => ({ set: (ambient) => page.set({ ambient }) }),
711
- [page]
712
- );
713
- }
714
- var ambientModule = defineModule({
715
- id: "ambient",
716
- context: AmbientContext,
717
- Provider: AmbientProvider,
718
- uses: ["background"],
719
- page: {
720
- select: selectPageAmbient,
721
- use: useAmbientPage
722
- }
723
- });
724
- function resolveValue(value, props) {
725
- return typeof value === "function" ? value(props) : value;
726
- }
727
- function defineAmbient(definition = {}) {
728
- const { defaultProps, id = "ambient-theme", ...config } = definition;
729
- const create = (props = {}, { id: overrideId, ...overrides } = {}) => {
730
- const mergedProps = { ...defaultProps, ...props };
731
- const merged = { ...config, ...overrides };
732
- return {
733
- ...merged,
734
- colors: resolveValue(merged.colors ?? null, mergedProps) ?? null,
735
- id: overrideId ?? id,
736
- image: resolveValue(merged.image ?? null, mergedProps),
737
- initialPalette: merged.initialPalette ?? null,
738
- options: { ...config.options, ...overrides.options },
739
- props: mergedProps,
740
- scope: merged.scope ?? null,
741
- transition: merged.transition ?? true
742
- };
743
- };
744
- return Object.freeze({
745
- config: definition,
746
- create,
747
- id,
748
- use: function useDefinedAmbient(props, overrides) {
749
- return useAmbientTheme(create(props, overrides));
750
- }
751
- });
752
- }
753
-
754
- export { AMBIENT_CSS_VARS, AMBIENT_DEFAULTS, AmbientContext, AmbientProvider, COLOR_EXTRACT_CONFIG, ambientModule, ambientTheme, applyScopedCssVariables, createDefaultPalette, defineAmbient, derivePalette, extractPaletteFromImage, normalizeColorMap, oklchToString, resolveAmbientVarMap, resolvePageAmbientTheme, resolveTargetElement, rgbToOklch, sampleImageData, srgbToLinear, useAmbient, useAmbientColor, useAmbientTheme };
2
+ export { AMBIENT_REGIONS, AMBIENT_ROLES, AMBIENT_TONES, AmbientContext, AmbientProvider, DEFAULT_ANALYSIS, DEFAULT_CSS_VAR_NAMES, ambientModule, ambientTheme, analyzeAmbientPixels, applyScopedCssVariables, configureAmbient, contrastRatio, defineAmbient, extractPaletteFromImage, findContentBounds, formatOklch, getAmbientSettings, getCachedAmbientPalette, maxChroma, normalizeColorMap, onColorFor, paletteVarMap, primeAmbientPalette, resolveAmbientVarMap, resolveCssVarNames, resolvePageAmbientTheme, resolveTargetElement, srgbToOklab, toneOf, useAmbient, useAmbientColor, useAmbientTheme } from '../../chunk-QXR55VVS.js';
3
+ import '../../chunk-CGHZSSFR.js';
4
+ import '../../chunk-R2YGFJDJ.js';
5
+ import '../../chunk-7TAVYJ3A.js';
6
+ import '../../chunk-GF7TUX5I.js';
7
+ import '../../chunk-TV3WEF5G.js';
8
+ import '../../chunk-3BUP64Q6.js';
755
9
  //# sourceMappingURL=index.js.map
756
10
  //# sourceMappingURL=index.js.map