@kbach/react 0.4.3 → 0.5.0

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.
@@ -650,10 +650,19 @@ var MODIFIERS = /* @__PURE__ */ new Set([
650
650
  "md",
651
651
  "lg",
652
652
  "xl",
653
- "2xl"
653
+ "2xl",
654
+ // Pseudo-elements (CSS-injection only; matchesMods returns false for these)
655
+ "before",
656
+ "after",
657
+ "selection",
658
+ "first-letter",
659
+ "first-line",
660
+ "marker",
661
+ // Print media modifier
662
+ "print"
654
663
  ]);
655
664
  var UTILITY_PREFIXES = [
656
- // Multi-word order matters
665
+ // Multi-word flex
657
666
  "flex-row-reverse",
658
667
  "flex-col-reverse",
659
668
  "flex-row",
@@ -731,7 +740,6 @@ var UTILITY_PREFIXES = [
731
740
  "rounded-r",
732
741
  "rounded-b",
733
742
  "rounded-l",
734
- "text-decoration-none",
735
743
  "list-none",
736
744
  "list-disc",
737
745
  "list-decimal",
@@ -761,6 +769,7 @@ var UTILITY_PREFIXES = [
761
769
  "bg-clip-padding",
762
770
  "bg-clip-content",
763
771
  "bg-clip-text",
772
+ "bg-gradient-to",
764
773
  "resize-none",
765
774
  "resize-y",
766
775
  "resize-x",
@@ -780,15 +789,8 @@ var UTILITY_PREFIXES = [
780
789
  "scale-y",
781
790
  "skew-x",
782
791
  "skew-y",
783
- "origin-center",
784
- "origin-top",
785
- "origin-top-right",
786
- "origin-right",
787
- "origin-bottom-right",
788
- "origin-bottom",
789
- "origin-bottom-left",
790
- "origin-left",
791
- "origin-top-left",
792
+ // Transform origin (single prefix, value carries direction)
793
+ "origin",
792
794
  "min-w",
793
795
  "min-h",
794
796
  "max-w",
@@ -797,7 +799,7 @@ var UTILITY_PREFIXES = [
797
799
  "bg-opacity",
798
800
  "text-opacity",
799
801
  "border-opacity",
800
- // Grid placement (longer prefixes before shorter ones)
802
+ // Grid placement
801
803
  "col-span",
802
804
  "col-start",
803
805
  "col-end",
@@ -809,6 +811,35 @@ var UTILITY_PREFIXES = [
809
811
  "grid-flow",
810
812
  "auto-cols",
811
813
  "auto-rows",
814
+ // Grid alignment
815
+ "place-items",
816
+ "place-content",
817
+ "place-self",
818
+ "justify-items",
819
+ "justify-self",
820
+ // Backdrop filters (longer than 'backdrop' alone)
821
+ "backdrop-blur",
822
+ "backdrop-brightness",
823
+ "backdrop-contrast",
824
+ "backdrop-grayscale",
825
+ "backdrop-hue-rotate",
826
+ "backdrop-invert",
827
+ "backdrop-opacity",
828
+ "backdrop-saturate",
829
+ "backdrop-sepia",
830
+ "backdrop-filter",
831
+ // Filters
832
+ "drop-shadow",
833
+ "hue-rotate",
834
+ "text-shadow",
835
+ "underline-offset",
836
+ "outline-offset",
837
+ "will-change",
838
+ "mix-blend",
839
+ "decoration",
840
+ "perspective",
841
+ "tint",
842
+ "animate",
812
843
  // Single-word prefixes last
813
844
  "appearance-none",
814
845
  "outline-none",
@@ -849,9 +880,11 @@ var UTILITY_PREFIXES = [
849
880
  "border",
850
881
  "rounded",
851
882
  "shadow",
883
+ "size",
852
884
  "opacity",
853
885
  "leading",
854
886
  "tracking",
887
+ "line-clamp",
855
888
  "basis",
856
889
  "grow",
857
890
  "shrink",
@@ -862,13 +895,23 @@ var UTILITY_PREFIXES = [
862
895
  "rotate",
863
896
  "aspect",
864
897
  "columns",
865
- "placeholder",
866
898
  "ring",
867
899
  "gap",
868
900
  "inset",
901
+ "filter",
902
+ "transform",
903
+ "blur",
904
+ "brightness",
905
+ "contrast",
906
+ "grayscale",
907
+ "invert",
908
+ "saturate",
909
+ "sepia",
869
910
  "bg",
870
911
  "text",
871
912
  "font",
913
+ "caret",
914
+ "accent",
872
915
  "from",
873
916
  "via",
874
917
  "to",
@@ -897,12 +940,11 @@ var UTILITY_PREFIXES = [
897
940
  "left",
898
941
  "z",
899
942
  "col",
900
- "row",
901
- "flex"
902
- // also a standalone
943
+ "row"
903
944
  ];
904
945
  var SORTED_PREFIXES = [...new Set(UTILITY_PREFIXES)].sort((a, b) => b.length - a.length);
905
946
  var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
947
+ // Display
906
948
  "flex",
907
949
  "block",
908
950
  "inline-block",
@@ -914,13 +956,16 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
914
956
  "hidden",
915
957
  "contents",
916
958
  "flow-root",
959
+ // Position
917
960
  "relative",
918
961
  "absolute",
919
962
  "fixed",
920
963
  "sticky",
921
964
  "static",
965
+ // Visibility
922
966
  "visible",
923
967
  "invisible",
968
+ // Typography
924
969
  "uppercase",
925
970
  "lowercase",
926
971
  "capitalize",
@@ -935,6 +980,17 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
935
980
  "antialiased",
936
981
  "sr-only",
937
982
  "not-sr-only",
983
+ // Font variant numeric
984
+ "normal-nums",
985
+ "ordinal",
986
+ "slashed-zero",
987
+ "lining-nums",
988
+ "oldstyle-nums",
989
+ "proportional-nums",
990
+ "tabular-nums",
991
+ "diagonal-fractions",
992
+ "stacked-fractions",
993
+ // Flexbox
938
994
  "flex-row",
939
995
  "flex-col",
940
996
  "flex-row-reverse",
@@ -963,15 +1019,19 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
963
1019
  "content-between",
964
1020
  "content-around",
965
1021
  "content-evenly",
1022
+ "content-stretch",
966
1023
  "self-start",
967
1024
  "self-end",
968
1025
  "self-center",
969
1026
  "self-auto",
970
1027
  "self-stretch",
1028
+ "self-baseline",
1029
+ // Text align
971
1030
  "text-left",
972
1031
  "text-right",
973
1032
  "text-center",
974
1033
  "text-justify",
1034
+ // Font weight shortcuts
975
1035
  "font-thin",
976
1036
  "font-extralight",
977
1037
  "font-light",
@@ -981,6 +1041,7 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
981
1041
  "font-bold",
982
1042
  "font-extrabold",
983
1043
  "font-black",
1044
+ // Overflow
984
1045
  "overflow-hidden",
985
1046
  "overflow-visible",
986
1047
  "overflow-scroll",
@@ -991,11 +1052,23 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
991
1052
  "overflow-y-hidden",
992
1053
  "overflow-y-scroll",
993
1054
  "overflow-y-auto",
1055
+ // Object fit
994
1056
  "object-contain",
995
1057
  "object-cover",
996
1058
  "object-fill",
997
1059
  "object-none",
998
1060
  "object-scale-down",
1061
+ // Object position
1062
+ "object-center",
1063
+ "object-top",
1064
+ "object-bottom",
1065
+ "object-left",
1066
+ "object-right",
1067
+ "object-left-top",
1068
+ "object-left-bottom",
1069
+ "object-right-top",
1070
+ "object-right-bottom",
1071
+ // Border
999
1072
  "border-solid",
1000
1073
  "border-dashed",
1001
1074
  "border-dotted",
@@ -1004,9 +1077,15 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
1004
1077
  "border-r",
1005
1078
  "border-b",
1006
1079
  "border-l",
1080
+ "border-collapse",
1081
+ "border-separate",
1082
+ // Lists
1007
1083
  "list-none",
1008
1084
  "list-disc",
1009
1085
  "list-decimal",
1086
+ "list-inside",
1087
+ "list-outside",
1088
+ // Cursor / select
1010
1089
  "cursor-auto",
1011
1090
  "cursor-default",
1012
1091
  "cursor-pointer",
@@ -1020,6 +1099,7 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
1020
1099
  "select-auto",
1021
1100
  "pointer-events-none",
1022
1101
  "pointer-events-auto",
1102
+ // Whitespace / word break
1023
1103
  "whitespace-normal",
1024
1104
  "whitespace-nowrap",
1025
1105
  "whitespace-pre",
@@ -1028,19 +1108,129 @@ var STANDALONE_UTILITIES = /* @__PURE__ */ new Set([
1028
1108
  "break-normal",
1029
1109
  "break-words",
1030
1110
  "break-all",
1111
+ // Background clip
1031
1112
  "bg-clip-border",
1032
1113
  "bg-clip-padding",
1033
1114
  "bg-clip-content",
1034
1115
  "bg-clip-text",
1116
+ // Background size
1117
+ "bg-auto",
1118
+ "bg-cover",
1119
+ "bg-contain",
1120
+ // Background position
1121
+ "bg-center",
1122
+ "bg-top",
1123
+ "bg-bottom",
1124
+ "bg-left",
1125
+ "bg-right",
1126
+ "bg-left-top",
1127
+ "bg-left-bottom",
1128
+ "bg-right-top",
1129
+ "bg-right-bottom",
1130
+ // Background repeat
1131
+ "bg-repeat",
1132
+ "bg-no-repeat",
1133
+ "bg-repeat-x",
1134
+ "bg-repeat-y",
1135
+ "bg-repeat-round",
1136
+ "bg-repeat-space",
1137
+ // Background attachment
1138
+ "bg-fixed",
1139
+ "bg-local",
1140
+ "bg-scroll",
1141
+ // Background image
1142
+ "bg-none",
1143
+ // Box sizing
1035
1144
  "box-border",
1036
1145
  "box-content",
1146
+ // Resize
1037
1147
  "resize",
1038
1148
  "resize-none",
1039
1149
  "resize-y",
1040
1150
  "resize-x",
1151
+ // Outline
1041
1152
  "appearance-none",
1042
1153
  "outline-none",
1043
- "outline"
1154
+ "outline",
1155
+ // Table
1156
+ "table",
1157
+ "table-auto",
1158
+ "table-fixed",
1159
+ "caption-top",
1160
+ "caption-bottom",
1161
+ // CSS filters (standalone = default/full effect)
1162
+ "grayscale",
1163
+ "invert",
1164
+ "sepia",
1165
+ // Isolation
1166
+ "isolate",
1167
+ "isolation-auto",
1168
+ // Backface visibility (both platforms)
1169
+ "backface-visible",
1170
+ "backface-hidden",
1171
+ // Divide none
1172
+ "divide-none",
1173
+ // Group / peer markers (no-op style; needed so isKnownUtility recognises them)
1174
+ "group",
1175
+ "peer",
1176
+ // Text-wrap (web-only)
1177
+ "text-wrap",
1178
+ "text-nowrap",
1179
+ "text-balance",
1180
+ "text-pretty",
1181
+ // Screen sizing
1182
+ "w-screen",
1183
+ "min-h-screen",
1184
+ "max-h-screen",
1185
+ "min-w-screen",
1186
+ "max-w-screen",
1187
+ // Extended cursors (web-only)
1188
+ "cursor-grab",
1189
+ "cursor-grabbing",
1190
+ "cursor-zoom-in",
1191
+ "cursor-zoom-out",
1192
+ "cursor-crosshair",
1193
+ "cursor-help",
1194
+ "cursor-none",
1195
+ // Overflow clip (web-only)
1196
+ "overflow-clip",
1197
+ "overflow-x-clip",
1198
+ "overflow-y-clip",
1199
+ // Scroll behavior (web-only)
1200
+ "scroll-smooth",
1201
+ "scroll-auto",
1202
+ // Float & clear (web-only)
1203
+ "float-left",
1204
+ "float-right",
1205
+ "float-start",
1206
+ "float-end",
1207
+ "float-none",
1208
+ "clear-left",
1209
+ "clear-right",
1210
+ "clear-both",
1211
+ "clear-start",
1212
+ "clear-end",
1213
+ "clear-none",
1214
+ // Vertical align (web-only)
1215
+ "align-baseline",
1216
+ "align-top",
1217
+ "align-middle",
1218
+ "align-bottom",
1219
+ "align-text-top",
1220
+ "align-text-bottom",
1221
+ "align-sub",
1222
+ "align-super",
1223
+ // Touch action (web-only)
1224
+ "touch-auto",
1225
+ "touch-none",
1226
+ "touch-pan-x",
1227
+ "touch-pan-y",
1228
+ "touch-pan-left",
1229
+ "touch-pan-right",
1230
+ "touch-pan-up",
1231
+ "touch-pan-down",
1232
+ "touch-pinch-zoom",
1233
+ "touch-manipulation"
1044
1234
  ]);
1045
1235
  function parseClass(className) {
1046
1236
  const trimmed = className.trim();
@@ -1058,6 +1248,11 @@ function parseClass(className) {
1058
1248
  break;
1059
1249
  }
1060
1250
  }
1251
+ let important = false;
1252
+ if (remaining.startsWith("!") && remaining.length > 1) {
1253
+ important = true;
1254
+ remaining = remaining.slice(1);
1255
+ }
1061
1256
  let negative = false;
1062
1257
  if (remaining.startsWith("-") && remaining.length > 1 && remaining[1] !== "-") {
1063
1258
  negative = true;
@@ -1067,18 +1262,18 @@ function parseClass(className) {
1067
1262
  if (bracketStart > 0 && remaining.endsWith("]")) {
1068
1263
  const utility = remaining.slice(0, bracketStart);
1069
1264
  const value = remaining.slice(bracketStart + 2, -1);
1070
- return { original: trimmed, modifiers, negative, utility, value, isArbitrary: true };
1265
+ return { original: trimmed, modifiers, negative, important, utility, value, isArbitrary: true };
1071
1266
  }
1072
1267
  if (STANDALONE_UTILITIES.has(remaining)) {
1073
- return { original: trimmed, modifiers, negative, utility: remaining, value: "", isArbitrary: false };
1268
+ return { original: trimmed, modifiers, negative, important, utility: remaining, value: "", isArbitrary: false };
1074
1269
  }
1075
1270
  for (const prefix of SORTED_PREFIXES) {
1076
1271
  if (remaining === prefix) {
1077
- return { original: trimmed, modifiers, negative, utility: prefix, value: "", isArbitrary: false };
1272
+ return { original: trimmed, modifiers, negative, important, utility: prefix, value: "", isArbitrary: false };
1078
1273
  }
1079
1274
  if (remaining.startsWith(prefix + "-")) {
1080
1275
  const value = remaining.slice(prefix.length + 1);
1081
- return { original: trimmed, modifiers, negative, utility: prefix, value, isArbitrary: false };
1276
+ return { original: trimmed, modifiers, negative, important, utility: prefix, value, isArbitrary: false };
1082
1277
  }
1083
1278
  }
1084
1279
  const firstDash = remaining.indexOf("-");
@@ -1087,12 +1282,13 @@ function parseClass(className) {
1087
1282
  original: trimmed,
1088
1283
  modifiers,
1089
1284
  negative,
1285
+ important,
1090
1286
  utility: remaining.slice(0, firstDash),
1091
1287
  value: remaining.slice(firstDash + 1),
1092
1288
  isArbitrary: false
1093
1289
  };
1094
1290
  }
1095
- return { original: trimmed, modifiers, negative, utility: remaining, value: "", isArbitrary: false };
1291
+ return { original: trimmed, modifiers, negative, important, utility: remaining, value: "", isArbitrary: false };
1096
1292
  }
1097
1293
  function parseClasses(classString) {
1098
1294
  const results = [];
@@ -1214,6 +1410,8 @@ function resolveFontSize(value, fontSizes, isArbitrary) {
1214
1410
  if (isArbitrary) return isWeb ? value : toNativeValue(value);
1215
1411
  return fontSizes[value] ?? null;
1216
1412
  }
1413
+ 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,)";
1414
+ 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,)";
1217
1415
  var STANDALONE = {
1218
1416
  // Display
1219
1417
  // React Native only supports display:'flex'|'none'. Setting 'flex' explicitly is
@@ -1264,12 +1462,14 @@ var STANDALONE = {
1264
1462
  "content-between": { alignContent: "space-between" },
1265
1463
  "content-around": { alignContent: "space-around" },
1266
1464
  "content-evenly": { alignContent: "space-evenly" },
1465
+ "content-stretch": { alignContent: "stretch" },
1267
1466
  // Align self (both)
1268
1467
  "self-auto": { alignSelf: "auto" },
1269
1468
  "self-start": { alignSelf: "flex-start" },
1270
1469
  "self-end": { alignSelf: "flex-end" },
1271
1470
  "self-center": { alignSelf: "center" },
1272
1471
  "self-stretch": { alignSelf: "stretch" },
1472
+ "self-baseline": { alignSelf: "baseline" },
1273
1473
  // Text align (both)
1274
1474
  "text-left": { textAlign: "left" },
1275
1475
  "text-right": { textAlign: "right" },
@@ -1402,7 +1602,139 @@ var STANDALONE = {
1402
1602
  "bg-clip-border": isWeb ? { backgroundClip: "border-box" } : null,
1403
1603
  "bg-clip-padding": isWeb ? { backgroundClip: "padding-box" } : null,
1404
1604
  "bg-clip-content": isWeb ? { backgroundClip: "content-box" } : null,
1405
- "bg-clip-text": isWeb ? { backgroundClip: "text", WebkitBackgroundClip: "text" } : null
1605
+ "bg-clip-text": isWeb ? { backgroundClip: "text", WebkitBackgroundClip: "text" } : null,
1606
+ // Background image
1607
+ "bg-none": isWeb ? { backgroundImage: "none" } : null,
1608
+ // Background size (web-only)
1609
+ "bg-auto": isWeb ? { backgroundSize: "auto" } : null,
1610
+ "bg-cover": isWeb ? { backgroundSize: "cover" } : null,
1611
+ "bg-contain": isWeb ? { backgroundSize: "contain" } : null,
1612
+ // Background position (web-only)
1613
+ "bg-center": isWeb ? { backgroundPosition: "center" } : null,
1614
+ "bg-top": isWeb ? { backgroundPosition: "top" } : null,
1615
+ "bg-bottom": isWeb ? { backgroundPosition: "bottom" } : null,
1616
+ "bg-left": isWeb ? { backgroundPosition: "left" } : null,
1617
+ "bg-right": isWeb ? { backgroundPosition: "right" } : null,
1618
+ "bg-left-top": isWeb ? { backgroundPosition: "left top" } : null,
1619
+ "bg-left-bottom": isWeb ? { backgroundPosition: "left bottom" } : null,
1620
+ "bg-right-top": isWeb ? { backgroundPosition: "right top" } : null,
1621
+ "bg-right-bottom": isWeb ? { backgroundPosition: "right bottom" } : null,
1622
+ // Background repeat (web-only)
1623
+ "bg-repeat": isWeb ? { backgroundRepeat: "repeat" } : null,
1624
+ "bg-no-repeat": isWeb ? { backgroundRepeat: "no-repeat" } : null,
1625
+ "bg-repeat-x": isWeb ? { backgroundRepeat: "repeat-x" } : null,
1626
+ "bg-repeat-y": isWeb ? { backgroundRepeat: "repeat-y" } : null,
1627
+ "bg-repeat-round": isWeb ? { backgroundRepeat: "round" } : null,
1628
+ "bg-repeat-space": isWeb ? { backgroundRepeat: "space" } : null,
1629
+ // Background attachment (web-only)
1630
+ "bg-fixed": isWeb ? { backgroundAttachment: "fixed" } : null,
1631
+ "bg-local": isWeb ? { backgroundAttachment: "local" } : null,
1632
+ "bg-scroll": isWeb ? { backgroundAttachment: "scroll" } : null,
1633
+ // Object position (web-only)
1634
+ "object-center": isWeb ? { objectPosition: "center" } : null,
1635
+ "object-top": isWeb ? { objectPosition: "top" } : null,
1636
+ "object-bottom": isWeb ? { objectPosition: "bottom" } : null,
1637
+ "object-left": isWeb ? { objectPosition: "left" } : null,
1638
+ "object-right": isWeb ? { objectPosition: "right" } : null,
1639
+ "object-left-top": isWeb ? { objectPosition: "left top" } : null,
1640
+ "object-left-bottom": isWeb ? { objectPosition: "left bottom" } : null,
1641
+ "object-right-top": isWeb ? { objectPosition: "right top" } : null,
1642
+ "object-right-bottom": isWeb ? { objectPosition: "right bottom" } : null,
1643
+ // Table (web-only)
1644
+ table: isWeb ? { display: "table" } : null,
1645
+ "table-auto": isWeb ? { tableLayout: "auto" } : null,
1646
+ "table-fixed": isWeb ? { tableLayout: "fixed" } : null,
1647
+ "caption-top": isWeb ? { captionSide: "top" } : null,
1648
+ "caption-bottom": isWeb ? { captionSide: "bottom" } : null,
1649
+ "border-collapse": isWeb ? { borderCollapse: "collapse" } : null,
1650
+ "border-separate": isWeb ? { borderCollapse: "separate" } : null,
1651
+ // List style position (web-only)
1652
+ "list-inside": isWeb ? { listStylePosition: "inside" } : null,
1653
+ "list-outside": isWeb ? { listStylePosition: "outside" } : null,
1654
+ // Font variant numeric (web-only)
1655
+ "normal-nums": isWeb ? { fontVariantNumeric: "normal" } : null,
1656
+ ordinal: isWeb ? { fontVariantNumeric: "ordinal" } : null,
1657
+ "slashed-zero": isWeb ? { fontVariantNumeric: "slashed-zero" } : null,
1658
+ "lining-nums": isWeb ? { fontVariantNumeric: "lining-nums" } : null,
1659
+ "oldstyle-nums": isWeb ? { fontVariantNumeric: "oldstyle-nums" } : null,
1660
+ "proportional-nums": isWeb ? { fontVariantNumeric: "proportional-nums" } : null,
1661
+ "tabular-nums": isWeb ? { fontVariantNumeric: "tabular-nums" } : null,
1662
+ "diagonal-fractions": isWeb ? { fontVariantNumeric: "diagonal-fractions" } : null,
1663
+ "stacked-fractions": isWeb ? { fontVariantNumeric: "stacked-fractions" } : null,
1664
+ // Isolation (web-only)
1665
+ isolate: isWeb ? { isolation: "isolate" } : null,
1666
+ "isolation-auto": isWeb ? { isolation: "auto" } : null,
1667
+ // Backface visibility (both iOS and Android)
1668
+ "backface-visible": { backfaceVisibility: "visible" },
1669
+ "backface-hidden": { backfaceVisibility: "hidden" },
1670
+ // CSS filters — standalone = default/full effect (web-only)
1671
+ grayscale: isWeb ? { "--tw-grayscale": "grayscale(100%)", filter: FILTER_COMPOSE } : null,
1672
+ invert: isWeb ? { "--tw-invert": "invert(100%)", filter: FILTER_COMPOSE } : null,
1673
+ sepia: isWeb ? { "--tw-sepia": "sepia(100%)", filter: FILTER_COMPOSE } : null,
1674
+ // Divide none
1675
+ "divide-none": isWeb ? { __divideX: 0, __divideY: 0 } : null,
1676
+ // Group / peer markers (no-op: no style emitted; just ensures isKnownUtility returns true)
1677
+ group: isWeb ? {} : null,
1678
+ peer: isWeb ? {} : null,
1679
+ // Text-wrap (web-only)
1680
+ "text-wrap": isWeb ? { textWrap: "wrap" } : null,
1681
+ "text-nowrap": isWeb ? { textWrap: "nowrap" } : null,
1682
+ "text-balance": isWeb ? { textWrap: "balance" } : null,
1683
+ "text-pretty": isWeb ? { textWrap: "pretty" } : null,
1684
+ // Screen sizing (vw values are web-only; vh values work cross-platform via spacing scale for h-*)
1685
+ "w-screen": isWeb ? { width: "100vw" } : null,
1686
+ "min-h-screen": { minHeight: "100vh" },
1687
+ "max-h-screen": { maxHeight: "100vh" },
1688
+ "min-w-screen": isWeb ? { minWidth: "100vw" } : null,
1689
+ "max-w-screen": isWeb ? { maxWidth: "100vw" } : null,
1690
+ // Extended cursors (web-only)
1691
+ "cursor-grab": isWeb ? { cursor: "grab" } : null,
1692
+ "cursor-grabbing": isWeb ? { cursor: "grabbing" } : null,
1693
+ "cursor-zoom-in": isWeb ? { cursor: "zoom-in" } : null,
1694
+ "cursor-zoom-out": isWeb ? { cursor: "zoom-out" } : null,
1695
+ "cursor-crosshair": isWeb ? { cursor: "crosshair" } : null,
1696
+ "cursor-help": isWeb ? { cursor: "help" } : null,
1697
+ "cursor-none": isWeb ? { cursor: "none" } : null,
1698
+ // Overflow clip (web-only)
1699
+ "overflow-clip": isWeb ? { overflow: "clip" } : null,
1700
+ "overflow-x-clip": isWeb ? { overflowX: "clip" } : null,
1701
+ "overflow-y-clip": isWeb ? { overflowY: "clip" } : null,
1702
+ // Scroll behavior (web-only)
1703
+ "scroll-smooth": isWeb ? { scrollBehavior: "smooth" } : null,
1704
+ "scroll-auto": isWeb ? { scrollBehavior: "auto" } : null,
1705
+ // Float (web-only)
1706
+ "float-left": isWeb ? { float: "left" } : null,
1707
+ "float-right": isWeb ? { float: "right" } : null,
1708
+ "float-start": isWeb ? { float: "inline-start" } : null,
1709
+ "float-end": isWeb ? { float: "inline-end" } : null,
1710
+ "float-none": isWeb ? { float: "none" } : null,
1711
+ // Clear (web-only)
1712
+ "clear-left": isWeb ? { clear: "left" } : null,
1713
+ "clear-right": isWeb ? { clear: "right" } : null,
1714
+ "clear-both": isWeb ? { clear: "both" } : null,
1715
+ "clear-start": isWeb ? { clear: "inline-start" } : null,
1716
+ "clear-end": isWeb ? { clear: "inline-end" } : null,
1717
+ "clear-none": isWeb ? { clear: "none" } : null,
1718
+ // Vertical align (web-only)
1719
+ "align-baseline": isWeb ? { verticalAlign: "baseline" } : null,
1720
+ "align-top": isWeb ? { verticalAlign: "top" } : null,
1721
+ "align-middle": isWeb ? { verticalAlign: "middle" } : null,
1722
+ "align-bottom": isWeb ? { verticalAlign: "bottom" } : null,
1723
+ "align-text-top": isWeb ? { verticalAlign: "text-top" } : null,
1724
+ "align-text-bottom": isWeb ? { verticalAlign: "text-bottom" } : null,
1725
+ "align-sub": isWeb ? { verticalAlign: "sub" } : null,
1726
+ "align-super": isWeb ? { verticalAlign: "super" } : null,
1727
+ // Touch action (web-only)
1728
+ "touch-auto": isWeb ? { touchAction: "auto" } : null,
1729
+ "touch-none": isWeb ? { touchAction: "none" } : null,
1730
+ "touch-pan-x": isWeb ? { touchAction: "pan-x" } : null,
1731
+ "touch-pan-y": isWeb ? { touchAction: "pan-y" } : null,
1732
+ "touch-pan-left": isWeb ? { touchAction: "pan-left" } : null,
1733
+ "touch-pan-right": isWeb ? { touchAction: "pan-right" } : null,
1734
+ "touch-pan-up": isWeb ? { touchAction: "pan-up" } : null,
1735
+ "touch-pan-down": isWeb ? { touchAction: "pan-down" } : null,
1736
+ "touch-pinch-zoom": isWeb ? { touchAction: "pinch-zoom" } : null,
1737
+ "touch-manipulation": isWeb ? { touchAction: "manipulation" } : null
1406
1738
  };
1407
1739
  var RESOLVERS = {
1408
1740
  // ── Background ─────────────────────────────────────────────────────────────
@@ -1734,6 +2066,545 @@ var RESOLVERS = {
1734
2066
  if (isArbitrary) return { gridRow: value };
1735
2067
  return null;
1736
2068
  },
2069
+ // ── Grid alignment (web-only) ──────────────────────────────────────────────
2070
+ // place-items is shorthand for align-items + justify-items on a grid container
2071
+ "place-items": ({ value }) => {
2072
+ if (!isWeb) return null;
2073
+ const map = {
2074
+ start: "start",
2075
+ end: "end",
2076
+ center: "center",
2077
+ stretch: "stretch",
2078
+ baseline: "baseline"
2079
+ };
2080
+ return map[value] ? { placeItems: map[value] } : null;
2081
+ },
2082
+ // place-content is shorthand for align-content + justify-content on a grid container
2083
+ "place-content": ({ value }) => {
2084
+ if (!isWeb) return null;
2085
+ const map = {
2086
+ start: "start",
2087
+ end: "end",
2088
+ center: "center",
2089
+ stretch: "stretch",
2090
+ between: "space-between",
2091
+ around: "space-around",
2092
+ evenly: "space-evenly",
2093
+ baseline: "baseline"
2094
+ };
2095
+ return map[value] ? { placeContent: map[value] } : null;
2096
+ },
2097
+ // justify-items controls inline-axis alignment of grid items within their cells
2098
+ "justify-items": ({ value }) => {
2099
+ if (!isWeb) return null;
2100
+ const map = {
2101
+ start: "start",
2102
+ end: "end",
2103
+ center: "center",
2104
+ stretch: "stretch"
2105
+ };
2106
+ return map[value] ? { justifyItems: map[value] } : null;
2107
+ },
2108
+ // place-self is shorthand for align-self + justify-self on a grid item
2109
+ "place-self": ({ value }) => {
2110
+ if (!isWeb) return null;
2111
+ const map = {
2112
+ auto: "auto",
2113
+ start: "start",
2114
+ end: "end",
2115
+ center: "center",
2116
+ stretch: "stretch"
2117
+ };
2118
+ return map[value] ? { placeSelf: map[value] } : null;
2119
+ },
2120
+ // justify-self controls inline-axis self-alignment of a grid item
2121
+ "justify-self": ({ value }) => {
2122
+ if (!isWeb) return null;
2123
+ const map = {
2124
+ auto: "auto",
2125
+ start: "start",
2126
+ end: "end",
2127
+ center: "center",
2128
+ stretch: "stretch"
2129
+ };
2130
+ return map[value] ? { justifySelf: map[value] } : null;
2131
+ },
2132
+ // ── CSS Filters (composable via CSS variables, web-only) ─────────────────
2133
+ blur: ({ value, isArbitrary }) => {
2134
+ if (!isWeb) return null;
2135
+ const sizes = {
2136
+ "": "blur(8px)",
2137
+ sm: "blur(4px)",
2138
+ md: "blur(12px)",
2139
+ lg: "blur(16px)",
2140
+ xl: "blur(24px)",
2141
+ "2xl": "blur(40px)",
2142
+ "3xl": "blur(64px)"
2143
+ };
2144
+ if (value === "none") return { "--tw-blur": "", filter: FILTER_COMPOSE };
2145
+ const v = isArbitrary ? `blur(${value})` : sizes[value];
2146
+ return v !== void 0 ? { "--tw-blur": v, filter: FILTER_COMPOSE } : null;
2147
+ },
2148
+ brightness: ({ value, isArbitrary }) => {
2149
+ if (!isWeb) return null;
2150
+ const v = isArbitrary ? `brightness(${value})` : `brightness(${parseFloat(value) / 100})`;
2151
+ return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-brightness": v, filter: FILTER_COMPOSE };
2152
+ },
2153
+ contrast: ({ value, isArbitrary }) => {
2154
+ if (!isWeb) return null;
2155
+ const v = isArbitrary ? `contrast(${value})` : `contrast(${parseFloat(value) / 100})`;
2156
+ return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-contrast": v, filter: FILTER_COMPOSE };
2157
+ },
2158
+ grayscale: ({ value }) => {
2159
+ if (!isWeb) return null;
2160
+ const v = value === "0" ? "grayscale(0)" : "grayscale(100%)";
2161
+ return { "--tw-grayscale": v, filter: FILTER_COMPOSE };
2162
+ },
2163
+ "hue-rotate": ({ value, negative, isArbitrary }) => {
2164
+ if (!isWeb) return null;
2165
+ const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2166
+ if (isNaN(parseFloat(deg)) && !isArbitrary) return null;
2167
+ return { "--tw-hue-rotate": `hue-rotate(${deg})`, filter: FILTER_COMPOSE };
2168
+ },
2169
+ invert: ({ value }) => {
2170
+ if (!isWeb) return null;
2171
+ const v = value === "0" ? "invert(0)" : "invert(100%)";
2172
+ return { "--tw-invert": v, filter: FILTER_COMPOSE };
2173
+ },
2174
+ saturate: ({ value, isArbitrary }) => {
2175
+ if (!isWeb) return null;
2176
+ const v = isArbitrary ? `saturate(${value})` : `saturate(${parseFloat(value) / 100})`;
2177
+ return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-saturate": v, filter: FILTER_COMPOSE };
2178
+ },
2179
+ sepia: ({ value }) => {
2180
+ if (!isWeb) return null;
2181
+ const v = value === "0" ? "sepia(0)" : "sepia(100%)";
2182
+ return { "--tw-sepia": v, filter: FILTER_COMPOSE };
2183
+ },
2184
+ "drop-shadow": ({ value, isArbitrary }) => {
2185
+ if (!isWeb) return null;
2186
+ if (isArbitrary) return { "--tw-drop-shadow": `drop-shadow(${value.replace(/_/g, " ")})`, filter: FILTER_COMPOSE };
2187
+ const presets = {
2188
+ "": "drop-shadow(0 1px 2px rgb(0 0 0/0.1)) drop-shadow(0 1px 1px rgb(0 0 0/0.06))",
2189
+ sm: "drop-shadow(0 1px 1px rgb(0 0 0/0.05))",
2190
+ md: "drop-shadow(0 4px 3px rgb(0 0 0/0.07)) drop-shadow(0 2px 2px rgb(0 0 0/0.06))",
2191
+ lg: "drop-shadow(0 10px 8px rgb(0 0 0/0.04)) drop-shadow(0 4px 3px rgb(0 0 0/0.1))",
2192
+ xl: "drop-shadow(0 20px 13px rgb(0 0 0/0.03)) drop-shadow(0 8px 5px rgb(0 0 0/0.08))",
2193
+ "2xl": "drop-shadow(0 25px 25px rgb(0 0 0/0.15))",
2194
+ none: "drop-shadow(0 0 #0000)"
2195
+ };
2196
+ const v = presets[value];
2197
+ return v !== void 0 ? { "--tw-drop-shadow": v, filter: FILTER_COMPOSE } : null;
2198
+ },
2199
+ // Arbitrary full filter string: filter-[blur(4px)_grayscale(1)]
2200
+ filter: ({ value, isArbitrary }) => {
2201
+ if (!isWeb) return null;
2202
+ if (isArbitrary) return { filter: value.replace(/_/g, " ") };
2203
+ if (value === "none") return { filter: "none" };
2204
+ return null;
2205
+ },
2206
+ // ── Backdrop Filters (composable via CSS variables, web-only) ────────────
2207
+ "backdrop-blur": ({ value, isArbitrary }) => {
2208
+ if (!isWeb) return null;
2209
+ const sizes = {
2210
+ "": "blur(8px)",
2211
+ sm: "blur(4px)",
2212
+ md: "blur(12px)",
2213
+ lg: "blur(16px)",
2214
+ xl: "blur(24px)",
2215
+ "2xl": "blur(40px)",
2216
+ "3xl": "blur(64px)"
2217
+ };
2218
+ if (value === "none") return { "--tw-backdrop-blur": "", backdropFilter: BACKDROP_FILTER_COMPOSE };
2219
+ const v = isArbitrary ? `blur(${value})` : sizes[value];
2220
+ return v !== void 0 ? { "--tw-backdrop-blur": v, backdropFilter: BACKDROP_FILTER_COMPOSE } : null;
2221
+ },
2222
+ "backdrop-brightness": ({ value, isArbitrary }) => {
2223
+ if (!isWeb) return null;
2224
+ const v = isArbitrary ? `brightness(${value})` : `brightness(${parseFloat(value) / 100})`;
2225
+ return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-brightness": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2226
+ },
2227
+ "backdrop-contrast": ({ value, isArbitrary }) => {
2228
+ if (!isWeb) return null;
2229
+ const v = isArbitrary ? `contrast(${value})` : `contrast(${parseFloat(value) / 100})`;
2230
+ return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-contrast": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2231
+ },
2232
+ "backdrop-grayscale": ({ value }) => {
2233
+ if (!isWeb) return null;
2234
+ return { "--tw-backdrop-grayscale": value === "0" ? "grayscale(0)" : "grayscale(100%)", backdropFilter: BACKDROP_FILTER_COMPOSE };
2235
+ },
2236
+ "backdrop-hue-rotate": ({ value, negative, isArbitrary }) => {
2237
+ if (!isWeb) return null;
2238
+ const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2239
+ if (isNaN(parseFloat(deg)) && !isArbitrary) return null;
2240
+ return { "--tw-backdrop-hue-rotate": `hue-rotate(${deg})`, backdropFilter: BACKDROP_FILTER_COMPOSE };
2241
+ },
2242
+ "backdrop-invert": ({ value }) => {
2243
+ if (!isWeb) return null;
2244
+ return { "--tw-backdrop-invert": value === "0" ? "invert(0)" : "invert(100%)", backdropFilter: BACKDROP_FILTER_COMPOSE };
2245
+ },
2246
+ "backdrop-opacity": ({ value, isArbitrary }) => {
2247
+ if (!isWeb) return null;
2248
+ const v = isArbitrary ? `opacity(${value})` : `opacity(${parseFloat(value) / 100})`;
2249
+ return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-opacity": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2250
+ },
2251
+ "backdrop-saturate": ({ value, isArbitrary }) => {
2252
+ if (!isWeb) return null;
2253
+ const v = isArbitrary ? `saturate(${value})` : `saturate(${parseFloat(value) / 100})`;
2254
+ return isNaN(parseFloat(value)) && !isArbitrary ? null : { "--tw-backdrop-saturate": v, backdropFilter: BACKDROP_FILTER_COMPOSE };
2255
+ },
2256
+ "backdrop-sepia": ({ value }) => {
2257
+ if (!isWeb) return null;
2258
+ return { "--tw-backdrop-sepia": value === "0" ? "sepia(0)" : "sepia(100%)", backdropFilter: BACKDROP_FILTER_COMPOSE };
2259
+ },
2260
+ "backdrop-filter": ({ value, isArbitrary }) => {
2261
+ if (!isWeb) return null;
2262
+ if (isArbitrary) return { backdropFilter: value.replace(/_/g, " ") };
2263
+ if (value === "none") return { backdropFilter: "none" };
2264
+ return null;
2265
+ },
2266
+ // ── Background gradient (CSS variable gradient stops, web-only) ──────────
2267
+ "bg-gradient-to": ({ value }) => {
2268
+ if (!isWeb) return null;
2269
+ const directions = {
2270
+ t: "to top",
2271
+ tr: "to top right",
2272
+ r: "to right",
2273
+ br: "to bottom right",
2274
+ b: "to bottom",
2275
+ bl: "to bottom left",
2276
+ l: "to left",
2277
+ tl: "to top left"
2278
+ };
2279
+ const dir = directions[value];
2280
+ if (!dir) return null;
2281
+ return {
2282
+ backgroundImage: `linear-gradient(${dir}, var(--tw-gradient-from, transparent), var(--tw-gradient-stops, transparent))`
2283
+ };
2284
+ },
2285
+ from: ({ value, isArbitrary }, { colors }) => {
2286
+ if (!isWeb) return null;
2287
+ const color = resolveColor(value, colors, isArbitrary);
2288
+ if (!color) return null;
2289
+ return {
2290
+ "--tw-gradient-from": color,
2291
+ "--tw-gradient-stops": `var(--tw-gradient-from), var(--tw-gradient-to, transparent)`
2292
+ };
2293
+ },
2294
+ via: ({ value, isArbitrary }, { colors }) => {
2295
+ if (!isWeb) return null;
2296
+ const color = resolveColor(value, colors, isArbitrary);
2297
+ if (!color) return null;
2298
+ return {
2299
+ "--tw-gradient-via": color,
2300
+ "--tw-gradient-stops": `var(--tw-gradient-from), var(--tw-gradient-via), var(--tw-gradient-to, transparent)`
2301
+ };
2302
+ },
2303
+ to: ({ value, isArbitrary }, { colors }) => {
2304
+ if (!isWeb) return null;
2305
+ const color = resolveColor(value, colors, isArbitrary);
2306
+ if (!color) return null;
2307
+ return { "--tw-gradient-to": color };
2308
+ },
2309
+ // ── Transform extras (web-only) ───────────────────────────────────────────
2310
+ "skew-x": ({ value, negative, isArbitrary }) => {
2311
+ const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2312
+ if (!isArbitrary && isNaN(parseFloat(value))) return null;
2313
+ return isWeb ? { transform: `skewX(${deg})` } : { transform: [{ skewX: deg }] };
2314
+ },
2315
+ "skew-y": ({ value, negative, isArbitrary }) => {
2316
+ const deg = isArbitrary ? value : `${(negative ? -1 : 1) * parseFloat(value)}deg`;
2317
+ if (!isArbitrary && isNaN(parseFloat(value))) return null;
2318
+ return isWeb ? { transform: `skewY(${deg})` } : { transform: [{ skewY: deg }] };
2319
+ },
2320
+ // Arbitrary full transform string: transform-[rotate(45deg)_scale(1.5)]
2321
+ transform: ({ value, isArbitrary }) => {
2322
+ if (!isWeb) return null;
2323
+ if (isArbitrary) return { transform: value.replace(/_/g, " ") };
2324
+ if (value === "none") return { transform: "none" };
2325
+ return null;
2326
+ },
2327
+ // Transform origin
2328
+ origin: ({ value, isArbitrary }) => {
2329
+ if (!isWeb) return null;
2330
+ if (isArbitrary) return { transformOrigin: value.replace(/_/g, " ") };
2331
+ const origins = {
2332
+ center: "center",
2333
+ top: "top",
2334
+ "top-right": "top right",
2335
+ right: "right",
2336
+ "bottom-right": "bottom right",
2337
+ bottom: "bottom",
2338
+ "bottom-left": "bottom left",
2339
+ left: "left",
2340
+ "top-left": "top left"
2341
+ };
2342
+ return origins[value] ? { transformOrigin: origins[value] } : null;
2343
+ },
2344
+ // ── Text decoration advanced (web-only) ───────────────────────────────────
2345
+ decoration: ({ value, isArbitrary }, { colors }) => {
2346
+ if (!isWeb) return null;
2347
+ if (isArbitrary) {
2348
+ if (/^\d/.test(value) || value.startsWith("calc(")) return { textDecorationThickness: value };
2349
+ return { textDecorationColor: value };
2350
+ }
2351
+ const thickTokens = {
2352
+ auto: "auto",
2353
+ "from-font": "from-font",
2354
+ "0": "0px",
2355
+ "1": "1px",
2356
+ "2": "2px",
2357
+ "4": "4px",
2358
+ "8": "8px"
2359
+ };
2360
+ if (value in thickTokens) return { textDecorationThickness: thickTokens[value] };
2361
+ const styleTokens = {
2362
+ solid: "solid",
2363
+ dashed: "dashed",
2364
+ dotted: "dotted",
2365
+ double: "double",
2366
+ wavy: "wavy"
2367
+ };
2368
+ if (value in styleTokens) return { textDecorationStyle: styleTokens[value] };
2369
+ const color = resolveColor(value, colors, false);
2370
+ return color ? { textDecorationColor: color } : null;
2371
+ },
2372
+ "underline-offset": ({ value, isArbitrary }) => {
2373
+ if (!isWeb) return null;
2374
+ if (isArbitrary) return { textUnderlineOffset: value };
2375
+ const offsets = {
2376
+ auto: "auto",
2377
+ "0": "0px",
2378
+ "1": "1px",
2379
+ "2": "2px",
2380
+ "4": "4px",
2381
+ "8": "8px"
2382
+ };
2383
+ return offsets[value] ? { textUnderlineOffset: offsets[value] } : null;
2384
+ },
2385
+ // ── Outline extended (web-only) ───────────────────────────────────────────
2386
+ outline: ({ value, isArbitrary }, { colors }) => {
2387
+ if (!isWeb) return null;
2388
+ if (!value) return { outline: "2px solid transparent", outlineOffset: "2px" };
2389
+ if (value === "none") return { outline: "none", outlineOffset: "0" };
2390
+ if (isArbitrary) {
2391
+ if (/^\d/.test(value) || value.startsWith("calc(")) return { outlineWidth: value };
2392
+ return { outlineColor: value };
2393
+ }
2394
+ const widths = { "0": "0px", "1": "1px", "2": "2px", "4": "4px", "8": "8px" };
2395
+ if (value in widths) return { outlineWidth: widths[value] };
2396
+ const color = resolveColor(value, colors, false);
2397
+ return color ? { outlineColor: color } : null;
2398
+ },
2399
+ "outline-offset": ({ value, isArbitrary }) => {
2400
+ if (!isWeb) return null;
2401
+ if (isArbitrary) return { outlineOffset: value };
2402
+ const offsets = { "0": "0px", "1": "1px", "2": "2px", "4": "4px", "8": "8px" };
2403
+ return offsets[value] ? { outlineOffset: offsets[value] } : null;
2404
+ },
2405
+ // ── Columns (web-only) ─────────────────────────────────────────────────────
2406
+ columns: ({ value, isArbitrary }) => {
2407
+ if (!isWeb) return null;
2408
+ if (isArbitrary) return { columnCount: value };
2409
+ if (value === "auto") return { columnCount: "auto" };
2410
+ const n = parseInt(value, 10);
2411
+ if (!isNaN(n)) return { columnCount: n };
2412
+ const widths = {
2413
+ "3xs": "16rem",
2414
+ "2xs": "18rem",
2415
+ xs: "20rem",
2416
+ sm: "24rem",
2417
+ md: "28rem",
2418
+ lg: "32rem",
2419
+ xl: "36rem",
2420
+ "2xl": "42rem",
2421
+ "3xl": "48rem",
2422
+ "4xl": "56rem",
2423
+ "5xl": "64rem",
2424
+ "6xl": "72rem",
2425
+ "7xl": "80rem"
2426
+ };
2427
+ return widths[value] ? { columnWidth: widths[value] } : null;
2428
+ },
2429
+ // ── Mix blend mode (web-only) ─────────────────────────────────────────────
2430
+ "mix-blend": ({ value }) => {
2431
+ if (!isWeb) return null;
2432
+ const modes = [
2433
+ "normal",
2434
+ "multiply",
2435
+ "screen",
2436
+ "overlay",
2437
+ "darken",
2438
+ "lighten",
2439
+ "color-dodge",
2440
+ "color-burn",
2441
+ "hard-light",
2442
+ "soft-light",
2443
+ "difference",
2444
+ "exclusion",
2445
+ "hue",
2446
+ "saturation",
2447
+ "color",
2448
+ "luminosity",
2449
+ "plus-lighter"
2450
+ ];
2451
+ return modes.includes(value) ? { mixBlendMode: value } : null;
2452
+ },
2453
+ // ── Will-change (web-only) ─────────────────────────────────────────────────
2454
+ "will-change": ({ value, isArbitrary }) => {
2455
+ if (!isWeb) return null;
2456
+ if (isArbitrary) return { willChange: value.replace(/_/g, ", ") };
2457
+ const presets = {
2458
+ auto: "auto",
2459
+ scroll: "scroll-position",
2460
+ contents: "contents",
2461
+ transform: "transform"
2462
+ };
2463
+ return presets[value] ? { willChange: presets[value] } : null;
2464
+ },
2465
+ // ── Divide (child combinator CSS, web-only) ───────────────────────────────
2466
+ // These return special __divide* markers that resolver.ts converts to
2467
+ // .cls > * + * { border-... } CSS rules. No inline style is applied.
2468
+ "divide-x": ({ value, isArbitrary }) => {
2469
+ if (!isWeb) return null;
2470
+ if (value === "reverse") return null;
2471
+ if (!value) return { __divideX: 1 };
2472
+ const n = parseFloat(value);
2473
+ return isNaN(n) ? null : { __divideX: n };
2474
+ },
2475
+ "divide-y": ({ value, isArbitrary }) => {
2476
+ if (!isWeb) return null;
2477
+ if (value === "reverse") return null;
2478
+ if (!value) return { __divideY: 1 };
2479
+ const n = parseFloat(value);
2480
+ return isNaN(n) ? null : { __divideY: n };
2481
+ },
2482
+ divide: ({ value, isArbitrary }, { colors }) => {
2483
+ if (!isWeb) return null;
2484
+ if (isArbitrary) return { __divideColor: value };
2485
+ const styleTokens = {
2486
+ solid: "solid",
2487
+ dashed: "dashed",
2488
+ dotted: "dotted",
2489
+ double: "double",
2490
+ none: "none"
2491
+ };
2492
+ if (value in styleTokens) return { __divideStyle: styleTokens[value] };
2493
+ const color = resolveColor(value, colors, false);
2494
+ return color ? { __divideColor: color } : null;
2495
+ },
2496
+ // ── Text shadow (cross-platform: iOS, Android, web) ─────────────────────
2497
+ // Named presets give cross-platform shadow; arbitrary is web-only.
2498
+ "text-shadow": ({ value, isArbitrary }, { colors }) => {
2499
+ if (value === "none") {
2500
+ return isWeb ? { textShadow: "none" } : { textShadowColor: "transparent", textShadowOffset: { width: 0, height: 0 }, textShadowRadius: 0 };
2501
+ }
2502
+ const webPresets = {
2503
+ "": "0 2px 4px rgba(0,0,0,0.3)",
2504
+ sm: "0 1px 2px rgba(0,0,0,0.3)",
2505
+ md: "0 4px 6px rgba(0,0,0,0.3)",
2506
+ lg: "0 8px 16px rgba(0,0,0,0.5)",
2507
+ xl: "0 16px 32px rgba(0,0,0,0.5)"
2508
+ };
2509
+ const nativePresets = {
2510
+ "": { textShadowColor: "rgba(0,0,0,0.3)", textShadowOffset: { width: 0, height: 2 }, textShadowRadius: 4 },
2511
+ sm: { textShadowColor: "rgba(0,0,0,0.3)", textShadowOffset: { width: 0, height: 1 }, textShadowRadius: 2 },
2512
+ md: { textShadowColor: "rgba(0,0,0,0.3)", textShadowOffset: { width: 0, height: 4 }, textShadowRadius: 6 },
2513
+ lg: { textShadowColor: "rgba(0,0,0,0.5)", textShadowOffset: { width: 0, height: 8 }, textShadowRadius: 16 },
2514
+ xl: { textShadowColor: "rgba(0,0,0,0.5)", textShadowOffset: { width: 0, height: 16 }, textShadowRadius: 32 }
2515
+ };
2516
+ if (value in webPresets) {
2517
+ if (isWeb) return { textShadow: webPresets[value] };
2518
+ return nativePresets[value] ?? null;
2519
+ }
2520
+ if (isArbitrary) {
2521
+ return isWeb ? { textShadow: value.replace(/_/g, " ") } : null;
2522
+ }
2523
+ const color = resolveColor(value, colors, false);
2524
+ if (color) {
2525
+ return isWeb ? { textShadow: `0 2px 4px ${color}` } : { textShadowColor: color };
2526
+ }
2527
+ return null;
2528
+ },
2529
+ // ── Perspective transform (cross-platform: iOS, Android, web) ────────────
2530
+ perspective: ({ value, isArbitrary }) => {
2531
+ if (isArbitrary) {
2532
+ const numPx = parseFloat(value);
2533
+ if (isWeb) return { transform: `perspective(${value})` };
2534
+ return isNaN(numPx) ? null : { transform: [{ perspective: numPx }] };
2535
+ }
2536
+ if (value === "none") return isWeb ? { transform: "none" } : null;
2537
+ const n = parseFloat(value);
2538
+ if (isNaN(n)) return null;
2539
+ return isWeb ? { transform: `perspective(${n}px)` } : { transform: [{ perspective: n }] };
2540
+ },
2541
+ // ── Tint color (native-only, for Image and icon components) ──────────────
2542
+ tint: ({ value, isArbitrary }, { colors }) => {
2543
+ if (isWeb) return null;
2544
+ const color = resolveColor(value, colors, isArbitrary);
2545
+ return color ? { tintColor: color } : null;
2546
+ },
2547
+ // ── Size shorthand (sets width AND height in one utility) ────────────────
2548
+ size: ({ value, isArbitrary }, { spacing }) => {
2549
+ const v = resolveSizing(value, spacing, isArbitrary);
2550
+ return v !== null ? { width: v, height: v } : null;
2551
+ },
2552
+ // ── Animations (CSS keyframe animations, web-only) ────────────────────────
2553
+ // Each variant injects a @keyframes rule once via the __keyframe marker.
2554
+ // resolver.ts detects __keyframe, injects the rule, then strips the marker
2555
+ // so it never reaches element inline styles.
2556
+ animate: ({ value, isArbitrary }) => {
2557
+ if (!isWeb) return null;
2558
+ if (isArbitrary) return { animation: value.replace(/_/g, " ") };
2559
+ const defs = {
2560
+ none: { animation: "none" },
2561
+ spin: {
2562
+ animation: "kb-spin 1s linear infinite",
2563
+ __keyframe: "@keyframes kb-spin { from { transform: rotate(0deg) } to { transform: rotate(360deg) } }"
2564
+ },
2565
+ ping: {
2566
+ animation: "kb-ping 1s cubic-bezier(0,0,0.2,1) infinite",
2567
+ __keyframe: "@keyframes kb-ping { 75%, 100% { transform: scale(2); opacity: 0 } }"
2568
+ },
2569
+ pulse: {
2570
+ animation: "kb-pulse 2s cubic-bezier(0.4,0,0.6,1) infinite",
2571
+ __keyframe: "@keyframes kb-pulse { 0%, 100% { opacity: 1 } 50% { opacity: .5 } }"
2572
+ },
2573
+ bounce: {
2574
+ animation: "kb-bounce 1s infinite",
2575
+ __keyframe: "@keyframes kb-bounce { 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(0.8,0,1,1) } 50% { transform: none; animation-timing-function: cubic-bezier(0,0,0.2,1) } }"
2576
+ }
2577
+ };
2578
+ const def = defs[value];
2579
+ return def ? def : null;
2580
+ },
2581
+ // ── Line-clamp (web-only) ─────────────────────────────────────────────────
2582
+ "line-clamp": ({ value }) => {
2583
+ if (!isWeb) return null;
2584
+ if (value === "none") return { overflow: "visible", display: "block", WebkitLineClamp: "unset" };
2585
+ const n = parseInt(value, 10);
2586
+ if (isNaN(n) || n < 1) return null;
2587
+ return {
2588
+ overflow: "hidden",
2589
+ display: "-webkit-box",
2590
+ WebkitBoxOrient: "vertical",
2591
+ WebkitLineClamp: n
2592
+ };
2593
+ },
2594
+ // ── Caret color (web-only) ────────────────────────────────────────────────
2595
+ caret: ({ value, isArbitrary }, { colors }) => {
2596
+ if (!isWeb) return null;
2597
+ if (value === "auto" || value === "transparent") return { caretColor: value };
2598
+ const color = resolveColor(value, colors, isArbitrary);
2599
+ return color ? { caretColor: color } : null;
2600
+ },
2601
+ // ── Accent color (web-only) ───────────────────────────────────────────────
2602
+ accent: ({ value, isArbitrary }, { colors }) => {
2603
+ if (!isWeb) return null;
2604
+ if (value === "auto") return { accentColor: "auto" };
2605
+ const color = resolveColor(value, colors, isArbitrary);
2606
+ return color ? { accentColor: color } : null;
2607
+ },
1737
2608
  // ── Flex ───────────────────────────────────────────────────────────────────
1738
2609
  flex: ({ value, isArbitrary }, { flex }) => {
1739
2610
  if (!value) return { display: "flex" };
@@ -2014,6 +2885,9 @@ function clearPluginUtilities() {
2014
2885
  function getPluginStandaloneMap() {
2015
2886
  return PLUGIN_STANDALONE;
2016
2887
  }
2888
+ function isKnownUtility(utility) {
2889
+ return utility in STANDALONE || utility in RESOLVERS || utility in PLUGIN_STANDALONE || utility in PLUGIN_RESOLVERS;
2890
+ }
2017
2891
 
2018
2892
  // src/core/responsiveStore.ts
2019
2893
  var RESPONSIVE_KEY = "__kbach_responsive__";
@@ -2086,7 +2960,14 @@ var MODIFIER_TO_PSEUDO = {
2086
2960
  "not-pressed": ":not(:active)",
2087
2961
  "not-disabled": ":not(:disabled)",
2088
2962
  "not-checked": ":not(:checked)",
2089
- "not-visited": ":not(:visited)"
2963
+ "not-visited": ":not(:visited)",
2964
+ // Pseudo-elements (CSS-injection only; never applied as inline styles)
2965
+ before: "::before",
2966
+ after: "::after",
2967
+ selection: "::selection",
2968
+ "first-letter": "::first-letter",
2969
+ "first-line": "::first-line",
2970
+ marker: "::marker"
2090
2971
  };
2091
2972
  var GROUP_PEER_PREFIX = {
2092
2973
  "group-hover": ".group:hover",
@@ -2096,12 +2977,34 @@ var GROUP_PEER_PREFIX = {
2096
2977
  };
2097
2978
  var MODE_MODS = /* @__PURE__ */ new Set(["dark", "light", "not-dark", "not-light"]);
2098
2979
  var RESPONSIVE_MODS = /* @__PURE__ */ new Set(["sm", "md", "lg", "xl", "2xl"]);
2099
- function injectClassRule(cls, bucketKey, styles, darkMode) {
2100
- const cssDecls = styleValueToCSS(styles);
2980
+ var PRINT_MODS = /* @__PURE__ */ new Set(["print"]);
2981
+ function buildDivideDecls(styles) {
2982
+ const parts = [];
2983
+ if ("__divideX" in styles) {
2984
+ const w = Number(styles.__divideX);
2985
+ parts.push(`border-left-width: ${w}px`);
2986
+ parts.push("border-right-width: 0px");
2987
+ }
2988
+ if ("__divideY" in styles) {
2989
+ const w = Number(styles.__divideY);
2990
+ parts.push(`border-top-width: ${w}px`);
2991
+ parts.push("border-bottom-width: 0px");
2992
+ }
2993
+ if ("__divideColor" in styles) parts.push(`border-color: ${String(styles.__divideColor)}`);
2994
+ if ("__divideStyle" in styles) parts.push(`border-style: ${String(styles.__divideStyle)}`);
2995
+ return parts.join("; ");
2996
+ }
2997
+ function injectClassRule(cls, bucketKey, styles, darkMode, important = false) {
2998
+ if ("__keyframe" in styles && typeof styles.__keyframe === "string") {
2999
+ injectRule(styles.__keyframe);
3000
+ }
3001
+ const isDivide = "__divideX" in styles || "__divideY" in styles || "__divideColor" in styles || "__divideStyle" in styles;
3002
+ const cssDecls = isDivide ? buildDivideDecls(styles) : styleValueToCSS(styles, important);
2101
3003
  if (!cssDecls) return;
2102
3004
  const escaped = escapeCSSSelector(cls);
3005
+ const childSuffix = isDivide ? " > * + *" : "";
2103
3006
  if (bucketKey === "base") {
2104
- injectRule(`.${escaped} { ${cssDecls} }`);
3007
+ injectRule(`.${escaped}${childSuffix} { ${cssDecls} }`);
2105
3008
  return;
2106
3009
  }
2107
3010
  const mods = bucketKey.split(":");
@@ -2109,10 +3012,11 @@ function injectClassRule(cls, bucketKey, styles, darkMode) {
2109
3012
  const nonResponsiveMods = mods.filter((m) => !RESPONSIVE_MODS.has(m));
2110
3013
  const hasDark = nonResponsiveMods.includes("dark") || nonResponsiveMods.includes("not-light");
2111
3014
  const hasLight = nonResponsiveMods.includes("light") || nonResponsiveMods.includes("not-dark");
3015
+ const hasPrint = nonResponsiveMods.includes("print");
2112
3016
  const ancestorMods = nonResponsiveMods.filter((m) => m in GROUP_PEER_PREFIX);
2113
- const pseudoMods = nonResponsiveMods.filter((m) => !MODE_MODS.has(m) && !(m in GROUP_PEER_PREFIX));
3017
+ const pseudoMods = nonResponsiveMods.filter((m) => !MODE_MODS.has(m) && !(m in GROUP_PEER_PREFIX) && !PRINT_MODS.has(m));
2114
3018
  const pseudoSuffix = pseudoMods.map((p) => MODIFIER_TO_PSEUDO[p] ?? `:${p}`).join("");
2115
- const elementSelector = `.${escaped}${pseudoSuffix}`;
3019
+ const elementSelector = `.${escaped}${pseudoSuffix}${childSuffix}`;
2116
3020
  const ancestorPrefix = ancestorMods.length ? ancestorMods.map((m) => GROUP_PEER_PREFIX[m]).join(" ") + " " : "";
2117
3021
  const selector = `${ancestorPrefix}${elementSelector}`;
2118
3022
  let rule;
@@ -2135,6 +3039,9 @@ function injectClassRule(cls, bucketKey, styles, darkMode) {
2135
3039
  } else {
2136
3040
  rule = `${selector} { ${cssDecls} }`;
2137
3041
  }
3042
+ if (hasPrint) {
3043
+ rule = `@media print { ${rule} }`;
3044
+ }
2138
3045
  if (responsiveMods.length > 0) {
2139
3046
  const screens = getGlobalScreens();
2140
3047
  const minWidth = Math.max(...responsiveMods.map((m) => screens[m] ?? 0));
@@ -2152,7 +3059,19 @@ var RN_ONLY_PROPS = /* @__PURE__ */ new Set([
2152
3059
  "elevation",
2153
3060
  "includeFontPadding",
2154
3061
  "textAlignVertical",
2155
- "writingDirection"
3062
+ "writingDirection",
3063
+ // Text shadow native props — web uses the textShadow CSS shorthand instead
3064
+ "textShadowColor",
3065
+ "textShadowOffset",
3066
+ "textShadowRadius",
3067
+ // tintColor is native-only (Image/icon tinting)
3068
+ "tintColor",
3069
+ // Internal markers — handled specially, never serialized as CSS props
3070
+ "__divideX",
3071
+ "__divideY",
3072
+ "__divideColor",
3073
+ "__divideStyle",
3074
+ "__keyframe"
2156
3075
  ]);
2157
3076
  var CSS_UNITLESS = /* @__PURE__ */ new Set([
2158
3077
  "opacity",
@@ -2170,7 +3089,7 @@ var CSS_UNITLESS = /* @__PURE__ */ new Set([
2170
3089
  "gridRowStart",
2171
3090
  "gridRowEnd"
2172
3091
  ]);
2173
- function styleValueToCSS(styles) {
3092
+ function styleValueToCSS(styles, forceImportant = false) {
2174
3093
  return Object.entries(styles).filter(
2175
3094
  ([prop, v]) => v !== void 0 && v !== null && typeof v !== "object" && !RN_ONLY_PROPS.has(prop)
2176
3095
  ).map(([prop, val]) => {
@@ -2181,8 +3100,8 @@ function styleValueToCSS(styles) {
2181
3100
  } else {
2182
3101
  cssVal = String(val);
2183
3102
  }
2184
- const important = prop === "display" && (cssVal === "grid" || cssVal === "inline-grid") || prop === "position" && (cssVal === "sticky" || cssVal === "fixed" || cssVal === "static") ? " !important" : "";
2185
- return `${cssProp}: ${cssVal}${important}`;
3103
+ const imp = forceImportant || prop === "display" && (cssVal === "grid" || cssVal === "inline-grid") || prop === "position" && (cssVal === "sticky" || cssVal === "fixed" || cssVal === "static") ? " !important" : "";
3104
+ return `${cssProp}: ${cssVal}${imp}`;
2186
3105
  }).join("; ");
2187
3106
  }
2188
3107
  function camelToKebab(str) {
@@ -2197,18 +3116,23 @@ function resolve(classString, theme, darkMode = "attribute") {
2197
3116
  const injectQueue = [];
2198
3117
  for (const parsed of parsedClasses) {
2199
3118
  const styles = resolveUtility(parsed, theme);
2200
- if (!styles) continue;
3119
+ if (!styles) {
3120
+ if (process.env.NODE_ENV !== "production" && !parsed.isArbitrary && !isKnownUtility(parsed.utility)) {
3121
+ console.warn(`[kbach] Unknown utility "${parsed.utility}" in class "${parsed.original}"`);
3122
+ }
3123
+ continue;
3124
+ }
2201
3125
  const bucketKey = parsed.modifiers.length === 0 ? "base" : parsed.modifiers.join(":");
2202
3126
  if (!result[bucketKey]) result[bucketKey] = {};
2203
3127
  Object.assign(result[bucketKey], styles);
2204
3128
  if (typeof document !== "undefined") {
2205
- injectQueue.push({ cls: parsed.original, bucketKey, styles });
3129
+ injectQueue.push({ cls: parsed.original, bucketKey, styles, important: parsed.important });
2206
3130
  }
2207
3131
  }
2208
3132
  styleCache.set(cacheKey, result);
2209
3133
  if (typeof document !== "undefined") {
2210
- for (const { cls, bucketKey, styles } of injectQueue) {
2211
- injectClassRule(cls, bucketKey, styles, darkMode);
3134
+ for (const { cls, bucketKey, styles, important } of injectQueue) {
3135
+ injectClassRule(cls, bucketKey, styles, darkMode, important);
2212
3136
  }
2213
3137
  }
2214
3138
  return result;
@@ -2535,6 +3459,11 @@ var InteractiveWrapper = (0, import_react3.forwardRef)(
2535
3459
  const computedStyle = (0, import_react3.useMemo)(
2536
3460
  () => {
2537
3461
  const s = flatten(resolvedStyle, isDark, { pressed, hover: hovered, focus: focused }, breakpoints);
3462
+ delete s.__divideX;
3463
+ delete s.__divideY;
3464
+ delete s.__divideColor;
3465
+ delete s.__divideStyle;
3466
+ delete s.__keyframe;
2538
3467
  if (typeof Component !== "string") {
2539
3468
  if (s.display === "grid" || s.display === "inline-grid") delete s.display;
2540
3469
  delete s.gridTemplateColumns;
@@ -2542,9 +3471,18 @@ var InteractiveWrapper = (0, import_react3.forwardRef)(
2542
3471
  delete s.gridColumn;
2543
3472
  delete s.gridRow;
2544
3473
  delete s.gridArea;
3474
+ delete s.gridColumnStart;
3475
+ delete s.gridColumnEnd;
3476
+ delete s.gridRowStart;
3477
+ delete s.gridRowEnd;
2545
3478
  delete s.gridAutoFlow;
2546
3479
  delete s.gridAutoColumns;
2547
3480
  delete s.gridAutoRows;
3481
+ delete s.placeItems;
3482
+ delete s.placeContent;
3483
+ delete s.justifyItems;
3484
+ delete s.placeSelf;
3485
+ delete s.justifySelf;
2548
3486
  if (s.position === "sticky" || s.position === "fixed" || s.position === "static") {
2549
3487
  delete s.position;
2550
3488
  }
@@ -2592,6 +3530,7 @@ var DarkWrapper = import_react4.default.forwardRef(
2592
3530
  const width = useConditionalWidth(needsWidth);
2593
3531
  const breakpoints = needsWidth ? getActiveBreakpoints(width) : EMPTY_BREAKPOINTS;
2594
3532
  const computedStyle = flatten(resolvedStyle, isDark, {}, breakpoints);
3533
+ stripInternalMarkers(computedStyle);
2595
3534
  if (typeof Component !== "string") stripWebOnlyProps(computedStyle);
2596
3535
  const finalStyle = styleProp ? Array.isArray(styleProp) ? Object.assign({}, computedStyle, ...styleProp) : { ...computedStyle, ...styleProp } : computedStyle;
2597
3536
  const props = { ref, ...rest, style: finalStyle };
@@ -2599,6 +3538,13 @@ var DarkWrapper = import_react4.default.forwardRef(
2599
3538
  }
2600
3539
  );
2601
3540
  DarkWrapper.displayName = "Kbach.DarkWrapper";
3541
+ function stripInternalMarkers(s) {
3542
+ delete s.__divideX;
3543
+ delete s.__divideY;
3544
+ delete s.__divideColor;
3545
+ delete s.__divideStyle;
3546
+ delete s.__keyframe;
3547
+ }
2602
3548
  function stripWebOnlyProps(s) {
2603
3549
  if (s.display === "grid" || s.display === "inline-grid") delete s.display;
2604
3550
  delete s.gridTemplateColumns;
@@ -2606,9 +3552,18 @@ function stripWebOnlyProps(s) {
2606
3552
  delete s.gridColumn;
2607
3553
  delete s.gridRow;
2608
3554
  delete s.gridArea;
3555
+ delete s.gridColumnStart;
3556
+ delete s.gridColumnEnd;
3557
+ delete s.gridRowStart;
3558
+ delete s.gridRowEnd;
2609
3559
  delete s.gridAutoFlow;
2610
3560
  delete s.gridAutoColumns;
2611
3561
  delete s.gridAutoRows;
3562
+ delete s.placeItems;
3563
+ delete s.placeContent;
3564
+ delete s.justifyItems;
3565
+ delete s.placeSelf;
3566
+ delete s.justifySelf;
2612
3567
  if (s.position === "sticky" || s.position === "fixed" || s.position === "static") {
2613
3568
  delete s.position;
2614
3569
  }
@@ -2682,6 +3637,57 @@ function mergeStyle(computed, userStyle) {
2682
3637
  function makeElement(isStaticChildren, type, props, key) {
2683
3638
  return (isStaticChildren ? import_jsx_runtime.jsxs : import_jsx_runtime.jsx)(type, props, key);
2684
3639
  }
3640
+ function hasGridStyles(resolved) {
3641
+ for (const styles of Object.values(resolved)) {
3642
+ if (!styles) continue;
3643
+ if (styles.display === "grid" || styles.display === "inline-grid") return true;
3644
+ if ("gridTemplateColumns" in styles || "gridTemplateRows" in styles) return true;
3645
+ if ("gridColumn" in styles || "gridRow" in styles) return true;
3646
+ if ("gridColumnStart" in styles || "gridColumnEnd" in styles) return true;
3647
+ if ("gridRowStart" in styles || "gridRowEnd" in styles) return true;
3648
+ if ("gridAutoFlow" in styles || "gridAutoColumns" in styles || "gridAutoRows" in styles) return true;
3649
+ if ("placeItems" in styles || "placeContent" in styles || "justifyItems" in styles) return true;
3650
+ if ("placeSelf" in styles || "justifySelf" in styles) return true;
3651
+ }
3652
+ return false;
3653
+ }
3654
+ function hasWebPositionStyles(resolved) {
3655
+ for (const styles of Object.values(resolved)) {
3656
+ if (!styles) continue;
3657
+ if (styles.position === "sticky" || styles.position === "fixed" || styles.position === "static") return true;
3658
+ }
3659
+ return false;
3660
+ }
3661
+ function stripInternalMarkers2(s) {
3662
+ delete s.__divideX;
3663
+ delete s.__divideY;
3664
+ delete s.__divideColor;
3665
+ delete s.__divideStyle;
3666
+ delete s.__keyframe;
3667
+ }
3668
+ function stripWebOnlyInlineProps(s) {
3669
+ if (s.display === "grid" || s.display === "inline-grid") delete s.display;
3670
+ delete s.gridTemplateColumns;
3671
+ delete s.gridTemplateRows;
3672
+ delete s.gridColumn;
3673
+ delete s.gridRow;
3674
+ delete s.gridArea;
3675
+ delete s.gridColumnStart;
3676
+ delete s.gridColumnEnd;
3677
+ delete s.gridRowStart;
3678
+ delete s.gridRowEnd;
3679
+ delete s.gridAutoFlow;
3680
+ delete s.gridAutoColumns;
3681
+ delete s.gridAutoRows;
3682
+ delete s.placeItems;
3683
+ delete s.placeContent;
3684
+ delete s.justifyItems;
3685
+ delete s.placeSelf;
3686
+ delete s.justifySelf;
3687
+ if (s.position === "sticky" || s.position === "fixed" || s.position === "static") {
3688
+ delete s.position;
3689
+ }
3690
+ }
2685
3691
  function processElement(type, rawProps, key, isStaticChildren) {
2686
3692
  if (!rawProps) return (0, import_jsx_runtime.jsx)(type, null, key);
2687
3693
  const { className, kb: kbProp, __kbachStyles, __kbachClasses } = rawProps;
@@ -2690,13 +3696,12 @@ function processElement(type, rawProps, key, isStaticChildren) {
2690
3696
  return makeElement(isStaticChildren, type, rawProps, key);
2691
3697
  }
2692
3698
  const config = getConfig();
2693
- const isOnWeb = typeof document !== "undefined" && classStr != null;
2694
- const isGridOnWeb = isOnWeb && /(?:^|\s)(?:[\w-]+:)*(?:grd|grid-(?:\d+|cols-\d+|rows-\d+))(?:\s|$)/.test(classStr);
2695
- const hasWebPosition = isOnWeb && /(?:^|\s)(?:[\w-]+:)*(?:fixed|sticky)(?:\s|$)/.test(classStr);
2696
- const actualType = isGridOnWeb || hasWebPosition ? "div" : type;
2697
3699
  const resolved = __kbachStyles ?? (classStr ? resolve(classStr, config.theme, config.darkMode) : {});
2698
3700
  const { style: userStyle, ...passProps } = omitConsumed(rawProps);
2699
3701
  const { interactive, modeOrResponsive } = bucketMods(resolved);
3702
+ const onWeb = typeof document !== "undefined";
3703
+ const needsDiv = onWeb && (hasGridStyles(resolved) || hasWebPositionStyles(resolved));
3704
+ const actualType = needsDiv ? "div" : type;
2700
3705
  if (interactive) {
2701
3706
  return (0, import_jsx_runtime.jsx)(InteractiveWrapper, {
2702
3707
  Component: actualType,
@@ -2716,20 +3721,8 @@ function processElement(type, rawProps, key, isStaticChildren) {
2716
3721
  }, key);
2717
3722
  }
2718
3723
  const computedStyle = flatten(resolved, false);
2719
- if (typeof actualType !== "string") {
2720
- if (computedStyle.display === "grid" || computedStyle.display === "inline-grid") delete computedStyle.display;
2721
- delete computedStyle.gridTemplateColumns;
2722
- delete computedStyle.gridTemplateRows;
2723
- delete computedStyle.gridColumn;
2724
- delete computedStyle.gridRow;
2725
- delete computedStyle.gridArea;
2726
- delete computedStyle.gridAutoFlow;
2727
- delete computedStyle.gridAutoColumns;
2728
- delete computedStyle.gridAutoRows;
2729
- if (computedStyle.position === "sticky" || computedStyle.position === "fixed" || computedStyle.position === "static") {
2730
- delete computedStyle.position;
2731
- }
2732
- }
3724
+ stripInternalMarkers2(computedStyle);
3725
+ if (typeof actualType !== "string") stripWebOnlyInlineProps(computedStyle);
2733
3726
  const finalStyle = mergeStyle(computedStyle, userStyle);
2734
3727
  return makeElement(isStaticChildren, actualType, {
2735
3728
  ...passProps,