@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.
@@ -1,14 +1,14 @@
1
- import "./chunk-TS2EEVOE.mjs";
1
+ import "./chunk-JENWPIJT.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-EBLZ3CJG.mjs";
7
+ import "./chunk-TBDAJIR3.mjs";
8
8
 
9
9
  // src/jsxRuntimeCore.ts
10
10
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
- import { Fragment as Fragment2, useCallback, useState, useSyncExternalStore } from "react";
11
+ import { Fragment as Fragment2, useCallback, useRef, useState, useSyncExternalStore } from "react";
12
12
  import { Pressable, useWindowDimensions } from "react-native";
13
13
  function createJsxDEV(jsx2, jsxs2) {
14
14
  return function jsxDEV2(type, props, key, isStaticChildren, source, self) {
@@ -589,11 +589,18 @@ function ReactiveElement({
589
589
  }) {
590
590
  (0, import_react.useSyncExternalStore)(import_darkModeStore.subscribeGlobalDarkMode, import_darkModeStore.getGlobalDarkMode);
591
591
  (0, import_react.useSyncExternalStore)(import_dynamicTokens.subscribeDynamicTokens, import_dynamicTokens.getDynamicTokensVersion);
592
- (0, import_react_native.useWindowDimensions)();
592
+ const windowSize = (0, import_react_native.useWindowDimensions)();
593
593
  const [measuredBasis, setMeasuredBasis] = (0, import_react.useState)(null);
594
+ const lastWindowSizeRef = (0, import_react.useRef)(windowSize);
595
+ if (lastWindowSizeRef.current.width !== windowSize.width || lastWindowSizeRef.current.height !== windowSize.height) {
596
+ lastWindowSizeRef.current = windowSize;
597
+ if (measuredBasis !== null) {
598
+ setMeasuredBasis(null);
599
+ }
600
+ }
594
601
  const measure = (0, import_react.useCallback)((e) => {
595
602
  const { width: w, height: h } = e.nativeEvent.layout;
596
- setMeasuredBasis((prev) => prev && prev.width === w && prev.height === h ? prev : { width: w, height: h });
603
+ setMeasuredBasis((prev) => prev === null ? { width: w, height: h } : prev);
597
604
  }, []);
598
605
  const [isHovered, setIsHovered] = (0, import_react.useState)(false);
599
606
  const [isFocused, setIsFocused] = (0, import_react.useState)(false);
@@ -713,6 +720,27 @@ function resolveNegatableLength(theme, parsed) {
713
720
  if (px === 0) return "0px";
714
721
  return `-${px}px`;
715
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
+ }
716
744
  function resolvePercent(parsed) {
717
745
  if (parsed.negative) return null;
718
746
  const value = parsed.value;
@@ -866,43 +894,44 @@ function resolve(parsed, theme) {
866
894
  case "shrink":
867
895
  return [decl("flex-shrink", parsed.value ?? "1")];
868
896
  // top/right/bottom/left/inset support real Tailwind's negative-value
869
- // 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.
870
899
  case "top": {
871
- const v = resolveNegatableLength(theme, parsed);
900
+ const v = resolveNegatableSize(theme, parsed);
872
901
  return v === null ? null : [decl("top", v)];
873
902
  }
874
903
  case "right": {
875
- const v = resolveNegatableLength(theme, parsed);
904
+ const v = resolveNegatableSize(theme, parsed);
876
905
  return v === null ? null : [decl("right", v)];
877
906
  }
878
907
  case "bottom": {
879
- const v = resolveNegatableLength(theme, parsed);
908
+ const v = resolveNegatableSize(theme, parsed);
880
909
  return v === null ? null : [decl("bottom", v)];
881
910
  }
882
911
  case "left": {
883
- const v = resolveNegatableLength(theme, parsed);
912
+ const v = resolveNegatableSize(theme, parsed);
884
913
  return v === null ? null : [decl("left", v)];
885
914
  }
886
915
  case "inset": {
887
- const v = resolveNegatableLength(theme, parsed);
916
+ const v = resolveNegatableSize(theme, parsed);
888
917
  return v === null ? null : [decl("inset", v)];
889
918
  }
890
919
  case "inset-x": {
891
- const v = resolveNegatableLength(theme, parsed);
920
+ const v = resolveNegatableSize(theme, parsed);
892
921
  return v === null ? null : [decl("left", v), decl("right", v)];
893
922
  }
894
923
  case "inset-y": {
895
- const v = resolveNegatableLength(theme, parsed);
924
+ const v = resolveNegatableSize(theme, parsed);
896
925
  return v === null ? null : [decl("top", v), decl("bottom", v)];
897
926
  }
898
927
  // Logical inset — just a different CSS property name, same reasoning
899
928
  // as Rust's layout.rs (no direction-tracking logic needed here).
900
929
  case "start": {
901
- const v = resolveNegatableLength(theme, parsed);
930
+ const v = resolveNegatableSize(theme, parsed);
902
931
  return v === null ? null : [decl("inset-inline-start", v)];
903
932
  }
904
933
  case "end": {
905
- const v = resolveNegatableLength(theme, parsed);
934
+ const v = resolveNegatableSize(theme, parsed);
906
935
  return v === null ? null : [decl("inset-inline-end", v)];
907
936
  }
908
937
  // "aspect-" is a registered VALUE_PREFIXES entry (parser.ts), so
@@ -1000,20 +1029,6 @@ function namedSize(key) {
1000
1029
  return null;
1001
1030
  }
1002
1031
  }
1003
- function fractionPercent(value) {
1004
- const slashIdx = value.indexOf("/");
1005
- if (slashIdx === -1) return null;
1006
- const numStr = value.slice(0, slashIdx);
1007
- const denStr = value.slice(slashIdx + 1);
1008
- const num = Number(numStr);
1009
- const den = Number(denStr);
1010
- if (!Number.isFinite(num) || !Number.isFinite(den) || numStr.trim() === "" || denStr.trim() === "") return null;
1011
- if (den === 0) return null;
1012
- const pct = num / den * 100;
1013
- const formatted = pct.toFixed(6);
1014
- const trimmed = formatted.replace(/0+$/, "").replace(/\.$/, "");
1015
- return `${trimmed}%`;
1016
- }
1017
1032
  function cssSizeKeyword(key) {
1018
1033
  switch (key) {
1019
1034
  case "min":