@kbach/react-native 1.0.0-beta.23 → 1.0.0-beta.25

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.
@@ -9,13 +9,13 @@ import {
9
9
  subscribeDynamicTokens,
10
10
  subscribeGlobalDarkMode,
11
11
  toggleGlobalDarkMode
12
- } from "./chunk-TS2EEVOE.mjs";
12
+ } from "./chunk-JENWPIJT.mjs";
13
13
  import {
14
14
  defaultTheme,
15
15
  getTheme,
16
16
  resolveClassName,
17
17
  setTheme
18
- } from "./chunk-AG7ZQ2K4.mjs";
18
+ } from "./chunk-TBDAJIR3.mjs";
19
19
 
20
20
  // src/config.ts
21
21
  function parseHexRgb(hex) {
@@ -588,11 +588,18 @@ function ReactiveElement({
588
588
  }) {
589
589
  (0, import_react.useSyncExternalStore)(import_darkModeStore.subscribeGlobalDarkMode, import_darkModeStore.getGlobalDarkMode);
590
590
  (0, import_react.useSyncExternalStore)(import_dynamicTokens.subscribeDynamicTokens, import_dynamicTokens.getDynamicTokensVersion);
591
- (0, import_react_native.useWindowDimensions)();
591
+ const windowSize = (0, import_react_native.useWindowDimensions)();
592
592
  const [measuredBasis, setMeasuredBasis] = (0, import_react.useState)(null);
593
+ const lastWindowSizeRef = (0, import_react.useRef)(windowSize);
594
+ if (lastWindowSizeRef.current.width !== windowSize.width || lastWindowSizeRef.current.height !== windowSize.height) {
595
+ lastWindowSizeRef.current = windowSize;
596
+ if (measuredBasis !== null) {
597
+ setMeasuredBasis(null);
598
+ }
599
+ }
593
600
  const measure = (0, import_react.useCallback)((e) => {
594
601
  const { width: w, height: h } = e.nativeEvent.layout;
595
- setMeasuredBasis((prev) => prev && prev.width === w && prev.height === h ? prev : { width: w, height: h });
602
+ setMeasuredBasis((prev) => prev === null ? { width: w, height: h } : prev);
596
603
  }, []);
597
604
  const [isHovered, setIsHovered] = (0, import_react.useState)(false);
598
605
  const [isFocused, setIsFocused] = (0, import_react.useState)(false);
@@ -722,6 +729,27 @@ function resolveNegatableLength(theme, parsed) {
722
729
  if (px === 0) return "0px";
723
730
  return `-${px}px`;
724
731
  }
732
+ function fractionPercent(value) {
733
+ const slashIdx = value.indexOf("/");
734
+ if (slashIdx === -1) return null;
735
+ const numStr = value.slice(0, slashIdx);
736
+ const denStr = value.slice(slashIdx + 1);
737
+ const num = Number(numStr);
738
+ const den = Number(denStr);
739
+ if (!Number.isFinite(num) || !Number.isFinite(den) || numStr.trim() === "" || denStr.trim() === "") return null;
740
+ if (den === 0) return null;
741
+ const pct = num / den * 100;
742
+ const formatted = pct.toFixed(6);
743
+ const trimmed = formatted.replace(/0+$/, "").replace(/\.$/, "");
744
+ return `${trimmed}%`;
745
+ }
746
+ function resolveNegatableSize(theme, parsed) {
747
+ if (!parsed.isArbitrary && parsed.value !== null) {
748
+ const pct = fractionPercent(parsed.value);
749
+ if (pct !== null) return parsed.negative ? `-${pct}` : pct;
750
+ }
751
+ return resolveNegatableLength(theme, parsed);
752
+ }
725
753
  function resolvePercent(parsed) {
726
754
  if (parsed.negative) return null;
727
755
  const value = parsed.value;
@@ -875,43 +903,44 @@ function resolve(parsed, theme) {
875
903
  case "shrink":
876
904
  return [decl("flex-shrink", parsed.value ?? "1")];
877
905
  // top/right/bottom/left/inset support real Tailwind's negative-value
878
- // convention ("-top-4") — see resolveNegatableLength's own doc comment.
906
+ // convention ("-top-4") AND its percentage-fraction scale ("top-1/2",
907
+ // "-inset-1/3") — see resolveNegatableSize's own doc comment.
879
908
  case "top": {
880
- const v = resolveNegatableLength(theme, parsed);
909
+ const v = resolveNegatableSize(theme, parsed);
881
910
  return v === null ? null : [decl("top", v)];
882
911
  }
883
912
  case "right": {
884
- const v = resolveNegatableLength(theme, parsed);
913
+ const v = resolveNegatableSize(theme, parsed);
885
914
  return v === null ? null : [decl("right", v)];
886
915
  }
887
916
  case "bottom": {
888
- const v = resolveNegatableLength(theme, parsed);
917
+ const v = resolveNegatableSize(theme, parsed);
889
918
  return v === null ? null : [decl("bottom", v)];
890
919
  }
891
920
  case "left": {
892
- const v = resolveNegatableLength(theme, parsed);
921
+ const v = resolveNegatableSize(theme, parsed);
893
922
  return v === null ? null : [decl("left", v)];
894
923
  }
895
924
  case "inset": {
896
- const v = resolveNegatableLength(theme, parsed);
925
+ const v = resolveNegatableSize(theme, parsed);
897
926
  return v === null ? null : [decl("inset", v)];
898
927
  }
899
928
  case "inset-x": {
900
- const v = resolveNegatableLength(theme, parsed);
929
+ const v = resolveNegatableSize(theme, parsed);
901
930
  return v === null ? null : [decl("left", v), decl("right", v)];
902
931
  }
903
932
  case "inset-y": {
904
- const v = resolveNegatableLength(theme, parsed);
933
+ const v = resolveNegatableSize(theme, parsed);
905
934
  return v === null ? null : [decl("top", v), decl("bottom", v)];
906
935
  }
907
936
  // Logical inset — just a different CSS property name, same reasoning
908
937
  // as Rust's layout.rs (no direction-tracking logic needed here).
909
938
  case "start": {
910
- const v = resolveNegatableLength(theme, parsed);
939
+ const v = resolveNegatableSize(theme, parsed);
911
940
  return v === null ? null : [decl("inset-inline-start", v)];
912
941
  }
913
942
  case "end": {
914
- const v = resolveNegatableLength(theme, parsed);
943
+ const v = resolveNegatableSize(theme, parsed);
915
944
  return v === null ? null : [decl("inset-inline-end", v)];
916
945
  }
917
946
  // "aspect-" is a registered VALUE_PREFIXES entry (parser.ts), so
@@ -1009,20 +1038,6 @@ function namedSize(key) {
1009
1038
  return null;
1010
1039
  }
1011
1040
  }
1012
- function fractionPercent(value) {
1013
- const slashIdx = value.indexOf("/");
1014
- if (slashIdx === -1) return null;
1015
- const numStr = value.slice(0, slashIdx);
1016
- const denStr = value.slice(slashIdx + 1);
1017
- const num = Number(numStr);
1018
- const den = Number(denStr);
1019
- if (!Number.isFinite(num) || !Number.isFinite(den) || numStr.trim() === "" || denStr.trim() === "") return null;
1020
- if (den === 0) return null;
1021
- const pct = num / den * 100;
1022
- const formatted = pct.toFixed(6);
1023
- const trimmed = formatted.replace(/0+$/, "").replace(/\.$/, "");
1024
- return `${trimmed}%`;
1025
- }
1026
1041
  function cssSizeKeyword(key) {
1027
1042
  switch (key) {
1028
1043
  case "min":