@tamagui/web 3.0.5 → 3.0.6

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 (33) hide show
  1. package/dist/cjs/_withNativeStyle.cjs +37 -20
  2. package/dist/cjs/_withNativeStyle.native.cjs +37 -20
  3. package/dist/cjs/_withNativeStyle.native.js +37 -20
  4. package/dist/cjs/_withNativeStyle.native.js.map +1 -1
  5. package/dist/cjs/helpers/getSplitStyles.cjs +2 -1
  6. package/dist/cjs/helpers/getSplitStyles.native.cjs +2 -1
  7. package/dist/cjs/helpers/getSplitStyles.native.js +2 -1
  8. package/dist/cjs/helpers/getSplitStyles.native.js.map +1 -1
  9. package/dist/cjs/helpers/nativeStyleEngine.cjs +67 -121
  10. package/dist/cjs/helpers/nativeStyleEngine.native.cjs +66 -161
  11. package/dist/cjs/helpers/nativeStyleEngine.native.js +66 -161
  12. package/dist/cjs/helpers/nativeStyleEngine.native.js.map +1 -1
  13. package/dist/esm/_withNativeStyle.mjs +38 -21
  14. package/dist/esm/_withNativeStyle.mjs.map +1 -1
  15. package/dist/esm/_withNativeStyle.native.js +38 -21
  16. package/dist/esm/_withNativeStyle.native.js.map +1 -1
  17. package/dist/esm/helpers/getSplitStyles.mjs +2 -1
  18. package/dist/esm/helpers/getSplitStyles.mjs.map +1 -1
  19. package/dist/esm/helpers/getSplitStyles.native.js +2 -1
  20. package/dist/esm/helpers/getSplitStyles.native.js.map +1 -1
  21. package/dist/esm/helpers/nativeStyleEngine.mjs +66 -121
  22. package/dist/esm/helpers/nativeStyleEngine.mjs.map +1 -1
  23. package/dist/esm/helpers/nativeStyleEngine.native.js +65 -161
  24. package/dist/esm/helpers/nativeStyleEngine.native.js.map +1 -1
  25. package/package.json +17 -17
  26. package/src/_withNativeStyle.tsx +67 -31
  27. package/src/helpers/getSplitStyles.tsx +3 -0
  28. package/src/helpers/nativeStyleEngine.ts +95 -162
  29. package/types/_withNativeStyle.d.ts +4 -3
  30. package/types/_withNativeStyle.d.ts.map +1 -1
  31. package/types/helpers/getSplitStyles.d.ts.map +1 -1
  32. package/types/helpers/nativeStyleEngine.d.ts +19 -6
  33. package/types/helpers/nativeStyleEngine.d.ts.map +1 -1
@@ -101,11 +101,10 @@ function syncTableState(compiled, stateName, theme) {
101
101
  }
102
102
  function setNativeStyleEngine(next) {
103
103
  if (engine !== next) {
104
- settleReleases();
105
104
  compiledMappings.clear();
106
105
  scopeMappings.clear();
107
- pendingLinks = [];
108
- unlinkedPending = 0;
106
+ pendingHosts = [];
107
+ pendingStates = [];
109
108
  }
110
109
  engine = next;
111
110
  if (next) {
@@ -128,7 +127,7 @@ function updateNativeStyleScope(scopeId, stateName, theme) {
128
127
  if (engine) {
129
128
  const linked = scopeMappings.get(scopeId);
130
129
  if (linked) {
131
- for (const compiled of linked.keys()) {
130
+ for (const compiled of linked) {
132
131
  syncTableState(compiled, stateName, theme);
133
132
  }
134
133
  }
@@ -137,137 +136,83 @@ function updateNativeStyleScope(scopeId, stateName, theme) {
137
136
  }
138
137
  function removeNativeStyleScope(scopeId) {
139
138
  if (!scopeStates.delete(scopeId)) return;
139
+ queueMicrotask(() => {
140
+ if (!scopeStates.has(scopeId)) scopeMappings.delete(scopeId);
141
+ });
140
142
  engine?.removeScope(scopeId);
141
143
  }
142
144
  function resolveNativeStyleMapping(mapping, stateName, theme) {
143
145
  return resolveCompiledMapping(getCompiledMapping(mapping), stateName, theme).renderProps;
144
146
  }
145
- let pendingLinks = [];
146
- let unlinkedPending = 0;
147
- function trackScopeMapping(link, delta) {
148
- let linked = scopeMappings.get(link.scopeId);
149
- if (!linked) scopeMappings.set(link.scopeId, linked = /* @__PURE__ */ new Map());
150
- const count = (linked.get(link.compiled) ?? 0) + delta;
151
- if (count) {
152
- linked.set(link.compiled, count);
153
- } else {
154
- linked.delete(link.compiled);
155
- if (!linked.size) scopeMappings.delete(link.scopeId);
156
- }
147
+ function createNativeStyleLinkState(mapping, scopeId, stateName, theme) {
148
+ return {
149
+ mapping,
150
+ scopeId,
151
+ stateName,
152
+ theme
153
+ };
154
+ }
155
+ let pendingHosts = [];
156
+ let pendingStates = [];
157
+ const maxPendingHosts = 4096;
158
+ let idleFlushQueued = false;
159
+ function idleFlush() {
160
+ idleFlushQueued = false;
161
+ flushNativeStyleLinks();
162
+ }
163
+ function addScopeMapping(scopeId, compiled) {
164
+ let linked = scopeMappings.get(scopeId);
165
+ if (!linked) scopeMappings.set(scopeId, linked = /* @__PURE__ */ new Set());
166
+ linked.add(compiled);
157
167
  }
158
168
  function flushNativeStyleLinks() {
159
- settleReleases();
160
- if (!pendingLinks.length) return;
161
- const links = pendingLinks;
162
- pendingLinks = [];
163
- unlinkedPending = 0;
169
+ if (!pendingHosts.length) return;
170
+ const hosts = pendingHosts;
171
+ const states = pendingStates;
172
+ pendingHosts = [];
173
+ pendingStates = [];
164
174
  if (!engine) return;
165
- const live = links.filter((link) => link.id === 0);
166
- if (!live.length) return;
167
- const refs = [];
168
- const tableIds = [];
169
- const scopeIndexes = [];
175
+ const tableIds = new Array(hosts.length);
176
+ const scopeIndexes = new Array(hosts.length);
170
177
  const scopes = [];
171
- for (const link of live) {
172
- let scopeIndex = scopes.indexOf(link.scopeId);
173
- if (scopeIndex === -1) scopeIndex = scopes.push(link.scopeId) - 1;
174
- refs.push(link.ref);
175
- tableIds.push(link.compiled.tableId);
176
- scopeIndexes.push(scopeIndex);
177
- }
178
- const firstId = engine.linkTables(refs, tableIds, scopeIndexes, scopes);
179
- for (let i = 0; i < live.length; i++) {
180
- const link = live[i];
181
- link.id = firstId + i;
182
- link.owner = engine;
183
- link.ref = null;
184
- trackScopeMapping(link, 1);
185
- }
186
- }
187
- const releases = /* @__PURE__ */ new Map();
188
- let settleQueued = false;
189
- function settleReleases() {
190
- settleQueued = false;
191
- if (!releases.size) return;
192
- const settling = [...releases.values()];
193
- releases.clear();
194
- for (const release of settling) release.settle();
195
- }
196
- function releasable(ref, compiled, scopeId, id, settle) {
197
- const handle = {
198
- id,
199
- unlink: () => {
200
- const prior = releases.get(ref);
201
- if (prior && prior.handle !== handle) prior.settle();
202
- releases.set(ref, {
203
- compiled,
204
- scopeId,
205
- handle,
206
- settle
207
- });
208
- if (!settleQueued) {
209
- settleQueued = true;
210
- queueMicrotask(settleReleases);
211
- }
178
+ let last;
179
+ let tableId = 0;
180
+ let scopeIndex = 0;
181
+ for (let i = 0; i < hosts.length; i++) {
182
+ const state = states[i];
183
+ if (state !== last) {
184
+ last = state;
185
+ const compiled = getCompiledMapping(state.mapping);
186
+ syncTableState(compiled, state.stateName, state.theme);
187
+ addScopeMapping(state.scopeId, compiled);
188
+ tableId = compiled.tableId;
189
+ scopeIndex = scopes.indexOf(state.scopeId);
190
+ if (scopeIndex === -1) scopeIndex = scopes.push(state.scopeId) - 1;
212
191
  }
213
- };
214
- return handle;
192
+ tableIds[i] = tableId;
193
+ scopeIndexes[i] = scopeIndex;
194
+ }
195
+ engine.linkTables(hosts, tableIds, scopeIndexes, scopes);
215
196
  }
216
- function linkNativeStyleMapping(ref, mapping, scopeId, stateName, theme) {
217
- if (!engine) return null;
218
- const compiled = getCompiledMapping(mapping);
219
- const scopeState = scopeStates.get(scopeId);
220
- const stale = scopeState && (scopeState.name !== stateName || scopeState.theme !== theme);
221
- const kept = releases.get(ref);
222
- if (kept) {
223
- releases.delete(ref);
224
- if (!stale && kept.compiled === compiled && kept.scopeId === scopeId) return kept.handle;
225
- kept.settle();
197
+ function linkNativeStyleHost(host, state) {
198
+ if (!engine) return;
199
+ const live = scopeStates.get(state.scopeId);
200
+ if (live && (live.name !== state.stateName || live.theme !== state.theme)) {
201
+ const compiled = getCompiledMapping(state.mapping);
202
+ syncTableState(compiled, live.name, live.theme);
203
+ addScopeMapping(state.scopeId, compiled);
204
+ engine.link(host, compiled.tableId, state.scopeId, true);
205
+ return;
226
206
  }
227
- if (stale) {
228
- syncTableState(compiled, scopeState.name, scopeState.theme);
229
- const handle = engine.link(ref, compiled.tableId, scopeId, true);
230
- if (!handle) return null;
231
- const link2 = {
232
- ref: null,
233
- compiled,
234
- scopeId,
235
- id: handle.id,
236
- owner: engine
237
- };
238
- trackScopeMapping(link2, 1);
239
- return releasable(ref, compiled, scopeId, handle.id, () => {
240
- if (link2.id === -1) return;
241
- link2.id = -1;
242
- if (link2.owner === engine) trackScopeMapping(link2, -1);
243
- handle.unlink();
244
- });
207
+ pendingHosts.push(host);
208
+ pendingStates.push(state);
209
+ if (pendingHosts.length >= maxPendingHosts && !idleFlushQueued) {
210
+ idleFlushQueued = true;
211
+ requestIdleCallback(idleFlush);
245
212
  }
246
- syncTableState(compiled, stateName, theme);
247
- const link = {
248
- ref,
249
- compiled,
250
- scopeId,
251
- id: 0,
252
- owner: null
253
- };
254
- pendingLinks.push(link);
255
- return releasable(ref, compiled, scopeId, 0, () => {
256
- const id = link.id;
257
- if (id === -1) return;
258
- link.id = -1;
259
- link.ref = null;
260
- if (id > 0) {
261
- if (link.owner === engine) trackScopeMapping(link, -1);
262
- link.owner.unlink(id);
263
- } else if (++unlinkedPending > 512 && unlinkedPending * 2 > pendingLinks.length) {
264
- pendingLinks = pendingLinks.filter((pending2) => pending2.id === 0);
265
- unlinkedPending = 0;
266
- }
267
- });
268
213
  }
269
214
  const getNativeStyleEngineCacheStats = () => {
270
- const active = new Set([...scopeMappings.values()].flatMap((linked) => [...linked.keys()]));
215
+ const active = new Set([...scopeMappings.values()].flatMap((linked) => [...linked]));
271
216
  return {
272
217
  mappings: compiledMappings.size,
273
218
  activeMappings: active.size,
@@ -303,5 +248,5 @@ function queueNativeViewState(entry) {
303
248
  pending.push(entry);
304
249
  }
305
250
 
306
- export { flushNativeStyleLinks, getNativeStyleEngine, getNativeStyleEngineCacheStats, linkNativeStyleMapping, nativeTextInputColorProps, normalizeNativeStyle, queueNativeViewState, removeNativeStyleScope, resolveNativeStyleMapping, setNativeStyleEngine, setNativeStyleEngineFlushListener, updateNativeStyleLink, updateNativeStyleScope };
251
+ export { createNativeStyleLinkState, flushNativeStyleLinks, getNativeStyleEngine, getNativeStyleEngineCacheStats, linkNativeStyleHost, nativeTextInputColorProps, normalizeNativeStyle, queueNativeViewState, removeNativeStyleScope, resolveNativeStyleMapping, setNativeStyleEngine, setNativeStyleEngineFlushListener, updateNativeStyleLink, updateNativeStyleScope };
307
252
  //# sourceMappingURL=nativeStyleEngine.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"nativeStyleEngine.js","names":[],"sources":["esm/helpers/nativeStyleEngine.js"],"sourcesContent":["import { getVariableValue } from \"../createVariable\";\nconst nativeTextInputColorProps = {\n placeholderTextColor: \"placeholderTextColor\",\n selectionColor: \"selectionColor\",\n cursorColor: \"cursorColor\",\n selectionHandleColor: \"selectionHandleColor\"\n};\nconst nativeOutlineProps = [\n \"outlineStyle\",\n \"outlineWidth\",\n \"outlineColor\",\n \"outlineOffset\"\n];\nconst nativeIntrinsicSizeProps = [\n \"width\",\n \"height\",\n \"minWidth\",\n \"minHeight\",\n \"maxWidth\",\n \"maxHeight\"\n];\nfunction normalizeNativeStyle(style, reset = false) {\n let next;\n if (style.outlineStyle === \"none\") {\n next = { ...style };\n for (const key of nativeOutlineProps) {\n if (reset) {\n next[key] = null;\n } else {\n delete next[key];\n }\n }\n }\n for (const key of nativeIntrinsicSizeProps) {\n const value = style[key];\n if (value === \"max-content\" || value === \"min-content\" || value === \"fit-content\") {\n next ||= { ...style };\n if (reset) {\n next[key] = null;\n } else {\n delete next[key];\n }\n }\n }\n return next ?? style;\n}\nlet engine = null;\nconst scopeStates = /* @__PURE__ */ new Map();\nconst mappingKeys = /* @__PURE__ */ new WeakMap();\nconst compiledMappings = /* @__PURE__ */ new Map();\nconst scopeMappings = /* @__PURE__ */ new Map();\nlet nextTableId = 1;\nfunction getCompiledMapping(mapping) {\n let key = mappingKeys.get(mapping);\n if (!key) {\n key = JSON.stringify(\n Object.keys(mapping).sort().map((styleKey) => [styleKey, mapping[styleKey]])\n );\n mappingKeys.set(mapping, key);\n }\n let compiled = compiledMappings.get(key);\n if (!compiled) {\n compiled = {\n mapping,\n states: /* @__PURE__ */ new Map(),\n tableId: nextTableId++,\n sent: /* @__PURE__ */ new Map()\n };\n if (compiledMappings.size >= 1e4) {\n compiledMappings.clear();\n }\n compiledMappings.set(key, compiled);\n }\n return compiled;\n}\nfunction resolveCompiledMapping(compiled, stateName, theme) {\n const cached = compiled.states.get(stateName);\n if (cached?.theme === theme) return cached;\n let renderProps = {};\n for (const styleKey in compiled.mapping) {\n const value = theme[compiled.mapping[styleKey]];\n renderProps[styleKey] = value === void 0 ? null : getVariableValue(value);\n }\n renderProps = normalizeNativeStyle(renderProps, true);\n const nativeProps = engine?.processStyleColors(renderProps) ?? renderProps;\n if (compiled.states.size >= 1e4) {\n compiled.states.clear();\n }\n const resolved = { theme, renderProps, nativeProps };\n compiled.states.set(stateName, resolved);\n return resolved;\n}\nfunction syncTableState(compiled, stateName, theme) {\n const resolved = resolveCompiledMapping(compiled, stateName, theme);\n if (compiled.sent.get(stateName) === resolved) return;\n compiled.sent.set(stateName, resolved);\n engine.setTableState(compiled.tableId, stateName, resolved.nativeProps);\n}\nfunction setNativeStyleEngine(next) {\n if (engine !== next) {\n settleReleases();\n compiledMappings.clear();\n scopeMappings.clear();\n pendingLinks = [];\n unlinkedPending = 0;\n }\n engine = next;\n if (next) {\n for (const [scopeId, state] of scopeStates) {\n next.setStateName(state.name, scopeId);\n }\n }\n}\nfunction getNativeStyleEngine() {\n return engine;\n}\nfunction updateNativeStyleScope(scopeId, stateName, theme) {\n const previous = scopeStates.get(scopeId);\n if (previous?.name === stateName && previous.theme === theme) return;\n flushNativeStyleLinks();\n scopeStates.set(scopeId, { name: stateName, theme });\n if (engine) {\n const linked = scopeMappings.get(scopeId);\n if (linked) {\n for (const compiled of linked.keys()) {\n syncTableState(compiled, stateName, theme);\n }\n }\n }\n engine?.setStateName(stateName, scopeId);\n}\nfunction removeNativeStyleScope(scopeId) {\n if (!scopeStates.delete(scopeId)) return;\n engine?.removeScope(scopeId);\n}\nfunction resolveNativeStyleMapping(mapping, stateName, theme) {\n return resolveCompiledMapping(getCompiledMapping(mapping), stateName, theme).renderProps;\n}\nlet pendingLinks = [];\nlet unlinkedPending = 0;\nfunction trackScopeMapping(link, delta) {\n let linked = scopeMappings.get(link.scopeId);\n if (!linked) scopeMappings.set(link.scopeId, linked = /* @__PURE__ */ new Map());\n const count = (linked.get(link.compiled) ?? 0) + delta;\n if (count) {\n linked.set(link.compiled, count);\n } else {\n linked.delete(link.compiled);\n if (!linked.size) scopeMappings.delete(link.scopeId);\n }\n}\nfunction flushNativeStyleLinks() {\n settleReleases();\n if (!pendingLinks.length) return;\n const links = pendingLinks;\n pendingLinks = [];\n unlinkedPending = 0;\n if (!engine) return;\n const live = links.filter((link) => link.id === 0);\n if (!live.length) return;\n const refs = [];\n const tableIds = [];\n const scopeIndexes = [];\n const scopes = [];\n for (const link of live) {\n let scopeIndex = scopes.indexOf(link.scopeId);\n if (scopeIndex === -1) scopeIndex = scopes.push(link.scopeId) - 1;\n refs.push(link.ref);\n tableIds.push(link.compiled.tableId);\n scopeIndexes.push(scopeIndex);\n }\n const firstId = engine.linkTables(refs, tableIds, scopeIndexes, scopes);\n for (let i = 0; i < live.length; i++) {\n const link = live[i];\n link.id = firstId + i;\n link.owner = engine;\n link.ref = null;\n trackScopeMapping(link, 1);\n }\n}\nconst releases = /* @__PURE__ */ new Map();\nlet settleQueued = false;\nfunction settleReleases() {\n settleQueued = false;\n if (!releases.size) return;\n const settling = [...releases.values()];\n releases.clear();\n for (const release of settling) release.settle();\n}\nfunction releasable(ref, compiled, scopeId, id, settle) {\n const handle = {\n id,\n unlink: () => {\n const prior = releases.get(ref);\n if (prior && prior.handle !== handle) prior.settle();\n releases.set(ref, { compiled, scopeId, handle, settle });\n if (!settleQueued) {\n settleQueued = true;\n queueMicrotask(settleReleases);\n }\n }\n };\n return handle;\n}\nfunction linkNativeStyleMapping(ref, mapping, scopeId, stateName, theme) {\n if (!engine) return null;\n const compiled = getCompiledMapping(mapping);\n const scopeState = scopeStates.get(scopeId);\n const stale = scopeState && (scopeState.name !== stateName || scopeState.theme !== theme);\n const kept = releases.get(ref);\n if (kept) {\n releases.delete(ref);\n if (!stale && kept.compiled === compiled && kept.scopeId === scopeId)\n return kept.handle;\n kept.settle();\n }\n if (stale) {\n syncTableState(compiled, scopeState.name, scopeState.theme);\n const handle = engine.link(ref, compiled.tableId, scopeId, true);\n if (!handle) return null;\n const link2 = {\n ref: null,\n compiled,\n scopeId,\n id: handle.id,\n owner: engine\n };\n trackScopeMapping(link2, 1);\n return releasable(ref, compiled, scopeId, handle.id, () => {\n if (link2.id === -1) return;\n link2.id = -1;\n if (link2.owner === engine) trackScopeMapping(link2, -1);\n handle.unlink();\n });\n }\n syncTableState(compiled, stateName, theme);\n const link = { ref, compiled, scopeId, id: 0, owner: null };\n pendingLinks.push(link);\n return releasable(ref, compiled, scopeId, 0, () => {\n const id = link.id;\n if (id === -1) return;\n link.id = -1;\n link.ref = null;\n if (id > 0) {\n if (link.owner === engine) trackScopeMapping(link, -1);\n link.owner.unlink(id);\n } else if (++unlinkedPending > 512 && unlinkedPending * 2 > pendingLinks.length) {\n pendingLinks = pendingLinks.filter((pending2) => pending2.id === 0);\n unlinkedPending = 0;\n }\n });\n}\nconst getNativeStyleEngineCacheStats = () => {\n const active = new Set(\n [...scopeMappings.values()].flatMap((linked) => [...linked.keys()])\n );\n return {\n mappings: compiledMappings.size,\n activeMappings: active.size,\n states: [.../* @__PURE__ */ new Set([...compiledMappings.values(), ...active])].reduce(\n (total, compiled) => total + compiled.states.size,\n 0\n )\n };\n};\nlet pending = null;\nlet flushListener = null;\nfunction setNativeStyleEngineFlushListener(cb) {\n flushListener = cb;\n}\nfunction updateNativeStyleLink(ref, host) {\n if (ref.nativeLink) {\n ref.nativeLink.unlink();\n ref.nativeLink = null;\n }\n ref.nativePushedKeys = void 0;\n if (host && engine && ref.nativeStyleUpdate) {\n ref.nativeLink = engine.link(host, {});\n }\n}\nfunction queueNativeViewState(entry) {\n if (!engine) return;\n if (!pending) {\n pending = [];\n queueMicrotask(() => {\n const entries = pending;\n pending = null;\n engine?.applyViewStates(entries);\n flushListener?.(entries);\n });\n }\n pending.push(entry);\n}\nexport {\n flushNativeStyleLinks,\n getNativeStyleEngine,\n getNativeStyleEngineCacheStats,\n linkNativeStyleMapping,\n nativeTextInputColorProps,\n normalizeNativeStyle,\n queueNativeViewState,\n removeNativeStyleScope,\n resolveNativeStyleMapping,\n setNativeStyleEngine,\n setNativeStyleEngineFlushListener,\n updateNativeStyleLink,\n updateNativeStyleScope\n};\n//# sourceMappingURL=nativeStyleEngine.js.map\n"],"mappings":"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"}
1
+ {"version":3,"file":"nativeStyleEngine.js","names":[],"sources":["esm/helpers/nativeStyleEngine.js"],"sourcesContent":["import { getVariableValue } from \"../createVariable\";\nconst nativeTextInputColorProps = {\n placeholderTextColor: \"placeholderTextColor\",\n selectionColor: \"selectionColor\",\n cursorColor: \"cursorColor\",\n selectionHandleColor: \"selectionHandleColor\"\n};\nconst nativeOutlineProps = [\n \"outlineStyle\",\n \"outlineWidth\",\n \"outlineColor\",\n \"outlineOffset\"\n];\nconst nativeIntrinsicSizeProps = [\n \"width\",\n \"height\",\n \"minWidth\",\n \"minHeight\",\n \"maxWidth\",\n \"maxHeight\"\n];\nfunction normalizeNativeStyle(style, reset = false) {\n let next;\n if (style.outlineStyle === \"none\") {\n next = { ...style };\n for (const key of nativeOutlineProps) {\n if (reset) {\n next[key] = null;\n } else {\n delete next[key];\n }\n }\n }\n for (const key of nativeIntrinsicSizeProps) {\n const value = style[key];\n if (value === \"max-content\" || value === \"min-content\" || value === \"fit-content\") {\n next ||= { ...style };\n if (reset) {\n next[key] = null;\n } else {\n delete next[key];\n }\n }\n }\n return next ?? style;\n}\nlet engine = null;\nconst scopeStates = /* @__PURE__ */ new Map();\nconst mappingKeys = /* @__PURE__ */ new WeakMap();\nconst compiledMappings = /* @__PURE__ */ new Map();\nconst scopeMappings = /* @__PURE__ */ new Map();\nlet nextTableId = 1;\nfunction getCompiledMapping(mapping) {\n let key = mappingKeys.get(mapping);\n if (!key) {\n key = JSON.stringify(\n Object.keys(mapping).sort().map((styleKey) => [styleKey, mapping[styleKey]])\n );\n mappingKeys.set(mapping, key);\n }\n let compiled = compiledMappings.get(key);\n if (!compiled) {\n compiled = {\n mapping,\n states: /* @__PURE__ */ new Map(),\n tableId: nextTableId++,\n sent: /* @__PURE__ */ new Map()\n };\n if (compiledMappings.size >= 1e4) {\n compiledMappings.clear();\n }\n compiledMappings.set(key, compiled);\n }\n return compiled;\n}\nfunction resolveCompiledMapping(compiled, stateName, theme) {\n const cached = compiled.states.get(stateName);\n if (cached?.theme === theme) return cached;\n let renderProps = {};\n for (const styleKey in compiled.mapping) {\n const value = theme[compiled.mapping[styleKey]];\n renderProps[styleKey] = value === void 0 ? null : getVariableValue(value);\n }\n renderProps = normalizeNativeStyle(renderProps, true);\n const nativeProps = engine?.processStyleColors(renderProps) ?? renderProps;\n if (compiled.states.size >= 1e4) {\n compiled.states.clear();\n }\n const resolved = { theme, renderProps, nativeProps };\n compiled.states.set(stateName, resolved);\n return resolved;\n}\nfunction syncTableState(compiled, stateName, theme) {\n const resolved = resolveCompiledMapping(compiled, stateName, theme);\n if (compiled.sent.get(stateName) === resolved) return;\n compiled.sent.set(stateName, resolved);\n engine.setTableState(compiled.tableId, stateName, resolved.nativeProps);\n}\nfunction setNativeStyleEngine(next) {\n if (engine !== next) {\n compiledMappings.clear();\n scopeMappings.clear();\n pendingHosts = [];\n pendingStates = [];\n }\n engine = next;\n if (next) {\n for (const [scopeId, state] of scopeStates) {\n next.setStateName(state.name, scopeId);\n }\n }\n}\nfunction getNativeStyleEngine() {\n return engine;\n}\nfunction updateNativeStyleScope(scopeId, stateName, theme) {\n const previous = scopeStates.get(scopeId);\n if (previous?.name === stateName && previous.theme === theme) return;\n flushNativeStyleLinks();\n scopeStates.set(scopeId, { name: stateName, theme });\n if (engine) {\n const linked = scopeMappings.get(scopeId);\n if (linked) {\n for (const compiled of linked) {\n syncTableState(compiled, stateName, theme);\n }\n }\n }\n engine?.setStateName(stateName, scopeId);\n}\nfunction removeNativeStyleScope(scopeId) {\n if (!scopeStates.delete(scopeId)) return;\n queueMicrotask(() => {\n if (!scopeStates.has(scopeId)) scopeMappings.delete(scopeId);\n });\n engine?.removeScope(scopeId);\n}\nfunction resolveNativeStyleMapping(mapping, stateName, theme) {\n return resolveCompiledMapping(getCompiledMapping(mapping), stateName, theme).renderProps;\n}\nfunction createNativeStyleLinkState(mapping, scopeId, stateName, theme) {\n return { mapping, scopeId, stateName, theme };\n}\nlet pendingHosts = [];\nlet pendingStates = [];\nconst maxPendingHosts = 4096;\nlet idleFlushQueued = false;\nfunction idleFlush() {\n idleFlushQueued = false;\n flushNativeStyleLinks();\n}\nfunction addScopeMapping(scopeId, compiled) {\n let linked = scopeMappings.get(scopeId);\n if (!linked) scopeMappings.set(scopeId, linked = /* @__PURE__ */ new Set());\n linked.add(compiled);\n}\nfunction flushNativeStyleLinks() {\n if (!pendingHosts.length) return;\n const hosts = pendingHosts;\n const states = pendingStates;\n pendingHosts = [];\n pendingStates = [];\n if (!engine) return;\n const tableIds = new Array(hosts.length);\n const scopeIndexes = new Array(hosts.length);\n const scopes = [];\n let last;\n let tableId = 0;\n let scopeIndex = 0;\n for (let i = 0; i < hosts.length; i++) {\n const state = states[i];\n if (state !== last) {\n last = state;\n const compiled = getCompiledMapping(state.mapping);\n syncTableState(compiled, state.stateName, state.theme);\n addScopeMapping(state.scopeId, compiled);\n tableId = compiled.tableId;\n scopeIndex = scopes.indexOf(state.scopeId);\n if (scopeIndex === -1) scopeIndex = scopes.push(state.scopeId) - 1;\n }\n tableIds[i] = tableId;\n scopeIndexes[i] = scopeIndex;\n }\n engine.linkTables(hosts, tableIds, scopeIndexes, scopes);\n}\nfunction linkNativeStyleHost(host, state) {\n if (!engine) return;\n const live = scopeStates.get(state.scopeId);\n if (live && (live.name !== state.stateName || live.theme !== state.theme)) {\n const compiled = getCompiledMapping(state.mapping);\n syncTableState(compiled, live.name, live.theme);\n addScopeMapping(state.scopeId, compiled);\n engine.link(host, compiled.tableId, state.scopeId, true);\n return;\n }\n pendingHosts.push(host);\n pendingStates.push(state);\n if (pendingHosts.length >= maxPendingHosts && !idleFlushQueued) {\n idleFlushQueued = true;\n requestIdleCallback(idleFlush);\n }\n}\nconst getNativeStyleEngineCacheStats = () => {\n const active = new Set([...scopeMappings.values()].flatMap((linked) => [...linked]));\n return {\n mappings: compiledMappings.size,\n activeMappings: active.size,\n states: [.../* @__PURE__ */ new Set([...compiledMappings.values(), ...active])].reduce(\n (total, compiled) => total + compiled.states.size,\n 0\n )\n };\n};\nlet pending = null;\nlet flushListener = null;\nfunction setNativeStyleEngineFlushListener(cb) {\n flushListener = cb;\n}\nfunction updateNativeStyleLink(ref, host) {\n if (ref.nativeLink) {\n ref.nativeLink.unlink();\n ref.nativeLink = null;\n }\n ref.nativePushedKeys = void 0;\n if (host && engine && ref.nativeStyleUpdate) {\n ref.nativeLink = engine.link(host, {});\n }\n}\nfunction queueNativeViewState(entry) {\n if (!engine) return;\n if (!pending) {\n pending = [];\n queueMicrotask(() => {\n const entries = pending;\n pending = null;\n engine?.applyViewStates(entries);\n flushListener?.(entries);\n });\n }\n pending.push(entry);\n}\nexport {\n createNativeStyleLinkState,\n flushNativeStyleLinks,\n getNativeStyleEngine,\n getNativeStyleEngineCacheStats,\n linkNativeStyleHost,\n nativeTextInputColorProps,\n normalizeNativeStyle,\n queueNativeViewState,\n removeNativeStyleScope,\n resolveNativeStyleMapping,\n setNativeStyleEngine,\n setNativeStyleEngineFlushListener,\n updateNativeStyleLink,\n updateNativeStyleScope\n};\n//# sourceMappingURL=nativeStyleEngine.js.map\n"],"mappings":"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"}
@@ -139,11 +139,10 @@ function syncTableState(compiled, stateName, theme) {
139
139
  }
140
140
  function setNativeStyleEngine(next) {
141
141
  if (engine !== next) {
142
- settleReleases();
143
142
  compiledMappings.clear();
144
143
  scopeMappings.clear();
145
- pendingLinks = [];
146
- unlinkedPending = 0;
144
+ pendingHosts = [];
145
+ pendingStates = [];
147
146
  }
148
147
  engine = next;
149
148
  if (next) {
@@ -185,7 +184,7 @@ function updateNativeStyleScope(scopeId, stateName, theme) {
185
184
  if (linked) {
186
185
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
187
186
  try {
188
- for (var _iterator = linked.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
187
+ for (var _iterator = linked[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
189
188
  var compiled = _step.value;
190
189
  syncTableState(compiled, stateName, theme);
191
190
  }
@@ -209,179 +208,84 @@ function updateNativeStyleScope(scopeId, stateName, theme) {
209
208
  }
210
209
  function removeNativeStyleScope(scopeId) {
211
210
  if (!scopeStates.delete(scopeId)) return;
211
+ queueMicrotask(function() {
212
+ if (!scopeStates.has(scopeId)) scopeMappings.delete(scopeId);
213
+ });
212
214
  engine === null || engine === void 0 ? void 0 : engine.removeScope(scopeId);
213
215
  }
214
216
  function resolveNativeStyleMapping(mapping, stateName, theme) {
215
217
  return resolveCompiledMapping(getCompiledMapping(mapping), stateName, theme).renderProps;
216
218
  }
217
- var pendingLinks = [];
218
- var unlinkedPending = 0;
219
- function trackScopeMapping(link, delta) {
220
- var linked = scopeMappings.get(link.scopeId);
221
- if (!linked) scopeMappings.set(link.scopeId, linked = /* @__PURE__ */ new Map());
222
- var _linked_get;
223
- var count = ((_linked_get = linked.get(link.compiled)) !== null && _linked_get !== void 0 ? _linked_get : 0) + delta;
224
- if (count) {
225
- linked.set(link.compiled, count);
226
- } else {
227
- linked.delete(link.compiled);
228
- if (!linked.size) scopeMappings.delete(link.scopeId);
229
- }
219
+ function createNativeStyleLinkState(mapping, scopeId, stateName, theme) {
220
+ return {
221
+ mapping,
222
+ scopeId,
223
+ stateName,
224
+ theme
225
+ };
226
+ }
227
+ var pendingHosts = [];
228
+ var pendingStates = [];
229
+ var maxPendingHosts = 4096;
230
+ var idleFlushQueued = false;
231
+ function idleFlush() {
232
+ idleFlushQueued = false;
233
+ flushNativeStyleLinks();
234
+ }
235
+ function addScopeMapping(scopeId, compiled) {
236
+ var linked = scopeMappings.get(scopeId);
237
+ if (!linked) scopeMappings.set(scopeId, linked = /* @__PURE__ */ new Set());
238
+ linked.add(compiled);
230
239
  }
231
240
  function flushNativeStyleLinks() {
232
- settleReleases();
233
- if (!pendingLinks.length) return;
234
- var links = pendingLinks;
235
- pendingLinks = [];
236
- unlinkedPending = 0;
241
+ if (!pendingHosts.length) return;
242
+ var hosts = pendingHosts;
243
+ var states = pendingStates;
244
+ pendingHosts = [];
245
+ pendingStates = [];
237
246
  if (!engine) return;
238
- var live = links.filter(function(link2) {
239
- return link2.id === 0;
240
- });
241
- if (!live.length) return;
242
- var refs = [];
243
- var tableIds = [];
244
- var scopeIndexes = [];
247
+ var tableIds = new Array(hosts.length);
248
+ var scopeIndexes = new Array(hosts.length);
245
249
  var scopes = [];
246
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
247
- try {
248
- for (var _iterator = live[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
249
- var link = _step.value;
250
- var scopeIndex = scopes.indexOf(link.scopeId);
251
- if (scopeIndex === -1) scopeIndex = scopes.push(link.scopeId) - 1;
252
- refs.push(link.ref);
253
- tableIds.push(link.compiled.tableId);
254
- scopeIndexes.push(scopeIndex);
250
+ var last;
251
+ var tableId = 0;
252
+ var scopeIndex = 0;
253
+ for (var i = 0; i < hosts.length; i++) {
254
+ var state = states[i];
255
+ if (state !== last) {
256
+ last = state;
257
+ var compiled = getCompiledMapping(state.mapping);
258
+ syncTableState(compiled, state.stateName, state.theme);
259
+ addScopeMapping(state.scopeId, compiled);
260
+ tableId = compiled.tableId;
261
+ scopeIndex = scopes.indexOf(state.scopeId);
262
+ if (scopeIndex === -1) scopeIndex = scopes.push(state.scopeId) - 1;
255
263
  }
256
- } catch (err) {
257
- _didIteratorError = true;
258
- _iteratorError = err;
259
- } finally {
260
- try {
261
- if (!_iteratorNormalCompletion && _iterator.return != null) {
262
- _iterator.return();
263
- }
264
- } finally {
265
- if (_didIteratorError) {
266
- throw _iteratorError;
267
- }
268
- }
269
- }
270
- var firstId = engine.linkTables(refs, tableIds, scopeIndexes, scopes);
271
- for (var i = 0; i < live.length; i++) {
272
- var link1 = live[i];
273
- link1.id = firstId + i;
274
- link1.owner = engine;
275
- link1.ref = null;
276
- trackScopeMapping(link1, 1);
264
+ tableIds[i] = tableId;
265
+ scopeIndexes[i] = scopeIndex;
277
266
  }
267
+ engine.linkTables(hosts, tableIds, scopeIndexes, scopes);
278
268
  }
279
- var releases = /* @__PURE__ */ new Map();
280
- var settleQueued = false;
281
- function settleReleases() {
282
- settleQueued = false;
283
- if (!releases.size) return;
284
- var settling = [...releases.values()];
285
- releases.clear();
286
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
287
- try {
288
- for (var _iterator = settling[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
289
- var release = _step.value;
290
- release.settle();
291
- }
292
- } catch (err) {
293
- _didIteratorError = true;
294
- _iteratorError = err;
295
- } finally {
296
- try {
297
- if (!_iteratorNormalCompletion && _iterator.return != null) {
298
- _iterator.return();
299
- }
300
- } finally {
301
- if (_didIteratorError) {
302
- throw _iteratorError;
303
- }
304
- }
305
- }
306
- }
307
- function releasable(ref, compiled, scopeId, id, settle) {
308
- var handle = {
309
- id,
310
- unlink: function() {
311
- var prior = releases.get(ref);
312
- if (prior && prior.handle !== handle) prior.settle();
313
- releases.set(ref, {
314
- compiled,
315
- scopeId,
316
- handle,
317
- settle
318
- });
319
- if (!settleQueued) {
320
- settleQueued = true;
321
- queueMicrotask(settleReleases);
322
- }
323
- }
324
- };
325
- return handle;
326
- }
327
- function linkNativeStyleMapping(ref, mapping, scopeId, stateName, theme) {
328
- if (!engine) return null;
329
- var compiled = getCompiledMapping(mapping);
330
- var scopeState = scopeStates.get(scopeId);
331
- var stale = scopeState && (scopeState.name !== stateName || scopeState.theme !== theme);
332
- var kept = releases.get(ref);
333
- if (kept) {
334
- releases.delete(ref);
335
- if (!stale && kept.compiled === compiled && kept.scopeId === scopeId) return kept.handle;
336
- kept.settle();
269
+ function linkNativeStyleHost(host, state) {
270
+ if (!engine) return;
271
+ var live = scopeStates.get(state.scopeId);
272
+ if (live && (live.name !== state.stateName || live.theme !== state.theme)) {
273
+ var compiled = getCompiledMapping(state.mapping);
274
+ syncTableState(compiled, live.name, live.theme);
275
+ addScopeMapping(state.scopeId, compiled);
276
+ engine.link(host, compiled.tableId, state.scopeId, true);
277
+ return;
337
278
  }
338
- if (stale) {
339
- syncTableState(compiled, scopeState.name, scopeState.theme);
340
- var handle = engine.link(ref, compiled.tableId, scopeId, true);
341
- if (!handle) return null;
342
- var link = {
343
- ref: null,
344
- compiled,
345
- scopeId,
346
- id: handle.id,
347
- owner: engine
348
- };
349
- trackScopeMapping(link, 1);
350
- return releasable(ref, compiled, scopeId, handle.id, function() {
351
- if (link.id === -1) return;
352
- link.id = -1;
353
- if (link.owner === engine) trackScopeMapping(link, -1);
354
- handle.unlink();
355
- });
279
+ pendingHosts.push(host);
280
+ pendingStates.push(state);
281
+ if (pendingHosts.length >= maxPendingHosts && !idleFlushQueued) {
282
+ idleFlushQueued = true;
283
+ requestIdleCallback(idleFlush);
356
284
  }
357
- syncTableState(compiled, stateName, theme);
358
- var link1 = {
359
- ref,
360
- compiled,
361
- scopeId,
362
- id: 0,
363
- owner: null
364
- };
365
- pendingLinks.push(link1);
366
- return releasable(ref, compiled, scopeId, 0, function() {
367
- var id = link1.id;
368
- if (id === -1) return;
369
- link1.id = -1;
370
- link1.ref = null;
371
- if (id > 0) {
372
- if (link1.owner === engine) trackScopeMapping(link1, -1);
373
- link1.owner.unlink(id);
374
- } else if (++unlinkedPending > 512 && unlinkedPending * 2 > pendingLinks.length) {
375
- pendingLinks = pendingLinks.filter(function(pending2) {
376
- return pending2.id === 0;
377
- });
378
- unlinkedPending = 0;
379
- }
380
- });
381
285
  }
382
286
  var getNativeStyleEngineCacheStats = function() {
383
287
  var active = new Set([...scopeMappings.values()].flatMap(function(linked) {
384
- return [...linked.keys()];
288
+ return [...linked];
385
289
  }));
386
290
  return {
387
291
  mappings: compiledMappings.size,
@@ -420,5 +324,5 @@ function queueNativeViewState(entry) {
420
324
  pending.push(entry);
421
325
  }
422
326
 
423
- export { flushNativeStyleLinks, getNativeStyleEngine, getNativeStyleEngineCacheStats, linkNativeStyleMapping, nativeTextInputColorProps, normalizeNativeStyle, queueNativeViewState, removeNativeStyleScope, resolveNativeStyleMapping, setNativeStyleEngine, setNativeStyleEngineFlushListener, updateNativeStyleLink, updateNativeStyleScope };
327
+ export { createNativeStyleLinkState, flushNativeStyleLinks, getNativeStyleEngine, getNativeStyleEngineCacheStats, linkNativeStyleHost, nativeTextInputColorProps, normalizeNativeStyle, queueNativeViewState, removeNativeStyleScope, resolveNativeStyleMapping, setNativeStyleEngine, setNativeStyleEngineFlushListener, updateNativeStyleLink, updateNativeStyleScope };
424
328
  //# sourceMappingURL=nativeStyleEngine.native.js.map