@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
@@ -1 +1 @@
1
- {"version":3,"file":"nativeStyleEngine.native.js","names":[],"sources":["esm/helpers/nativeStyleEngine.native.js"],"sourcesContent":["import { getVariableValue } from \"../createVariable\";\nvar nativeTextInputColorProps = {\n placeholderTextColor: \"placeholderTextColor\",\n selectionColor: \"selectionColor\",\n cursorColor: \"cursorColor\",\n selectionHandleColor: \"selectionHandleColor\"\n};\nvar nativeOutlineProps = [\n \"outlineStyle\",\n \"outlineWidth\",\n \"outlineColor\",\n \"outlineOffset\"\n];\nvar nativeIntrinsicSizeProps = [\n \"width\",\n \"height\",\n \"minWidth\",\n \"minHeight\",\n \"maxWidth\",\n \"maxHeight\"\n];\nfunction normalizeNativeStyle(style) {\n var reset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;\n var next;\n if (style.outlineStyle === \"none\") {\n next = {\n ...style\n };\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = nativeOutlineProps[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var key = _step.value;\n if (reset) {\n next[key] = null;\n } else {\n delete next[key];\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;\n try {\n for (var _iterator1 = nativeIntrinsicSizeProps[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {\n var key1 = _step1.value;\n var value = style[key1];\n if (value === \"max-content\" || value === \"min-content\" || value === \"fit-content\") {\n next || (next = {\n ...style\n });\n if (reset) {\n next[key1] = null;\n } else {\n delete next[key1];\n }\n }\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally {\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n return next !== null && next !== void 0 ? next : style;\n}\nvar engine = null;\nvar scopeStates = /* @__PURE__ */ new Map();\nvar mappingKeys = /* @__PURE__ */ new WeakMap();\nvar compiledMappings = /* @__PURE__ */ new Map();\nvar scopeMappings = /* @__PURE__ */ new Map();\nvar nextTableId = 1;\nfunction getCompiledMapping(mapping) {\n var key = mappingKeys.get(mapping);\n if (!key) {\n key = JSON.stringify(Object.keys(mapping).sort().map(function(styleKey) {\n return [\n styleKey,\n mapping[styleKey]\n ];\n }));\n mappingKeys.set(mapping, key);\n }\n var 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 var cached = compiled.states.get(stateName);\n if ((cached === null || cached === void 0 ? void 0 : cached.theme) === theme) return cached;\n var renderProps = {};\n for (var styleKey in compiled.mapping) {\n var value = theme[compiled.mapping[styleKey]];\n renderProps[styleKey] = value === void 0 ? null : getVariableValue(value);\n }\n renderProps = normalizeNativeStyle(renderProps, true);\n var _engine_processStyleColors;\n var nativeProps = (_engine_processStyleColors = engine === null || engine === void 0 ? void 0 : engine.processStyleColors(renderProps)) !== null && _engine_processStyleColors !== void 0 ? _engine_processStyleColors : renderProps;\n if (compiled.states.size >= 1e4) {\n compiled.states.clear();\n }\n var resolved = {\n theme,\n renderProps,\n nativeProps\n };\n compiled.states.set(stateName, resolved);\n return resolved;\n}\nfunction syncTableState(compiled, stateName, theme) {\n var 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 var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = scopeStates[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var [scopeId, state] = _step.value;\n next.setStateName(state.name, scopeId);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n}\nfunction getNativeStyleEngine() {\n return engine;\n}\nfunction updateNativeStyleScope(scopeId, stateName, theme) {\n var previous = scopeStates.get(scopeId);\n if ((previous === null || previous === void 0 ? void 0 : previous.name) === stateName && previous.theme === theme) return;\n flushNativeStyleLinks();\n scopeStates.set(scopeId, {\n name: stateName,\n theme\n });\n if (engine) {\n var linked = scopeMappings.get(scopeId);\n if (linked) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = linked.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var compiled = _step.value;\n syncTableState(compiled, stateName, theme);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n }\n engine === null || engine === void 0 ? void 0 : engine.setStateName(stateName, scopeId);\n}\nfunction removeNativeStyleScope(scopeId) {\n if (!scopeStates.delete(scopeId)) return;\n engine === null || engine === void 0 ? void 0 : engine.removeScope(scopeId);\n}\nfunction resolveNativeStyleMapping(mapping, stateName, theme) {\n return resolveCompiledMapping(getCompiledMapping(mapping), stateName, theme).renderProps;\n}\nvar pendingLinks = [];\nvar unlinkedPending = 0;\nfunction trackScopeMapping(link, delta) {\n var linked = scopeMappings.get(link.scopeId);\n if (!linked) scopeMappings.set(link.scopeId, linked = /* @__PURE__ */ new Map());\n var _linked_get;\n var count = ((_linked_get = linked.get(link.compiled)) !== null && _linked_get !== void 0 ? _linked_get : 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 var links = pendingLinks;\n pendingLinks = [];\n unlinkedPending = 0;\n if (!engine) return;\n var live = links.filter(function(link2) {\n return link2.id === 0;\n });\n if (!live.length) return;\n var refs = [];\n var tableIds = [];\n var scopeIndexes = [];\n var scopes = [];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = live[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var link = _step.value;\n var 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 } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n var firstId = engine.linkTables(refs, tableIds, scopeIndexes, scopes);\n for (var i = 0; i < live.length; i++) {\n var link1 = live[i];\n link1.id = firstId + i;\n link1.owner = engine;\n link1.ref = null;\n trackScopeMapping(link1, 1);\n }\n}\nvar releases = /* @__PURE__ */ new Map();\nvar settleQueued = false;\nfunction settleReleases() {\n settleQueued = false;\n if (!releases.size) return;\n var settling = [\n ...releases.values()\n ];\n releases.clear();\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = settling[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var release = _step.value;\n release.settle();\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction releasable(ref, compiled, scopeId, id, settle) {\n var handle = {\n id,\n unlink: function() {\n var prior = releases.get(ref);\n if (prior && prior.handle !== handle) prior.settle();\n releases.set(ref, {\n compiled,\n scopeId,\n handle,\n settle\n });\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 var compiled = getCompiledMapping(mapping);\n var scopeState = scopeStates.get(scopeId);\n var stale = scopeState && (scopeState.name !== stateName || scopeState.theme !== theme);\n var kept = releases.get(ref);\n if (kept) {\n releases.delete(ref);\n if (!stale && kept.compiled === compiled && kept.scopeId === scopeId) return kept.handle;\n kept.settle();\n }\n if (stale) {\n syncTableState(compiled, scopeState.name, scopeState.theme);\n var handle = engine.link(ref, compiled.tableId, scopeId, true);\n if (!handle) return null;\n var link = {\n ref: null,\n compiled,\n scopeId,\n id: handle.id,\n owner: engine\n };\n trackScopeMapping(link, 1);\n return releasable(ref, compiled, scopeId, handle.id, function() {\n if (link.id === -1) return;\n link.id = -1;\n if (link.owner === engine) trackScopeMapping(link, -1);\n handle.unlink();\n });\n }\n syncTableState(compiled, stateName, theme);\n var link1 = {\n ref,\n compiled,\n scopeId,\n id: 0,\n owner: null\n };\n pendingLinks.push(link1);\n return releasable(ref, compiled, scopeId, 0, function() {\n var id = link1.id;\n if (id === -1) return;\n link1.id = -1;\n link1.ref = null;\n if (id > 0) {\n if (link1.owner === engine) trackScopeMapping(link1, -1);\n link1.owner.unlink(id);\n } else if (++unlinkedPending > 512 && unlinkedPending * 2 > pendingLinks.length) {\n pendingLinks = pendingLinks.filter(function(pending2) {\n return pending2.id === 0;\n });\n unlinkedPending = 0;\n }\n });\n}\nvar getNativeStyleEngineCacheStats = function() {\n var active = new Set([\n ...scopeMappings.values()\n ].flatMap(function(linked) {\n return [\n ...linked.keys()\n ];\n }));\n return {\n mappings: compiledMappings.size,\n activeMappings: active.size,\n states: [\n .../* @__PURE__ */ new Set([\n ...compiledMappings.values(),\n ...active\n ])\n ].reduce(function(total, compiled) {\n return total + compiled.states.size;\n }, 0)\n };\n};\nvar pending = null;\nvar 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(function() {\n var entries = pending;\n pending = null;\n engine === null || engine === void 0 ? void 0 : engine.applyViewStates(entries);\n flushListener === null || flushListener === void 0 ? void 0 : 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.native.js","names":[],"sources":["esm/helpers/nativeStyleEngine.native.js"],"sourcesContent":["import { getVariableValue } from \"../createVariable\";\nvar nativeTextInputColorProps = {\n placeholderTextColor: \"placeholderTextColor\",\n selectionColor: \"selectionColor\",\n cursorColor: \"cursorColor\",\n selectionHandleColor: \"selectionHandleColor\"\n};\nvar nativeOutlineProps = [\n \"outlineStyle\",\n \"outlineWidth\",\n \"outlineColor\",\n \"outlineOffset\"\n];\nvar nativeIntrinsicSizeProps = [\n \"width\",\n \"height\",\n \"minWidth\",\n \"minHeight\",\n \"maxWidth\",\n \"maxHeight\"\n];\nfunction normalizeNativeStyle(style) {\n var reset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;\n var next;\n if (style.outlineStyle === \"none\") {\n next = {\n ...style\n };\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = nativeOutlineProps[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var key = _step.value;\n if (reset) {\n next[key] = null;\n } else {\n delete next[key];\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;\n try {\n for (var _iterator1 = nativeIntrinsicSizeProps[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {\n var key1 = _step1.value;\n var value = style[key1];\n if (value === \"max-content\" || value === \"min-content\" || value === \"fit-content\") {\n next || (next = {\n ...style\n });\n if (reset) {\n next[key1] = null;\n } else {\n delete next[key1];\n }\n }\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally {\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n return next !== null && next !== void 0 ? next : style;\n}\nvar engine = null;\nvar scopeStates = /* @__PURE__ */ new Map();\nvar mappingKeys = /* @__PURE__ */ new WeakMap();\nvar compiledMappings = /* @__PURE__ */ new Map();\nvar scopeMappings = /* @__PURE__ */ new Map();\nvar nextTableId = 1;\nfunction getCompiledMapping(mapping) {\n var key = mappingKeys.get(mapping);\n if (!key) {\n key = JSON.stringify(Object.keys(mapping).sort().map(function(styleKey) {\n return [\n styleKey,\n mapping[styleKey]\n ];\n }));\n mappingKeys.set(mapping, key);\n }\n var 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 var cached = compiled.states.get(stateName);\n if ((cached === null || cached === void 0 ? void 0 : cached.theme) === theme) return cached;\n var renderProps = {};\n for (var styleKey in compiled.mapping) {\n var value = theme[compiled.mapping[styleKey]];\n renderProps[styleKey] = value === void 0 ? null : getVariableValue(value);\n }\n renderProps = normalizeNativeStyle(renderProps, true);\n var _engine_processStyleColors;\n var nativeProps = (_engine_processStyleColors = engine === null || engine === void 0 ? void 0 : engine.processStyleColors(renderProps)) !== null && _engine_processStyleColors !== void 0 ? _engine_processStyleColors : renderProps;\n if (compiled.states.size >= 1e4) {\n compiled.states.clear();\n }\n var resolved = {\n theme,\n renderProps,\n nativeProps\n };\n compiled.states.set(stateName, resolved);\n return resolved;\n}\nfunction syncTableState(compiled, stateName, theme) {\n var 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 var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = scopeStates[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var [scopeId, state] = _step.value;\n next.setStateName(state.name, scopeId);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n}\nfunction getNativeStyleEngine() {\n return engine;\n}\nfunction updateNativeStyleScope(scopeId, stateName, theme) {\n var previous = scopeStates.get(scopeId);\n if ((previous === null || previous === void 0 ? void 0 : previous.name) === stateName && previous.theme === theme) return;\n flushNativeStyleLinks();\n scopeStates.set(scopeId, {\n name: stateName,\n theme\n });\n if (engine) {\n var linked = scopeMappings.get(scopeId);\n if (linked) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = linked[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var compiled = _step.value;\n syncTableState(compiled, stateName, theme);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n }\n engine === null || engine === void 0 ? void 0 : engine.setStateName(stateName, scopeId);\n}\nfunction removeNativeStyleScope(scopeId) {\n if (!scopeStates.delete(scopeId)) return;\n queueMicrotask(function() {\n if (!scopeStates.has(scopeId)) scopeMappings.delete(scopeId);\n });\n engine === null || engine === void 0 ? void 0 : 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 {\n mapping,\n scopeId,\n stateName,\n theme\n };\n}\nvar pendingHosts = [];\nvar pendingStates = [];\nvar maxPendingHosts = 4096;\nvar idleFlushQueued = false;\nfunction idleFlush() {\n idleFlushQueued = false;\n flushNativeStyleLinks();\n}\nfunction addScopeMapping(scopeId, compiled) {\n var 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 var hosts = pendingHosts;\n var states = pendingStates;\n pendingHosts = [];\n pendingStates = [];\n if (!engine) return;\n var tableIds = new Array(hosts.length);\n var scopeIndexes = new Array(hosts.length);\n var scopes = [];\n var last;\n var tableId = 0;\n var scopeIndex = 0;\n for (var i = 0; i < hosts.length; i++) {\n var state = states[i];\n if (state !== last) {\n last = state;\n var 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 var live = scopeStates.get(state.scopeId);\n if (live && (live.name !== state.stateName || live.theme !== state.theme)) {\n var 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}\nvar getNativeStyleEngineCacheStats = function() {\n var active = new Set([\n ...scopeMappings.values()\n ].flatMap(function(linked) {\n return [\n ...linked\n ];\n }));\n return {\n mappings: compiledMappings.size,\n activeMappings: active.size,\n states: [\n .../* @__PURE__ */ new Set([\n ...compiledMappings.values(),\n ...active\n ])\n ].reduce(function(total, compiled) {\n return total + compiled.states.size;\n }, 0)\n };\n};\nvar pending = null;\nvar 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(function() {\n var entries = pending;\n pending = null;\n engine === null || engine === void 0 ? void 0 : engine.applyViewStates(entries);\n flushListener === null || flushListener === void 0 ? void 0 : 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/web",
3
- "version": "3.0.5",
3
+ "version": "3.0.6",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "Nate Wienert"
@@ -100,23 +100,23 @@
100
100
  "test:web": "vitest --typecheck --run"
101
101
  },
102
102
  "dependencies": {
103
- "@tamagui/animation-helpers": "3.0.5",
104
- "@tamagui/compose-refs": "3.0.5",
105
- "@tamagui/constants": "3.0.5",
106
- "@tamagui/dom": "3.0.5",
107
- "@tamagui/helpers": "3.0.5",
108
- "@tamagui/is-equal-shallow": "3.0.5",
109
- "@tamagui/native": "3.0.5",
110
- "@tamagui/normalize-css-color": "3.0.5",
111
- "@tamagui/react-native-types": "3.0.5",
112
- "@tamagui/style-grammar": "3.0.5",
113
- "@tamagui/types": "3.0.5",
114
- "@tamagui/use-did-finish-ssr": "3.0.5",
115
- "@tamagui/use-event": "3.0.5",
116
- "@tamagui/use-force-update": "3.0.5"
103
+ "@tamagui/animation-helpers": "3.0.6",
104
+ "@tamagui/compose-refs": "3.0.6",
105
+ "@tamagui/constants": "3.0.6",
106
+ "@tamagui/dom": "3.0.6",
107
+ "@tamagui/helpers": "3.0.6",
108
+ "@tamagui/is-equal-shallow": "3.0.6",
109
+ "@tamagui/native": "3.0.6",
110
+ "@tamagui/normalize-css-color": "3.0.6",
111
+ "@tamagui/react-native-types": "3.0.6",
112
+ "@tamagui/style-grammar": "3.0.6",
113
+ "@tamagui/types": "3.0.6",
114
+ "@tamagui/use-did-finish-ssr": "3.0.6",
115
+ "@tamagui/use-event": "3.0.6",
116
+ "@tamagui/use-force-update": "3.0.6"
117
117
  },
118
118
  "devDependencies": {
119
- "@tamagui/build": "3.0.5",
119
+ "@tamagui/build": "3.0.6",
120
120
  "@testing-library/react": "^16.1.0",
121
121
  "csstype": "^3.0.10",
122
122
  "react": "19.2.3",
@@ -133,5 +133,5 @@
133
133
  "./dist/cjs": "./dist/esm/index.native.js",
134
134
  "./theme-update": "./dist/esm/theme-update.native.js"
135
135
  },
136
- "releaseSourceCommit": "2500e65729dfd41ce27b4b3271f22f9c1d1ff5a3"
136
+ "releaseSourceCommit": "ee01c1a5d113f9d0f4e9e26c35154165ce25add6"
137
137
  }
@@ -3,9 +3,11 @@ import { isAndroid, isIos } from '@tamagui/constants'
3
3
  import React, { use } from 'react'
4
4
  import { _withStableStyle } from './_withStableStyle'
5
5
  import {
6
+ createNativeStyleLinkState,
6
7
  getNativeStyleEngine,
7
- linkNativeStyleMapping,
8
+ linkNativeStyleHost,
8
9
  resolveNativeStyleMapping,
10
+ type NativeStyleLinkState,
9
11
  type NativeStyleThemeMapping,
10
12
  } from './helpers/nativeStyleEngine'
11
13
  import { getThemeState, ThemeStateContext } from './hooks/useThemeState'
@@ -22,9 +24,10 @@ const hostTextProps = {
22
24
  /**
23
25
  * internal: emitted by the native compiler when experimental.nativeFastPath is on.
24
26
  *
25
- * One component over the host: the theme scope is the only context read, the
26
- * host ref links straight to the engine and unlinks through React's ref
27
- * cleanup, so a themed view costs one component and one engine call to mount.
27
+ * One component over the host: the theme scope is the only context read and
28
+ * the host ref queues the host for the engine's next batched link. Links never
29
+ * detach (the engine prunes unmounted views), so a themed view costs one
30
+ * component and one array push to mount.
28
31
  *
29
32
  * `host: 'view'`: `Component` is RN's host view (`unstable_NativeView`).
30
33
  * <View> resets TextAncestorContext for its children when it sits inside a
@@ -72,20 +75,36 @@ export const _withNativeStyle = (
72
75
  }),
73
76
  }
74
77
  : baseStyle
75
- // one style array per scope and host mode, its theme slot set to the scope's
76
- // current state on every render. the engine owns a linked view's theme
77
- // values, so a re-render after a switch hands React the same array, its diff
78
- // skips the style, and the host is not re-committed with values the engine
79
- // already applied. a new host reads the array's current state at creation
80
- const styles = new Map<string, (object | null)[]>()
81
- const hostTextStyles = new Map<string, (object | null)[]>()
78
+ // one entry per scope. its style arrays (one per host mode) keep their
79
+ // identity while their theme slot follows the scope's state: the engine owns
80
+ // a linked view's theme values, so a re-render after a switch hands React
81
+ // the same array, its diff skips the style, and the host is not re-committed
82
+ // with values the engine already applied. a new host reads the array's
83
+ // current state at creation. the entry's ref is stable too, so a parent
84
+ // re-render never detaches and re-attaches its hosts, and attaching records
85
+ // the host against the state record every host of this scope shares
86
+ const entries = new Map<string, ScopeEntry>()
87
+ const createEntry = (): ScopeEntry => {
88
+ const entry: ScopeEntry = {
89
+ style: [baseStyle, null],
90
+ hostTextStyle: [hostTextBase, null],
91
+ stateName: '',
92
+ theme: null,
93
+ state: null!,
94
+ ref: (node: unknown) => {
95
+ if (node) linkHost(node, entry.state)
96
+ },
97
+ }
98
+ return entry
99
+ }
82
100
  // bundlers inline imports as a module lookup at every use; bind them once
83
101
  // here, outside the per-mount path
84
102
  const ScopeContext = ThemeStateContext
85
103
  const engineOf = getNativeStyleEngine
86
104
  const scopeState = getThemeState
87
105
  const resolve = resolveNativeStyleMapping
88
- const linkMapping = linkNativeStyleMapping
106
+ const linkState = createNativeStyleLinkState
107
+ const linkHost = linkNativeStyleHost
89
108
  const assignRef = setRef
90
109
 
91
110
  // `use` reads context from whichever render calls it, so the compiler can
@@ -117,32 +136,40 @@ export const _withNativeStyle = (
117
136
  const { name, theme } = themeState
118
137
  const asHostText = HostText && !inText
119
138
  const Rendered = asHostText ? HostText : Component
120
- const cache = asHostText ? hostTextStyles : styles
121
- let style = cache.get(scopeId)
122
- if (!style) {
123
- style = [asHostText ? hostTextBase : baseStyle, null]
124
- cache.set(scopeId, style)
139
+ let entry = entries.get(scopeId)
140
+ if (!entry) {
141
+ entry = createEntry()
142
+ entries.set(scopeId, entry)
125
143
  }
126
- style[1] = resolve(themeStyleKeys, name, theme)
144
+ if (entry.stateName !== name || entry.theme !== theme) {
145
+ const themed = resolve(themeStyleKeys, name, theme)
146
+ entry.style[1] = themed
147
+ entry.hostTextStyle[1] = themed
148
+ entry.stateName = name
149
+ entry.theme = theme
150
+ entry.state = linkState(themeStyleKeys, scopeId, name, theme)
151
+ }
152
+ const style = asHostText ? entry.hostTextStyle : entry.style
127
153
  const wrapped = resetsText || (asHostText && mayRenderText(rest.children))
154
+ const state = entry.state
155
+ // a user ref composes per render; without one the entry's stable ref links
156
+ const hostRef =
157
+ ref == null
158
+ ? entry.ref
159
+ : (node: unknown) => {
160
+ if (!node) return assignRef(ref, null)
161
+ linkHost(node, state)
162
+ // a callback ref may return its own cleanup (React 19), which
163
+ // then replaces its null call
164
+ if (typeof ref === 'function') return ref(node)
165
+ assignRef(ref, node)
166
+ }
128
167
  const element = (
129
168
  <Rendered
130
169
  key={wrapped ? undefined : key}
131
170
  {...(asHostText && hostTextProps)}
132
171
  {...rest}
133
- ref={(node: unknown) => {
134
- // a callback ref may return its own cleanup (React 19), which then
135
- // replaces the null call
136
- let refCleanup: unknown
137
- if (typeof ref === 'function') refCleanup = ref(node)
138
- else assignRef(ref, node)
139
- const link = linkMapping(node, themeStyleKeys, scopeId, name, theme)
140
- return () => {
141
- link?.unlink()
142
- if (typeof refCleanup === 'function') refCleanup()
143
- else assignRef(ref, null)
144
- }
145
- }}
172
+ ref={hostRef}
146
173
  style={style}
147
174
  />
148
175
  )
@@ -164,6 +191,15 @@ export const _withNativeStyle = (
164
191
  return NativeStyleView
165
192
  }
166
193
 
194
+ interface ScopeEntry {
195
+ style: (object | null)[]
196
+ hostTextStyle: (object | null)[]
197
+ stateName: string
198
+ theme: object | null
199
+ state: NativeStyleLinkState
200
+ ref: (node: unknown) => void
201
+ }
202
+
167
203
  // <Text>'s own check for children that could render a nested <Text>: arrays
168
204
  // longer than three are assumed to
169
205
  function mayRenderText(children: unknown): boolean {
@@ -2781,6 +2781,8 @@ const cssWideColorKeywords = new Set([
2781
2781
  ])
2782
2782
 
2783
2783
  const shadowRecipeProperties = new Set(['boxShadow', 'textShadow', 'filter'])
2784
+ // recipe keywords that are neither tokens nor colors
2785
+ const shadowRecipeKeywords = new Set(['inset', 'none'])
2784
2786
 
2785
2787
  // `embedded` also runs the embedded-token pass when the direct lookup leaves the
2786
2788
  // value alone, and memoizes that result. it is a regex replace over most string
@@ -3032,6 +3034,7 @@ function configuredValue(
3032
3034
  if (
3033
3035
  resolved !== word ||
3034
3036
  !shadowRecipeProperties.has(property) ||
3037
+ shadowRecipeKeywords.has(word) ||
3035
3038
  !/^[a-z][\w-]*$/i.test(word)
3036
3039
  )
3037
3040
  return resolved
@@ -107,17 +107,17 @@ export interface NativeStyleEngine {
107
107
  ): NativeStyleEngineLinkHandle | null
108
108
  /**
109
109
  * links many mounted hosts to shared tables in one call: entry i links
110
- * refs[i] to tableIds[i] under scopes[scopeIndexes[i]]. returns the id of
111
- * entry 0; ids are consecutive, and an entry whose host is gone consumes
112
- * its id unlinked
110
+ * refs[i] to tableIds[i] under scopes[scopeIndexes[i]]. a host already
111
+ * linked moves to its new entry, and the engine drops linked views that
112
+ * have left the tree, so table links are never unlinked by id
113
113
  */
114
114
  linkTables(
115
115
  refs: unknown[],
116
116
  tableIds: number[],
117
117
  scopeIndexes: number[],
118
118
  scopes: string[]
119
- ): number
120
- /** unlinks an id from linkTables */
119
+ ): void
120
+ /** unlinks an id from link with per-view slots */
121
121
  unlink(id: number): void
122
122
  /**
123
123
  * fills one state of a shared table, read by every view linked to it;
@@ -155,7 +155,7 @@ const compiledMappings = new Map<string, CompiledMapping>()
155
155
  // linked mappings per scope, with their live link counts. they remain update
156
156
  // owners across memo-generation rollovers, and a scope change only syncs the
157
157
  // mappings linked under that scope
158
- const scopeMappings = new Map<string, Map<CompiledMapping, number>>()
158
+ const scopeMappings = new Map<string, Set<CompiledMapping>>()
159
159
  let nextTableId = 1
160
160
 
161
161
  function getCompiledMapping(mapping: NativeStyleThemeMapping): CompiledMapping {
@@ -223,11 +223,10 @@ function syncTableState(
223
223
 
224
224
  export function setNativeStyleEngine(next: NativeStyleEngine | null): void {
225
225
  if (engine !== next) {
226
- settleReleases()
227
226
  compiledMappings.clear()
228
227
  scopeMappings.clear()
229
- pendingLinks = []
230
- unlinkedPending = 0
228
+ pendingHosts = []
229
+ pendingStates = []
231
230
  }
232
231
  engine = next
233
232
  if (next) {
@@ -257,7 +256,7 @@ export function updateNativeStyleScope(
257
256
  // one theme, so every scope showing it reads the same table entry
258
257
  const linked = scopeMappings.get(scopeId)
259
258
  if (linked) {
260
- for (const compiled of linked.keys()) {
259
+ for (const compiled of linked) {
261
260
  syncTableState(compiled, stateName, theme as Record<string, unknown>)
262
261
  }
263
262
  }
@@ -267,6 +266,11 @@ export function updateNativeStyleScope(
267
266
 
268
267
  export function removeNativeStyleScope(scopeId: string): void {
269
268
  if (!scopeStates.delete(scopeId)) return
269
+ // a <Theme> removes and re-adds its scope in one commit whenever its state
270
+ // changes; only a scope still gone after that commit drops its mappings
271
+ queueMicrotask(() => {
272
+ if (!scopeStates.has(scopeId)) scopeMappings.delete(scopeId)
273
+ })
270
274
  engine?.removeScope(scopeId)
271
275
  }
272
276
 
@@ -278,179 +282,108 @@ export function resolveNativeStyleMapping(
278
282
  return resolveCompiledMapping(getCompiledMapping(mapping), stateName, theme).renderProps
279
283
  }
280
284
 
281
- interface MappingLink {
282
- ref: unknown
283
- compiled: CompiledMapping
285
+ /**
286
+ * what a host rendered: one mapping under one scope state. every host of a
287
+ * compiled component that rendered that state shares one record, so a mount
288
+ * allocates nothing to link
289
+ */
290
+ export interface NativeStyleLinkState {
291
+ mapping: NativeStyleThemeMapping
284
292
  scopeId: string
285
- /** 0 while pending, -1 once unlinked */
286
- id: number
287
- /** the engine that assigned `id`: a later engine swap must not receive its unlink */
288
- owner: NativeStyleEngine | null
293
+ stateName: string
294
+ theme: Record<string, unknown>
289
295
  }
290
296
 
291
- // views link lazily: a mount only records its host here, and the engine
292
- // links every pending view in one call before a scope next changes. linking
293
- // exists for theme switches, so a mount pays nothing native, and a view that
294
- // unmounts before any switch never reaches the engine
295
- let pendingLinks: MappingLink[] = []
296
- // pending entries unlinked before any flush; compacted once they dominate
297
- let unlinkedPending = 0
298
-
299
- function trackScopeMapping(link: MappingLink, delta: 1 | -1) {
300
- let linked = scopeMappings.get(link.scopeId)
301
- if (!linked) scopeMappings.set(link.scopeId, (linked = new Map()))
302
- const count = (linked.get(link.compiled) ?? 0) + delta
303
- if (count) {
304
- linked.set(link.compiled, count)
305
- } else {
306
- linked.delete(link.compiled)
307
- if (!linked.size) scopeMappings.delete(link.scopeId)
308
- }
297
+ export function createNativeStyleLinkState(
298
+ mapping: NativeStyleThemeMapping,
299
+ scopeId: string,
300
+ stateName: string,
301
+ theme: Record<string, unknown>
302
+ ): NativeStyleLinkState {
303
+ return { mapping, scopeId, stateName, theme }
309
304
  }
310
305
 
311
- /** links every pending view in one engine call */
312
- export function flushNativeStyleLinks(): void {
313
- settleReleases()
314
- if (!pendingLinks.length) return
315
- const links = pendingLinks
316
- pendingLinks = []
317
- unlinkedPending = 0
318
- if (!engine) return
319
- const live = links.filter((link) => link.id === 0)
320
- if (!live.length) return
321
- const refs: unknown[] = []
322
- const tableIds: number[] = []
323
- const scopeIndexes: number[] = []
324
- const scopes: string[] = []
325
- for (const link of live) {
326
- let scopeIndex = scopes.indexOf(link.scopeId)
327
- if (scopeIndex === -1) scopeIndex = scopes.push(link.scopeId) - 1
328
- refs.push(link.ref)
329
- tableIds.push(link.compiled.tableId)
330
- scopeIndexes.push(scopeIndex)
331
- }
332
- const firstId = engine.linkTables(refs, tableIds, scopeIndexes, scopes)
333
- for (let i = 0; i < live.length; i++) {
334
- const link = live[i]!
335
- link.id = firstId + i
336
- link.owner = engine
337
- link.ref = null
338
- trackScopeMapping(link, 1)
339
- }
306
+ // views link lazily: a mount only records its host and the state it rendered,
307
+ // and the engine links every pending view in one call before a scope next
308
+ // changes. linking exists for theme switches, so a mount pays nothing native.
309
+ // nothing unlinks: the engine drops views that left the tree when it links, so
310
+ // an unmount costs nothing either
311
+ let pendingHosts: unknown[] = []
312
+ let pendingStates: NativeStyleLinkState[] = []
313
+ // past this many pending hosts, link them once the JS thread idles, so hosts
314
+ // that mount and unmount without a scope change never accumulate
315
+ const maxPendingHosts = 4096
316
+ let idleFlushQueued = false
317
+
318
+ function idleFlush() {
319
+ idleFlushQueued = false
320
+ flushNativeStyleLinks()
340
321
  }
341
322
 
342
- // React detaches and re-attaches a callback ref whenever the callback changes,
343
- // which a parent re-render does to every child. a release settles after the
344
- // commit, so the same host attaching again keeps its link and the engine keeps
345
- // its per-view caches instead of unlinking and relinking every view
346
- interface Release {
347
- compiled: CompiledMapping
348
- scopeId: string
349
- handle: NativeStyleEngineLinkHandle
350
- settle: () => void
351
- }
352
- const releases = new Map<unknown, Release>()
353
- let settleQueued = false
354
-
355
- function settleReleases() {
356
- settleQueued = false
357
- if (!releases.size) return
358
- const settling = [...releases.values()]
359
- releases.clear()
360
- for (const release of settling) release.settle()
323
+ function addScopeMapping(scopeId: string, compiled: CompiledMapping) {
324
+ let linked = scopeMappings.get(scopeId)
325
+ if (!linked) scopeMappings.set(scopeId, (linked = new Set()))
326
+ linked.add(compiled)
361
327
  }
362
328
 
363
- function releasable(
364
- ref: unknown,
365
- compiled: CompiledMapping,
366
- scopeId: string,
367
- id: number,
368
- settle: () => void
369
- ): NativeStyleEngineLinkHandle {
370
- const handle: NativeStyleEngineLinkHandle = {
371
- id,
372
- unlink: () => {
373
- const prior = releases.get(ref)
374
- if (prior && prior.handle !== handle) prior.settle()
375
- releases.set(ref, { compiled, scopeId, handle, settle })
376
- if (!settleQueued) {
377
- settleQueued = true
378
- queueMicrotask(settleReleases)
379
- }
380
- },
329
+ /** links every pending view in one engine call */
330
+ export function flushNativeStyleLinks(): void {
331
+ if (!pendingHosts.length) return
332
+ const hosts = pendingHosts
333
+ const states = pendingStates
334
+ pendingHosts = []
335
+ pendingStates = []
336
+ if (!engine) return
337
+ const tableIds: number[] = new Array(hosts.length)
338
+ const scopeIndexes: number[] = new Array(hosts.length)
339
+ const scopes: string[] = []
340
+ let last: NativeStyleLinkState | undefined
341
+ let tableId = 0
342
+ let scopeIndex = 0
343
+ for (let i = 0; i < hosts.length; i++) {
344
+ const state = states[i]!
345
+ if (state !== last) {
346
+ last = state
347
+ const compiled = getCompiledMapping(state.mapping)
348
+ // the table must hold the state each view rendered before the switch
349
+ syncTableState(compiled, state.stateName, state.theme)
350
+ addScopeMapping(state.scopeId, compiled)
351
+ tableId = compiled.tableId
352
+ scopeIndex = scopes.indexOf(state.scopeId)
353
+ if (scopeIndex === -1) scopeIndex = scopes.push(state.scopeId) - 1
354
+ }
355
+ tableIds[i] = tableId
356
+ scopeIndexes[i] = scopeIndex
381
357
  }
382
- return handle
358
+ engine.linkTables(hosts, tableIds, scopeIndexes, scopes)
383
359
  }
384
360
 
385
- export function linkNativeStyleMapping(
386
- ref: unknown,
387
- mapping: NativeStyleThemeMapping,
388
- scopeId: string,
389
- stateName: string,
390
- theme: Record<string, unknown>
391
- ): NativeStyleEngineLinkHandle | null {
392
- if (!engine) return null
393
-
394
- const compiled = getCompiledMapping(mapping)
361
+ /** records a mounted host for linking. a host attaching twice links once */
362
+ export function linkNativeStyleHost(host: unknown, state: NativeStyleLinkState): void {
363
+ if (!engine) return
395
364
  // a scope can advance (layout effect) after a concurrent render captured its
396
- // theme but before that render's host ref links. link that host now against
365
+ // theme but before that render's host attaches. link that host now against
397
366
  // the live scope state and have the engine commit it once to correct the
398
367
  // stale React commit.
399
- const scopeState = scopeStates.get(scopeId)
400
- const stale =
401
- scopeState && (scopeState.name !== stateName || scopeState.theme !== theme)
402
- const kept = releases.get(ref)
403
- if (kept) {
404
- releases.delete(ref)
405
- if (!stale && kept.compiled === compiled && kept.scopeId === scopeId)
406
- return kept.handle
407
- kept.settle()
368
+ const live = scopeStates.get(state.scopeId)
369
+ if (live && (live.name !== state.stateName || live.theme !== state.theme)) {
370
+ const compiled = getCompiledMapping(state.mapping)
371
+ syncTableState(compiled, live.name, live.theme as Record<string, unknown>)
372
+ addScopeMapping(state.scopeId, compiled)
373
+ engine.link(host, compiled.tableId, state.scopeId, true)
374
+ return
408
375
  }
409
- if (stale) {
410
- syncTableState(compiled, scopeState.name, scopeState.theme as Record<string, unknown>)
411
- const handle = engine.link(ref, compiled.tableId, scopeId, true)
412
- if (!handle) return null
413
- const link: MappingLink = {
414
- ref: null,
415
- compiled,
416
- scopeId,
417
- id: handle.id,
418
- owner: engine,
419
- }
420
- trackScopeMapping(link, 1)
421
- return releasable(ref, compiled, scopeId, handle.id, () => {
422
- if (link.id === -1) return
423
- link.id = -1
424
- if (link.owner === engine) trackScopeMapping(link, -1)
425
- handle.unlink()
426
- })
376
+ pendingHosts.push(host)
377
+ pendingStates.push(state)
378
+ if (pendingHosts.length >= maxPendingHosts && !idleFlushQueued) {
379
+ idleFlushQueued = true
380
+ requestIdleCallback(idleFlush)
427
381
  }
428
-
429
- // the table must hold the state this view rendered before a switch links it
430
- syncTableState(compiled, stateName, theme)
431
- const link: MappingLink = { ref, compiled, scopeId, id: 0, owner: null }
432
- pendingLinks.push(link)
433
- return releasable(ref, compiled, scopeId, 0, () => {
434
- const id = link.id
435
- if (id === -1) return
436
- link.id = -1
437
- link.ref = null
438
- if (id > 0) {
439
- // scope accounting was reset when the engine changed
440
- if (link.owner === engine) trackScopeMapping(link, -1)
441
- link.owner!.unlink(id)
442
- } else if (++unlinkedPending > 512 && unlinkedPending * 2 > pendingLinks.length) {
443
- pendingLinks = pendingLinks.filter((pending) => pending.id === 0)
444
- unlinkedPending = 0
445
- }
446
- })
447
382
  }
448
383
 
449
384
  /** memo-generation and live-owner sizes for development diagnostics and probes */
450
385
  export const getNativeStyleEngineCacheStats = () => {
451
- const active = new Set(
452
- [...scopeMappings.values()].flatMap((linked) => [...linked.keys()])
453
- )
386
+ const active = new Set([...scopeMappings.values()].flatMap((linked) => [...linked]))
454
387
  return {
455
388
  mappings: compiledMappings.size,
456
389
  activeMappings: active.size,