@kbach/react-native 1.0.0-beta.52 → 1.0.0-beta.54

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.
@@ -10,13 +10,13 @@ import {
10
10
  subscribeDynamicTokens,
11
11
  subscribeGlobalDarkMode,
12
12
  toggleGlobalDarkMode
13
- } from "./chunk-23JJORPW.mjs";
13
+ } from "./chunk-NPDSBCXR.mjs";
14
14
  import {
15
15
  defaultTheme,
16
16
  getTheme,
17
17
  resolveClassName,
18
18
  setTheme
19
- } from "./chunk-Z5Q3FGXR.mjs";
19
+ } from "./chunk-MLBH2JYH.mjs";
20
20
 
21
21
  // src/config.ts
22
22
  function parseHexRgb(hex) {
@@ -262,7 +262,41 @@ function resolveClassValue(value) {
262
262
  }
263
263
  return "";
264
264
  }
265
+
266
+ // src/semanticElements.tsx
267
+ import * as React from "react";
268
+ import { Pressable, Text } from "react-native";
269
+ import { jsx as jsx2 } from "react/jsx-runtime";
270
+ var Button = React.forwardRef(function Button2(props, ref) {
271
+ return /* @__PURE__ */ jsx2(Pressable, { ref, accessibilityRole: "button", ...props });
272
+ });
273
+ var PARAGRAPH_ROLE = "paragraph";
274
+ var Paragraph = React.forwardRef(function Paragraph2(props, ref) {
275
+ return /* @__PURE__ */ jsx2(Text, { ref, role: PARAGRAPH_ROLE, ...props });
276
+ });
277
+ function makeHeading(level) {
278
+ const extra = { "aria-level": level };
279
+ const Heading = React.forwardRef(function Heading2(props, ref) {
280
+ return /* @__PURE__ */ jsx2(Text, { ref, accessibilityRole: "header", ...extra, ...props });
281
+ });
282
+ Heading.displayName = `H${level}`;
283
+ return Heading;
284
+ }
285
+ var H1 = makeHeading(1);
286
+ var H2 = makeHeading(2);
287
+ var H3 = makeHeading(3);
288
+ var H4 = makeHeading(4);
289
+ var H5 = makeHeading(5);
290
+ var H6 = makeHeading(6);
265
291
  export {
292
+ Button,
293
+ H1,
294
+ H2,
295
+ H3,
296
+ H4,
297
+ H5,
298
+ H6,
299
+ Paragraph,
266
300
  ThemeProvider,
267
301
  applyKbachConfig,
268
302
  clsx,
@@ -1,10 +1,10 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  export { Fragment } from 'react';
3
3
 
4
4
  declare const jsxDEV: (type: unknown, props: Record<string, unknown> | null, key?: string, isStaticChildren?: boolean, source?: {
5
5
  fileName: string;
6
6
  lineNumber: number;
7
7
  columnNumber: number;
8
- }, self?: unknown) => react.ReactElement;
8
+ }, self?: unknown) => React.ReactElement;
9
9
 
10
10
  export { jsxDEV };
@@ -563,11 +563,15 @@ var VALUE_PREFIXES = [
563
563
  "rotate-y-",
564
564
  "rotate-z-",
565
565
  "rotate-",
566
+ // Bare 'translate-'/'skew-' (both axes) after their per-axis forms, same
567
+ // longer-before-shorter rule as resolvers/parser.rs.
566
568
  "translate-x-",
567
569
  "translate-y-",
568
570
  "translate-z-",
571
+ "translate-",
569
572
  "skew-x-",
570
573
  "skew-y-",
574
+ "skew-",
571
575
  "perspective-origin-",
572
576
  "perspective-",
573
577
  "origin-",
@@ -992,6 +996,7 @@ function decl(property, value) {
992
996
  function spacingPx(theme, value) {
993
997
  const fromTable = theme.spacing[value];
994
998
  if (fromTable !== void 0) return fromTable;
999
+ if (value === "px") return 1;
995
1000
  const n = Number(value);
996
1001
  return Number.isFinite(n) && value.trim() !== "" ? n * 4 : void 0;
997
1002
  }
@@ -1034,6 +1039,7 @@ function fractionPercent(value) {
1034
1039
  }
1035
1040
  function resolveNegatableSize(theme, parsed) {
1036
1041
  if (!parsed.isArbitrary && parsed.value !== null) {
1042
+ if (parsed.negative && parsed.value === "full") return "-100%";
1037
1043
  const pct = fractionPercent(parsed.value);
1038
1044
  if (pct !== null) return parsed.negative ? `-${pct}` : pct;
1039
1045
  }
@@ -1292,7 +1298,7 @@ function resolveFlex(parsed, web) {
1292
1298
  case "shrink-0":
1293
1299
  return [decl("flex-shrink", "0")];
1294
1300
  default:
1295
- return null;
1301
+ return /^\d+$/.test(value) ? [decl("flex", value)] : null;
1296
1302
  }
1297
1303
  }
1298
1304
 
@@ -1465,8 +1471,11 @@ function radiusSize(key) {
1465
1471
  switch (key) {
1466
1472
  case "none":
1467
1473
  return "0px";
1468
- case "sm":
1474
+ // Tailwind v4.3's radius scale: `sm` is 0.25rem (v3's 0.125rem is `xs`).
1475
+ case "xs":
1469
1476
  return "0.125rem";
1477
+ case "sm":
1478
+ return "0.25rem";
1470
1479
  case "md":
1471
1480
  return "0.375rem";
1472
1481
  case "lg":
@@ -1477,12 +1486,19 @@ function radiusSize(key) {
1477
1486
  return "1rem";
1478
1487
  case "3xl":
1479
1488
  return "1.5rem";
1489
+ case "4xl":
1490
+ return "2rem";
1480
1491
  case "full":
1481
1492
  return "9999px";
1482
1493
  default:
1483
1494
  return null;
1484
1495
  }
1485
1496
  }
1497
+ function borderWidthPx(parsed) {
1498
+ if (parsed.negative || parsed.isArbitrary || parsed.value === null) return null;
1499
+ const n = Number(parsed.value);
1500
+ return Number.isFinite(n) && n >= 0 && parsed.value.trim() !== "" ? `${n}px` : null;
1501
+ }
1486
1502
  function borderSideProperty(side) {
1487
1503
  switch (side) {
1488
1504
  case "t":
@@ -1505,6 +1521,15 @@ function borderValue(theme, parsed) {
1505
1521
  if (side !== null) {
1506
1522
  return [decl(`${side}-width`, "1px"), decl(`${side}-style`, "solid")];
1507
1523
  }
1524
+ const pair = value === "x" ? ["border-left", "border-right"] : value === "y" ? ["border-top", "border-bottom"] : null;
1525
+ if (pair !== null) {
1526
+ return [
1527
+ decl(`${pair[0]}-width`, "1px"),
1528
+ decl(`${pair[1]}-width`, "1px"),
1529
+ decl(`${pair[0]}-style`, "solid"),
1530
+ decl(`${pair[1]}-style`, "solid")
1531
+ ];
1532
+ }
1508
1533
  if (value === "collapse") return [decl("border-collapse", "collapse")];
1509
1534
  if (value === "separate") return [decl("border-collapse", "separate")];
1510
1535
  }
@@ -1514,7 +1539,7 @@ function borderValue(theme, parsed) {
1514
1539
  return color2 === null ? null : [decl("border-color", color2)];
1515
1540
  }
1516
1541
  if (Number.isFinite(Number(value)) && value.trim() !== "") {
1517
- const v = resolveLength(theme, parsed);
1542
+ const v = borderWidthPx(parsed);
1518
1543
  return v === null ? null : [decl("border-width", v)];
1519
1544
  }
1520
1545
  if (value === "solid" || value === "dashed" || value === "dotted" || value === "double" || value === "hidden" || value === "none") {
@@ -1532,7 +1557,7 @@ function borderSideValue(theme, parsed, sideProperty) {
1532
1557
  return color2 === null ? null : [decl(`${sideProperty}-color`, color2)];
1533
1558
  }
1534
1559
  if (Number.isFinite(Number(value)) && value.trim() !== "") {
1535
- const v = resolveLength(theme, parsed);
1560
+ const v = borderWidthPx(parsed);
1536
1561
  return v === null ? null : [decl(`${sideProperty}-width`, v)];
1537
1562
  }
1538
1563
  if (value === "solid" || value === "dashed" || value === "dotted" || value === "double" || value === "hidden" || value === "none") {
@@ -1550,7 +1575,7 @@ function borderAxisValue(theme, parsed, sideA, sideB) {
1550
1575
  return color2 === null ? null : [decl(`${sideA}-color`, color2), decl(`${sideB}-color`, color2)];
1551
1576
  }
1552
1577
  if (Number.isFinite(Number(value)) && value.trim() !== "") {
1553
- const v = resolveLength(theme, parsed);
1578
+ const v = borderWidthPx(parsed);
1554
1579
  return v === null ? null : [decl(`${sideA}-width`, v), decl(`${sideB}-width`, v)];
1555
1580
  }
1556
1581
  if (value === "solid" || value === "dashed" || value === "dotted" || value === "double" || value === "hidden" || value === "none") {
@@ -1597,20 +1622,7 @@ function resolveRadiusSide(theme, parsed, side) {
1597
1622
  }
1598
1623
  var OUTLINE_STYLES = ["solid", "dashed", "dotted", "double"];
1599
1624
  function outlineWidthValue(key) {
1600
- switch (key) {
1601
- case "0":
1602
- return "0px";
1603
- case "1":
1604
- return "1px";
1605
- case "2":
1606
- return "2px";
1607
- case "4":
1608
- return "4px";
1609
- case "8":
1610
- return "8px";
1611
- default:
1612
- return null;
1613
- }
1625
+ return /^\d+$/.test(key) ? `${Number(key)}px` : null;
1614
1626
  }
1615
1627
  function outlineValue(theme, parsed) {
1616
1628
  const value = parsed.value;
@@ -1633,48 +1645,6 @@ function outlineOffsetValue(parsed) {
1633
1645
  const w = outlineWidthValue(value);
1634
1646
  return w === null ? null : [decl("outline-offset", w)];
1635
1647
  }
1636
- var RING_BOX_SHADOW = "var(--kb-ring-inset,) 0 0 0 var(--kb-ring-offset-width, 0px) var(--kb-ring-offset-color, #fff), var(--kb-ring-inset,) 0 0 0 calc(var(--kb-ring-width, 0px) + var(--kb-ring-offset-width, 0px)) var(--kb-ring-color, rgba(59,130,246,0.5))";
1637
- function ringWidth(key) {
1638
- switch (key) {
1639
- case "0":
1640
- return "0px";
1641
- case "1":
1642
- return "1px";
1643
- case "2":
1644
- return "2px";
1645
- case "4":
1646
- return "4px";
1647
- case "8":
1648
- return "8px";
1649
- default:
1650
- return null;
1651
- }
1652
- }
1653
- function ringValue(theme, parsed) {
1654
- const value = parsed.value;
1655
- if (value === null) return null;
1656
- if (value === "inset") {
1657
- return [decl("--kb-ring-inset", "inset"), decl("box-shadow", RING_BOX_SHADOW)];
1658
- }
1659
- if (!parsed.isArbitrary) {
1660
- const w = ringWidth(value);
1661
- if (w !== null) return [decl("--kb-ring-width", w), decl("box-shadow", RING_BOX_SHADOW)];
1662
- }
1663
- const color = colorValue(theme, parsed);
1664
- if (color === null) return null;
1665
- return [decl("--kb-ring-color", color), decl("box-shadow", RING_BOX_SHADOW)];
1666
- }
1667
- function ringOffsetValue(theme, parsed) {
1668
- const value = parsed.value;
1669
- if (value === null) return null;
1670
- if (!parsed.isArbitrary) {
1671
- const w = ringWidth(value);
1672
- if (w !== null) return [decl("--kb-ring-offset-width", w), decl("box-shadow", RING_BOX_SHADOW)];
1673
- }
1674
- const color = colorValue(theme, parsed);
1675
- if (color === null) return null;
1676
- return [decl("--kb-ring-offset-color", color), decl("box-shadow", RING_BOX_SHADOW)];
1677
- }
1678
1648
  var RADIUS_SIDES = /* @__PURE__ */ new Set(["t", "r", "b", "l", "tl", "tr", "br", "bl"]);
1679
1649
  function resolve3(parsed, theme) {
1680
1650
  switch (parsed.utility) {
@@ -1703,14 +1673,19 @@ function resolve3(parsed, theme) {
1703
1673
  const v = resolveLength(theme, parsed);
1704
1674
  return v === null ? null : [decl("border-radius", v)];
1705
1675
  }
1676
+ // Rings are web-only (a var()-composed CSS box-shadow React Native can't
1677
+ // parse) — same as resolvers/mod.rs's native dispatcher.
1706
1678
  case "ring":
1707
- if (parsed.value === null) return [decl("--kb-ring-width", "3px"), decl("box-shadow", RING_BOX_SHADOW)];
1708
- return ringValue(theme, parsed);
1709
1679
  case "ring-offset":
1710
- return ringOffsetValue(theme, parsed);
1680
+ return null;
1681
+ // Outlines: the same final native style the Rust engine produces once
1682
+ // its var()-based web declarations are filtered out (resolve_style.rs):
1683
+ // bare `outline` is a 1px width, `outline-none` is outline-style: none,
1684
+ // `outline-hidden` keeps only its offset (RN has no `outline` shorthand).
1711
1685
  case "outline":
1712
- if (parsed.value === null) return [decl("outline-style", "solid")];
1713
- if (parsed.value === "none") return [decl("outline", "none")];
1686
+ if (parsed.value === null) return [decl("outline-width", "1px")];
1687
+ if (parsed.value === "none") return [decl("outline-style", "none")];
1688
+ if (!parsed.isArbitrary && parsed.value === "hidden") return [decl("outline-offset", "2px")];
1714
1689
  return outlineValue(theme, parsed);
1715
1690
  case "outline-offset":
1716
1691
  return outlineOffsetValue(parsed);
@@ -1756,26 +1731,10 @@ function textSize(key) {
1756
1731
  }
1757
1732
  }
1758
1733
  function lineHeightSize(key) {
1759
- switch (key) {
1760
- case "3":
1761
- return "0.75rem";
1762
- case "4":
1763
- return "1rem";
1764
- case "5":
1765
- return "1.25rem";
1766
- case "6":
1767
- return "1.5rem";
1768
- case "7":
1769
- return "1.75rem";
1770
- case "8":
1771
- return "2rem";
1772
- case "9":
1773
- return "2.25rem";
1774
- case "10":
1775
- return "2.5rem";
1776
- default:
1777
- return null;
1778
- }
1734
+ if (key === "px") return "1px";
1735
+ if (key.trim() === "") return null;
1736
+ const n = Number(key);
1737
+ return Number.isFinite(n) && n >= 0 ? `${n * 0.25}rem` : null;
1779
1738
  }
1780
1739
  function textAlign(key) {
1781
1740
  switch (key) {
@@ -1839,8 +1798,14 @@ function fontFamilyValue(theme, key) {
1839
1798
  // src/jsEngine/resolvers/effects.ts
1840
1799
  function nativeShadowValue(key) {
1841
1800
  switch (key) {
1842
- case "sm":
1801
+ // Tailwind v4.3's scale, like effects.rs: `sm` is the default shadow,
1802
+ // v3's `sm` is `xs`.
1803
+ case "2xs":
1804
+ return { offsetY: 1, radius: 0, opacity: 0.05, elevation: 1 };
1805
+ case "xs":
1843
1806
  return { offsetY: 1, radius: 2, opacity: 0.05, elevation: 1 };
1807
+ case "sm":
1808
+ return { offsetY: 1, radius: 3, opacity: 0.1, elevation: 2 };
1844
1809
  case "DEFAULT":
1845
1810
  return { offsetY: 1, radius: 3, opacity: 0.1, elevation: 2 };
1846
1811
  case "md":
@@ -1890,6 +1855,16 @@ function resolveNative(parsed, theme) {
1890
1855
  switch (parsed.utility) {
1891
1856
  case "transform-none":
1892
1857
  return [decl("transform-op-none", "1")];
1858
+ // Both axes at once (`translate-4`, `-skew-3`); mirrors transform.rs.
1859
+ case "translate": {
1860
+ if (!parsed.isArbitrary && parsed.value === "none") return [decl("transform-op-translate-x", "0"), decl("transform-op-translate-y", "0")];
1861
+ const v = resolveNegatableSize(theme, parsed);
1862
+ return v === null ? null : [decl("transform-op-translate-x", v), decl("transform-op-translate-y", v)];
1863
+ }
1864
+ case "skew": {
1865
+ const deg = angle(parsed);
1866
+ return deg === null ? null : [decl("transform-op-skew-x", deg), decl("transform-op-skew-y", deg)];
1867
+ }
1893
1868
  case "backface-visible":
1894
1869
  return [decl("backface-visibility", "visible")];
1895
1870
  case "backface-hidden":
@@ -1903,6 +1878,7 @@ function resolveNative(parsed, theme) {
1903
1878
  return v === null ? null : [decl("transform-op-translate-y", v)];
1904
1879
  }
1905
1880
  case "scale": {
1881
+ if (!parsed.isArbitrary && parsed.value === "none") return [decl("transform-op-scale-x", "1"), decl("transform-op-scale-y", "1")];
1906
1882
  const n = scaleFactor(parsed);
1907
1883
  return n === null ? null : [decl("transform-op-scale-x", `${n}`), decl("transform-op-scale-y", `${n}`)];
1908
1884
  }
@@ -1915,6 +1891,7 @@ function resolveNative(parsed, theme) {
1915
1891
  return n === null ? null : [decl("transform-op-scale-y", `${n}`)];
1916
1892
  }
1917
1893
  case "rotate": {
1894
+ if (!parsed.isArbitrary && parsed.value === "none") return [decl("transform-op-rotate", "0deg")];
1918
1895
  const deg = angle(parsed);
1919
1896
  return deg === null ? null : [decl("transform-op-rotate", deg)];
1920
1897
  }
@@ -2212,6 +2189,9 @@ function resolveStyleJsWithWarnings(classString, theme, colorScheme, pressed, wi
2212
2189
  if (d.property.startsWith("__")) {
2213
2190
  continue;
2214
2191
  }
2192
+ if (d.property.startsWith("--") || d.value.includes("var(") || d.property === "outline" || d.property === "object-position" || d.property === "container-type") {
2193
+ continue;
2194
+ }
2215
2195
  if (d.property === "shadow-offset-x" || d.property === "shadow-offset-y") {
2216
2196
  if (spec < (keySpecificity.get("shadowOffset") ?? 0)) continue;
2217
2197
  const n = Number(d.value);
@@ -1,10 +1,10 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  export { Fragment } from 'react';
3
3
 
4
4
  declare const jsxDEV: (type: unknown, props: Record<string, unknown> | null, key?: string, isStaticChildren?: boolean, source?: {
5
5
  fileName: string;
6
6
  lineNumber: number;
7
7
  columnNumber: number;
8
- }, self?: unknown) => react.ReactElement;
8
+ }, self?: unknown) => React.ReactElement;
9
9
 
10
10
  export { jsxDEV };