@kbach/react 0.5.33 → 0.5.35

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/dist/index.js CHANGED
@@ -709,6 +709,10 @@ var LRUCache = class {
709
709
 
710
710
  // src/core/platform.ts
711
711
  var isWeb = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined";
712
+ var _cssGenMode = false;
713
+ function getEffectiveIsWeb() {
714
+ return isWeb || _cssGenMode;
715
+ }
712
716
  function toNativeValue(raw) {
713
717
  if (/^-?\d+(\.\d+)?px$/.test(raw)) return parseFloat(raw);
714
718
  if (/^-?\d+(\.\d+)?rem$/.test(raw)) return parseFloat(raw) * 16;
@@ -1408,7 +1412,7 @@ function parseClass(className) {
1408
1412
  const bracketStart = remaining.lastIndexOf("-[");
1409
1413
  if (bracketStart > 0 && remaining.endsWith("]")) {
1410
1414
  const utility = remaining.slice(0, bracketStart);
1411
- const value = remaining.slice(bracketStart + 2, -1);
1415
+ const value = remaining.slice(bracketStart + 2, -1).replace(/_/g, " ");
1412
1416
  return { original: trimmed, modifiers, negative, important, utility, value, isArbitrary: true };
1413
1417
  }
1414
1418
  if (STANDALONE_UTILITIES.has(remaining)) {
@@ -1437,10 +1441,29 @@ function parseClass(className) {
1437
1441
  }
1438
1442
  return { original: trimmed, modifiers, negative, important, utility: remaining, value: "", isArbitrary: false };
1439
1443
  }
1444
+ function splitClassTokens(classString) {
1445
+ const tokens = [];
1446
+ let current = "";
1447
+ let depth = 0;
1448
+ for (let i = 0; i < classString.length; i++) {
1449
+ const ch = classString[i];
1450
+ if (ch === "[") depth++;
1451
+ else if (ch === "]") depth--;
1452
+ if (/\s/.test(ch) && depth === 0) {
1453
+ if (current) {
1454
+ tokens.push(current);
1455
+ current = "";
1456
+ }
1457
+ } else {
1458
+ current += ch;
1459
+ }
1460
+ }
1461
+ if (current) tokens.push(current);
1462
+ return tokens;
1463
+ }
1440
1464
  function parseClasses(classString) {
1441
1465
  const results = [];
1442
- for (const token of classString.split(/\s+/)) {
1443
- if (!token) continue;
1466
+ for (const token of splitClassTokens(classString)) {
1444
1467
  const parsed = parseClass(token);
1445
1468
  if (parsed) results.push(parsed);
1446
1469
  }
@@ -1526,8 +1549,12 @@ function hexToRgba(hex, alpha) {
1526
1549
  }
1527
1550
  function resolveSpacing(value, negative, spacing, isArbitrary) {
1528
1551
  if (isArbitrary) {
1529
- const resolved = isWeb ? value : toNativeValue(value);
1530
- return negative && typeof resolved === "number" ? -resolved : resolved;
1552
+ const resolved = getEffectiveIsWeb() ? value : toNativeValue(value);
1553
+ if (negative) {
1554
+ if (typeof resolved === "number") return -resolved;
1555
+ if (typeof resolved === "string" && /^\d/.test(resolved)) return `-${resolved}`;
1556
+ }
1557
+ return resolved;
1531
1558
  }
1532
1559
  const raw = spacing[value];
1533
1560
  if (raw === void 0) return null;
@@ -1539,7 +1566,7 @@ function resolveSpacing(value, negative, spacing, isArbitrary) {
1539
1566
  return raw;
1540
1567
  }
1541
1568
  function resolveSizing(value, spacing, isArbitrary) {
1542
- if (isArbitrary) return isWeb ? value : toNativeValue(value);
1569
+ if (isArbitrary) return getEffectiveIsWeb() ? value : toNativeValue(value);
1543
1570
  const raw = spacing[value];
1544
1571
  if (raw !== void 0) return raw;
1545
1572
  if (/^\d+\/\d+$/.test(value)) {
@@ -1549,356 +1576,364 @@ function resolveSizing(value, spacing, isArbitrary) {
1549
1576
  return null;
1550
1577
  }
1551
1578
  function resolveRadius(value, radii, isArbitrary) {
1552
- if (isArbitrary) return isWeb ? value : toNativeValue(value);
1579
+ if (isArbitrary) return getEffectiveIsWeb() ? value : toNativeValue(value);
1553
1580
  const key = value === "" ? "DEFAULT" : value;
1554
1581
  return radii[key] ?? null;
1555
1582
  }
1556
1583
  function resolveFontSize(value, fontSizes, isArbitrary) {
1557
- if (isArbitrary) return isWeb ? value : toNativeValue(value);
1584
+ if (isArbitrary) return getEffectiveIsWeb() ? value : toNativeValue(value);
1558
1585
  return fontSizes[value] ?? null;
1559
1586
  }
1560
1587
  var FILTER_COMPOSE = "var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)";
1561
1588
  var BACKDROP_FILTER_COMPOSE = "var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)";
1562
- var STANDALONE = {
1563
- // Display
1564
- // React Native only supports display:'flex'|'none'. Setting 'flex' explicitly is
1565
- // a no-op normally, but is needed to re-show an element that was hidden via `hidden`.
1566
- // `grid`, `inline-*`, `contents`, `flow-root` have no native equivalent.
1567
- flex: { display: "flex" },
1568
- block: isWeb ? { display: "block" } : null,
1569
- "inline-block": isWeb ? { display: "inline-block" } : null,
1570
- inline: isWeb ? { display: "inline" } : null,
1571
- grid: isWeb ? { display: "grid" } : null,
1572
- grd: isWeb ? { display: "grid" } : null,
1573
- "inline-flex": { display: isWeb ? "inline-flex" : "flex" },
1574
- "inline-grid": isWeb ? { display: "inline-grid" } : null,
1575
- hidden: { display: "none" },
1576
- contents: isWeb ? { display: "contents" } : null,
1577
- "flow-root": isWeb ? { display: "flow-root" } : null,
1578
- // Flex direction (both web and native)
1579
- "flex-row": { flexDirection: "row" },
1580
- "flex-col": { flexDirection: "column" },
1581
- "flex-row-reverse": { flexDirection: "row-reverse" },
1582
- "flex-col-reverse": { flexDirection: "column-reverse" },
1583
- // Flex wrap (both)
1584
- "flex-wrap": { flexWrap: "wrap" },
1585
- "flex-wrap-reverse": { flexWrap: "wrap-reverse" },
1586
- "flex-nowrap": { flexWrap: "nowrap" },
1587
- // Flex grow / shrink (both)
1588
- "flex-grow": { flexGrow: 1 },
1589
- "flex-grow-0": { flexGrow: 0 },
1590
- "flex-shrink": { flexShrink: 1 },
1591
- "flex-shrink-0": { flexShrink: 0 },
1592
- // Align items (both)
1593
- "items-start": { alignItems: "flex-start" },
1594
- "items-end": { alignItems: "flex-end" },
1595
- "items-center": { alignItems: "center" },
1596
- "items-baseline": { alignItems: "baseline" },
1597
- "items-stretch": { alignItems: "stretch" },
1598
- // Justify content (both)
1599
- "justify-start": { justifyContent: "flex-start" },
1600
- "justify-end": { justifyContent: "flex-end" },
1601
- "justify-center": { justifyContent: "center" },
1602
- "justify-between": { justifyContent: "space-between" },
1603
- "justify-around": { justifyContent: "space-around" },
1604
- "justify-evenly": { justifyContent: "space-evenly" },
1605
- // Align content (both)
1606
- "content-start": { alignContent: "flex-start" },
1607
- "content-end": { alignContent: "flex-end" },
1608
- "content-center": { alignContent: "center" },
1609
- "content-between": { alignContent: "space-between" },
1610
- "content-around": { alignContent: "space-around" },
1611
- "content-evenly": { alignContent: "space-evenly" },
1612
- "content-stretch": { alignContent: "stretch" },
1613
- // Align self (both)
1614
- "self-auto": { alignSelf: "auto" },
1615
- "self-start": { alignSelf: "flex-start" },
1616
- "self-end": { alignSelf: "flex-end" },
1617
- "self-center": { alignSelf: "center" },
1618
- "self-stretch": { alignSelf: "stretch" },
1619
- "self-baseline": { alignSelf: "baseline" },
1620
- // Text align (both)
1621
- "text-left": { textAlign: "left" },
1622
- "text-right": { textAlign: "right" },
1623
- "text-center": { textAlign: "center" },
1624
- "text-justify": { textAlign: "justify" },
1625
- // Font weight shortcuts (both)
1626
- "font-thin": { fontWeight: "100" },
1627
- "font-extralight": { fontWeight: "200" },
1628
- "font-light": { fontWeight: "300" },
1629
- "font-normal": { fontWeight: "400" },
1630
- "font-medium": { fontWeight: "500" },
1631
- "font-semibold": { fontWeight: "600" },
1632
- "font-bold": { fontWeight: "700" },
1633
- "font-extrabold": { fontWeight: "800" },
1634
- "font-black": { fontWeight: "900" },
1635
- // Text decoration (overline is web-only)
1636
- underline: { textDecorationLine: "underline" },
1637
- overline: isWeb ? { textDecorationLine: "overline" } : null,
1638
- "line-through": { textDecorationLine: "line-through" },
1639
- "no-underline": { textDecorationLine: "none" },
1640
- // Text transform (both)
1641
- uppercase: { textTransform: "uppercase" },
1642
- lowercase: { textTransform: "lowercase" },
1643
- capitalize: { textTransform: "capitalize" },
1644
- "normal-case": { textTransform: "none" },
1645
- // Font style (both)
1646
- italic: { fontStyle: "italic" },
1647
- "non-italic": { fontStyle: "normal" },
1648
- // Position (fixed/sticky/static are web-only; RN only supports relative/absolute)
1649
- relative: { position: "relative" },
1650
- absolute: { position: "absolute" },
1651
- fixed: isWeb ? { position: "fixed" } : null,
1652
- sticky: isWeb ? { position: "sticky" } : null,
1653
- static: isWeb ? { position: "static" } : null,
1654
- // Visibility (no `visibility` prop on native; use opacity instead)
1655
- visible: isWeb ? { visibility: "visible" } : null,
1656
- invisible: isWeb ? { visibility: "hidden" } : { opacity: 0 },
1657
- // Overflow (RN supports 'hidden' | 'visible' | 'scroll'; not 'auto')
1658
- "overflow-hidden": { overflow: "hidden" },
1659
- "overflow-visible": { overflow: "visible" },
1660
- "overflow-scroll": { overflow: "scroll" },
1661
- "overflow-auto": isWeb ? { overflow: "auto" } : { overflow: "scroll" },
1662
- // overflowX / overflowY are web-only
1663
- "overflow-x-hidden": isWeb ? { overflowX: "hidden" } : null,
1664
- "overflow-x-scroll": isWeb ? { overflowX: "scroll" } : null,
1665
- "overflow-x-auto": isWeb ? { overflowX: "auto" } : null,
1666
- "overflow-y-hidden": isWeb ? { overflowY: "hidden" } : null,
1667
- "overflow-y-scroll": isWeb ? { overflowY: "scroll" } : null,
1668
- "overflow-y-auto": isWeb ? { overflowY: "auto" } : null,
1669
- // Object fit (web-only; use resizeMode prop on RN Image)
1670
- "object-contain": isWeb ? { objectFit: "contain" } : null,
1671
- "object-cover": isWeb ? { objectFit: "cover" } : null,
1672
- "object-fill": isWeb ? { objectFit: "fill" } : null,
1673
- "object-none": isWeb ? { objectFit: "none" } : null,
1674
- "object-scale-down": isWeb ? { objectFit: "scale-down" } : null,
1675
- // Border style (both)
1676
- "border-solid": { borderStyle: "solid" },
1677
- "border-dashed": { borderStyle: "dashed" },
1678
- "border-dotted": { borderStyle: "dotted" },
1679
- "border-none": { borderWidth: 0 },
1680
- // Border sides default width (both)
1681
- "border-t": { borderTopWidth: 1 },
1682
- "border-r": { borderRightWidth: 1 },
1683
- "border-b": { borderBottomWidth: 1 },
1684
- "border-l": { borderLeftWidth: 1 },
1685
- // Cursor (web-only)
1686
- "cursor-auto": isWeb ? { cursor: "auto" } : null,
1687
- "cursor-default": isWeb ? { cursor: "default" } : null,
1688
- "cursor-pointer": isWeb ? { cursor: "pointer" } : null,
1689
- "cursor-wait": isWeb ? { cursor: "wait" } : null,
1690
- "cursor-text": isWeb ? { cursor: "text" } : null,
1691
- "cursor-move": isWeb ? { cursor: "move" } : null,
1692
- "cursor-not-allowed": isWeb ? { cursor: "not-allowed" } : null,
1693
- // User select (web-only)
1694
- "select-none": isWeb ? { userSelect: "none" } : null,
1695
- "select-text": isWeb ? { userSelect: "text" } : null,
1696
- "select-all": isWeb ? { userSelect: "all" } : null,
1697
- "select-auto": isWeb ? { userSelect: "auto" } : null,
1698
- // Pointer events (both)
1699
- "pointer-events-none": { pointerEvents: "none" },
1700
- "pointer-events-auto": { pointerEvents: "auto" },
1701
- // Whitespace (web-only; RN Text uses numberOfLines prop instead)
1702
- "whitespace-normal": isWeb ? { whiteSpace: "normal" } : null,
1703
- "whitespace-nowrap": isWeb ? { whiteSpace: "nowrap" } : null,
1704
- "whitespace-pre": isWeb ? { whiteSpace: "pre" } : null,
1705
- "whitespace-pre-wrap": isWeb ? { whiteSpace: "pre-wrap" } : null,
1706
- "whitespace-pre-line": isWeb ? { whiteSpace: "pre-line" } : null,
1707
- // Word break (web-only)
1708
- "break-normal": isWeb ? { overflowWrap: "normal", wordBreak: "normal" } : null,
1709
- "break-words": isWeb ? { overflowWrap: "break-word" } : null,
1710
- "break-all": isWeb ? { wordBreak: "break-all" } : null,
1711
- // Misc web-only
1712
- truncate: isWeb ? { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } : null,
1713
- "box-border": isWeb ? { boxSizing: "border-box" } : null,
1714
- "box-content": isWeb ? { boxSizing: "content-box" } : null,
1715
- "appearance-none": isWeb ? { appearance: "none" } : null,
1716
- "outline-none": isWeb ? { outline: "none", outlineOffset: "0" } : null,
1717
- outline: isWeb ? { outline: "2px solid transparent", outlineOffset: "2px" } : null,
1718
- resize: isWeb ? { resize: "both" } : null,
1719
- "resize-none": isWeb ? { resize: "none" } : null,
1720
- "resize-y": isWeb ? { resize: "vertical" } : null,
1721
- "resize-x": isWeb ? { resize: "horizontal" } : null,
1722
- antialiased: isWeb ? { WebkitFontSmoothing: "antialiased", MozOsxFontSmoothing: "grayscale" } : null,
1723
- "subpixel-antialiased": isWeb ? { WebkitFontSmoothing: "subpixel-antialiased", MozOsxFontSmoothing: "auto" } : null,
1724
- "overflow-ellipsis": isWeb ? { textOverflow: "ellipsis" } : null,
1725
- "sr-only": isWeb ? {
1726
- position: "absolute",
1727
- width: 1,
1728
- height: 1,
1729
- padding: 0,
1730
- margin: -1,
1731
- overflow: "hidden",
1732
- clip: "rect(0,0,0,0)",
1733
- whiteSpace: "nowrap",
1734
- border: 0
1735
- } : null,
1736
- "not-sr-only": isWeb ? {
1737
- position: "static",
1738
- width: "auto",
1739
- height: "auto",
1740
- padding: 0,
1741
- margin: 0,
1742
- overflow: "visible",
1743
- clip: "auto",
1744
- whiteSpace: "normal"
1745
- } : null,
1746
- // Lists (web-only)
1747
- "list-none": isWeb ? { listStyleType: "none" } : null,
1748
- "list-disc": isWeb ? { listStyleType: "disc" } : null,
1749
- "list-decimal": isWeb ? { listStyleType: "decimal" } : null,
1750
- // Background clip (web-only)
1751
- "bg-clip-border": isWeb ? { backgroundClip: "border-box" } : null,
1752
- "bg-clip-padding": isWeb ? { backgroundClip: "padding-box" } : null,
1753
- "bg-clip-content": isWeb ? { backgroundClip: "content-box" } : null,
1754
- "bg-clip-text": isWeb ? { backgroundClip: "text", WebkitBackgroundClip: "text" } : null,
1755
- // Background image
1756
- "bg-none": isWeb ? { backgroundImage: "none" } : null,
1757
- // Background size (web-only)
1758
- "bg-auto": isWeb ? { backgroundSize: "auto" } : null,
1759
- "bg-cover": isWeb ? { backgroundSize: "cover" } : null,
1760
- "bg-contain": isWeb ? { backgroundSize: "contain" } : null,
1761
- // Background position (web-only)
1762
- "bg-center": isWeb ? { backgroundPosition: "center" } : null,
1763
- "bg-top": isWeb ? { backgroundPosition: "top" } : null,
1764
- "bg-bottom": isWeb ? { backgroundPosition: "bottom" } : null,
1765
- "bg-left": isWeb ? { backgroundPosition: "left" } : null,
1766
- "bg-right": isWeb ? { backgroundPosition: "right" } : null,
1767
- "bg-left-top": isWeb ? { backgroundPosition: "left top" } : null,
1768
- "bg-left-bottom": isWeb ? { backgroundPosition: "left bottom" } : null,
1769
- "bg-right-top": isWeb ? { backgroundPosition: "right top" } : null,
1770
- "bg-right-bottom": isWeb ? { backgroundPosition: "right bottom" } : null,
1771
- // Background repeat (web-only)
1772
- "bg-repeat": isWeb ? { backgroundRepeat: "repeat" } : null,
1773
- "bg-no-repeat": isWeb ? { backgroundRepeat: "no-repeat" } : null,
1774
- "bg-repeat-x": isWeb ? { backgroundRepeat: "repeat-x" } : null,
1775
- "bg-repeat-y": isWeb ? { backgroundRepeat: "repeat-y" } : null,
1776
- "bg-repeat-round": isWeb ? { backgroundRepeat: "round" } : null,
1777
- "bg-repeat-space": isWeb ? { backgroundRepeat: "space" } : null,
1778
- // Background attachment (web-only)
1779
- "bg-fixed": isWeb ? { backgroundAttachment: "fixed" } : null,
1780
- "bg-local": isWeb ? { backgroundAttachment: "local" } : null,
1781
- "bg-scroll": isWeb ? { backgroundAttachment: "scroll" } : null,
1782
- // Object position (web-only)
1783
- "object-center": isWeb ? { objectPosition: "center" } : null,
1784
- "object-top": isWeb ? { objectPosition: "top" } : null,
1785
- "object-bottom": isWeb ? { objectPosition: "bottom" } : null,
1786
- "object-left": isWeb ? { objectPosition: "left" } : null,
1787
- "object-right": isWeb ? { objectPosition: "right" } : null,
1788
- "object-left-top": isWeb ? { objectPosition: "left top" } : null,
1789
- "object-left-bottom": isWeb ? { objectPosition: "left bottom" } : null,
1790
- "object-right-top": isWeb ? { objectPosition: "right top" } : null,
1791
- "object-right-bottom": isWeb ? { objectPosition: "right bottom" } : null,
1792
- // Table (web-only)
1793
- table: isWeb ? { display: "table" } : null,
1794
- "table-auto": isWeb ? { tableLayout: "auto" } : null,
1795
- "table-fixed": isWeb ? { tableLayout: "fixed" } : null,
1796
- "caption-top": isWeb ? { captionSide: "top" } : null,
1797
- "caption-bottom": isWeb ? { captionSide: "bottom" } : null,
1798
- "border-collapse": isWeb ? { borderCollapse: "collapse" } : null,
1799
- "border-separate": isWeb ? { borderCollapse: "separate" } : null,
1800
- // List style position (web-only)
1801
- "list-inside": isWeb ? { listStylePosition: "inside" } : null,
1802
- "list-outside": isWeb ? { listStylePosition: "outside" } : null,
1803
- // Font variant numeric (web-only)
1804
- "normal-nums": isWeb ? { fontVariantNumeric: "normal" } : null,
1805
- ordinal: isWeb ? { fontVariantNumeric: "ordinal" } : null,
1806
- "slashed-zero": isWeb ? { fontVariantNumeric: "slashed-zero" } : null,
1807
- "lining-nums": isWeb ? { fontVariantNumeric: "lining-nums" } : null,
1808
- "oldstyle-nums": isWeb ? { fontVariantNumeric: "oldstyle-nums" } : null,
1809
- "proportional-nums": isWeb ? { fontVariantNumeric: "proportional-nums" } : null,
1810
- "tabular-nums": isWeb ? { fontVariantNumeric: "tabular-nums" } : null,
1811
- "diagonal-fractions": isWeb ? { fontVariantNumeric: "diagonal-fractions" } : null,
1812
- "stacked-fractions": isWeb ? { fontVariantNumeric: "stacked-fractions" } : null,
1813
- // Isolation (web-only)
1814
- isolate: isWeb ? { isolation: "isolate" } : null,
1815
- "isolation-auto": isWeb ? { isolation: "auto" } : null,
1816
- // Backface visibility (both iOS and Android)
1817
- "backface-visible": { backfaceVisibility: "visible" },
1818
- "backface-hidden": { backfaceVisibility: "hidden" },
1819
- // CSS filters — standalone = default/full effect (web-only)
1820
- grayscale: isWeb ? { "--tw-grayscale": "grayscale(100%)", filter: FILTER_COMPOSE } : null,
1821
- invert: isWeb ? { "--tw-invert": "invert(100%)", filter: FILTER_COMPOSE } : null,
1822
- sepia: isWeb ? { "--tw-sepia": "sepia(100%)", filter: FILTER_COMPOSE } : null,
1823
- // Divide none
1824
- "divide-none": isWeb ? { __divideX: 0, __divideY: 0 } : null,
1825
- // Group / peer markers (no-op: no style emitted; just ensures isKnownUtility returns true)
1826
- group: isWeb ? {} : null,
1827
- peer: isWeb ? {} : null,
1828
- // Text-wrap (web-only)
1829
- "text-wrap": isWeb ? { textWrap: "wrap" } : null,
1830
- "text-nowrap": isWeb ? { textWrap: "nowrap" } : null,
1831
- "text-balance": isWeb ? { textWrap: "balance" } : null,
1832
- "text-pretty": isWeb ? { textWrap: "pretty" } : null,
1833
- // Screen sizing (vw values are web-only; vh values work cross-platform via spacing scale for h-*)
1834
- "w-screen": isWeb ? { width: "100vw" } : null,
1835
- "min-h-screen": { minHeight: "100vh" },
1836
- "max-h-screen": { maxHeight: "100vh" },
1837
- "min-w-screen": isWeb ? { minWidth: "100vw" } : null,
1838
- "max-w-screen": isWeb ? { maxWidth: "100vw" } : null,
1839
- // max-w named container sizes (mirrors Tailwind's container scale)
1840
- "max-w-none": { maxWidth: "none" },
1841
- "max-w-xs": { maxWidth: 320 },
1842
- "max-w-sm": { maxWidth: 384 },
1843
- "max-w-md": { maxWidth: 448 },
1844
- "max-w-lg": { maxWidth: 512 },
1845
- "max-w-xl": { maxWidth: 576 },
1846
- "max-w-2xl": { maxWidth: 672 },
1847
- "max-w-3xl": { maxWidth: 768 },
1848
- "max-w-4xl": { maxWidth: 896 },
1849
- "max-w-5xl": { maxWidth: 1024 },
1850
- "max-w-6xl": { maxWidth: 1152 },
1851
- "max-w-7xl": { maxWidth: 1280 },
1852
- "max-w-prose": isWeb ? { maxWidth: "65ch" } : null,
1853
- // Extended cursors (web-only)
1854
- "cursor-grab": isWeb ? { cursor: "grab" } : null,
1855
- "cursor-grabbing": isWeb ? { cursor: "grabbing" } : null,
1856
- "cursor-zoom-in": isWeb ? { cursor: "zoom-in" } : null,
1857
- "cursor-zoom-out": isWeb ? { cursor: "zoom-out" } : null,
1858
- "cursor-crosshair": isWeb ? { cursor: "crosshair" } : null,
1859
- "cursor-help": isWeb ? { cursor: "help" } : null,
1860
- "cursor-none": isWeb ? { cursor: "none" } : null,
1861
- // Overflow clip (web-only)
1862
- "overflow-clip": isWeb ? { overflow: "clip" } : null,
1863
- "overflow-x-clip": isWeb ? { overflowX: "clip" } : null,
1864
- "overflow-y-clip": isWeb ? { overflowY: "clip" } : null,
1865
- // Scroll behavior (web-only)
1866
- "scroll-smooth": isWeb ? { scrollBehavior: "smooth" } : null,
1867
- "scroll-auto": isWeb ? { scrollBehavior: "auto" } : null,
1868
- // Float (web-only)
1869
- "float-left": isWeb ? { float: "left" } : null,
1870
- "float-right": isWeb ? { float: "right" } : null,
1871
- "float-start": isWeb ? { float: "inline-start" } : null,
1872
- "float-end": isWeb ? { float: "inline-end" } : null,
1873
- "float-none": isWeb ? { float: "none" } : null,
1874
- // Clear (web-only)
1875
- "clear-left": isWeb ? { clear: "left" } : null,
1876
- "clear-right": isWeb ? { clear: "right" } : null,
1877
- "clear-both": isWeb ? { clear: "both" } : null,
1878
- "clear-start": isWeb ? { clear: "inline-start" } : null,
1879
- "clear-end": isWeb ? { clear: "inline-end" } : null,
1880
- "clear-none": isWeb ? { clear: "none" } : null,
1881
- // Vertical align (web-only)
1882
- "align-baseline": isWeb ? { verticalAlign: "baseline" } : null,
1883
- "align-top": isWeb ? { verticalAlign: "top" } : null,
1884
- "align-middle": isWeb ? { verticalAlign: "middle" } : null,
1885
- "align-bottom": isWeb ? { verticalAlign: "bottom" } : null,
1886
- "align-text-top": isWeb ? { verticalAlign: "text-top" } : null,
1887
- "align-text-bottom": isWeb ? { verticalAlign: "text-bottom" } : null,
1888
- "align-sub": isWeb ? { verticalAlign: "sub" } : null,
1889
- "align-super": isWeb ? { verticalAlign: "super" } : null,
1890
- // Touch action (web-only)
1891
- "touch-auto": isWeb ? { touchAction: "auto" } : null,
1892
- "touch-none": isWeb ? { touchAction: "none" } : null,
1893
- "touch-pan-x": isWeb ? { touchAction: "pan-x" } : null,
1894
- "touch-pan-y": isWeb ? { touchAction: "pan-y" } : null,
1895
- "touch-pan-left": isWeb ? { touchAction: "pan-left" } : null,
1896
- "touch-pan-right": isWeb ? { touchAction: "pan-right" } : null,
1897
- "touch-pan-up": isWeb ? { touchAction: "pan-up" } : null,
1898
- "touch-pan-down": isWeb ? { touchAction: "pan-down" } : null,
1899
- "touch-pinch-zoom": isWeb ? { touchAction: "pinch-zoom" } : null,
1900
- "touch-manipulation": isWeb ? { touchAction: "manipulation" } : null
1901
- };
1589
+ var _standalone = null;
1590
+ function buildStandalone() {
1591
+ const web = getEffectiveIsWeb();
1592
+ return {
1593
+ // Display
1594
+ // React Native only supports display:'flex'|'none'. Setting 'flex' explicitly is
1595
+ // a no-op normally, but is needed to re-show an element that was hidden via `hidden`.
1596
+ // `grid`, `inline-*`, `contents`, `flow-root` have no native equivalent.
1597
+ flex: { display: "flex" },
1598
+ block: web ? { display: "block" } : null,
1599
+ "inline-block": web ? { display: "inline-block" } : null,
1600
+ inline: web ? { display: "inline" } : null,
1601
+ grid: web ? { display: "grid" } : null,
1602
+ grd: web ? { display: "grid" } : null,
1603
+ "inline-flex": { display: web ? "inline-flex" : "flex" },
1604
+ "inline-grid": web ? { display: "inline-grid" } : null,
1605
+ hidden: { display: "none" },
1606
+ contents: web ? { display: "contents" } : null,
1607
+ "flow-root": web ? { display: "flow-root" } : null,
1608
+ // Flex direction (both web and native)
1609
+ "flex-row": { flexDirection: "row" },
1610
+ "flex-col": { flexDirection: "column" },
1611
+ "flex-row-reverse": { flexDirection: "row-reverse" },
1612
+ "flex-col-reverse": { flexDirection: "column-reverse" },
1613
+ // Flex wrap (both)
1614
+ "flex-wrap": { flexWrap: "wrap" },
1615
+ "flex-wrap-reverse": { flexWrap: "wrap-reverse" },
1616
+ "flex-nowrap": { flexWrap: "nowrap" },
1617
+ // Flex grow / shrink (both)
1618
+ "flex-grow": { flexGrow: 1 },
1619
+ "flex-grow-0": { flexGrow: 0 },
1620
+ "flex-shrink": { flexShrink: 1 },
1621
+ "flex-shrink-0": { flexShrink: 0 },
1622
+ // Align items (both)
1623
+ "items-start": { alignItems: "flex-start" },
1624
+ "items-end": { alignItems: "flex-end" },
1625
+ "items-center": { alignItems: "center" },
1626
+ "items-baseline": { alignItems: "baseline" },
1627
+ "items-stretch": { alignItems: "stretch" },
1628
+ // Justify content (both)
1629
+ "justify-start": { justifyContent: "flex-start" },
1630
+ "justify-end": { justifyContent: "flex-end" },
1631
+ "justify-center": { justifyContent: "center" },
1632
+ "justify-between": { justifyContent: "space-between" },
1633
+ "justify-around": { justifyContent: "space-around" },
1634
+ "justify-evenly": { justifyContent: "space-evenly" },
1635
+ // Align content (both)
1636
+ "content-start": { alignContent: "flex-start" },
1637
+ "content-end": { alignContent: "flex-end" },
1638
+ "content-center": { alignContent: "center" },
1639
+ "content-between": { alignContent: "space-between" },
1640
+ "content-around": { alignContent: "space-around" },
1641
+ "content-evenly": { alignContent: "space-evenly" },
1642
+ "content-stretch": { alignContent: "stretch" },
1643
+ // Align self (both)
1644
+ "self-auto": { alignSelf: "auto" },
1645
+ "self-start": { alignSelf: "flex-start" },
1646
+ "self-end": { alignSelf: "flex-end" },
1647
+ "self-center": { alignSelf: "center" },
1648
+ "self-stretch": { alignSelf: "stretch" },
1649
+ "self-baseline": { alignSelf: "baseline" },
1650
+ // Text align (both)
1651
+ "text-left": { textAlign: "left" },
1652
+ "text-right": { textAlign: "right" },
1653
+ "text-center": { textAlign: "center" },
1654
+ "text-justify": { textAlign: "justify" },
1655
+ // Font weight shortcuts (both)
1656
+ "font-thin": { fontWeight: "100" },
1657
+ "font-extralight": { fontWeight: "200" },
1658
+ "font-light": { fontWeight: "300" },
1659
+ "font-normal": { fontWeight: "400" },
1660
+ "font-medium": { fontWeight: "500" },
1661
+ "font-semibold": { fontWeight: "600" },
1662
+ "font-bold": { fontWeight: "700" },
1663
+ "font-extrabold": { fontWeight: "800" },
1664
+ "font-black": { fontWeight: "900" },
1665
+ // Text decoration (overline is web-only)
1666
+ underline: { textDecorationLine: "underline" },
1667
+ overline: web ? { textDecorationLine: "overline" } : null,
1668
+ "line-through": { textDecorationLine: "line-through" },
1669
+ "no-underline": { textDecorationLine: "none" },
1670
+ // Text transform (both)
1671
+ uppercase: { textTransform: "uppercase" },
1672
+ lowercase: { textTransform: "lowercase" },
1673
+ capitalize: { textTransform: "capitalize" },
1674
+ "normal-case": { textTransform: "none" },
1675
+ // Font style (both)
1676
+ italic: { fontStyle: "italic" },
1677
+ "non-italic": { fontStyle: "normal" },
1678
+ // Position (fixed/sticky/static are web-only; RN only supports relative/absolute)
1679
+ relative: { position: "relative" },
1680
+ absolute: { position: "absolute" },
1681
+ fixed: web ? { position: "fixed" } : null,
1682
+ sticky: web ? { position: "sticky" } : null,
1683
+ static: web ? { position: "static" } : null,
1684
+ // Visibility (no `visibility` prop on native; use opacity instead)
1685
+ visible: web ? { visibility: "visible" } : null,
1686
+ invisible: web ? { visibility: "hidden" } : { opacity: 0 },
1687
+ // Overflow (RN supports 'hidden' | 'visible' | 'scroll'; not 'auto')
1688
+ "overflow-hidden": { overflow: "hidden" },
1689
+ "overflow-visible": { overflow: "visible" },
1690
+ "overflow-scroll": { overflow: "scroll" },
1691
+ "overflow-auto": web ? { overflow: "auto" } : { overflow: "scroll" },
1692
+ // overflowX / overflowY are web-only
1693
+ "overflow-x-hidden": web ? { overflowX: "hidden" } : null,
1694
+ "overflow-x-scroll": web ? { overflowX: "scroll" } : null,
1695
+ "overflow-x-auto": web ? { overflowX: "auto" } : null,
1696
+ "overflow-y-hidden": web ? { overflowY: "hidden" } : null,
1697
+ "overflow-y-scroll": web ? { overflowY: "scroll" } : null,
1698
+ "overflow-y-auto": web ? { overflowY: "auto" } : null,
1699
+ // Object fit (web-only; use resizeMode prop on RN Image)
1700
+ "object-contain": web ? { objectFit: "contain" } : null,
1701
+ "object-cover": web ? { objectFit: "cover" } : null,
1702
+ "object-fill": web ? { objectFit: "fill" } : null,
1703
+ "object-none": web ? { objectFit: "none" } : null,
1704
+ "object-scale-down": web ? { objectFit: "scale-down" } : null,
1705
+ // Border style (both)
1706
+ "border-solid": { borderStyle: "solid" },
1707
+ "border-dashed": { borderStyle: "dashed" },
1708
+ "border-dotted": { borderStyle: "dotted" },
1709
+ "border-none": { borderWidth: 0 },
1710
+ // Border sides default width (both)
1711
+ "border-t": { borderTopWidth: 1 },
1712
+ "border-r": { borderRightWidth: 1 },
1713
+ "border-b": { borderBottomWidth: 1 },
1714
+ "border-l": { borderLeftWidth: 1 },
1715
+ // Cursor (web-only)
1716
+ "cursor-auto": web ? { cursor: "auto" } : null,
1717
+ "cursor-default": web ? { cursor: "default" } : null,
1718
+ "cursor-pointer": web ? { cursor: "pointer" } : null,
1719
+ "cursor-wait": web ? { cursor: "wait" } : null,
1720
+ "cursor-text": web ? { cursor: "text" } : null,
1721
+ "cursor-move": web ? { cursor: "move" } : null,
1722
+ "cursor-not-allowed": web ? { cursor: "not-allowed" } : null,
1723
+ // User select (web-only)
1724
+ "select-none": web ? { userSelect: "none" } : null,
1725
+ "select-text": web ? { userSelect: "text" } : null,
1726
+ "select-all": web ? { userSelect: "all" } : null,
1727
+ "select-auto": web ? { userSelect: "auto" } : null,
1728
+ // Pointer events (both)
1729
+ "pointer-events-none": { pointerEvents: "none" },
1730
+ "pointer-events-auto": { pointerEvents: "auto" },
1731
+ // Whitespace (web-only; RN Text uses numberOfLines prop instead)
1732
+ "whitespace-normal": web ? { whiteSpace: "normal" } : null,
1733
+ "whitespace-nowrap": web ? { whiteSpace: "nowrap" } : null,
1734
+ "whitespace-pre": web ? { whiteSpace: "pre" } : null,
1735
+ "whitespace-pre-wrap": web ? { whiteSpace: "pre-wrap" } : null,
1736
+ "whitespace-pre-line": web ? { whiteSpace: "pre-line" } : null,
1737
+ // Word break (web-only)
1738
+ "break-normal": web ? { overflowWrap: "normal", wordBreak: "normal" } : null,
1739
+ "break-words": web ? { overflowWrap: "break-word" } : null,
1740
+ "break-all": web ? { wordBreak: "break-all" } : null,
1741
+ // Misc web-only
1742
+ truncate: web ? { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } : null,
1743
+ "box-border": web ? { boxSizing: "border-box" } : null,
1744
+ "box-content": web ? { boxSizing: "content-box" } : null,
1745
+ "appearance-none": web ? { appearance: "none" } : null,
1746
+ "outline-none": web ? { outline: "none", outlineOffset: "0" } : null,
1747
+ outline: web ? { outline: "2px solid transparent", outlineOffset: "2px" } : null,
1748
+ resize: web ? { resize: "both" } : null,
1749
+ "resize-none": web ? { resize: "none" } : null,
1750
+ "resize-y": web ? { resize: "vertical" } : null,
1751
+ "resize-x": web ? { resize: "horizontal" } : null,
1752
+ antialiased: web ? { WebkitFontSmoothing: "antialiased", MozOsxFontSmoothing: "grayscale" } : null,
1753
+ "subpixel-antialiased": web ? { WebkitFontSmoothing: "subpixel-antialiased", MozOsxFontSmoothing: "auto" } : null,
1754
+ "overflow-ellipsis": web ? { textOverflow: "ellipsis" } : null,
1755
+ "sr-only": web ? {
1756
+ position: "absolute",
1757
+ width: 1,
1758
+ height: 1,
1759
+ padding: 0,
1760
+ margin: -1,
1761
+ overflow: "hidden",
1762
+ clip: "rect(0,0,0,0)",
1763
+ whiteSpace: "nowrap",
1764
+ border: 0
1765
+ } : null,
1766
+ "not-sr-only": web ? {
1767
+ position: "static",
1768
+ width: "auto",
1769
+ height: "auto",
1770
+ padding: 0,
1771
+ margin: 0,
1772
+ overflow: "visible",
1773
+ clip: "auto",
1774
+ whiteSpace: "normal"
1775
+ } : null,
1776
+ // Lists (web-only)
1777
+ "list-none": web ? { listStyleType: "none" } : null,
1778
+ "list-disc": web ? { listStyleType: "disc" } : null,
1779
+ "list-decimal": web ? { listStyleType: "decimal" } : null,
1780
+ // Background clip (web-only)
1781
+ "bg-clip-border": web ? { backgroundClip: "border-box" } : null,
1782
+ "bg-clip-padding": web ? { backgroundClip: "padding-box" } : null,
1783
+ "bg-clip-content": web ? { backgroundClip: "content-box" } : null,
1784
+ "bg-clip-text": web ? { backgroundClip: "text", WebkitBackgroundClip: "text" } : null,
1785
+ // Background image
1786
+ "bg-none": web ? { backgroundImage: "none" } : null,
1787
+ // Background size (web-only)
1788
+ "bg-auto": web ? { backgroundSize: "auto" } : null,
1789
+ "bg-cover": web ? { backgroundSize: "cover" } : null,
1790
+ "bg-contain": web ? { backgroundSize: "contain" } : null,
1791
+ // Background position (web-only)
1792
+ "bg-center": web ? { backgroundPosition: "center" } : null,
1793
+ "bg-top": web ? { backgroundPosition: "top" } : null,
1794
+ "bg-bottom": web ? { backgroundPosition: "bottom" } : null,
1795
+ "bg-left": web ? { backgroundPosition: "left" } : null,
1796
+ "bg-right": web ? { backgroundPosition: "right" } : null,
1797
+ "bg-left-top": web ? { backgroundPosition: "left top" } : null,
1798
+ "bg-left-bottom": web ? { backgroundPosition: "left bottom" } : null,
1799
+ "bg-right-top": web ? { backgroundPosition: "right top" } : null,
1800
+ "bg-right-bottom": web ? { backgroundPosition: "right bottom" } : null,
1801
+ // Background repeat (web-only)
1802
+ "bg-repeat": web ? { backgroundRepeat: "repeat" } : null,
1803
+ "bg-no-repeat": web ? { backgroundRepeat: "no-repeat" } : null,
1804
+ "bg-repeat-x": web ? { backgroundRepeat: "repeat-x" } : null,
1805
+ "bg-repeat-y": web ? { backgroundRepeat: "repeat-y" } : null,
1806
+ "bg-repeat-round": web ? { backgroundRepeat: "round" } : null,
1807
+ "bg-repeat-space": web ? { backgroundRepeat: "space" } : null,
1808
+ // Background attachment (web-only)
1809
+ "bg-fixed": web ? { backgroundAttachment: "fixed" } : null,
1810
+ "bg-local": web ? { backgroundAttachment: "local" } : null,
1811
+ "bg-scroll": web ? { backgroundAttachment: "scroll" } : null,
1812
+ // Object position (web-only)
1813
+ "object-center": web ? { objectPosition: "center" } : null,
1814
+ "object-top": web ? { objectPosition: "top" } : null,
1815
+ "object-bottom": web ? { objectPosition: "bottom" } : null,
1816
+ "object-left": web ? { objectPosition: "left" } : null,
1817
+ "object-right": web ? { objectPosition: "right" } : null,
1818
+ "object-left-top": web ? { objectPosition: "left top" } : null,
1819
+ "object-left-bottom": web ? { objectPosition: "left bottom" } : null,
1820
+ "object-right-top": web ? { objectPosition: "right top" } : null,
1821
+ "object-right-bottom": web ? { objectPosition: "right bottom" } : null,
1822
+ // Table (web-only)
1823
+ table: web ? { display: "table" } : null,
1824
+ "table-auto": web ? { tableLayout: "auto" } : null,
1825
+ "table-fixed": web ? { tableLayout: "fixed" } : null,
1826
+ "caption-top": web ? { captionSide: "top" } : null,
1827
+ "caption-bottom": web ? { captionSide: "bottom" } : null,
1828
+ "border-collapse": web ? { borderCollapse: "collapse" } : null,
1829
+ "border-separate": web ? { borderCollapse: "separate" } : null,
1830
+ // List style position (web-only)
1831
+ "list-inside": web ? { listStylePosition: "inside" } : null,
1832
+ "list-outside": web ? { listStylePosition: "outside" } : null,
1833
+ // Font variant numeric (web-only)
1834
+ "normal-nums": web ? { fontVariantNumeric: "normal" } : null,
1835
+ ordinal: web ? { fontVariantNumeric: "ordinal" } : null,
1836
+ "slashed-zero": web ? { fontVariantNumeric: "slashed-zero" } : null,
1837
+ "lining-nums": web ? { fontVariantNumeric: "lining-nums" } : null,
1838
+ "oldstyle-nums": web ? { fontVariantNumeric: "oldstyle-nums" } : null,
1839
+ "proportional-nums": web ? { fontVariantNumeric: "proportional-nums" } : null,
1840
+ "tabular-nums": web ? { fontVariantNumeric: "tabular-nums" } : null,
1841
+ "diagonal-fractions": web ? { fontVariantNumeric: "diagonal-fractions" } : null,
1842
+ "stacked-fractions": web ? { fontVariantNumeric: "stacked-fractions" } : null,
1843
+ // Isolation (web-only)
1844
+ isolate: web ? { isolation: "isolate" } : null,
1845
+ "isolation-auto": web ? { isolation: "auto" } : null,
1846
+ // Backface visibility (both iOS and Android)
1847
+ "backface-visible": { backfaceVisibility: "visible" },
1848
+ "backface-hidden": { backfaceVisibility: "hidden" },
1849
+ // CSS filters — standalone = default/full effect (web-only)
1850
+ grayscale: web ? { "--tw-grayscale": "grayscale(100%)", filter: FILTER_COMPOSE } : null,
1851
+ invert: web ? { "--tw-invert": "invert(100%)", filter: FILTER_COMPOSE } : null,
1852
+ sepia: web ? { "--tw-sepia": "sepia(100%)", filter: FILTER_COMPOSE } : null,
1853
+ // Divide none
1854
+ "divide-none": web ? { __divideX: 0, __divideY: 0 } : null,
1855
+ // Group / peer markers (no-op: no style emitted; just ensures isKnownUtility returns true)
1856
+ group: web ? {} : null,
1857
+ peer: web ? {} : null,
1858
+ // Text-wrap (web-only)
1859
+ "text-wrap": web ? { textWrap: "wrap" } : null,
1860
+ "text-nowrap": web ? { textWrap: "nowrap" } : null,
1861
+ "text-balance": web ? { textWrap: "balance" } : null,
1862
+ "text-pretty": web ? { textWrap: "pretty" } : null,
1863
+ // Screen sizing (vw values are web-only; vh values work cross-platform via spacing scale for h-*)
1864
+ "w-screen": web ? { width: "100vw" } : null,
1865
+ "min-h-screen": { minHeight: "100vh" },
1866
+ "max-h-screen": { maxHeight: "100vh" },
1867
+ "min-w-screen": web ? { minWidth: "100vw" } : null,
1868
+ "max-w-screen": web ? { maxWidth: "100vw" } : null,
1869
+ // max-w named container sizes (mirrors Tailwind's container scale)
1870
+ "max-w-none": { maxWidth: "none" },
1871
+ "max-w-xs": { maxWidth: 320 },
1872
+ "max-w-sm": { maxWidth: 384 },
1873
+ "max-w-md": { maxWidth: 448 },
1874
+ "max-w-lg": { maxWidth: 512 },
1875
+ "max-w-xl": { maxWidth: 576 },
1876
+ "max-w-2xl": { maxWidth: 672 },
1877
+ "max-w-3xl": { maxWidth: 768 },
1878
+ "max-w-4xl": { maxWidth: 896 },
1879
+ "max-w-5xl": { maxWidth: 1024 },
1880
+ "max-w-6xl": { maxWidth: 1152 },
1881
+ "max-w-7xl": { maxWidth: 1280 },
1882
+ "max-w-prose": web ? { maxWidth: "65ch" } : null,
1883
+ // Extended cursors (web-only)
1884
+ "cursor-grab": web ? { cursor: "grab" } : null,
1885
+ "cursor-grabbing": web ? { cursor: "grabbing" } : null,
1886
+ "cursor-zoom-in": web ? { cursor: "zoom-in" } : null,
1887
+ "cursor-zoom-out": web ? { cursor: "zoom-out" } : null,
1888
+ "cursor-crosshair": web ? { cursor: "crosshair" } : null,
1889
+ "cursor-help": web ? { cursor: "help" } : null,
1890
+ "cursor-none": web ? { cursor: "none" } : null,
1891
+ // Overflow clip (web-only)
1892
+ "overflow-clip": web ? { overflow: "clip" } : null,
1893
+ "overflow-x-clip": web ? { overflowX: "clip" } : null,
1894
+ "overflow-y-clip": web ? { overflowY: "clip" } : null,
1895
+ // Scroll behavior (web-only)
1896
+ "scroll-smooth": web ? { scrollBehavior: "smooth" } : null,
1897
+ "scroll-auto": web ? { scrollBehavior: "auto" } : null,
1898
+ // Float (web-only)
1899
+ "float-left": web ? { float: "left" } : null,
1900
+ "float-right": web ? { float: "right" } : null,
1901
+ "float-start": web ? { float: "inline-start" } : null,
1902
+ "float-end": web ? { float: "inline-end" } : null,
1903
+ "float-none": web ? { float: "none" } : null,
1904
+ // Clear (web-only)
1905
+ "clear-left": web ? { clear: "left" } : null,
1906
+ "clear-right": web ? { clear: "right" } : null,
1907
+ "clear-both": web ? { clear: "both" } : null,
1908
+ "clear-start": web ? { clear: "inline-start" } : null,
1909
+ "clear-end": web ? { clear: "inline-end" } : null,
1910
+ "clear-none": web ? { clear: "none" } : null,
1911
+ // Vertical align (web-only)
1912
+ "align-baseline": web ? { verticalAlign: "baseline" } : null,
1913
+ "align-top": web ? { verticalAlign: "top" } : null,
1914
+ "align-middle": web ? { verticalAlign: "middle" } : null,
1915
+ "align-bottom": web ? { verticalAlign: "bottom" } : null,
1916
+ "align-text-top": web ? { verticalAlign: "text-top" } : null,
1917
+ "align-text-bottom": web ? { verticalAlign: "text-bottom" } : null,
1918
+ "align-sub": web ? { verticalAlign: "sub" } : null,
1919
+ "align-super": web ? { verticalAlign: "super" } : null,
1920
+ // Touch action (web-only)
1921
+ "touch-auto": web ? { touchAction: "auto" } : null,
1922
+ "touch-none": web ? { touchAction: "none" } : null,
1923
+ "touch-pan-x": web ? { touchAction: "pan-x" } : null,
1924
+ "touch-pan-y": web ? { touchAction: "pan-y" } : null,
1925
+ "touch-pan-left": web ? { touchAction: "pan-left" } : null,
1926
+ "touch-pan-right": web ? { touchAction: "pan-right" } : null,
1927
+ "touch-pan-up": web ? { touchAction: "pan-up" } : null,
1928
+ "touch-pan-down": web ? { touchAction: "pan-down" } : null,
1929
+ "touch-pinch-zoom": web ? { touchAction: "pinch-zoom" } : null,
1930
+ "touch-manipulation": web ? { touchAction: "manipulation" } : null
1931
+ };
1932
+ }
1933
+ function getStandalone() {
1934
+ if (!_standalone) _standalone = buildStandalone();
1935
+ return _standalone;
1936
+ }
1902
1937
  var RESOLVERS = {
1903
1938
  // ── Background ─────────────────────────────────────────────────────────────
1904
1939
  bg: ({ value, isArbitrary }, { colors }) => {
@@ -1906,7 +1941,7 @@ var RESOLVERS = {
1906
1941
  return color ? { backgroundColor: color } : null;
1907
1942
  },
1908
1943
  "bg-opacity": ({ value }, _) => {
1909
- if (!isWeb) return null;
1944
+ if (!getEffectiveIsWeb()) return null;
1910
1945
  const v = parseFloat(value) / 100;
1911
1946
  return isNaN(v) ? null : { "--bg-opacity": v };
1912
1947
  },
@@ -1916,7 +1951,7 @@ var RESOLVERS = {
1916
1951
  if (!isArbitrary && size !== null) return { fontSize: size };
1917
1952
  if (isArbitrary) {
1918
1953
  if (/^\d/.test(value) || /^(calc|min|max|clamp)/.test(value)) {
1919
- return { fontSize: isWeb ? value : toNativeValue(value) };
1954
+ return { fontSize: getEffectiveIsWeb() ? value : toNativeValue(value) };
1920
1955
  }
1921
1956
  return { color: value };
1922
1957
  }
@@ -1924,7 +1959,7 @@ var RESOLVERS = {
1924
1959
  return color ? { color } : null;
1925
1960
  },
1926
1961
  "text-opacity": ({ value }, _) => {
1927
- if (!isWeb) return null;
1962
+ if (!getEffectiveIsWeb()) return null;
1928
1963
  const v = parseFloat(value) / 100;
1929
1964
  return isNaN(v) ? null : { "--text-opacity": v };
1930
1965
  },
@@ -2120,7 +2155,7 @@ var RESOLVERS = {
2120
2155
  },
2121
2156
  // ── Grid template columns/rows (Tailwind-style aliases, web-only) ──────────
2122
2157
  "grid-cols": ({ value, isArbitrary }) => {
2123
- if (!isWeb) return null;
2158
+ if (!getEffectiveIsWeb()) return null;
2124
2159
  if (!value) return null;
2125
2160
  if (isArbitrary) return { display: "grid", gridTemplateColumns: value };
2126
2161
  if (value === "none") return { display: "grid", gridTemplateColumns: "none" };
@@ -2129,7 +2164,7 @@ var RESOLVERS = {
2129
2164
  return { display: "grid", gridTemplateColumns: `repeat(${n}, minmax(0, 1fr))` };
2130
2165
  },
2131
2166
  "grid-rows": ({ value, isArbitrary }) => {
2132
- if (!isWeb) return null;
2167
+ if (!getEffectiveIsWeb()) return null;
2133
2168
  if (!value) return null;
2134
2169
  if (isArbitrary) return { gridTemplateRows: value };
2135
2170
  if (value === "none") return { gridTemplateRows: "none" };
@@ -2139,7 +2174,7 @@ var RESOLVERS = {
2139
2174
  },
2140
2175
  // ── Grid auto flow (web-only) ─────────────────────────────────────────────
2141
2176
  "grid-flow": ({ value }) => {
2142
- if (!isWeb) return null;
2177
+ if (!getEffectiveIsWeb()) return null;
2143
2178
  const flows = {
2144
2179
  row: "row",
2145
2180
  col: "column",
@@ -2152,7 +2187,7 @@ var RESOLVERS = {
2152
2187
  },
2153
2188
  // ── Grid auto sizing (web-only) ───────────────────────────────────────────
2154
2189
  "auto-cols": ({ value, isArbitrary }) => {
2155
- if (!isWeb) return null;
2190
+ if (!getEffectiveIsWeb()) return null;
2156
2191
  if (isArbitrary) return { gridAutoColumns: value };
2157
2192
  const presets = {
2158
2193
  auto: "auto",
@@ -2164,7 +2199,7 @@ var RESOLVERS = {
2164
2199
  return v ? { gridAutoColumns: v } : null;
2165
2200
  },
2166
2201
  "auto-rows": ({ value, isArbitrary }) => {
2167
- if (!isWeb) return null;
2202
+ if (!getEffectiveIsWeb()) return null;
2168
2203
  if (isArbitrary) return { gridAutoRows: value };
2169
2204
  const presets = {
2170
2205
  auto: "auto",
@@ -2177,54 +2212,54 @@ var RESOLVERS = {
2177
2212
  },
2178
2213
  // ── Grid column placement (web-only) ──────────────────────────────────────
2179
2214
  "col-span": ({ value }) => {
2180
- if (!isWeb) return null;
2215
+ if (!getEffectiveIsWeb()) return null;
2181
2216
  if (value === "full") return { gridColumn: "1 / -1" };
2182
2217
  const n = parseInt(value, 10);
2183
2218
  return isNaN(n) ? null : { gridColumn: `span ${n} / span ${n}` };
2184
2219
  },
2185
2220
  "col-start": ({ value, isArbitrary }) => {
2186
- if (!isWeb) return null;
2221
+ if (!getEffectiveIsWeb()) return null;
2187
2222
  if (value === "auto") return { gridColumnStart: "auto" };
2188
2223
  if (isArbitrary) return { gridColumnStart: value };
2189
2224
  const n = parseInt(value, 10);
2190
2225
  return isNaN(n) ? null : { gridColumnStart: n };
2191
2226
  },
2192
2227
  "col-end": ({ value, isArbitrary }) => {
2193
- if (!isWeb) return null;
2228
+ if (!getEffectiveIsWeb()) return null;
2194
2229
  if (value === "auto") return { gridColumnEnd: "auto" };
2195
2230
  if (isArbitrary) return { gridColumnEnd: value };
2196
2231
  const n = parseInt(value, 10);
2197
2232
  return isNaN(n) ? null : { gridColumnEnd: n };
2198
2233
  },
2199
2234
  col: ({ value, isArbitrary }) => {
2200
- if (!isWeb) return null;
2235
+ if (!getEffectiveIsWeb()) return null;
2201
2236
  if (!value || value === "auto") return { gridColumn: "auto" };
2202
2237
  if (isArbitrary) return { gridColumn: value };
2203
2238
  return null;
2204
2239
  },
2205
2240
  // ── Grid row placement (web-only) ─────────────────────────────────────────
2206
2241
  "row-span": ({ value }) => {
2207
- if (!isWeb) return null;
2242
+ if (!getEffectiveIsWeb()) return null;
2208
2243
  if (value === "full") return { gridRow: "1 / -1" };
2209
2244
  const n = parseInt(value, 10);
2210
2245
  return isNaN(n) ? null : { gridRow: `span ${n} / span ${n}` };
2211
2246
  },
2212
2247
  "row-start": ({ value, isArbitrary }) => {
2213
- if (!isWeb) return null;
2248
+ if (!getEffectiveIsWeb()) return null;
2214
2249
  if (value === "auto") return { gridRowStart: "auto" };
2215
2250
  if (isArbitrary) return { gridRowStart: value };
2216
2251
  const n = parseInt(value, 10);
2217
2252
  return isNaN(n) ? null : { gridRowStart: n };
2218
2253
  },
2219
2254
  "row-end": ({ value, isArbitrary }) => {
2220
- if (!isWeb) return null;
2255
+ if (!getEffectiveIsWeb()) return null;
2221
2256
  if (value === "auto") return { gridRowEnd: "auto" };
2222
2257
  if (isArbitrary) return { gridRowEnd: value };
2223
2258
  const n = parseInt(value, 10);
2224
2259
  return isNaN(n) ? null : { gridRowEnd: n };
2225
2260
  },
2226
2261
  row: ({ value, isArbitrary }) => {
2227
- if (!isWeb) return null;
2262
+ if (!getEffectiveIsWeb()) return null;
2228
2263
  if (!value || value === "auto") return { gridRow: "auto" };
2229
2264
  if (isArbitrary) return { gridRow: value };
2230
2265
  return null;
@@ -2232,7 +2267,7 @@ var RESOLVERS = {
2232
2267
  // ── Grid alignment (web-only) ──────────────────────────────────────────────
2233
2268
  // place-items is shorthand for align-items + justify-items on a grid container
2234
2269
  "place-items": ({ value }) => {
2235
- if (!isWeb) return null;
2270
+ if (!getEffectiveIsWeb()) return null;
2236
2271
  const map = {
2237
2272
  start: "start",
2238
2273
  end: "end",
@@ -2244,7 +2279,7 @@ var RESOLVERS = {
2244
2279
  },
2245
2280
  // place-content is shorthand for align-content + justify-content on a grid container
2246
2281
  "place-content": ({ value }) => {
2247
- if (!isWeb) return null;
2282
+ if (!getEffectiveIsWeb()) return null;
2248
2283
  const map = {
2249
2284
  start: "start",
2250
2285
  end: "end",
@@ -2259,7 +2294,7 @@ var RESOLVERS = {
2259
2294
  },
2260
2295
  // justify-items controls inline-axis alignment of grid items within their cells
2261
2296
  "justify-items": ({ value }) => {
2262
- if (!isWeb) return null;
2297
+ if (!getEffectiveIsWeb()) return null;
2263
2298
  const map = {
2264
2299
  start: "start",
2265
2300
  end: "end",
@@ -2270,7 +2305,7 @@ var RESOLVERS = {
2270
2305
  },
2271
2306
  // place-self is shorthand for align-self + justify-self on a grid item
2272
2307
  "place-self": ({ value }) => {
2273
- if (!isWeb) return null;
2308
+ if (!getEffectiveIsWeb()) return null;
2274
2309
  const map = {
2275
2310
  auto: "auto",
2276
2311
  start: "start",
@@ -2282,7 +2317,7 @@ var RESOLVERS = {
2282
2317
  },
2283
2318
  // justify-self controls inline-axis self-alignment of a grid item
2284
2319
  "justify-self": ({ value }) => {
2285
- if (!isWeb) return null;
2320
+ if (!getEffectiveIsWeb()) return null;
2286
2321
  const map = {
2287
2322
  auto: "auto",
2288
2323
  start: "start",
@@ -2294,7 +2329,7 @@ var RESOLVERS = {
2294
2329
  },
2295
2330
  // ── CSS Filters (composable via CSS variables, web-only) ─────────────────
2296
2331
  blur: ({ value, isArbitrary }) => {
2297
- if (!isWeb) return null;
2332
+ if (!getEffectiveIsWeb()) return null;
2298
2333
  const sizes = {
2299
2334
  "": "blur(8px)",
2300
2335
  sm: "blur(4px)",
@@ -2309,43 +2344,43 @@ var RESOLVERS = {
2309
2344
  return v !== void 0 ? { "--tw-blur": v, filter: FILTER_COMPOSE } : null;
2310
2345
  },
2311
2346
  brightness: ({ value, isArbitrary }) => {
2312
- if (!isWeb) return null;
2347
+ if (!getEffectiveIsWeb()) return null;
2313
2348
  const v = isArbitrary ? `brightness(${value})` : `brightness(${parseFloat(value) / 100})`;
2314
2349
  return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-brightness": v, filter: FILTER_COMPOSE };
2315
2350
  },
2316
2351
  contrast: ({ value, isArbitrary }) => {
2317
- if (!isWeb) return null;
2352
+ if (!getEffectiveIsWeb()) return null;
2318
2353
  const v = isArbitrary ? `contrast(${value})` : `contrast(${parseFloat(value) / 100})`;
2319
2354
  return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-contrast": v, filter: FILTER_COMPOSE };
2320
2355
  },
2321
2356
  grayscale: ({ value }) => {
2322
- if (!isWeb) return null;
2357
+ if (!getEffectiveIsWeb()) return null;
2323
2358
  const v = value === "0" ? "grayscale(0)" : "grayscale(100%)";
2324
2359
  return { "--tw-grayscale": v, filter: FILTER_COMPOSE };
2325
2360
  },
2326
2361
  "hue-rotate": ({ value, negative, isArbitrary }) => {
2327
- if (!isWeb) return null;
2362
+ if (!getEffectiveIsWeb()) return null;
2328
2363
  const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2329
2364
  if (isNaN(parseFloat(deg)) && !isArbitrary) return null;
2330
2365
  return { "--tw-hue-rotate": `hue-rotate(${deg})`, filter: FILTER_COMPOSE };
2331
2366
  },
2332
2367
  invert: ({ value }) => {
2333
- if (!isWeb) return null;
2368
+ if (!getEffectiveIsWeb()) return null;
2334
2369
  const v = value === "0" ? "invert(0)" : "invert(100%)";
2335
2370
  return { "--tw-invert": v, filter: FILTER_COMPOSE };
2336
2371
  },
2337
2372
  saturate: ({ value, isArbitrary }) => {
2338
- if (!isWeb) return null;
2373
+ if (!getEffectiveIsWeb()) return null;
2339
2374
  const v = isArbitrary ? `saturate(${value})` : `saturate(${parseFloat(value) / 100})`;
2340
2375
  return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-saturate": v, filter: FILTER_COMPOSE };
2341
2376
  },
2342
2377
  sepia: ({ value }) => {
2343
- if (!isWeb) return null;
2378
+ if (!getEffectiveIsWeb()) return null;
2344
2379
  const v = value === "0" ? "sepia(0)" : "sepia(100%)";
2345
2380
  return { "--tw-sepia": v, filter: FILTER_COMPOSE };
2346
2381
  },
2347
2382
  "drop-shadow": ({ value, isArbitrary }) => {
2348
- if (!isWeb) return null;
2383
+ if (!getEffectiveIsWeb()) return null;
2349
2384
  if (isArbitrary) return { "--tw-drop-shadow": `drop-shadow(${value.replace(/_/g, " ")})`, filter: FILTER_COMPOSE };
2350
2385
  const presets = {
2351
2386
  "": "drop-shadow(0 1px 2px rgb(0 0 0/0.1)) drop-shadow(0 1px 1px rgb(0 0 0/0.06))",
@@ -2361,14 +2396,14 @@ var RESOLVERS = {
2361
2396
  },
2362
2397
  // Arbitrary full filter string: filter-[blur(4px)_grayscale(1)]
2363
2398
  filter: ({ value, isArbitrary }) => {
2364
- if (!isWeb) return null;
2399
+ if (!getEffectiveIsWeb()) return null;
2365
2400
  if (isArbitrary) return { filter: value.replace(/_/g, " ") };
2366
2401
  if (value === "none") return { filter: "none" };
2367
2402
  return null;
2368
2403
  },
2369
2404
  // ── Backdrop Filters (composable via CSS variables, web-only) ────────────
2370
2405
  "backdrop-blur": ({ value, isArbitrary }) => {
2371
- if (!isWeb) return null;
2406
+ if (!getEffectiveIsWeb()) return null;
2372
2407
  const sizes = {
2373
2408
  "": "blur(8px)",
2374
2409
  sm: "blur(4px)",
@@ -2383,52 +2418,52 @@ var RESOLVERS = {
2383
2418
  return v !== void 0 ? { "--tw-backdrop-blur": v, backdropFilter: BACKDROP_FILTER_COMPOSE } : null;
2384
2419
  },
2385
2420
  "backdrop-brightness": ({ value, isArbitrary }) => {
2386
- if (!isWeb) return null;
2421
+ if (!getEffectiveIsWeb()) return null;
2387
2422
  const v = isArbitrary ? `brightness(${value})` : `brightness(${parseFloat(value) / 100})`;
2388
2423
  return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-brightness": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2389
2424
  },
2390
2425
  "backdrop-contrast": ({ value, isArbitrary }) => {
2391
- if (!isWeb) return null;
2426
+ if (!getEffectiveIsWeb()) return null;
2392
2427
  const v = isArbitrary ? `contrast(${value})` : `contrast(${parseFloat(value) / 100})`;
2393
2428
  return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-contrast": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2394
2429
  },
2395
2430
  "backdrop-grayscale": ({ value }) => {
2396
- if (!isWeb) return null;
2431
+ if (!getEffectiveIsWeb()) return null;
2397
2432
  return { "--tw-backdrop-grayscale": value === "0" ? "grayscale(0)" : "grayscale(100%)", backdropFilter: BACKDROP_FILTER_COMPOSE };
2398
2433
  },
2399
2434
  "backdrop-hue-rotate": ({ value, negative, isArbitrary }) => {
2400
- if (!isWeb) return null;
2435
+ if (!getEffectiveIsWeb()) return null;
2401
2436
  const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2402
2437
  if (isNaN(parseFloat(deg)) && !isArbitrary) return null;
2403
2438
  return { "--tw-backdrop-hue-rotate": `hue-rotate(${deg})`, backdropFilter: BACKDROP_FILTER_COMPOSE };
2404
2439
  },
2405
2440
  "backdrop-invert": ({ value }) => {
2406
- if (!isWeb) return null;
2441
+ if (!getEffectiveIsWeb()) return null;
2407
2442
  return { "--tw-backdrop-invert": value === "0" ? "invert(0)" : "invert(100%)", backdropFilter: BACKDROP_FILTER_COMPOSE };
2408
2443
  },
2409
2444
  "backdrop-opacity": ({ value, isArbitrary }) => {
2410
- if (!isWeb) return null;
2445
+ if (!getEffectiveIsWeb()) return null;
2411
2446
  const v = isArbitrary ? `opacity(${value})` : `opacity(${parseFloat(value) / 100})`;
2412
2447
  return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-opacity": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2413
2448
  },
2414
2449
  "backdrop-saturate": ({ value, isArbitrary }) => {
2415
- if (!isWeb) return null;
2450
+ if (!getEffectiveIsWeb()) return null;
2416
2451
  const v = isArbitrary ? `saturate(${value})` : `saturate(${parseFloat(value) / 100})`;
2417
2452
  return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-saturate": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2418
2453
  },
2419
2454
  "backdrop-sepia": ({ value }) => {
2420
- if (!isWeb) return null;
2455
+ if (!getEffectiveIsWeb()) return null;
2421
2456
  return { "--tw-backdrop-sepia": value === "0" ? "sepia(0)" : "sepia(100%)", backdropFilter: BACKDROP_FILTER_COMPOSE };
2422
2457
  },
2423
2458
  "backdrop-filter": ({ value, isArbitrary }) => {
2424
- if (!isWeb) return null;
2459
+ if (!getEffectiveIsWeb()) return null;
2425
2460
  if (isArbitrary) return { backdropFilter: value.replace(/_/g, " ") };
2426
2461
  if (value === "none") return { backdropFilter: "none" };
2427
2462
  return null;
2428
2463
  },
2429
2464
  // ── Background gradient (CSS variable gradient stops, web-only) ──────────
2430
2465
  "bg-gradient-to": ({ value }) => {
2431
- if (!isWeb) return null;
2466
+ if (!getEffectiveIsWeb()) return null;
2432
2467
  const directions = {
2433
2468
  t: "to top",
2434
2469
  tr: "to top right",
@@ -2446,7 +2481,7 @@ var RESOLVERS = {
2446
2481
  };
2447
2482
  },
2448
2483
  from: ({ value, isArbitrary }, { colors }) => {
2449
- if (!isWeb) return null;
2484
+ if (!getEffectiveIsWeb()) return null;
2450
2485
  const color = resolveColor(value, colors, isArbitrary);
2451
2486
  if (!color) return null;
2452
2487
  return {
@@ -2455,7 +2490,7 @@ var RESOLVERS = {
2455
2490
  };
2456
2491
  },
2457
2492
  via: ({ value, isArbitrary }, { colors }) => {
2458
- if (!isWeb) return null;
2493
+ if (!getEffectiveIsWeb()) return null;
2459
2494
  const color = resolveColor(value, colors, isArbitrary);
2460
2495
  if (!color) return null;
2461
2496
  return {
@@ -2464,7 +2499,7 @@ var RESOLVERS = {
2464
2499
  };
2465
2500
  },
2466
2501
  to: ({ value, isArbitrary }, { colors }) => {
2467
- if (!isWeb) return null;
2502
+ if (!getEffectiveIsWeb()) return null;
2468
2503
  const color = resolveColor(value, colors, isArbitrary);
2469
2504
  if (!color) return null;
2470
2505
  return { "--tw-gradient-to": color };
@@ -2473,23 +2508,23 @@ var RESOLVERS = {
2473
2508
  "skew-x": ({ value, negative, isArbitrary }) => {
2474
2509
  const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2475
2510
  if (!isArbitrary && isNaN(parseFloat(value))) return null;
2476
- return isWeb ? { transform: `skewX(${deg})` } : { transform: [{ skewX: deg }] };
2511
+ return getEffectiveIsWeb() ? { transform: `skewX(${deg})` } : { transform: [{ skewX: deg }] };
2477
2512
  },
2478
2513
  "skew-y": ({ value, negative, isArbitrary }) => {
2479
2514
  const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2480
2515
  if (!isArbitrary && isNaN(parseFloat(value))) return null;
2481
- return isWeb ? { transform: `skewY(${deg})` } : { transform: [{ skewY: deg }] };
2516
+ return getEffectiveIsWeb() ? { transform: `skewY(${deg})` } : { transform: [{ skewY: deg }] };
2482
2517
  },
2483
2518
  // Arbitrary full transform string: transform-[rotate(45deg)_scale(1.5)]
2484
2519
  transform: ({ value, isArbitrary }) => {
2485
- if (!isWeb) return null;
2520
+ if (!getEffectiveIsWeb()) return null;
2486
2521
  if (isArbitrary) return { transform: value.replace(/_/g, " ") };
2487
2522
  if (value === "none") return { transform: "none" };
2488
2523
  return null;
2489
2524
  },
2490
2525
  // Transform origin
2491
2526
  origin: ({ value, isArbitrary }) => {
2492
- if (!isWeb) return null;
2527
+ if (!getEffectiveIsWeb()) return null;
2493
2528
  if (isArbitrary) return { transformOrigin: value.replace(/_/g, " ") };
2494
2529
  const origins = {
2495
2530
  center: "center",
@@ -2506,7 +2541,7 @@ var RESOLVERS = {
2506
2541
  },
2507
2542
  // ── Text decoration advanced (web-only) ───────────────────────────────────
2508
2543
  decoration: ({ value, isArbitrary }, { colors }) => {
2509
- if (!isWeb) return null;
2544
+ if (!getEffectiveIsWeb()) return null;
2510
2545
  if (isArbitrary) {
2511
2546
  if (/^\d/.test(value) || value.startsWith("calc(")) return { textDecorationThickness: value };
2512
2547
  return { textDecorationColor: value };
@@ -2533,7 +2568,7 @@ var RESOLVERS = {
2533
2568
  return color ? { textDecorationColor: color } : null;
2534
2569
  },
2535
2570
  "underline-offset": ({ value, isArbitrary }) => {
2536
- if (!isWeb) return null;
2571
+ if (!getEffectiveIsWeb()) return null;
2537
2572
  if (isArbitrary) return { textUnderlineOffset: value };
2538
2573
  const offsets = {
2539
2574
  auto: "auto",
@@ -2547,7 +2582,7 @@ var RESOLVERS = {
2547
2582
  },
2548
2583
  // ── Outline extended (web-only) ───────────────────────────────────────────
2549
2584
  outline: ({ value, isArbitrary }, { colors }) => {
2550
- if (!isWeb) return null;
2585
+ if (!getEffectiveIsWeb()) return null;
2551
2586
  if (!value) return { outline: "2px solid transparent", outlineOffset: "2px" };
2552
2587
  if (value === "none") return { outline: "none", outlineOffset: "0" };
2553
2588
  if (isArbitrary) {
@@ -2560,14 +2595,14 @@ var RESOLVERS = {
2560
2595
  return color ? { outlineColor: color } : null;
2561
2596
  },
2562
2597
  "outline-offset": ({ value, isArbitrary }) => {
2563
- if (!isWeb) return null;
2598
+ if (!getEffectiveIsWeb()) return null;
2564
2599
  if (isArbitrary) return { outlineOffset: value };
2565
2600
  const offsets = { "0": "0px", "1": "1px", "2": "2px", "4": "4px", "8": "8px" };
2566
2601
  return offsets[value] ? { outlineOffset: offsets[value] } : null;
2567
2602
  },
2568
2603
  // ── Columns (web-only) ─────────────────────────────────────────────────────
2569
2604
  columns: ({ value, isArbitrary }) => {
2570
- if (!isWeb) return null;
2605
+ if (!getEffectiveIsWeb()) return null;
2571
2606
  if (isArbitrary) return { columnCount: value };
2572
2607
  if (value === "auto") return { columnCount: "auto" };
2573
2608
  const n = parseInt(value, 10);
@@ -2591,7 +2626,7 @@ var RESOLVERS = {
2591
2626
  },
2592
2627
  // ── Mix / background blend mode (web-only) ───────────────────────────────
2593
2628
  "mix-blend": ({ value }) => {
2594
- if (!isWeb) return null;
2629
+ if (!getEffectiveIsWeb()) return null;
2595
2630
  const modes = [
2596
2631
  "normal",
2597
2632
  "multiply",
@@ -2614,7 +2649,7 @@ var RESOLVERS = {
2614
2649
  return modes.includes(value) ? { mixBlendMode: value } : null;
2615
2650
  },
2616
2651
  "bg-blend": ({ value }) => {
2617
- if (!isWeb) return null;
2652
+ if (!getEffectiveIsWeb()) return null;
2618
2653
  const modes = [
2619
2654
  "normal",
2620
2655
  "multiply",
@@ -2637,7 +2672,7 @@ var RESOLVERS = {
2637
2672
  },
2638
2673
  // ── Will-change (web-only) ─────────────────────────────────────────────────
2639
2674
  "will-change": ({ value, isArbitrary }) => {
2640
- if (!isWeb) return null;
2675
+ if (!getEffectiveIsWeb()) return null;
2641
2676
  if (isArbitrary) return { willChange: value.replace(/_/g, ", ") };
2642
2677
  const presets = {
2643
2678
  auto: "auto",
@@ -2651,21 +2686,21 @@ var RESOLVERS = {
2651
2686
  // These return special __divide* markers that resolver.ts converts to
2652
2687
  // .cls > * + * { border-... } CSS rules. No inline style is applied.
2653
2688
  "divide-x": ({ value, isArbitrary }) => {
2654
- if (!isWeb) return null;
2689
+ if (!getEffectiveIsWeb()) return null;
2655
2690
  if (value === "reverse") return null;
2656
2691
  if (!value) return { __divideX: 1 };
2657
2692
  const n = parseFloat(value);
2658
2693
  return isNaN(n) ? null : { __divideX: n };
2659
2694
  },
2660
2695
  "divide-y": ({ value, isArbitrary }) => {
2661
- if (!isWeb) return null;
2696
+ if (!getEffectiveIsWeb()) return null;
2662
2697
  if (value === "reverse") return null;
2663
2698
  if (!value) return { __divideY: 1 };
2664
2699
  const n = parseFloat(value);
2665
2700
  return isNaN(n) ? null : { __divideY: n };
2666
2701
  },
2667
2702
  divide: ({ value, isArbitrary }, { colors }) => {
2668
- if (!isWeb) return null;
2703
+ if (!getEffectiveIsWeb()) return null;
2669
2704
  if (isArbitrary) return { __divideColor: value };
2670
2705
  const styleTokens = {
2671
2706
  solid: "solid",
@@ -2682,7 +2717,7 @@ var RESOLVERS = {
2682
2717
  // Named presets give cross-platform shadow; arbitrary is web-only.
2683
2718
  "text-shadow": ({ value, isArbitrary }, { colors }) => {
2684
2719
  if (value === "none") {
2685
- return isWeb ? { textShadow: "none" } : { textShadowColor: "transparent", textShadowOffset: { width: 0, height: 0 }, textShadowRadius: 0 };
2720
+ return getEffectiveIsWeb() ? { textShadow: "none" } : { textShadowColor: "transparent", textShadowOffset: { width: 0, height: 0 }, textShadowRadius: 0 };
2686
2721
  }
2687
2722
  const webPresets = {
2688
2723
  "": "0 2px 4px rgba(0,0,0,0.3)",
@@ -2699,15 +2734,15 @@ var RESOLVERS = {
2699
2734
  xl: { textShadowColor: "rgba(0,0,0,0.5)", textShadowOffset: { width: 0, height: 16 }, textShadowRadius: 32 }
2700
2735
  };
2701
2736
  if (value in webPresets) {
2702
- if (isWeb) return { textShadow: webPresets[value] };
2737
+ if (getEffectiveIsWeb()) return { textShadow: webPresets[value] };
2703
2738
  return nativePresets[value] ?? null;
2704
2739
  }
2705
2740
  if (isArbitrary) {
2706
- return isWeb ? { textShadow: value.replace(/_/g, " ") } : null;
2741
+ return getEffectiveIsWeb() ? { textShadow: value.replace(/_/g, " ") } : null;
2707
2742
  }
2708
2743
  const color = resolveColor(value, colors, false);
2709
2744
  if (color) {
2710
- return isWeb ? { textShadow: `0 2px 4px ${color}` } : { textShadowColor: color };
2745
+ return getEffectiveIsWeb() ? { textShadow: `0 2px 4px ${color}` } : { textShadowColor: color };
2711
2746
  }
2712
2747
  return null;
2713
2748
  },
@@ -2715,13 +2750,13 @@ var RESOLVERS = {
2715
2750
  perspective: ({ value, isArbitrary }) => {
2716
2751
  if (isArbitrary) {
2717
2752
  const numPx = parseFloat(value);
2718
- if (isWeb) return { transform: `perspective(${value})` };
2753
+ if (getEffectiveIsWeb()) return { transform: `perspective(${value})` };
2719
2754
  return isNaN(numPx) ? null : { transform: [{ perspective: numPx }] };
2720
2755
  }
2721
- if (value === "none") return isWeb ? { transform: "none" } : null;
2756
+ if (value === "none") return getEffectiveIsWeb() ? { transform: "none" } : null;
2722
2757
  const n = parseFloat(value);
2723
2758
  if (isNaN(n)) return null;
2724
- return isWeb ? { transform: `perspective(${n}px)` } : { transform: [{ perspective: n }] };
2759
+ return getEffectiveIsWeb() ? { transform: `perspective(${n}px)` } : { transform: [{ perspective: n }] };
2725
2760
  },
2726
2761
  // ── Tint color (native-only, for Image and icon components) ──────────────
2727
2762
  tint: ({ value, isArbitrary }, { colors }) => {
@@ -2739,7 +2774,7 @@ var RESOLVERS = {
2739
2774
  // resolver.ts detects __keyframe, injects the rule, then strips the marker
2740
2775
  // so it never reaches element inline styles.
2741
2776
  animate: ({ value, isArbitrary }) => {
2742
- if (!isWeb) return null;
2777
+ if (!getEffectiveIsWeb()) return null;
2743
2778
  if (isArbitrary) return { animation: value.replace(/_/g, " ") };
2744
2779
  const defs = {
2745
2780
  none: { animation: "none" },
@@ -2765,7 +2800,7 @@ var RESOLVERS = {
2765
2800
  },
2766
2801
  // ── Line-clamp (web-only) ─────────────────────────────────────────────────
2767
2802
  "line-clamp": ({ value }) => {
2768
- if (!isWeb) return null;
2803
+ if (!getEffectiveIsWeb()) return null;
2769
2804
  if (value === "none") return { overflow: "visible", display: "block", WebkitLineClamp: "unset" };
2770
2805
  const n = parseInt(value, 10);
2771
2806
  if (isNaN(n) || n < 1) return null;
@@ -2778,14 +2813,14 @@ var RESOLVERS = {
2778
2813
  },
2779
2814
  // ── Caret color (web-only) ────────────────────────────────────────────────
2780
2815
  caret: ({ value, isArbitrary }, { colors }) => {
2781
- if (!isWeb) return null;
2816
+ if (!getEffectiveIsWeb()) return null;
2782
2817
  if (value === "auto" || value === "transparent") return { caretColor: value };
2783
2818
  const color = resolveColor(value, colors, isArbitrary);
2784
2819
  return color ? { caretColor: color } : null;
2785
2820
  },
2786
2821
  // ── Accent color (web-only) ───────────────────────────────────────────────
2787
2822
  accent: ({ value, isArbitrary }, { colors }) => {
2788
- if (!isWeb) return null;
2823
+ if (!getEffectiveIsWeb()) return null;
2789
2824
  if (value === "auto") return { accentColor: "auto" };
2790
2825
  const color = resolveColor(value, colors, isArbitrary);
2791
2826
  return color ? { accentColor: color } : null;
@@ -2869,7 +2904,7 @@ var RESOLVERS = {
2869
2904
  }
2870
2905
  const v = zIndex[value];
2871
2906
  if (v !== void 0) {
2872
- if (v === "auto") return isWeb ? { zIndex: "auto" } : null;
2907
+ if (v === "auto") return getEffectiveIsWeb() ? { zIndex: "auto" } : null;
2873
2908
  return { zIndex: v };
2874
2909
  }
2875
2910
  const n = parseInt(value);
@@ -2898,13 +2933,13 @@ var RESOLVERS = {
2898
2933
  },
2899
2934
  // ── Line height ────────────────────────────────────────────────────────────
2900
2935
  leading: ({ value, isArbitrary }, { lineHeight }) => {
2901
- if (isArbitrary) return { lineHeight: isWeb ? value : toNativeValue(value) };
2936
+ if (isArbitrary) return { lineHeight: getEffectiveIsWeb() ? value : toNativeValue(value) };
2902
2937
  const v = lineHeight[value];
2903
2938
  return v !== void 0 ? { lineHeight: v } : null;
2904
2939
  },
2905
2940
  // ── Letter spacing ─────────────────────────────────────────────────────────
2906
2941
  tracking: ({ value, isArbitrary }, { letterSpacing }) => {
2907
- if (isArbitrary) return { letterSpacing: isWeb ? value : toNativeValue(value) };
2942
+ if (isArbitrary) return { letterSpacing: getEffectiveIsWeb() ? value : toNativeValue(value) };
2908
2943
  const v = letterSpacing[value];
2909
2944
  return v !== void 0 ? { letterSpacing: v } : null;
2910
2945
  },
@@ -2919,34 +2954,34 @@ var RESOLVERS = {
2919
2954
  scale: ({ value, isArbitrary }) => {
2920
2955
  const n = isArbitrary ? parseFloat(value) : parseFloat(value) / 100;
2921
2956
  if (isNaN(n)) return null;
2922
- return isWeb ? { transform: `scale(${n})` } : { transform: [{ scale: n }] };
2957
+ return getEffectiveIsWeb() ? { transform: `scale(${n})` } : { transform: [{ scale: n }] };
2923
2958
  },
2924
2959
  "scale-x": ({ value, isArbitrary }) => {
2925
2960
  const n = isArbitrary ? parseFloat(value) : parseFloat(value) / 100;
2926
2961
  if (isNaN(n)) return null;
2927
- return isWeb ? { transform: `scaleX(${n})` } : { transform: [{ scaleX: n }] };
2962
+ return getEffectiveIsWeb() ? { transform: `scaleX(${n})` } : { transform: [{ scaleX: n }] };
2928
2963
  },
2929
2964
  "scale-y": ({ value, isArbitrary }) => {
2930
2965
  const n = isArbitrary ? parseFloat(value) : parseFloat(value) / 100;
2931
2966
  if (isNaN(n)) return null;
2932
- return isWeb ? { transform: `scaleY(${n})` } : { transform: [{ scaleY: n }] };
2967
+ return getEffectiveIsWeb() ? { transform: `scaleY(${n})` } : { transform: [{ scaleY: n }] };
2933
2968
  },
2934
2969
  // ── Rotate ─────────────────────────────────────────────────────────────────
2935
2970
  rotate: ({ value, negative, isArbitrary }) => {
2936
2971
  if (isArbitrary) {
2937
2972
  const finalValue = negative ? `-${value}` : value;
2938
- return isWeb ? { transform: `rotate(${finalValue})` } : { transform: [{ rotate: finalValue }] };
2973
+ return getEffectiveIsWeb() ? { transform: `rotate(${finalValue})` } : { transform: [{ rotate: finalValue }] };
2939
2974
  }
2940
2975
  const deg = parseFloat(value);
2941
2976
  if (isNaN(deg)) return null;
2942
2977
  const finalDeg = negative ? -deg : deg;
2943
- return isWeb ? { transform: `rotate(${finalDeg}deg)` } : { transform: [{ rotate: `${finalDeg}deg` }] };
2978
+ return getEffectiveIsWeb() ? { transform: `rotate(${finalDeg}deg)` } : { transform: [{ rotate: `${finalDeg}deg` }] };
2944
2979
  },
2945
2980
  // ── Translate ──────────────────────────────────────────────────────────────
2946
2981
  "translate-x": ({ value, negative, isArbitrary }, { spacing }) => {
2947
2982
  const v = resolveSpacing(value, negative, spacing, isArbitrary);
2948
2983
  if (v === null) return null;
2949
- if (isWeb) return { transform: `translateX(${v})` };
2984
+ if (getEffectiveIsWeb()) return { transform: `translateX(${v})` };
2950
2985
  if (typeof v === "string") {
2951
2986
  const n = parseFloat(v);
2952
2987
  return isNaN(n) ? null : { transform: [{ translateX: n }] };
@@ -2956,7 +2991,7 @@ var RESOLVERS = {
2956
2991
  "translate-y": ({ value, negative, isArbitrary }, { spacing }) => {
2957
2992
  const v = resolveSpacing(value, negative, spacing, isArbitrary);
2958
2993
  if (v === null) return null;
2959
- if (isWeb) return { transform: `translateY(${v})` };
2994
+ if (getEffectiveIsWeb()) return { transform: `translateY(${v})` };
2960
2995
  if (typeof v === "string") {
2961
2996
  const n = parseFloat(v);
2962
2997
  return isNaN(n) ? null : { transform: [{ translateY: n }] };
@@ -2969,12 +3004,12 @@ var RESOLVERS = {
2969
3004
  const presets = { auto: "auto", square: 1, video: 16 / 9 };
2970
3005
  if (!(value in presets)) return null;
2971
3006
  const v = presets[value];
2972
- if (v === "auto") return isWeb ? { aspectRatio: "auto" } : null;
3007
+ if (v === "auto") return getEffectiveIsWeb() ? { aspectRatio: "auto" } : null;
2973
3008
  return { aspectRatio: v };
2974
3009
  },
2975
3010
  // ── Transition (web-only; use Animated API on native) ─────────────────────
2976
3011
  transition: ({ value }) => {
2977
- if (!isWeb) return null;
3012
+ if (!getEffectiveIsWeb()) return null;
2978
3013
  const presets = {
2979
3014
  "": "color 150ms, background-color 150ms, border-color 150ms, opacity 150ms, box-shadow 150ms",
2980
3015
  all: "all 150ms",
@@ -2988,18 +3023,18 @@ var RESOLVERS = {
2988
3023
  return v !== void 0 ? { transition: v } : null;
2989
3024
  },
2990
3025
  duration: ({ value, isArbitrary }) => {
2991
- if (!isWeb) return null;
3026
+ if (!getEffectiveIsWeb()) return null;
2992
3027
  const ms = isArbitrary ? value : `${value}ms`;
2993
3028
  return { transitionDuration: ms };
2994
3029
  },
2995
3030
  delay: ({ value, isArbitrary }) => {
2996
- if (!isWeb) return null;
3031
+ if (!getEffectiveIsWeb()) return null;
2997
3032
  const ms = isArbitrary ? value : `${value}ms`;
2998
3033
  return { transitionDelay: ms };
2999
3034
  },
3000
3035
  // ── Ring (web-only: box-shadow outline ring) ──────────────────────────────
3001
3036
  ring: ({ value, isArbitrary }, { colors }) => {
3002
- if (!isWeb) return null;
3037
+ if (!getEffectiveIsWeb()) return null;
3003
3038
  const DEFAULT_COLOR = "rgba(59, 130, 246, 0.5)";
3004
3039
  const DEFAULT_WIDTH = 3;
3005
3040
  if (!value) {
@@ -3026,7 +3061,7 @@ var RESOLVERS = {
3026
3061
  return null;
3027
3062
  },
3028
3063
  "ring-offset": ({ value, isArbitrary }, _theme) => {
3029
- if (!isWeb) return null;
3064
+ if (!getEffectiveIsWeb()) return null;
3030
3065
  const DEFAULT_RING_COLOR = "rgba(59, 130, 246, 0.5)";
3031
3066
  const DEFAULT_RING_WIDTH = 3;
3032
3067
  const offsetTokens = { "0": 0, "1": 1, "2": 2, "4": 4, "8": 8 };
@@ -3055,7 +3090,7 @@ function resolveUtility(parsed, theme) {
3055
3090
  if (parsed.utility === "inline-grid") {
3056
3091
  return { display: "inline-grid" };
3057
3092
  }
3058
- if (parsed.utility in STANDALONE) return STANDALONE[parsed.utility] ?? null;
3093
+ if (parsed.utility in getStandalone()) return getStandalone()[parsed.utility] ?? null;
3059
3094
  }
3060
3095
  const resolver = PLUGIN_RESOLVERS[parsed.utility] ?? RESOLVERS[parsed.utility];
3061
3096
  if (resolver) return resolver(parsed, theme);
@@ -3071,7 +3106,7 @@ function getPluginStandaloneMap() {
3071
3106
  return PLUGIN_STANDALONE;
3072
3107
  }
3073
3108
  function isKnownUtility(utility) {
3074
- return utility in STANDALONE || utility in RESOLVERS || utility in PLUGIN_STANDALONE || utility in PLUGIN_RESOLVERS;
3109
+ return utility in getStandalone() || utility in RESOLVERS || utility in PLUGIN_STANDALONE || utility in PLUGIN_RESOLVERS;
3075
3110
  }
3076
3111
 
3077
3112
  // src/core/responsiveStore.ts