rnwind 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/core/normalize-classname.cjs +25 -0
- package/lib/cjs/core/normalize-classname.cjs.map +1 -0
- package/lib/cjs/core/normalize-classname.d.ts +10 -0
- package/lib/cjs/core/style-builder/build-style.cjs +258 -58
- package/lib/cjs/core/style-builder/build-style.cjs.map +1 -1
- package/lib/cjs/core/style-builder/build-style.d.ts +6 -1
- package/lib/cjs/core/style-builder/union-builder.cjs +37 -3
- package/lib/cjs/core/style-builder/union-builder.cjs.map +1 -1
- package/lib/cjs/core/style-builder/union-builder.d.ts +21 -1
- package/lib/cjs/metro/dts.cjs +7 -16
- package/lib/cjs/metro/dts.cjs.map +1 -1
- package/lib/cjs/metro/dts.d.ts +2 -4
- package/lib/cjs/metro/state.cjs +30 -78
- package/lib/cjs/metro/state.cjs.map +1 -1
- package/lib/cjs/metro/state.d.ts +8 -25
- package/lib/cjs/metro/transformer.cjs +193 -34
- package/lib/cjs/metro/transformer.cjs.map +1 -1
- package/lib/cjs/metro/with-config.cjs +2 -2
- package/lib/cjs/metro/with-config.cjs.map +1 -1
- package/lib/cjs/metro/with-config.d.ts +11 -26
- package/lib/cjs/metro/wrap-imports.cjs +273 -0
- package/lib/cjs/metro/wrap-imports.cjs.map +1 -0
- package/lib/cjs/metro/wrap-imports.d.ts +26 -0
- package/lib/cjs/runtime/components/rnwind-provider.cjs +0 -17
- package/lib/cjs/runtime/components/rnwind-provider.cjs.map +1 -1
- package/lib/cjs/runtime/components/rnwind-provider.d.ts +0 -14
- package/lib/cjs/runtime/hooks/use-css.cjs +16 -10
- package/lib/cjs/runtime/hooks/use-css.cjs.map +1 -1
- package/lib/cjs/runtime/hooks/use-css.d.ts +15 -9
- package/lib/cjs/runtime/index.cjs +11 -13
- package/lib/cjs/runtime/index.cjs.map +1 -1
- package/lib/cjs/runtime/index.d.ts +4 -9
- package/lib/cjs/runtime/lookup-css.cjs +10 -0
- package/lib/cjs/runtime/lookup-css.cjs.map +1 -1
- package/lib/cjs/runtime/lookup-css.d.ts +7 -0
- package/lib/cjs/runtime/resolve.cjs +348 -0
- package/lib/cjs/runtime/resolve.cjs.map +1 -0
- package/lib/cjs/runtime/resolve.d.ts +61 -0
- package/lib/cjs/runtime/wrap.cjs +254 -0
- package/lib/cjs/runtime/wrap.cjs.map +1 -0
- package/lib/cjs/runtime/wrap.d.ts +37 -0
- package/lib/cjs/testing/index.cjs +81 -50
- package/lib/cjs/testing/index.cjs.map +1 -1
- package/lib/esm/core/normalize-classname.d.ts +10 -0
- package/lib/esm/core/normalize-classname.mjs +23 -0
- package/lib/esm/core/normalize-classname.mjs.map +1 -0
- package/lib/esm/core/style-builder/build-style.d.ts +6 -1
- package/lib/esm/core/style-builder/build-style.mjs +258 -58
- package/lib/esm/core/style-builder/build-style.mjs.map +1 -1
- package/lib/esm/core/style-builder/union-builder.d.ts +21 -1
- package/lib/esm/core/style-builder/union-builder.mjs +37 -3
- package/lib/esm/core/style-builder/union-builder.mjs.map +1 -1
- package/lib/esm/metro/dts.d.ts +2 -4
- package/lib/esm/metro/dts.mjs +7 -16
- package/lib/esm/metro/dts.mjs.map +1 -1
- package/lib/esm/metro/state.d.ts +8 -25
- package/lib/esm/metro/state.mjs +30 -76
- package/lib/esm/metro/state.mjs.map +1 -1
- package/lib/esm/metro/transformer.mjs +194 -35
- package/lib/esm/metro/transformer.mjs.map +1 -1
- package/lib/esm/metro/with-config.d.ts +11 -26
- package/lib/esm/metro/with-config.mjs +2 -2
- package/lib/esm/metro/with-config.mjs.map +1 -1
- package/lib/esm/metro/wrap-imports.d.ts +26 -0
- package/lib/esm/metro/wrap-imports.mjs +250 -0
- package/lib/esm/metro/wrap-imports.mjs.map +1 -0
- package/lib/esm/runtime/components/rnwind-provider.d.ts +0 -14
- package/lib/esm/runtime/components/rnwind-provider.mjs +1 -17
- package/lib/esm/runtime/components/rnwind-provider.mjs.map +1 -1
- package/lib/esm/runtime/hooks/use-css.d.ts +15 -9
- package/lib/esm/runtime/hooks/use-css.mjs +16 -10
- package/lib/esm/runtime/hooks/use-css.mjs.map +1 -1
- package/lib/esm/runtime/index.d.ts +4 -9
- package/lib/esm/runtime/index.mjs +4 -4
- package/lib/esm/runtime/index.mjs.map +1 -1
- package/lib/esm/runtime/lookup-css.d.ts +7 -0
- package/lib/esm/runtime/lookup-css.mjs +10 -1
- package/lib/esm/runtime/lookup-css.mjs.map +1 -1
- package/lib/esm/runtime/resolve.d.ts +61 -0
- package/lib/esm/runtime/resolve.mjs +341 -0
- package/lib/esm/runtime/resolve.mjs.map +1 -0
- package/lib/esm/runtime/wrap.d.ts +37 -0
- package/lib/esm/runtime/wrap.mjs +251 -0
- package/lib/esm/runtime/wrap.mjs.map +1 -0
- package/lib/esm/testing/index.mjs +84 -53
- package/lib/esm/testing/index.mjs.map +1 -1
- package/package.json +2 -1
- package/src/core/normalize-classname.ts +19 -0
- package/src/core/style-builder/build-style.ts +286 -55
- package/src/core/style-builder/union-builder.ts +36 -3
- package/src/metro/dts.ts +7 -19
- package/src/metro/state.ts +29 -74
- package/src/metro/transformer.ts +190 -34
- package/src/metro/with-config.ts +13 -28
- package/src/metro/wrap-imports.ts +260 -0
- package/src/runtime/components/rnwind-provider.tsx +0 -17
- package/src/runtime/hooks/use-css.ts +17 -11
- package/src/runtime/index.ts +3 -26
- package/src/runtime/lookup-css.ts +10 -0
- package/src/runtime/resolve.ts +381 -0
- package/src/runtime/wrap.tsx +267 -0
- package/src/testing/index.ts +106 -56
- package/lib/cjs/core/parser/text-truncate.cjs +0 -78
- package/lib/cjs/core/parser/text-truncate.cjs.map +0 -1
- package/lib/cjs/metro/transform-ast.cjs +0 -1472
- package/lib/cjs/metro/transform-ast.cjs.map +0 -1
- package/lib/cjs/metro/transform-ast.d.ts +0 -88
- package/lib/cjs/runtime/haptics.cjs +0 -113
- package/lib/cjs/runtime/haptics.cjs.map +0 -1
- package/lib/cjs/runtime/haptics.d.ts +0 -48
- package/lib/cjs/runtime/interactive-box.cjs +0 -35
- package/lib/cjs/runtime/interactive-box.cjs.map +0 -1
- package/lib/cjs/runtime/interactive-box.d.ts +0 -40
- package/lib/esm/core/parser/text-truncate.mjs +0 -75
- package/lib/esm/core/parser/text-truncate.mjs.map +0 -1
- package/lib/esm/metro/transform-ast.d.ts +0 -88
- package/lib/esm/metro/transform-ast.mjs +0 -1451
- package/lib/esm/metro/transform-ast.mjs.map +0 -1
- package/lib/esm/runtime/haptics.d.ts +0 -48
- package/lib/esm/runtime/haptics.mjs +0 -110
- package/lib/esm/runtime/haptics.mjs.map +0 -1
- package/lib/esm/runtime/interactive-box.d.ts +0 -40
- package/lib/esm/runtime/interactive-box.mjs +0 -33
- package/lib/esm/runtime/interactive-box.mjs.map +0 -1
- package/src/metro/transform-ast.ts +0 -1729
- package/src/runtime/haptics.ts +0 -120
- package/src/runtime/interactive-box.tsx +0 -57
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var lookupCss = require('./lookup-css.cjs');
|
|
4
|
-
var
|
|
4
|
+
var wrap = require('./wrap.cjs');
|
|
5
|
+
var resolve = require('./resolve.cjs');
|
|
5
6
|
var useCss = require('./hooks/use-css.cjs');
|
|
6
7
|
var useInteract = require('./hooks/use-interact.cjs');
|
|
7
8
|
var chainHandlers = require('./chain-handlers.cjs');
|
|
8
|
-
var
|
|
9
|
-
var haptics = require('./haptics.cjs');
|
|
9
|
+
var rnwindProvider = require('./components/rnwind-provider.cjs');
|
|
10
10
|
var useScheme = require('./hooks/use-scheme.cjs');
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -16,7 +16,6 @@ var useScheme = require('./hooks/use-scheme.cjs');
|
|
|
16
16
|
*/
|
|
17
17
|
const VERSION = '0.0.1';
|
|
18
18
|
|
|
19
|
-
exports._l = lookupCss.lookupCss;
|
|
20
19
|
exports.activeBreakpointFor = lookupCss.activeBreakpointFor;
|
|
21
20
|
exports.getBreakpoints = lookupCss.getBreakpoints;
|
|
22
21
|
exports.lookupCss = lookupCss.lookupCss;
|
|
@@ -24,19 +23,18 @@ exports.registerAtoms = lookupCss.registerAtoms;
|
|
|
24
23
|
exports.registerBreakpoints = lookupCss.registerBreakpoints;
|
|
25
24
|
exports.registerSchemeLoader = lookupCss.registerSchemeLoader;
|
|
26
25
|
exports.setWindowHeightProvider = lookupCss.setWindowHeightProvider;
|
|
27
|
-
exports.
|
|
28
|
-
exports.
|
|
29
|
-
exports.
|
|
26
|
+
exports.wrap = wrap.wrap;
|
|
27
|
+
exports.wrapNamespace = wrap.wrapNamespace;
|
|
28
|
+
exports.registerGradients = resolve.registerGradients;
|
|
29
|
+
exports.registerHaptics = resolve.registerHaptics;
|
|
30
|
+
exports.registerMolecules = resolve.registerMolecules;
|
|
31
|
+
exports.resolve = resolve.resolve;
|
|
30
32
|
exports.useCss = useCss.useCss;
|
|
31
33
|
exports.useInteract = useInteract.useInteract;
|
|
32
34
|
exports.chainFocus = chainHandlers.chainFocus;
|
|
33
35
|
exports.chainPress = chainHandlers.chainPress;
|
|
34
|
-
exports.
|
|
35
|
-
exports.
|
|
36
|
-
exports._hm = haptics.useMountHaptic;
|
|
37
|
-
exports._ht = haptics.triggerHaptic;
|
|
38
|
-
exports.triggerHaptic = haptics.triggerHaptic;
|
|
39
|
-
exports.useMountHaptic = haptics.useMountHaptic;
|
|
36
|
+
exports.RnwindProvider = rnwindProvider.RnwindProvider;
|
|
37
|
+
exports.useRnwind = rnwindProvider.useRnwind;
|
|
40
38
|
exports.useColor = useScheme.useColor;
|
|
41
39
|
exports.useSize = useScheme.useSize;
|
|
42
40
|
exports.useTheme = useScheme.useTheme;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/runtime/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/runtime/index.ts"],"sourcesContent":["export {\n lookupCss,\n registerAtoms,\n registerBreakpoints,\n registerSchemeLoader,\n setWindowHeightProvider,\n getBreakpoints,\n activeBreakpointFor,\n} from './lookup-css'\nexport type { HoistedClassName, InteractState, LookupInsets, SafeMarkerSpec } from './lookup-css'\nexport { wrap, wrapNamespace } from './wrap'\nexport { resolve, registerMolecules, registerGradients, registerHaptics } from './resolve'\nexport type { ResolvedCss } from './resolve'\nexport { useCss } from './hooks/use-css'\nexport { useInteract } from './hooks/use-interact'\nexport type { UseInteractResult } from './hooks/use-interact'\nexport { chainPress, chainFocus } from './chain-handlers'\nexport { RnwindProvider, useRnwind } from './components/rnwind-provider'\nexport type { RnwindProviderProps, RnwindState, Insets } from './components/rnwind-provider'\nexport type { HapticRequest, HapticTrigger, OnHaptics } from '../core/parser/haptics'\nexport type { AsLinearGradientProps, LinearGradientPoint } from './gradient-types'\nexport type { ThemeTable, ThemeTables } from '../core/types'\nexport { useTheme, useToken, useColor, useSize } from './hooks/use-scheme'\nexport type { Scheme, RnwindConfig } from './types'\n\n/**\n * Installed rnwind version, inlined at publish time. Compare against a pinned\n * string when integrating with build tooling that may see multiple rnwind\n * copies (e.g. workspace overrides).\n */\nexport const VERSION = '0.0.1' as const\n"],"names":[],"mappings":";;;;;;;;;;;AAyBA;;;;AAIG;AACI,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,19 +1,14 @@
|
|
|
1
|
-
export { lookupCss, registerAtoms, registerBreakpoints, registerSchemeLoader, setWindowHeightProvider, getBreakpoints, activeBreakpointFor,
|
|
2
|
-
export { useR_ } from './components/rnwind-provider';
|
|
1
|
+
export { lookupCss, registerAtoms, registerBreakpoints, registerSchemeLoader, setWindowHeightProvider, getBreakpoints, activeBreakpointFor, } from './lookup-css';
|
|
3
2
|
export type { HoistedClassName, InteractState, LookupInsets, SafeMarkerSpec } from './lookup-css';
|
|
3
|
+
export { wrap, wrapNamespace } from './wrap';
|
|
4
|
+
export { resolve, registerMolecules, registerGradients, registerHaptics } from './resolve';
|
|
5
|
+
export type { ResolvedCss } from './resolve';
|
|
4
6
|
export { useCss } from './hooks/use-css';
|
|
5
7
|
export { useInteract } from './hooks/use-interact';
|
|
6
8
|
export type { UseInteractResult } from './hooks/use-interact';
|
|
7
9
|
export { chainPress, chainFocus } from './chain-handlers';
|
|
8
|
-
export { InteractiveBox, InteractiveBox as _ib } from './interactive-box';
|
|
9
|
-
export type { InteractiveBoxProps, InteractiveSpec } from './interactive-box';
|
|
10
10
|
export { RnwindProvider, useRnwind } from './components/rnwind-provider';
|
|
11
11
|
export type { RnwindProviderProps, RnwindState, Insets } from './components/rnwind-provider';
|
|
12
|
-
export { useMountHaptic, triggerHaptic, triggerHaptic as _ht, useMountHaptic as _hm } from './haptics';
|
|
13
|
-
/** @internal */
|
|
14
|
-
/** @internal */
|
|
15
|
-
/** @internal */
|
|
16
|
-
/** @internal */
|
|
17
12
|
export type { HapticRequest, HapticTrigger, OnHaptics } from '../core/parser/haptics';
|
|
18
13
|
export type { AsLinearGradientProps, LinearGradientPoint } from './gradient-types';
|
|
19
14
|
export type { ThemeTable, ThemeTables } from '../core/types';
|
|
@@ -409,6 +409,15 @@ function registerAtoms(scheme, atoms) {
|
|
|
409
409
|
cache.atoms[scheme] = atoms;
|
|
410
410
|
atomVersion += 1;
|
|
411
411
|
}
|
|
412
|
+
/**
|
|
413
|
+
* Current registry version — bumps on every `registerAtoms` /
|
|
414
|
+
* `registerBreakpoints`. The molecule resolver folds it into its cache
|
|
415
|
+
* key so an HMR atom reload invalidates derived results.
|
|
416
|
+
* @returns Monotonic version counter.
|
|
417
|
+
*/
|
|
418
|
+
function getStyleVersion() {
|
|
419
|
+
return atomVersion;
|
|
420
|
+
}
|
|
412
421
|
/**
|
|
413
422
|
* Register the responsive-breakpoint table the manifest module emits at
|
|
414
423
|
* load time. Replaces the prior table — calling with `{}` clears it.
|
|
@@ -533,6 +542,7 @@ exports.BASE_BREAKPOINT = BASE_BREAKPOINT;
|
|
|
533
542
|
exports.__resetLookupCssState = __resetLookupCssState;
|
|
534
543
|
exports.activeBreakpointFor = activeBreakpointFor;
|
|
535
544
|
exports.getBreakpoints = getBreakpoints;
|
|
545
|
+
exports.getStyleVersion = getStyleVersion;
|
|
536
546
|
exports.loadScheme = loadScheme;
|
|
537
547
|
exports.lookupCss = lookupCss;
|
|
538
548
|
exports.registerAtoms = registerAtoms;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-css.cjs","sources":["../../../../src/runtime/lookup-css.ts"],"sourcesContent":["/**\n * Runtime resolver for rnwind-transformed files.\n *\n * Hot path is ONE WeakMap.get + cached-array return for stable atoms\n * (no `active:`/`focus:`/`*-safe` variance beyond what the cache key\n * captures). First call per (hoist, scheme, stateIndex) walks the\n * atoms once, looks each up as\n *\n * `cache.atoms[scheme]?.[atom] ?? cache.atoms.common?.[atom]`\n *\n * and caches the result. `registerAtoms(scheme, record)` bumps a\n * version counter; the next lookup notices the mismatch and rebuilds.\n *\n * Keyframes are inlined directly into atom values via `animationName`\n * at build time — no separate registry.\n */\n\nimport type { RnwindState } from './components/rnwind-provider'\n\n/** Empty sentinel returned when the input is null / undefined / empty. */\nconst EMPTY_STYLES: readonly unknown[] = []\n\n/** Registry key for the always-loaded fallback scheme. */\nconst COMMON_SCHEME = 'common'\n\n/** Atom name prefix marking a press-state-gated atom. */\nconst ACTIVE_PREFIX = 'active:'\n\n/** Atom name prefix marking a focus-state-gated atom. */\nconst FOCUS_PREFIX = 'focus:'\n\n/** Partial record — missing keys resolve to undefined, which the fallback handles. */\ntype SchemeAtomsRecord = Partial<Record<string, unknown>>\n\n/** 0 = idle, 1 = active, 2 = focus, 3 = both. */\ntype StateIndex = 0 | 1 | 2 | 3\n\n/**\n * One entry in the sorted-by-threshold breakpoints array. The runtime\n * derives an atom's threshold by matching its `<prefix>:` against\n * `name`; the array form is preferred over a Map so the hot-path\n * `tierFor(width)` walk is a tight numeric loop.\n */\ninterface BreakpointEntry {\n readonly name: string\n readonly minWidth: number\n}\n\n/**\n * Process-global style cache. Replaced key-by-key by {@link registerAtoms}.\n * Plain record-of-records: `scheme → atom → style`. Active scheme\n * lookup is `cache.atoms[scheme]?.[atom]` — two property reads with\n * an `?? cache.atoms.common[atom]` fallback. No loops over the\n * registry, ever.\n *\n * `breakpoints` mirrors the build-time table the manifest module\n * registers via {@link registerBreakpoints} — `name → px-threshold` for\n * fast prefix-based atom filtering plus the sorted-by-threshold list\n * for cheap tier-index computation in `lookupCss`.\n */\nconst cache = {\n atoms: Object.create(null) as Partial<Record<string, SchemeAtomsRecord>>,\n breakpoints: Object.create(null) as Partial<Record<string, number>>,\n breakpointList: [] as readonly BreakpointEntry[],\n}\n\n/**\n * Bumps on every {@link registerAtoms} call. {@link HoistCache} entries\n * stamp themselves with the current version; a mismatch on read\n * triggers a rebuild so HMR-reloaded atoms propagate without manual\n * invalidation.\n */\nlet atomVersion = 0\n\n/** Optional window-height provider for the `screen-minus-y` marker. */\ntype WindowHeightProvider = () => number\nlet windowHeightProvider: WindowHeightProvider | null = null\n\n/**\n * Optional scheme loader. Registered by the generated manifest module\n * (`rnwind/__generated/schemes`) once at import time. SchemeProvider\n * calls it synchronously on every render with the active scheme name;\n * first call per scheme pulls the scheme's style module in via an\n * inline `require()` — subsequent calls are a no-op through Metro's\n * module cache.\n */\ntype SchemeLoader = (scheme: string) => void\nlet schemeLoader: SchemeLoader | null = null\n\n/** Module-scope flag so the missing-insets warning fires at most once. */\nlet WARNED_MISSING_INSETS = false\n\n/** Atoms we've already dev-warned about — keeps the noise to ONE line per typo per session. */\nconst WARNED_UNKNOWN_ATOMS = new Set<string>()\n\n/**\n * Compute the state-array index from the live interactState. Bit-or\n * encoding: 0 = idle, 1 = active, 2 = focus, 3 = both.\n * @param interactState Snapshot from `useInteract()` (or undefined).\n * @returns 0 / 1 / 2 / 3.\n */\nfunction stateIndexFor(interactState: InteractState | undefined): StateIndex {\n if (!interactState) return 0\n return (((interactState.active ? 1 : 0) | (interactState.focus ? 2 : 0)) as StateIndex)\n}\n\n/**\n * Fetch the px inset for one side. Falls back to 0 when insets is undefined.\n * @param side Compact side tag (`t` / `r` / `b` / `l`).\n * @param insets Active insets.\n * @returns Px value for that side.\n */\nfunction insetOf(side: string, insets: LookupInsets | undefined): number {\n if (!insets) return 0\n if (side === 't') return insets.top\n if (side === 'r') return insets.right\n if (side === 'b') return insets.bottom\n if (side === 'l') return insets.left\n return 0\n}\n\n/**\n * Collapse one safe-area marker into a concrete px number using the\n * active insets.\n * @param spec Marker spec tuple `[cssKey, sideTag, or, offset]`.\n * @param insets Active insets (or undefined → 0).\n * @returns Resolved px number.\n */\nfunction resolveMarker(spec: SafeMarkerSpec, insets: LookupInsets | undefined): number {\n const [, side, or_, offset] = spec\n if (side === 'screen-minus-y') {\n const h = windowHeightProvider ? windowHeightProvider() : 0\n return Math.max(0, h - insetOf('t', insets) - insetOf('b', insets))\n }\n let base = insetOf(side, insets)\n if (or_ !== undefined) base = Math.max(base, or_)\n if (offset !== undefined) base += offset\n return base\n}\n\n/**\n * Emit a one-shot dev warning when a safe-area atom resolves without\n * real insets in scope.\n * @param insets Insets received by the resolver.\n */\nfunction warnMissingInsetsOnce(insets: LookupInsets | undefined): void {\n if (WARNED_MISSING_INSETS) return\n const isDevelopment = typeof __DEV__ === 'undefined' || __DEV__\n if (!isDevelopment) return\n if (insets && (insets.top !== 0 || insets.right !== 0 || insets.bottom !== 0 || insets.left !== 0)) return\n WARNED_MISSING_INSETS = true\n // eslint-disable-next-line no-console\n console.warn(\n 'rnwind: a `*-safe` utility resolved with zero insets. Wire `insets` on <SchemeProvider> ' +\n '(e.g. `insets={useSafeAreaInsets()}` from react-native-safe-area-context).',\n )\n}\n\n/**\n * Resolve precomputed safe-area marker specs into a fresh RN style\n * object. Cannot be cached — insets vary per render with rotation /\n * keyboard.\n * @param specs Array of spec tuples.\n * @param insets Live safe-area insets.\n * @returns Fresh RN style object with concrete numbers.\n */\nfunction resolveSafe(specs: readonly SafeMarkerSpec[], insets: LookupInsets | undefined): Record<string, number> {\n warnMissingInsetsOnce(insets)\n const out: Record<string, number> = {}\n for (const spec of specs) out[spec[0]] = resolveMarker(spec, insets)\n return out\n}\n\n/**\n * Multiply `fontSize` / `lineHeight` in a resolved atom value by the\n * active font scale. Early-returns the original reference for any atom\n * that doesn't carry either property (most of them) — zero allocation\n * on the hot path for non-text atoms.\n * @param value Atom value as registered in the global table.\n * @param fontScale Multiplier from `useWindowDimensions().fontScale`.\n * @returns Scaled style object, or the original when no scaling applied.\n */\nfunction applyFontScale(value: unknown, fontScale: number): unknown {\n if (fontScale === 1) return value\n if (typeof value !== 'object' || value === null) return value\n const record = value as Record<string, unknown>\n const fs = record.fontSize\n const lh = record.lineHeight\n if (typeof fs !== 'number' && typeof lh !== 'number') return value\n const scaled: Record<string, unknown> = { ...record }\n if (typeof fs === 'number') scaled.fontSize = fs * fontScale\n if (typeof lh === 'number') scaled.lineHeight = lh * fontScale\n return scaled\n}\n\n/**\n * Read the precomputed safe-area marker spec list off an atom value.\n * Build-side `envelopeSafeMarkers` wraps safe atoms in\n * `{__safeStyle: [...]}`; this is a single property access.\n * @param value Atom value as registered in the global table.\n * @returns Spec array when the atom is safe-area, else null.\n */\nfunction readSafeSpecs(value: unknown): readonly SafeMarkerSpec[] | null {\n if (typeof value !== 'object' || value === null) return null\n const safe = (value as { __safeStyle?: readonly SafeMarkerSpec[] }).__safeStyle\n return safe ?? null\n}\n\n/**\n * Per-atom lookup. Two property reads: scheme's own table then the\n * common fallback. Returns `undefined` for unknown atoms — the caller\n * skips them.\n * @param scheme Active scheme.\n * @param atom Atom name.\n * @returns Resolved value, or undefined.\n */\nfunction lookupAtom(scheme: string, atom: string): unknown {\n const schemeTable = cache.atoms[scheme]\n if (schemeTable !== undefined) {\n const own = schemeTable[atom]\n if (own !== undefined) return own\n }\n const common = cache.atoms[COMMON_SCHEME]\n return common === undefined ? undefined : common[atom]\n}\n\n/**\n * Whether an atom should participate in a given interact-state index.\n * - idle (0): no `active:` / `focus:` atoms.\n * - active (1): base + `active:`.\n * - focus (2): base + `focus:`.\n * - both (3): base + `active:` + `focus:`.\n * @param atom Atom name.\n * @param stateIndex Encoded state (0/1/2/3).\n * @returns True when the atom should be emitted for this state.\n */\nfunction atomMatchesState(atom: string, stateIndex: StateIndex): boolean {\n // Cheap prefix check — check the first code point before the full\n // `startsWith` so we skip it for any atom whose first letter isn't\n // `a` / `f`.\n const code = atom.codePointAt(0)\n if (code === 97 /* a */ && atom.startsWith(ACTIVE_PREFIX)) return (stateIndex & 1) !== 0\n if (code === 102 /* f */ && atom.startsWith(FOCUS_PREFIX)) return (stateIndex & 2) !== 0\n return true\n}\n\n/**\n * Whether an atom passes the responsive-breakpoint gate for the\n * current `windowWidth`. Atoms without a registered `<prefix>:` are\n * always-on (the common case — `bg-red-500`, `active:bg-blue-700`).\n * Atoms whose first prefix matches a registered breakpoint name pass\n * only when `windowWidth >= threshold`.\n * @param atom Atom name.\n * @param windowWidth Live `useWindowDimensions().width` snapshot.\n * @returns True when the atom should be emitted for this width.\n */\nfunction atomMatchesBreakpoint(atom: string, windowWidth: number): boolean {\n const colon = atom.indexOf(':')\n if (colon === -1) return true\n const prefix = atom.slice(0, colon)\n const threshold = cache.breakpoints[prefix]\n if (threshold === undefined) return true\n return windowWidth >= threshold\n}\n\n/**\n * Tier index — count of registered breakpoints whose threshold is\n * `<= windowWidth`. Bounded by the breakpoint count, so it's a stable\n * cache-key dimension instead of the unbounded raw width. Crossings\n * happen ~5 times across the device-width spectrum, not per-pixel.\n * @param windowWidth Live width.\n * @returns Tier 0..N where N = `cache.breakpointList.length`.\n */\nfunction tierFor(windowWidth: number): number {\n let tier = 0\n for (const entry of cache.breakpointList) {\n if (windowWidth >= entry.minWidth) tier += 1\n else break\n }\n return tier\n}\n\n/**\n * Build the style array for a (hoist, scheme, state, width) tuple.\n * Walks the atom list, applies the interact-state and breakpoint\n * filters, resolves each atom via scheme→common fallback, and\n * envelopes safe values via {@link resolveSafe}.\n * @param atoms Atom name list (build-time constant).\n * @param scheme Active scheme.\n * @param stateIndex Encoded active/focus state.\n * @param insets Live safe-area insets.\n * @param fontScale Font scale multiplier.\n * @param windowWidth Live window width — gates `md:*` / `lg:*` atoms.\n * @returns Fresh style array.\n */\nfunction buildStyleArray(\n atoms: readonly string[],\n scheme: string,\n stateIndex: StateIndex,\n insets: LookupInsets | undefined,\n fontScale: number,\n windowWidth: number,\n): readonly unknown[] {\n const out: unknown[] = []\n for (const atom of atoms) {\n if (!atomMatchesState(atom, stateIndex)) continue\n if (!atomMatchesBreakpoint(atom, windowWidth)) continue\n const value = lookupAtom(scheme, atom)\n if (value === undefined) {\n warnUnknownAtomOnce(atom)\n continue\n }\n const safe = readSafeSpecs(value)\n const resolved = safe === null ? value : resolveSafe(safe, insets)\n out.push(applyFontScale(resolved, fontScale))\n }\n return out\n}\n\n/**\n * Emit a one-shot dev warning when an atom name doesn't resolve in the\n * registry. The two real causes are a typo (`bg-red-501`) or a class\n * the build-time scanner never saw because it lives in a string the\n * oxide tokeniser can't see (e.g. computed at runtime). Either way, a\n * silent empty style is the worst possible UX — surface it.\n *\n * Filters cosmetic non-issues: empty strings, build-time `__safeStyle`\n * envelopes that wandered in, etc.\n * @param atom Class name that didn't resolve.\n */\nfunction warnUnknownAtomOnce(atom: string): void {\n if (atom.length === 0) return\n const isDevelopment = typeof __DEV__ === 'undefined' || __DEV__\n if (!isDevelopment) return\n if (WARNED_UNKNOWN_ATOMS.has(atom)) return\n WARNED_UNKNOWN_ATOMS.add(atom)\n // eslint-disable-next-line no-console\n console.warn(\n `rnwind: unknown class \"${atom}\" — typo, or the class is built dynamically and the build-time ` +\n `scanner never saw it. Static literals + ternaries are scanned automatically; runtime-built ` +\n `strings need to appear somewhere as a literal so oxide can pick them up.`,\n )\n}\n\n/**\n * Per-hoist cache entry. `version` stamps `atomVersion` at build time\n * so HMR reloads (which bump the counter) invalidate cleanly on next\n * read. `hasSafe` prevents caching results whose values depend on\n * per-render insets. `byKey` maps `\"${scheme}|${stateIndex}\"` to the\n * cached result.\n */\ninterface HoistCache {\n version: number\n hasSafe: boolean\n byKey: Partial<Record<string, readonly unknown[]>>\n}\n\n/**\n * Per-atom-list cache keyed on the hoist reference. WeakMap so\n * hoists GC with their host module on HMR.\n */\nconst resultCache = new WeakMap<readonly string[], HoistCache>()\n\n/**\n * Walk the atom list once to detect safe-area atoms — results that\n * vary per render with `insets`. When any atom envelopes safe specs\n * we skip the cache and rebuild every call.\n * @param atoms Hoist atom list.\n * @param scheme Active scheme.\n * @returns Whether the hoist resolves a safe atom under this scheme.\n */\nfunction detectHasSafe(atoms: readonly string[], scheme: string): boolean {\n for (const atom of atoms) {\n const value = lookupAtom(scheme, atom)\n if (readSafeSpecs(value) !== null) return true\n }\n return false\n}\n\n/**\n * Cache-keyed resolution for the common static-schema case. Returns a\n * stable array reference across renders until `atomVersion` bumps.\n * For hoists containing safe atoms — which depend on per-render\n * insets — rebuilds every call.\n *\n * The `tier` dimension keeps the cache bounded under responsive\n * variants: instead of keying on raw `windowWidth` (which would explode\n * the cache to one entry per pixel), we key on the count of registered\n * breakpoints whose threshold is reached. That gives at most\n * `breakpointCount + 1` cache rows per (scheme, state, fontScale).\n * @param atoms Hoist atom list.\n * @param scheme Active scheme.\n * @param stateIndex Encoded interact state.\n * @param insets Live safe-area insets.\n * @param fontScale Font scale multiplier.\n * @param windowWidth Live window width.\n * @returns Style array.\n */\nfunction lookupCached(\n atoms: readonly string[],\n scheme: string,\n stateIndex: StateIndex,\n insets: LookupInsets | undefined,\n fontScale: number,\n windowWidth: number,\n): readonly unknown[] {\n let entry = resultCache.get(atoms)\n if (entry?.version !== atomVersion) {\n entry = { version: atomVersion, hasSafe: detectHasSafe(atoms, scheme), byKey: Object.create(null) }\n resultCache.set(atoms, entry)\n }\n if (entry.hasSafe) return buildStyleArray(atoms, scheme, stateIndex, insets, fontScale, windowWidth)\n const tier = tierFor(windowWidth)\n const key = `${scheme}|${stateIndex}|${fontScale}|${tier}`\n const cached = entry.byKey[key]\n if (cached !== undefined) return cached\n const fresh = buildStyleArray(atoms, scheme, stateIndex, insets, fontScale, windowWidth)\n entry.byKey[key] = fresh\n return fresh\n}\n\n/**\n * Per-render snapshot of which interactive states (active, focus) are\n * currently engaged. Forwarded from the `useInteract()` hook the\n * transformer injects.\n */\nexport interface InteractState {\n active?: boolean\n focus?: boolean\n}\n\n/**\n * Safe-area insets bundle the transformer passes to `lookupCss` when a\n * file uses any `*-safe` utility.\n */\nexport interface LookupInsets {\n top: number\n right: number\n bottom: number\n left: number\n}\n\n\n/**\n * Precomputed safe-area marker spec emitted by the build-side\n * `envelopeSafeMarkers`. Tuple form: `[cssKey, sideTag, or, offset]`.\n */\nexport type SafeMarkerSpec = readonly [string, string, number | undefined, number | undefined]\n\n/** Type alias: the atom-list build output the transformer emits. */\nexport type HoistedClassName = readonly string[]\n\n/**\n * Register a window-height provider used by the `screen-minus-y`\n * safe-area variant. When not wired, `h-screen-safe` resolves to `0`.\n * @param provider Callback returning the current window height in px.\n */\nexport function setWindowHeightProvider(provider: WindowHeightProvider | null): void {\n windowHeightProvider = provider\n}\n\n/**\n * Register the scheme-loader function exported by the generated\n * manifest module. Called once at manifest-module evaluation time —\n * subsequent registrations override the previous loader (useful for\n * tests).\n * @param loader Manifest's `ensureSchemeLoaded` function, or null to\n * detach (tests).\n */\nexport function registerSchemeLoader(loader: SchemeLoader | null): void {\n schemeLoader = loader\n}\n\n/**\n * Ensure the given scheme's style module is loaded. Safe to call in\n * render — zero-cost after the first call per scheme thanks to\n * Metro's module cache, and a no-op when no loader is registered\n * (tests, or a bundle without rnwind-transformed sources).\n * @param scheme Active scheme name.\n */\nexport function loadScheme(scheme: string): void {\n if (schemeLoader) schemeLoader(scheme)\n}\n\n/**\n * Register (or re-register) one scheme's atoms in the global registry.\n * Pure property assignment — no iteration, no allocation. The version\n * counter bump invalidates every hoist-level result cache lazily on\n * next read.\n * @param scheme Registry key — `'common'` for the always-loaded\n * fallback, or a variant name (`'dark'`, `'light'`, `'brand'`, ...).\n * @param atoms Plain record keyed by atom name.\n */\nexport function registerAtoms(scheme: string, atoms: Record<string, unknown>): void {\n cache.atoms[scheme] = atoms\n atomVersion += 1\n}\n\n/**\n * Register the responsive-breakpoint table the manifest module emits at\n * load time. Replaces the prior table — calling with `{}` clears it.\n * Bumps `atomVersion` so any cached lookup invalidates on next read,\n * which matters during a theme HMR cycle that adds/removes breakpoints.\n * @param breakpoints Breakpoint name → minimum-width threshold (px).\n */\nexport function registerBreakpoints(breakpoints: Record<string, number>): void {\n const fresh: Partial<Record<string, number>> = Object.create(null)\n const list: BreakpointEntry[] = []\n for (const name of Object.keys(breakpoints)) {\n const minWidth = breakpoints[name]\n if (!Number.isFinite(minWidth) || minWidth <= 0) continue\n fresh[name] = minWidth\n list.push({ name, minWidth })\n }\n list.sort((a, b) => a.minWidth - b.minWidth || a.name.localeCompare(b.name))\n cache.breakpoints = fresh\n cache.breakpointList = list\n atomVersion += 1\n}\n\n/**\n * Snapshot of the registered breakpoints, for callers that want to\n * compute their own derivations (e.g. the provider deriving the active\n * breakpoint name). Returns a fresh array — callers can iterate without\n * worrying about concurrent mutation from a manifest reload.\n * @returns Breakpoints sorted by ascending min-width threshold.\n */\nexport function getBreakpoints(): readonly BreakpointEntry[] {\n return cache.breakpointList\n}\n\n/**\n * Sentinel name returned by {@link activeBreakpointFor} ONLY when no\n * breakpoints are registered at all (bundle without rnwind-transformed\n * sources, fresh test setup). When at least one breakpoint is\n * registered, the function falls back to the smallest registered name\n * instead — so phone-width devices (402 dp on a stock iPhone, well\n * below `sm = 640`) report `activeBreakpoint === 'sm'` rather than the\n * abstract `'base'`. This matches the user expectation that the value\n * is always a real Tailwind breakpoint label they can branch on.\n *\n * Note: this is decoupled from the className filter. `sm:*` atoms\n * still only fire at `windowWidth >= 640` per Tailwind's mobile-first\n * spec — `activeBreakpoint === 'sm'` at 402 means \"I'm in the smallest\n * tier\", not \"`sm:` classes are firing\".\n */\nexport const BASE_BREAKPOINT = 'base'\n\n/**\n * Resolve the currently-active breakpoint name for a width:\n * - `windowWidth >= some threshold` → the highest matching breakpoint name.\n * - below every registered threshold → the smallest registered name.\n * - no breakpoints registered → {@link BASE_BREAKPOINT}.\n * Always returns a string so consumers can branch on it without\n * null-handling.\n * @param windowWidth Live window width in px.\n * @returns Active breakpoint name (never null).\n */\nexport function activeBreakpointFor(windowWidth: number): string {\n const list = cache.breakpointList\n if (list.length === 0) return BASE_BREAKPOINT\n let active: string = list[0]!.name\n for (const entry of list) {\n if (windowWidth >= entry.minWidth) active = entry.name\n else break\n }\n return active\n}\n\n/**\n * Resolve a className input against the active rnwind context. Hot\n * path:\n * - Array input (build hoist): ONE WeakMap.get + ONE record-access\n * + cached array return. No per-render allocation when there's no\n * userStyle and the hoist has no safe atoms.\n * - String input (dynamic `className={expr}`): tokenise + walk.\n * @param input Hoisted atom list or raw className string.\n * @param ctx Rnwind context — `{scheme, fontScale, insets}` (extra\n * fields ignored). Pass the result of `useRnwind()` directly.\n * @param userStyle Optional caller-supplied style appended last.\n * @param interactState Live active/focus flags from `useInteract()`.\n * @returns Style array for React Native's `style` prop.\n */\nexport function lookupCss(\n input: HoistedClassName | string | null | undefined,\n ctx: RnwindState,\n userStyle?: unknown,\n interactState?: InteractState,\n): readonly unknown[] {\n if (input === null || input === undefined) {\n return userStyle === undefined || userStyle === null ? EMPTY_STYLES : [userStyle]\n }\n const { scheme, insets, fontScale, windowWidth } = ctx\n if (typeof input === 'string') {\n const trimmed = input.trim()\n if (trimmed.length === 0) {\n return userStyle === undefined || userStyle === null ? EMPTY_STYLES : [userStyle]\n }\n const atoms = trimmed.split(/\\s+/)\n const out = buildStyleArray(atoms, scheme, stateIndexFor(interactState), insets, fontScale, windowWidth)\n if (userStyle === undefined || userStyle === null) return out\n return [...out, userStyle]\n }\n const base = lookupCached(input, scheme, stateIndexFor(interactState), insets, fontScale, windowWidth)\n if (userStyle === undefined || userStyle === null) return base\n return [...base, userStyle]\n}\n\n/** Test-only — clear the global registry between suites. */\nexport function __resetLookupCssState(): void {\n for (const key of Object.keys(cache.atoms)) delete cache.atoms[key]\n for (const key of Object.keys(cache.breakpoints)) delete cache.breakpoints[key]\n cache.breakpointList = []\n windowHeightProvider = null\n schemeLoader = null\n WARNED_MISSING_INSETS = false\n WARNED_UNKNOWN_ATOMS.clear()\n atomVersion += 1\n}\n\n/**\n * Test-only sugar: accept a single-scheme record and register it as the\n * `common` table.\n * @param record Atom name → value record (registered under `common`).\n */\nexport function __registerAtomsFromRecord(record: Record<string, unknown>): void {\n registerAtoms(COMMON_SCHEME, record)\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lookup-css.cjs","sources":["../../../../src/runtime/lookup-css.ts"],"sourcesContent":["/**\n * Runtime resolver for rnwind-transformed files.\n *\n * Hot path is ONE WeakMap.get + cached-array return for stable atoms\n * (no `active:`/`focus:`/`*-safe` variance beyond what the cache key\n * captures). First call per (hoist, scheme, stateIndex) walks the\n * atoms once, looks each up as\n *\n * `cache.atoms[scheme]?.[atom] ?? cache.atoms.common?.[atom]`\n *\n * and caches the result. `registerAtoms(scheme, record)` bumps a\n * version counter; the next lookup notices the mismatch and rebuilds.\n *\n * Keyframes are inlined directly into atom values via `animationName`\n * at build time — no separate registry.\n */\n\nimport type { RnwindState } from './components/rnwind-provider'\n\n/** Empty sentinel returned when the input is null / undefined / empty. */\nconst EMPTY_STYLES: readonly unknown[] = []\n\n/** Registry key for the always-loaded fallback scheme. */\nconst COMMON_SCHEME = 'common'\n\n/** Atom name prefix marking a press-state-gated atom. */\nconst ACTIVE_PREFIX = 'active:'\n\n/** Atom name prefix marking a focus-state-gated atom. */\nconst FOCUS_PREFIX = 'focus:'\n\n/** Partial record — missing keys resolve to undefined, which the fallback handles. */\ntype SchemeAtomsRecord = Partial<Record<string, unknown>>\n\n/** 0 = idle, 1 = active, 2 = focus, 3 = both. */\ntype StateIndex = 0 | 1 | 2 | 3\n\n/**\n * One entry in the sorted-by-threshold breakpoints array. The runtime\n * derives an atom's threshold by matching its `<prefix>:` against\n * `name`; the array form is preferred over a Map so the hot-path\n * `tierFor(width)` walk is a tight numeric loop.\n */\ninterface BreakpointEntry {\n readonly name: string\n readonly minWidth: number\n}\n\n/**\n * Process-global style cache. Replaced key-by-key by {@link registerAtoms}.\n * Plain record-of-records: `scheme → atom → style`. Active scheme\n * lookup is `cache.atoms[scheme]?.[atom]` — two property reads with\n * an `?? cache.atoms.common[atom]` fallback. No loops over the\n * registry, ever.\n *\n * `breakpoints` mirrors the build-time table the manifest module\n * registers via {@link registerBreakpoints} — `name → px-threshold` for\n * fast prefix-based atom filtering plus the sorted-by-threshold list\n * for cheap tier-index computation in `lookupCss`.\n */\nconst cache = {\n atoms: Object.create(null) as Partial<Record<string, SchemeAtomsRecord>>,\n breakpoints: Object.create(null) as Partial<Record<string, number>>,\n breakpointList: [] as readonly BreakpointEntry[],\n}\n\n/**\n * Bumps on every {@link registerAtoms} call. {@link HoistCache} entries\n * stamp themselves with the current version; a mismatch on read\n * triggers a rebuild so HMR-reloaded atoms propagate without manual\n * invalidation.\n */\nlet atomVersion = 0\n\n/** Optional window-height provider for the `screen-minus-y` marker. */\ntype WindowHeightProvider = () => number\nlet windowHeightProvider: WindowHeightProvider | null = null\n\n/**\n * Optional scheme loader. Registered by the generated manifest module\n * (`rnwind/__generated/schemes`) once at import time. SchemeProvider\n * calls it synchronously on every render with the active scheme name;\n * first call per scheme pulls the scheme's style module in via an\n * inline `require()` — subsequent calls are a no-op through Metro's\n * module cache.\n */\ntype SchemeLoader = (scheme: string) => void\nlet schemeLoader: SchemeLoader | null = null\n\n/** Module-scope flag so the missing-insets warning fires at most once. */\nlet WARNED_MISSING_INSETS = false\n\n/** Atoms we've already dev-warned about — keeps the noise to ONE line per typo per session. */\nconst WARNED_UNKNOWN_ATOMS = new Set<string>()\n\n/**\n * Compute the state-array index from the live interactState. Bit-or\n * encoding: 0 = idle, 1 = active, 2 = focus, 3 = both.\n * @param interactState Snapshot from `useInteract()` (or undefined).\n * @returns 0 / 1 / 2 / 3.\n */\nfunction stateIndexFor(interactState: InteractState | undefined): StateIndex {\n if (!interactState) return 0\n return (((interactState.active ? 1 : 0) | (interactState.focus ? 2 : 0)) as StateIndex)\n}\n\n/**\n * Fetch the px inset for one side. Falls back to 0 when insets is undefined.\n * @param side Compact side tag (`t` / `r` / `b` / `l`).\n * @param insets Active insets.\n * @returns Px value for that side.\n */\nfunction insetOf(side: string, insets: LookupInsets | undefined): number {\n if (!insets) return 0\n if (side === 't') return insets.top\n if (side === 'r') return insets.right\n if (side === 'b') return insets.bottom\n if (side === 'l') return insets.left\n return 0\n}\n\n/**\n * Collapse one safe-area marker into a concrete px number using the\n * active insets.\n * @param spec Marker spec tuple `[cssKey, sideTag, or, offset]`.\n * @param insets Active insets (or undefined → 0).\n * @returns Resolved px number.\n */\nfunction resolveMarker(spec: SafeMarkerSpec, insets: LookupInsets | undefined): number {\n const [, side, or_, offset] = spec\n if (side === 'screen-minus-y') {\n const h = windowHeightProvider ? windowHeightProvider() : 0\n return Math.max(0, h - insetOf('t', insets) - insetOf('b', insets))\n }\n let base = insetOf(side, insets)\n if (or_ !== undefined) base = Math.max(base, or_)\n if (offset !== undefined) base += offset\n return base\n}\n\n/**\n * Emit a one-shot dev warning when a safe-area atom resolves without\n * real insets in scope.\n * @param insets Insets received by the resolver.\n */\nfunction warnMissingInsetsOnce(insets: LookupInsets | undefined): void {\n if (WARNED_MISSING_INSETS) return\n const isDevelopment = typeof __DEV__ === 'undefined' || __DEV__\n if (!isDevelopment) return\n if (insets && (insets.top !== 0 || insets.right !== 0 || insets.bottom !== 0 || insets.left !== 0)) return\n WARNED_MISSING_INSETS = true\n // eslint-disable-next-line no-console\n console.warn(\n 'rnwind: a `*-safe` utility resolved with zero insets. Wire `insets` on <SchemeProvider> ' +\n '(e.g. `insets={useSafeAreaInsets()}` from react-native-safe-area-context).',\n )\n}\n\n/**\n * Resolve precomputed safe-area marker specs into a fresh RN style\n * object. Cannot be cached — insets vary per render with rotation /\n * keyboard.\n * @param specs Array of spec tuples.\n * @param insets Live safe-area insets.\n * @returns Fresh RN style object with concrete numbers.\n */\nfunction resolveSafe(specs: readonly SafeMarkerSpec[], insets: LookupInsets | undefined): Record<string, number> {\n warnMissingInsetsOnce(insets)\n const out: Record<string, number> = {}\n for (const spec of specs) out[spec[0]] = resolveMarker(spec, insets)\n return out\n}\n\n/**\n * Multiply `fontSize` / `lineHeight` in a resolved atom value by the\n * active font scale. Early-returns the original reference for any atom\n * that doesn't carry either property (most of them) — zero allocation\n * on the hot path for non-text atoms.\n * @param value Atom value as registered in the global table.\n * @param fontScale Multiplier from `useWindowDimensions().fontScale`.\n * @returns Scaled style object, or the original when no scaling applied.\n */\nfunction applyFontScale(value: unknown, fontScale: number): unknown {\n if (fontScale === 1) return value\n if (typeof value !== 'object' || value === null) return value\n const record = value as Record<string, unknown>\n const fs = record.fontSize\n const lh = record.lineHeight\n if (typeof fs !== 'number' && typeof lh !== 'number') return value\n const scaled: Record<string, unknown> = { ...record }\n if (typeof fs === 'number') scaled.fontSize = fs * fontScale\n if (typeof lh === 'number') scaled.lineHeight = lh * fontScale\n return scaled\n}\n\n/**\n * Read the precomputed safe-area marker spec list off an atom value.\n * Build-side `envelopeSafeMarkers` wraps safe atoms in\n * `{__safeStyle: [...]}`; this is a single property access.\n * @param value Atom value as registered in the global table.\n * @returns Spec array when the atom is safe-area, else null.\n */\nfunction readSafeSpecs(value: unknown): readonly SafeMarkerSpec[] | null {\n if (typeof value !== 'object' || value === null) return null\n const safe = (value as { __safeStyle?: readonly SafeMarkerSpec[] }).__safeStyle\n return safe ?? null\n}\n\n/**\n * Per-atom lookup. Two property reads: scheme's own table then the\n * common fallback. Returns `undefined` for unknown atoms — the caller\n * skips them.\n * @param scheme Active scheme.\n * @param atom Atom name.\n * @returns Resolved value, or undefined.\n */\nfunction lookupAtom(scheme: string, atom: string): unknown {\n const schemeTable = cache.atoms[scheme]\n if (schemeTable !== undefined) {\n const own = schemeTable[atom]\n if (own !== undefined) return own\n }\n const common = cache.atoms[COMMON_SCHEME]\n return common === undefined ? undefined : common[atom]\n}\n\n/**\n * Whether an atom should participate in a given interact-state index.\n * - idle (0): no `active:` / `focus:` atoms.\n * - active (1): base + `active:`.\n * - focus (2): base + `focus:`.\n * - both (3): base + `active:` + `focus:`.\n * @param atom Atom name.\n * @param stateIndex Encoded state (0/1/2/3).\n * @returns True when the atom should be emitted for this state.\n */\nfunction atomMatchesState(atom: string, stateIndex: StateIndex): boolean {\n // Cheap prefix check — check the first code point before the full\n // `startsWith` so we skip it for any atom whose first letter isn't\n // `a` / `f`.\n const code = atom.codePointAt(0)\n if (code === 97 /* a */ && atom.startsWith(ACTIVE_PREFIX)) return (stateIndex & 1) !== 0\n if (code === 102 /* f */ && atom.startsWith(FOCUS_PREFIX)) return (stateIndex & 2) !== 0\n return true\n}\n\n/**\n * Whether an atom passes the responsive-breakpoint gate for the\n * current `windowWidth`. Atoms without a registered `<prefix>:` are\n * always-on (the common case — `bg-red-500`, `active:bg-blue-700`).\n * Atoms whose first prefix matches a registered breakpoint name pass\n * only when `windowWidth >= threshold`.\n * @param atom Atom name.\n * @param windowWidth Live `useWindowDimensions().width` snapshot.\n * @returns True when the atom should be emitted for this width.\n */\nfunction atomMatchesBreakpoint(atom: string, windowWidth: number): boolean {\n const colon = atom.indexOf(':')\n if (colon === -1) return true\n const prefix = atom.slice(0, colon)\n const threshold = cache.breakpoints[prefix]\n if (threshold === undefined) return true\n return windowWidth >= threshold\n}\n\n/**\n * Tier index — count of registered breakpoints whose threshold is\n * `<= windowWidth`. Bounded by the breakpoint count, so it's a stable\n * cache-key dimension instead of the unbounded raw width. Crossings\n * happen ~5 times across the device-width spectrum, not per-pixel.\n * @param windowWidth Live width.\n * @returns Tier 0..N where N = `cache.breakpointList.length`.\n */\nfunction tierFor(windowWidth: number): number {\n let tier = 0\n for (const entry of cache.breakpointList) {\n if (windowWidth >= entry.minWidth) tier += 1\n else break\n }\n return tier\n}\n\n/**\n * Build the style array for a (hoist, scheme, state, width) tuple.\n * Walks the atom list, applies the interact-state and breakpoint\n * filters, resolves each atom via scheme→common fallback, and\n * envelopes safe values via {@link resolveSafe}.\n * @param atoms Atom name list (build-time constant).\n * @param scheme Active scheme.\n * @param stateIndex Encoded active/focus state.\n * @param insets Live safe-area insets.\n * @param fontScale Font scale multiplier.\n * @param windowWidth Live window width — gates `md:*` / `lg:*` atoms.\n * @returns Fresh style array.\n */\nfunction buildStyleArray(\n atoms: readonly string[],\n scheme: string,\n stateIndex: StateIndex,\n insets: LookupInsets | undefined,\n fontScale: number,\n windowWidth: number,\n): readonly unknown[] {\n const out: unknown[] = []\n for (const atom of atoms) {\n if (!atomMatchesState(atom, stateIndex)) continue\n if (!atomMatchesBreakpoint(atom, windowWidth)) continue\n const value = lookupAtom(scheme, atom)\n if (value === undefined) {\n warnUnknownAtomOnce(atom)\n continue\n }\n const safe = readSafeSpecs(value)\n const resolved = safe === null ? value : resolveSafe(safe, insets)\n out.push(applyFontScale(resolved, fontScale))\n }\n return out\n}\n\n/**\n * Emit a one-shot dev warning when an atom name doesn't resolve in the\n * registry. The two real causes are a typo (`bg-red-501`) or a class\n * the build-time scanner never saw because it lives in a string the\n * oxide tokeniser can't see (e.g. computed at runtime). Either way, a\n * silent empty style is the worst possible UX — surface it.\n *\n * Filters cosmetic non-issues: empty strings, build-time `__safeStyle`\n * envelopes that wandered in, etc.\n * @param atom Class name that didn't resolve.\n */\nfunction warnUnknownAtomOnce(atom: string): void {\n if (atom.length === 0) return\n const isDevelopment = typeof __DEV__ === 'undefined' || __DEV__\n if (!isDevelopment) return\n if (WARNED_UNKNOWN_ATOMS.has(atom)) return\n WARNED_UNKNOWN_ATOMS.add(atom)\n // eslint-disable-next-line no-console\n console.warn(\n `rnwind: unknown class \"${atom}\" — typo, or the class is built dynamically and the build-time ` +\n `scanner never saw it. Static literals + ternaries are scanned automatically; runtime-built ` +\n `strings need to appear somewhere as a literal so oxide can pick them up.`,\n )\n}\n\n/**\n * Per-hoist cache entry. `version` stamps `atomVersion` at build time\n * so HMR reloads (which bump the counter) invalidate cleanly on next\n * read. `hasSafe` prevents caching results whose values depend on\n * per-render insets. `byKey` maps `\"${scheme}|${stateIndex}\"` to the\n * cached result.\n */\ninterface HoistCache {\n version: number\n hasSafe: boolean\n byKey: Partial<Record<string, readonly unknown[]>>\n}\n\n/**\n * Per-atom-list cache keyed on the hoist reference. WeakMap so\n * hoists GC with their host module on HMR.\n */\nconst resultCache = new WeakMap<readonly string[], HoistCache>()\n\n/**\n * Walk the atom list once to detect safe-area atoms — results that\n * vary per render with `insets`. When any atom envelopes safe specs\n * we skip the cache and rebuild every call.\n * @param atoms Hoist atom list.\n * @param scheme Active scheme.\n * @returns Whether the hoist resolves a safe atom under this scheme.\n */\nfunction detectHasSafe(atoms: readonly string[], scheme: string): boolean {\n for (const atom of atoms) {\n const value = lookupAtom(scheme, atom)\n if (readSafeSpecs(value) !== null) return true\n }\n return false\n}\n\n/**\n * Cache-keyed resolution for the common static-schema case. Returns a\n * stable array reference across renders until `atomVersion` bumps.\n * For hoists containing safe atoms — which depend on per-render\n * insets — rebuilds every call.\n *\n * The `tier` dimension keeps the cache bounded under responsive\n * variants: instead of keying on raw `windowWidth` (which would explode\n * the cache to one entry per pixel), we key on the count of registered\n * breakpoints whose threshold is reached. That gives at most\n * `breakpointCount + 1` cache rows per (scheme, state, fontScale).\n * @param atoms Hoist atom list.\n * @param scheme Active scheme.\n * @param stateIndex Encoded interact state.\n * @param insets Live safe-area insets.\n * @param fontScale Font scale multiplier.\n * @param windowWidth Live window width.\n * @returns Style array.\n */\nfunction lookupCached(\n atoms: readonly string[],\n scheme: string,\n stateIndex: StateIndex,\n insets: LookupInsets | undefined,\n fontScale: number,\n windowWidth: number,\n): readonly unknown[] {\n let entry = resultCache.get(atoms)\n if (entry?.version !== atomVersion) {\n entry = { version: atomVersion, hasSafe: detectHasSafe(atoms, scheme), byKey: Object.create(null) }\n resultCache.set(atoms, entry)\n }\n if (entry.hasSafe) return buildStyleArray(atoms, scheme, stateIndex, insets, fontScale, windowWidth)\n const tier = tierFor(windowWidth)\n const key = `${scheme}|${stateIndex}|${fontScale}|${tier}`\n const cached = entry.byKey[key]\n if (cached !== undefined) return cached\n const fresh = buildStyleArray(atoms, scheme, stateIndex, insets, fontScale, windowWidth)\n entry.byKey[key] = fresh\n return fresh\n}\n\n/**\n * Per-render snapshot of which interactive states (active, focus) are\n * currently engaged. Forwarded from the `useInteract()` hook the\n * transformer injects.\n */\nexport interface InteractState {\n active?: boolean\n focus?: boolean\n}\n\n/**\n * Safe-area insets bundle the transformer passes to `lookupCss` when a\n * file uses any `*-safe` utility.\n */\nexport interface LookupInsets {\n top: number\n right: number\n bottom: number\n left: number\n}\n\n\n/**\n * Precomputed safe-area marker spec emitted by the build-side\n * `envelopeSafeMarkers`. Tuple form: `[cssKey, sideTag, or, offset]`.\n */\nexport type SafeMarkerSpec = readonly [string, string, number | undefined, number | undefined]\n\n/** Type alias: the atom-list build output the transformer emits. */\nexport type HoistedClassName = readonly string[]\n\n/**\n * Register a window-height provider used by the `screen-minus-y`\n * safe-area variant. When not wired, `h-screen-safe` resolves to `0`.\n * @param provider Callback returning the current window height in px.\n */\nexport function setWindowHeightProvider(provider: WindowHeightProvider | null): void {\n windowHeightProvider = provider\n}\n\n/**\n * Register the scheme-loader function exported by the generated\n * manifest module. Called once at manifest-module evaluation time —\n * subsequent registrations override the previous loader (useful for\n * tests).\n * @param loader Manifest's `ensureSchemeLoaded` function, or null to\n * detach (tests).\n */\nexport function registerSchemeLoader(loader: SchemeLoader | null): void {\n schemeLoader = loader\n}\n\n/**\n * Ensure the given scheme's style module is loaded. Safe to call in\n * render — zero-cost after the first call per scheme thanks to\n * Metro's module cache, and a no-op when no loader is registered\n * (tests, or a bundle without rnwind-transformed sources).\n * @param scheme Active scheme name.\n */\nexport function loadScheme(scheme: string): void {\n if (schemeLoader) schemeLoader(scheme)\n}\n\n/**\n * Register (or re-register) one scheme's atoms in the global registry.\n * Pure property assignment — no iteration, no allocation. The version\n * counter bump invalidates every hoist-level result cache lazily on\n * next read.\n * @param scheme Registry key — `'common'` for the always-loaded\n * fallback, or a variant name (`'dark'`, `'light'`, `'brand'`, ...).\n * @param atoms Plain record keyed by atom name.\n */\nexport function registerAtoms(scheme: string, atoms: Record<string, unknown>): void {\n cache.atoms[scheme] = atoms\n atomVersion += 1\n}\n\n/**\n * Current registry version — bumps on every `registerAtoms` /\n * `registerBreakpoints`. The molecule resolver folds it into its cache\n * key so an HMR atom reload invalidates derived results.\n * @returns Monotonic version counter.\n */\nexport function getStyleVersion(): number {\n return atomVersion\n}\n\n/**\n * Register the responsive-breakpoint table the manifest module emits at\n * load time. Replaces the prior table — calling with `{}` clears it.\n * Bumps `atomVersion` so any cached lookup invalidates on next read,\n * which matters during a theme HMR cycle that adds/removes breakpoints.\n * @param breakpoints Breakpoint name → minimum-width threshold (px).\n */\nexport function registerBreakpoints(breakpoints: Record<string, number>): void {\n const fresh: Partial<Record<string, number>> = Object.create(null)\n const list: BreakpointEntry[] = []\n for (const name of Object.keys(breakpoints)) {\n const minWidth = breakpoints[name]\n if (!Number.isFinite(minWidth) || minWidth <= 0) continue\n fresh[name] = minWidth\n list.push({ name, minWidth })\n }\n list.sort((a, b) => a.minWidth - b.minWidth || a.name.localeCompare(b.name))\n cache.breakpoints = fresh\n cache.breakpointList = list\n atomVersion += 1\n}\n\n/**\n * Snapshot of the registered breakpoints, for callers that want to\n * compute their own derivations (e.g. the provider deriving the active\n * breakpoint name). Returns a fresh array — callers can iterate without\n * worrying about concurrent mutation from a manifest reload.\n * @returns Breakpoints sorted by ascending min-width threshold.\n */\nexport function getBreakpoints(): readonly BreakpointEntry[] {\n return cache.breakpointList\n}\n\n/**\n * Sentinel name returned by {@link activeBreakpointFor} ONLY when no\n * breakpoints are registered at all (bundle without rnwind-transformed\n * sources, fresh test setup). When at least one breakpoint is\n * registered, the function falls back to the smallest registered name\n * instead — so phone-width devices (402 dp on a stock iPhone, well\n * below `sm = 640`) report `activeBreakpoint === 'sm'` rather than the\n * abstract `'base'`. This matches the user expectation that the value\n * is always a real Tailwind breakpoint label they can branch on.\n *\n * Note: this is decoupled from the className filter. `sm:*` atoms\n * still only fire at `windowWidth >= 640` per Tailwind's mobile-first\n * spec — `activeBreakpoint === 'sm'` at 402 means \"I'm in the smallest\n * tier\", not \"`sm:` classes are firing\".\n */\nexport const BASE_BREAKPOINT = 'base'\n\n/**\n * Resolve the currently-active breakpoint name for a width:\n * - `windowWidth >= some threshold` → the highest matching breakpoint name.\n * - below every registered threshold → the smallest registered name.\n * - no breakpoints registered → {@link BASE_BREAKPOINT}.\n * Always returns a string so consumers can branch on it without\n * null-handling.\n * @param windowWidth Live window width in px.\n * @returns Active breakpoint name (never null).\n */\nexport function activeBreakpointFor(windowWidth: number): string {\n const list = cache.breakpointList\n if (list.length === 0) return BASE_BREAKPOINT\n let active: string = list[0]!.name\n for (const entry of list) {\n if (windowWidth >= entry.minWidth) active = entry.name\n else break\n }\n return active\n}\n\n/**\n * Resolve a className input against the active rnwind context. Hot\n * path:\n * - Array input (build hoist): ONE WeakMap.get + ONE record-access\n * + cached array return. No per-render allocation when there's no\n * userStyle and the hoist has no safe atoms.\n * - String input (dynamic `className={expr}`): tokenise + walk.\n * @param input Hoisted atom list or raw className string.\n * @param ctx Rnwind context — `{scheme, fontScale, insets}` (extra\n * fields ignored). Pass the result of `useRnwind()` directly.\n * @param userStyle Optional caller-supplied style appended last.\n * @param interactState Live active/focus flags from `useInteract()`.\n * @returns Style array for React Native's `style` prop.\n */\nexport function lookupCss(\n input: HoistedClassName | string | null | undefined,\n ctx: RnwindState,\n userStyle?: unknown,\n interactState?: InteractState,\n): readonly unknown[] {\n if (input === null || input === undefined) {\n return userStyle === undefined || userStyle === null ? EMPTY_STYLES : [userStyle]\n }\n const { scheme, insets, fontScale, windowWidth } = ctx\n if (typeof input === 'string') {\n const trimmed = input.trim()\n if (trimmed.length === 0) {\n return userStyle === undefined || userStyle === null ? EMPTY_STYLES : [userStyle]\n }\n const atoms = trimmed.split(/\\s+/)\n const out = buildStyleArray(atoms, scheme, stateIndexFor(interactState), insets, fontScale, windowWidth)\n if (userStyle === undefined || userStyle === null) return out\n return [...out, userStyle]\n }\n const base = lookupCached(input, scheme, stateIndexFor(interactState), insets, fontScale, windowWidth)\n if (userStyle === undefined || userStyle === null) return base\n return [...base, userStyle]\n}\n\n/** Test-only — clear the global registry between suites. */\nexport function __resetLookupCssState(): void {\n for (const key of Object.keys(cache.atoms)) delete cache.atoms[key]\n for (const key of Object.keys(cache.breakpoints)) delete cache.breakpoints[key]\n cache.breakpointList = []\n windowHeightProvider = null\n schemeLoader = null\n WARNED_MISSING_INSETS = false\n WARNED_UNKNOWN_ATOMS.clear()\n atomVersion += 1\n}\n\n/**\n * Test-only sugar: accept a single-scheme record and register it as the\n * `common` table.\n * @param record Atom name → value record (registered under `common`).\n */\nexport function __registerAtomsFromRecord(record: Record<string, unknown>): void {\n registerAtoms(COMMON_SCHEME, record)\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -95,6 +95,13 @@ export declare function loadScheme(scheme: string): void;
|
|
|
95
95
|
* @param atoms Plain record keyed by atom name.
|
|
96
96
|
*/
|
|
97
97
|
export declare function registerAtoms(scheme: string, atoms: Record<string, unknown>): void;
|
|
98
|
+
/**
|
|
99
|
+
* Current registry version — bumps on every `registerAtoms` /
|
|
100
|
+
* `registerBreakpoints`. The molecule resolver folds it into its cache
|
|
101
|
+
* key so an HMR atom reload invalidates derived results.
|
|
102
|
+
* @returns Monotonic version counter.
|
|
103
|
+
*/
|
|
104
|
+
export declare function getStyleVersion(): number;
|
|
98
105
|
/**
|
|
99
106
|
* Register the responsive-breakpoint table the manifest module emits at
|
|
100
107
|
* load time. Replaces the prior table — calling with `{}` clears it.
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var lookupCss = require('./lookup-css.cjs');
|
|
4
|
+
var normalizeClassname = require('../core/normalize-classname.cjs');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Rich className resolver — the runtime heart of the wrap / `useCss`.
|
|
8
|
+
*
|
|
9
|
+
* Resolution order, per className string:
|
|
10
|
+
* 1. **Molecule** — a build-time PRE-MERGED single style object for the
|
|
11
|
+
* whole literal className (per scheme). One map lookup returns it by
|
|
12
|
+
* reference: no array, no merge, no per-atom loop. The common case.
|
|
13
|
+
* 2. **Atom fallback** — for a className the scanner never saw (a
|
|
14
|
+
* runtime-built string like `` `${className} px-2` ``) OR one that
|
|
15
|
+
* carries context-dependent atoms (`pt-safe`, `text-base`, `md:*`),
|
|
16
|
+
* fall back to per-atom resolution via `lookupCss`, which folds in
|
|
17
|
+
* insets / fontScale / breakpoint / scheme.
|
|
18
|
+
*
|
|
19
|
+
* Results are cached by `(normalized className, scheme, insets, fontScale,
|
|
20
|
+
* breakpoint)` so repeated renders return the SAME reference until the
|
|
21
|
+
* reactive context changes. Atoms / molecules / features all live in
|
|
22
|
+
* build-time registries the generated `.rnwind/*.js` modules populate.
|
|
23
|
+
*/
|
|
24
|
+
/** Always-loaded fallback scheme key. */
|
|
25
|
+
const COMMON_SCHEME = 'common';
|
|
26
|
+
/** Empty style sentinel. */
|
|
27
|
+
const EMPTY = [];
|
|
28
|
+
/** scheme → normalized className → pre-merged style object. */
|
|
29
|
+
let molecules = Object.create(null);
|
|
30
|
+
/** atom name → gradient role + resolved colour. */
|
|
31
|
+
let gradients = Object.create(null);
|
|
32
|
+
/** atom name (incl. `active:`/`focus:` prefix) → haptic request. */
|
|
33
|
+
let haptics = Object.create(null);
|
|
34
|
+
/** Bumps on any molecule/gradient/haptic registration. */
|
|
35
|
+
let registryVersion = 0;
|
|
36
|
+
/** Per-(className·state) resolved cache — strong references between context changes. */
|
|
37
|
+
const resolvedCache = new Map();
|
|
38
|
+
/** Version the cache was last valid for (`getStyleVersion()` + {@link registryVersion}). */
|
|
39
|
+
let cachedFor = -1;
|
|
40
|
+
/** `GradientDirection` → expo-linear-gradient start/end points. */
|
|
41
|
+
const DIRECTION_POINTS = {
|
|
42
|
+
'to-t': { start: { x: 0.5, y: 1 }, end: { x: 0.5, y: 0 } },
|
|
43
|
+
'to-b': { start: { x: 0.5, y: 0 }, end: { x: 0.5, y: 1 } },
|
|
44
|
+
'to-l': { start: { x: 1, y: 0.5 }, end: { x: 0, y: 0.5 } },
|
|
45
|
+
'to-r': { start: { x: 0, y: 0.5 }, end: { x: 1, y: 0.5 } },
|
|
46
|
+
'to-tl': { start: { x: 1, y: 1 }, end: { x: 0, y: 0 } },
|
|
47
|
+
'to-tr': { start: { x: 0, y: 1 }, end: { x: 1, y: 0 } },
|
|
48
|
+
'to-bl': { start: { x: 1, y: 0 }, end: { x: 0, y: 1 } },
|
|
49
|
+
'to-br': { start: { x: 0, y: 0 }, end: { x: 1, y: 1 } },
|
|
50
|
+
unknown: { start: { x: 0, y: 0.5 }, end: { x: 1, y: 0.5 } },
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Register one scheme's pre-merged molecules (atom-merged literal
|
|
54
|
+
* classNames). Merges onto any existing entries for the scheme.
|
|
55
|
+
* @param scheme Scheme name (or `'common'`).
|
|
56
|
+
* @param entries Normalized className → merged style object.
|
|
57
|
+
*/
|
|
58
|
+
function registerMolecules(scheme, entries) {
|
|
59
|
+
molecules[scheme] = { ...molecules[scheme], ...entries };
|
|
60
|
+
registryVersion += 1;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Register the gradient atom map (atom name → role + resolved colour).
|
|
64
|
+
* @param map Atom name → gradient info.
|
|
65
|
+
*/
|
|
66
|
+
function registerGradients(map) {
|
|
67
|
+
gradients = map;
|
|
68
|
+
registryVersion += 1;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Register the haptic atom map (atom name → request).
|
|
72
|
+
* @param map Atom name → haptic request.
|
|
73
|
+
*/
|
|
74
|
+
function registerHaptics(map) {
|
|
75
|
+
haptics = map;
|
|
76
|
+
registryVersion += 1;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Per-state-object signature memo. `RnwindState` is created fresh (via the
|
|
80
|
+
* provider's `useMemo`) whenever any field changes, so its identity is a
|
|
81
|
+
* sound key — a new object means a new signature. Keyed weakly so states
|
|
82
|
+
* GC with their provider.
|
|
83
|
+
*/
|
|
84
|
+
const stateSignatureCache = new WeakMap();
|
|
85
|
+
/**
|
|
86
|
+
* Cache key dimension for the reactive context — everything that can
|
|
87
|
+
* change a resolved style.
|
|
88
|
+
* @param state Rnwind context.
|
|
89
|
+
* @returns Compact signature string.
|
|
90
|
+
*/
|
|
91
|
+
function stateSignature(state) {
|
|
92
|
+
const { insets } = state;
|
|
93
|
+
return `${state.scheme}|${insets.top},${insets.right},${insets.bottom},${insets.left}|${state.fontScale}|${state.windowWidth}`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Memoised {@link stateSignature} — one `WeakMap.get` on the hot path
|
|
97
|
+
* instead of rebuilding the template string every resolve.
|
|
98
|
+
* @param state Rnwind context.
|
|
99
|
+
* @returns Cached compact signature.
|
|
100
|
+
*/
|
|
101
|
+
function stateSignatureCached(state) {
|
|
102
|
+
let signature = stateSignatureCache.get(state);
|
|
103
|
+
if (signature === undefined) {
|
|
104
|
+
signature = stateSignature(state);
|
|
105
|
+
stateSignatureCache.set(state, signature);
|
|
106
|
+
}
|
|
107
|
+
return signature;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Compact signature of the live interactive state for the cache key.
|
|
111
|
+
* @param interactState Active/focus flags, or undefined for the plain path.
|
|
112
|
+
* @returns Two-bit signature (`''` when no interactive state).
|
|
113
|
+
*/
|
|
114
|
+
function interactSignature(interactState) {
|
|
115
|
+
if (!interactState)
|
|
116
|
+
return '';
|
|
117
|
+
const active = interactState.active ? 1 : 0;
|
|
118
|
+
const focus = interactState.focus ? 1 : 0;
|
|
119
|
+
return `${active}${focus}`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Whether a token is a feature-ONLY utility (gradient stop/direction,
|
|
123
|
+
* haptic request, or text-truncate) that contributes NO RN `style`. These
|
|
124
|
+
* are folded in via {@link attachFeatures}, so they must be kept OUT of
|
|
125
|
+
* the `lookupCss` input — otherwise the atom resolver treats them as
|
|
126
|
+
* unknown style atoms and emits a spurious "unknown class" dev warning
|
|
127
|
+
* (e.g. for `active:haptic-rigid`).
|
|
128
|
+
* @param token Atom name.
|
|
129
|
+
* @returns True when the token carries no style.
|
|
130
|
+
*/
|
|
131
|
+
function isFeatureOnlyToken(token) {
|
|
132
|
+
return Boolean(gradients[token]) || Boolean(haptics[token]) || truncateForToken(token) !== null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Lifecycle trigger for a haptic atom from its variant prefix.
|
|
136
|
+
* @param token Atom name (maybe `active:`/`focus:`/`hover:` prefixed).
|
|
137
|
+
* @returns The trigger.
|
|
138
|
+
*/
|
|
139
|
+
function hapticTriggerForToken(token) {
|
|
140
|
+
const colon = token.indexOf(':');
|
|
141
|
+
if (colon === -1)
|
|
142
|
+
return 'mount';
|
|
143
|
+
const prefix = token.slice(0, colon);
|
|
144
|
+
if (prefix === 'active')
|
|
145
|
+
return 'pressIn';
|
|
146
|
+
if (prefix === 'focus')
|
|
147
|
+
return 'focus';
|
|
148
|
+
if (prefix === 'hover')
|
|
149
|
+
return 'hover';
|
|
150
|
+
return 'mount';
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Syntactic text-truncate directive for one atom.
|
|
154
|
+
* @param token Atom name.
|
|
155
|
+
* @returns Partial truncate props, or null.
|
|
156
|
+
*/
|
|
157
|
+
function truncateForToken(token) {
|
|
158
|
+
if (token === 'truncate')
|
|
159
|
+
return { numberOfLines: 1, ellipsizeMode: 'tail' };
|
|
160
|
+
if (token === 'text-ellipsis')
|
|
161
|
+
return { ellipsizeMode: 'tail' };
|
|
162
|
+
if (token === 'text-clip')
|
|
163
|
+
return { ellipsizeMode: 'clip' };
|
|
164
|
+
if (token === 'line-clamp-none')
|
|
165
|
+
return { numberOfLines: 0 };
|
|
166
|
+
if (token.startsWith('line-clamp-')) {
|
|
167
|
+
const count = Number(token.slice('line-clamp-'.length));
|
|
168
|
+
if (Number.isInteger(count) && count >= 0)
|
|
169
|
+
return { numberOfLines: count };
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Assemble gradient props from gradient roles present in the atom list.
|
|
175
|
+
* @param tokens Atom names.
|
|
176
|
+
* @returns `{colors, start, end}` or null when not a complete gradient.
|
|
177
|
+
*/
|
|
178
|
+
function assembleGradient(tokens) {
|
|
179
|
+
let from;
|
|
180
|
+
let via;
|
|
181
|
+
let to;
|
|
182
|
+
let dir;
|
|
183
|
+
for (const token of tokens) {
|
|
184
|
+
const info = gradients[token];
|
|
185
|
+
if (!info)
|
|
186
|
+
continue;
|
|
187
|
+
switch (info.role) {
|
|
188
|
+
case 'from': {
|
|
189
|
+
from = info.color;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case 'via': {
|
|
193
|
+
via = info.color;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case 'to': {
|
|
197
|
+
to = info.color;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
default: {
|
|
201
|
+
({ dir } = info);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (dir === undefined)
|
|
206
|
+
return null;
|
|
207
|
+
const colors = [from, via, to].filter((color) => color !== undefined);
|
|
208
|
+
if (colors.length < 2)
|
|
209
|
+
return null;
|
|
210
|
+
const points = DIRECTION_POINTS[dir];
|
|
211
|
+
return { colors, start: points.start, end: points.end };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Fold every truncate directive across the atom list into one result —
|
|
215
|
+
* last token wins per prop (matches Tailwind last-wins).
|
|
216
|
+
* @param tokens Atom names.
|
|
217
|
+
* @returns Merged truncate props (empty when none apply).
|
|
218
|
+
*/
|
|
219
|
+
function collectTruncate(tokens) {
|
|
220
|
+
const out = {};
|
|
221
|
+
for (const token of tokens) {
|
|
222
|
+
const truncate = truncateForToken(token);
|
|
223
|
+
if (!truncate)
|
|
224
|
+
continue;
|
|
225
|
+
if (truncate.numberOfLines !== undefined)
|
|
226
|
+
out.numberOfLines = truncate.numberOfLines;
|
|
227
|
+
if (truncate.ellipsizeMode !== undefined)
|
|
228
|
+
out.ellipsizeMode = truncate.ellipsizeMode;
|
|
229
|
+
}
|
|
230
|
+
return out;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Collect every haptic request present in the atom list, tagged with the
|
|
234
|
+
* lifecycle trigger its variant prefix implies.
|
|
235
|
+
* @param tokens Atom names.
|
|
236
|
+
* @returns Haptic request list, or undefined when none apply.
|
|
237
|
+
*/
|
|
238
|
+
function collectHaptics(tokens) {
|
|
239
|
+
let collected;
|
|
240
|
+
for (const token of tokens) {
|
|
241
|
+
const request = haptics[token];
|
|
242
|
+
if (!request)
|
|
243
|
+
continue;
|
|
244
|
+
collected ??= [];
|
|
245
|
+
collected.push({ request, trigger: hapticTriggerForToken(token) });
|
|
246
|
+
}
|
|
247
|
+
return collected;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Scan tokens for the className-derived feature props (gradient,
|
|
251
|
+
* truncate, haptics) and fold them onto the base result.
|
|
252
|
+
* @param base Result carrying the resolved `style`.
|
|
253
|
+
* @param tokens Atom names.
|
|
254
|
+
* @returns The result with any feature props attached.
|
|
255
|
+
*/
|
|
256
|
+
function attachFeatures(base, tokens) {
|
|
257
|
+
const { numberOfLines, ellipsizeMode } = collectTruncate(tokens);
|
|
258
|
+
const collected = collectHaptics(tokens);
|
|
259
|
+
const gradient = assembleGradient(tokens);
|
|
260
|
+
const result = { style: base.style };
|
|
261
|
+
if (gradient) {
|
|
262
|
+
result.colors = gradient.colors;
|
|
263
|
+
result.start = gradient.start;
|
|
264
|
+
result.end = gradient.end;
|
|
265
|
+
}
|
|
266
|
+
// `numberOfLines: 0` is kept (RN reads it as "unlimited"): `line-clamp-none`
|
|
267
|
+
// must be able to explicitly reset an earlier `line-clamp-N` on the same
|
|
268
|
+
// element — dropping the 0 would silently leave the prior limit in place.
|
|
269
|
+
if (numberOfLines !== undefined) {
|
|
270
|
+
result.numberOfLines = numberOfLines;
|
|
271
|
+
if (ellipsizeMode !== undefined)
|
|
272
|
+
result.ellipsizeMode = ellipsizeMode;
|
|
273
|
+
}
|
|
274
|
+
if (collected)
|
|
275
|
+
result.haptics = collected;
|
|
276
|
+
return result;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Compose a resolved style with a caller-supplied inline style (user wins).
|
|
280
|
+
* @param style
|
|
281
|
+
* @param userStyle
|
|
282
|
+
*/
|
|
283
|
+
function withUserStyle(style, userStyle) {
|
|
284
|
+
return Array.isArray(style) ? [...style, userStyle] : [style, userStyle];
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Resolve a className against the reactive context into a style plus any
|
|
288
|
+
* className-derived props. Molecule-first (one lookup, by reference),
|
|
289
|
+
* atom-fallback for unseen / context-dependent strings, cached per
|
|
290
|
+
* `(className, state)`.
|
|
291
|
+
* @param className Raw className string.
|
|
292
|
+
* @param state Rnwind context from `useRnwind()`.
|
|
293
|
+
* @param userStyle Optional inline style appended last (wins).
|
|
294
|
+
* @param interactState Live active/focus flags (for `active:`/`focus:` atoms).
|
|
295
|
+
* @returns The resolved style + feature props.
|
|
296
|
+
*/
|
|
297
|
+
function resolve(className, state, userStyle, interactState) {
|
|
298
|
+
const version = lookupCss.getStyleVersion() + registryVersion;
|
|
299
|
+
if (version !== cachedFor) {
|
|
300
|
+
resolvedCache.clear();
|
|
301
|
+
cachedFor = version;
|
|
302
|
+
}
|
|
303
|
+
if (className == null) {
|
|
304
|
+
return { style: userStyle === undefined || userStyle === null ? EMPTY : [userStyle] };
|
|
305
|
+
}
|
|
306
|
+
// Key on the RAW className so the hot (cache-hit) path skips normalize
|
|
307
|
+
// entirely — normalization only runs on a miss. The state signature is
|
|
308
|
+
// memoised per state object, so the hit path is one WeakMap.get + one
|
|
309
|
+
// string concat + one Map.get.
|
|
310
|
+
const key = `${className}@${stateSignatureCached(state)}@${interactSignature(interactState)}`;
|
|
311
|
+
const cached = resolvedCache.get(key);
|
|
312
|
+
if (cached !== undefined) {
|
|
313
|
+
return userStyle === undefined || userStyle === null ? cached : { ...cached, style: withUserStyle(cached.style, userStyle) };
|
|
314
|
+
}
|
|
315
|
+
const normalized = normalizeClassname.normalizeClassName(className);
|
|
316
|
+
if (normalized.length === 0) {
|
|
317
|
+
const empty = { style: EMPTY };
|
|
318
|
+
resolvedCache.set(key, empty);
|
|
319
|
+
return userStyle === undefined || userStyle === null ? empty : { style: [userStyle] };
|
|
320
|
+
}
|
|
321
|
+
// Molecules are static pre-merges; anything carrying `active:`/`focus:`
|
|
322
|
+
// is never registered as one, so the atom path handles interactive state.
|
|
323
|
+
const tokens = normalized.split(' ');
|
|
324
|
+
const molecule = interactState ? undefined : molecules[state.scheme]?.[normalized] ?? molecules[COMMON_SCHEME]?.[normalized];
|
|
325
|
+
// Feature-only tokens (gradient / haptic / truncate) carry no style — keep
|
|
326
|
+
// them out of the atom lookup so they don't warn as "unknown class".
|
|
327
|
+
const style = molecule === undefined ? lookupCss.lookupCss(tokens.filter((token) => !isFeatureOnlyToken(token)).join(' '), state, undefined, interactState) : molecule;
|
|
328
|
+
const base = attachFeatures({ style }, tokens);
|
|
329
|
+
resolvedCache.set(key, base);
|
|
330
|
+
return userStyle === undefined || userStyle === null ? base : { ...base, style: withUserStyle(base.style, userStyle) };
|
|
331
|
+
}
|
|
332
|
+
/** Test-only — clear the molecule / gradient / haptic registries + cache. */
|
|
333
|
+
function __resetResolveState() {
|
|
334
|
+
molecules = Object.create(null);
|
|
335
|
+
gradients = Object.create(null);
|
|
336
|
+
haptics = Object.create(null);
|
|
337
|
+
resolvedCache.clear();
|
|
338
|
+
registryVersion += 1;
|
|
339
|
+
cachedFor = -1;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
exports.normalizeClassName = normalizeClassname.normalizeClassName;
|
|
343
|
+
exports.__resetResolveState = __resetResolveState;
|
|
344
|
+
exports.registerGradients = registerGradients;
|
|
345
|
+
exports.registerHaptics = registerHaptics;
|
|
346
|
+
exports.registerMolecules = registerMolecules;
|
|
347
|
+
exports.resolve = resolve;
|
|
348
|
+
//# sourceMappingURL=resolve.cjs.map
|