@kbach/react-native 1.0.0-beta.24 → 1.0.0-beta.26

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.
@@ -1,10 +1,10 @@
1
- import "./chunk-TS2EEVOE.mjs";
1
+ import "./chunk-LWD6JATB.mjs";
2
2
  import {
3
3
  Fragment,
4
4
  jsx,
5
5
  jsxs
6
- } from "./chunk-OS7EPBH5.mjs";
7
- import "./chunk-AG7ZQ2K4.mjs";
6
+ } from "./chunk-GHQ7DWLO.mjs";
7
+ import "./chunk-BEXNFWW6.mjs";
8
8
 
9
9
  // src/jsxRuntimeCore.ts
10
10
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -720,6 +720,27 @@ function resolveNegatableLength(theme, parsed) {
720
720
  if (px === 0) return "0px";
721
721
  return `-${px}px`;
722
722
  }
723
+ function fractionPercent(value) {
724
+ const slashIdx = value.indexOf("/");
725
+ if (slashIdx === -1) return null;
726
+ const numStr = value.slice(0, slashIdx);
727
+ const denStr = value.slice(slashIdx + 1);
728
+ const num = Number(numStr);
729
+ const den = Number(denStr);
730
+ if (!Number.isFinite(num) || !Number.isFinite(den) || numStr.trim() === "" || denStr.trim() === "") return null;
731
+ if (den === 0) return null;
732
+ const pct = num / den * 100;
733
+ const formatted = pct.toFixed(6);
734
+ const trimmed = formatted.replace(/0+$/, "").replace(/\.$/, "");
735
+ return `${trimmed}%`;
736
+ }
737
+ function resolveNegatableSize(theme, parsed) {
738
+ if (!parsed.isArbitrary && parsed.value !== null) {
739
+ const pct = fractionPercent(parsed.value);
740
+ if (pct !== null) return parsed.negative ? `-${pct}` : pct;
741
+ }
742
+ return resolveNegatableLength(theme, parsed);
743
+ }
723
744
  function resolvePercent(parsed) {
724
745
  if (parsed.negative) return null;
725
746
  const value = parsed.value;
@@ -873,43 +894,44 @@ function resolve(parsed, theme) {
873
894
  case "shrink":
874
895
  return [decl("flex-shrink", parsed.value ?? "1")];
875
896
  // top/right/bottom/left/inset support real Tailwind's negative-value
876
- // convention ("-top-4") — see resolveNegatableLength's own doc comment.
897
+ // convention ("-top-4") AND its percentage-fraction scale ("top-1/2",
898
+ // "-inset-1/3") — see resolveNegatableSize's own doc comment.
877
899
  case "top": {
878
- const v = resolveNegatableLength(theme, parsed);
900
+ const v = resolveNegatableSize(theme, parsed);
879
901
  return v === null ? null : [decl("top", v)];
880
902
  }
881
903
  case "right": {
882
- const v = resolveNegatableLength(theme, parsed);
904
+ const v = resolveNegatableSize(theme, parsed);
883
905
  return v === null ? null : [decl("right", v)];
884
906
  }
885
907
  case "bottom": {
886
- const v = resolveNegatableLength(theme, parsed);
908
+ const v = resolveNegatableSize(theme, parsed);
887
909
  return v === null ? null : [decl("bottom", v)];
888
910
  }
889
911
  case "left": {
890
- const v = resolveNegatableLength(theme, parsed);
912
+ const v = resolveNegatableSize(theme, parsed);
891
913
  return v === null ? null : [decl("left", v)];
892
914
  }
893
915
  case "inset": {
894
- const v = resolveNegatableLength(theme, parsed);
916
+ const v = resolveNegatableSize(theme, parsed);
895
917
  return v === null ? null : [decl("inset", v)];
896
918
  }
897
919
  case "inset-x": {
898
- const v = resolveNegatableLength(theme, parsed);
920
+ const v = resolveNegatableSize(theme, parsed);
899
921
  return v === null ? null : [decl("left", v), decl("right", v)];
900
922
  }
901
923
  case "inset-y": {
902
- const v = resolveNegatableLength(theme, parsed);
924
+ const v = resolveNegatableSize(theme, parsed);
903
925
  return v === null ? null : [decl("top", v), decl("bottom", v)];
904
926
  }
905
927
  // Logical inset — just a different CSS property name, same reasoning
906
928
  // as Rust's layout.rs (no direction-tracking logic needed here).
907
929
  case "start": {
908
- const v = resolveNegatableLength(theme, parsed);
930
+ const v = resolveNegatableSize(theme, parsed);
909
931
  return v === null ? null : [decl("inset-inline-start", v)];
910
932
  }
911
933
  case "end": {
912
- const v = resolveNegatableLength(theme, parsed);
934
+ const v = resolveNegatableSize(theme, parsed);
913
935
  return v === null ? null : [decl("inset-inline-end", v)];
914
936
  }
915
937
  // "aspect-" is a registered VALUE_PREFIXES entry (parser.ts), so
@@ -1007,20 +1029,6 @@ function namedSize(key) {
1007
1029
  return null;
1008
1030
  }
1009
1031
  }
1010
- function fractionPercent(value) {
1011
- const slashIdx = value.indexOf("/");
1012
- if (slashIdx === -1) return null;
1013
- const numStr = value.slice(0, slashIdx);
1014
- const denStr = value.slice(slashIdx + 1);
1015
- const num = Number(numStr);
1016
- const den = Number(denStr);
1017
- if (!Number.isFinite(num) || !Number.isFinite(den) || numStr.trim() === "" || denStr.trim() === "") return null;
1018
- if (den === 0) return null;
1019
- const pct = num / den * 100;
1020
- const formatted = pct.toFixed(6);
1021
- const trimmed = formatted.replace(/0+$/, "").replace(/\.$/, "");
1022
- return `${trimmed}%`;
1023
- }
1024
1032
  function cssSizeKeyword(key) {
1025
1033
  switch (key) {
1026
1034
  case "min":
@@ -1921,16 +1929,33 @@ function resolveStyleJsWithWarnings(classString, theme, colorScheme, pressed, wi
1921
1929
  }
1922
1930
 
1923
1931
  // src/nativeBridge.ts
1932
+ var RESOLVE_STYLE_CACHE_MAX = 500;
1933
+ var resolveStyleCache = /* @__PURE__ */ new Map();
1934
+ var cachedForThemeJson = null;
1924
1935
  function resolveStyle(classString, pressed = false) {
1925
1936
  const colorScheme = (0, import_darkModeStore2.getGlobalDarkMode)() ? "dark" : "light";
1926
1937
  const width = import_react_native2.Dimensions.get("window").width;
1938
+ const themeJson = (0, import_theme.getThemeJson)();
1939
+ if (themeJson !== cachedForThemeJson) {
1940
+ resolveStyleCache.clear();
1941
+ cachedForThemeJson = themeJson;
1942
+ }
1943
+ const cacheKey = `${classString}\0${pressed}\0${colorScheme}\0${width}`;
1944
+ const cached = resolveStyleCache.get(cacheKey);
1945
+ if (cached !== void 0) return { ...cached };
1946
+ const style = resolveStyleUncached(classString, pressed, colorScheme, width, themeJson);
1947
+ if (resolveStyleCache.size >= RESOLVE_STYLE_CACHE_MAX) resolveStyleCache.clear();
1948
+ resolveStyleCache.set(cacheKey, style);
1949
+ return { ...style };
1950
+ }
1951
+ function resolveStyleUncached(classString, pressed, colorScheme, width, themeJson) {
1927
1952
  const KbachModule = import_react_native2.TurboModuleRegistry.get("KbachModule");
1928
1953
  if (!KbachModule) {
1929
1954
  const { style: style2, warnings: warnings2 } = resolveStyleJsWithWarnings(classString, (0, import_theme.getTheme)(), colorScheme, pressed, width);
1930
1955
  warnIfDev(classString, warnings2);
1931
1956
  return style2;
1932
1957
  }
1933
- const json = KbachModule.resolveStyle(classString, (0, import_theme.getThemeJson)(), colorScheme, pressed, width);
1958
+ const json = KbachModule.resolveStyle(classString, themeJson, colorScheme, pressed, width);
1934
1959
  const style = JSON.parse(json);
1935
1960
  const warnings = style.__kbachWarnings;
1936
1961
  if (warnings !== void 0) {