react-native-css 3.0.0-nightly.61014be → 3.0.0-nightly.d8cb1bc

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.
Files changed (214) hide show
  1. package/dist/commonjs/compiler/atRules.js +1 -1
  2. package/dist/commonjs/compiler/attributes.test.js +1 -1
  3. package/dist/commonjs/compiler/attributes.test.js.map +1 -1
  4. package/dist/commonjs/compiler/compiler.js +26 -17
  5. package/dist/commonjs/compiler/compiler.js.map +1 -1
  6. package/dist/commonjs/compiler/declarations.js +173 -74
  7. package/dist/commonjs/compiler/declarations.js.map +1 -1
  8. package/dist/commonjs/compiler/inheritance.test.js +7 -7
  9. package/dist/commonjs/compiler/inheritance.test.js.map +1 -1
  10. package/dist/commonjs/compiler/selector-builder.js +457 -0
  11. package/dist/commonjs/compiler/selector-builder.js.map +1 -0
  12. package/dist/commonjs/compiler/selectors.js +10 -6
  13. package/dist/commonjs/compiler/selectors.js.map +1 -1
  14. package/dist/commonjs/compiler/stylesheet.js +113 -39
  15. package/dist/commonjs/compiler/stylesheet.js.map +1 -1
  16. package/dist/commonjs/jest/index.js +23 -7
  17. package/dist/commonjs/jest/index.js.map +1 -1
  18. package/dist/commonjs/metro/index.js +1 -1
  19. package/dist/commonjs/metro/index.js.map +1 -1
  20. package/dist/commonjs/poison.pill.js +4 -1
  21. package/dist/commonjs/poison.pill.js.map +1 -1
  22. package/dist/commonjs/runtime/native/conditions/attributes.js +42 -0
  23. package/dist/commonjs/runtime/native/conditions/attributes.js.map +1 -0
  24. package/dist/commonjs/runtime/native/conditions/container-query.js +28 -21
  25. package/dist/commonjs/runtime/native/conditions/container-query.js.map +1 -1
  26. package/dist/commonjs/runtime/native/conditions/guards.js.map +1 -1
  27. package/dist/commonjs/runtime/native/conditions/index.js +10 -46
  28. package/dist/commonjs/runtime/native/conditions/index.js.map +1 -1
  29. package/dist/commonjs/runtime/native/conditions/media-query.js +17 -17
  30. package/dist/commonjs/runtime/native/conditions/media-query.js.map +1 -1
  31. package/dist/commonjs/runtime/native/injection.js +3 -2
  32. package/dist/commonjs/runtime/native/injection.js.map +1 -1
  33. package/dist/commonjs/runtime/native/react/interaction.js +10 -10
  34. package/dist/commonjs/runtime/native/react/interaction.js.map +1 -1
  35. package/dist/commonjs/runtime/native/react/rules.js +9 -9
  36. package/dist/commonjs/runtime/native/react/rules.js.map +1 -1
  37. package/dist/commonjs/runtime/native/react/useNativeCss.js +1 -0
  38. package/dist/commonjs/runtime/native/react/useNativeCss.js.map +1 -1
  39. package/dist/commonjs/runtime/native/reactivity.js +1 -12
  40. package/dist/commonjs/runtime/native/reactivity.js.map +1 -1
  41. package/dist/commonjs/runtime/native/root.js +28 -0
  42. package/dist/commonjs/runtime/native/root.js.map +1 -0
  43. package/dist/commonjs/runtime/native/styles/calculate-props.js +53 -48
  44. package/dist/commonjs/runtime/native/styles/calculate-props.js.map +1 -1
  45. package/dist/commonjs/runtime/native/styles/index.js +12 -12
  46. package/dist/commonjs/runtime/native/styles/index.js.map +1 -1
  47. package/dist/commonjs/runtime/native/styles/units.js +6 -3
  48. package/dist/commonjs/runtime/native/styles/units.js.map +1 -1
  49. package/dist/commonjs/runtime/native/styles/variables.js +3 -2
  50. package/dist/commonjs/runtime/native/styles/variables.js.map +1 -1
  51. package/dist/commonjs/runtime/utils/specificity.js +2 -1
  52. package/dist/commonjs/runtime/utils/specificity.js.map +1 -1
  53. package/dist/module/compiler/atRules.js +1 -1
  54. package/dist/module/compiler/attributes.test.js +1 -1
  55. package/dist/module/compiler/attributes.test.js.map +1 -1
  56. package/dist/module/compiler/compiler.js +26 -17
  57. package/dist/module/compiler/compiler.js.map +1 -1
  58. package/dist/module/compiler/compiler.types.js.map +1 -1
  59. package/dist/module/compiler/declarations.js +168 -70
  60. package/dist/module/compiler/declarations.js.map +1 -1
  61. package/dist/module/compiler/inheritance.test.js +7 -7
  62. package/dist/module/compiler/inheritance.test.js.map +1 -1
  63. package/dist/module/compiler/selector-builder.js +452 -0
  64. package/dist/module/compiler/selector-builder.js.map +1 -0
  65. package/dist/module/compiler/selectors.js +10 -6
  66. package/dist/module/compiler/selectors.js.map +1 -1
  67. package/dist/module/compiler/stylesheet.js +112 -38
  68. package/dist/module/compiler/stylesheet.js.map +1 -1
  69. package/dist/module/jest/index.js +23 -7
  70. package/dist/module/jest/index.js.map +1 -1
  71. package/dist/module/metro/index.js +1 -1
  72. package/dist/module/metro/index.js.map +1 -1
  73. package/dist/module/poison.pill.js +4 -1
  74. package/dist/module/poison.pill.js.map +1 -1
  75. package/dist/module/runtime/native/conditions/attributes.js +38 -0
  76. package/dist/module/runtime/native/conditions/attributes.js.map +1 -0
  77. package/dist/module/runtime/native/conditions/container-query.js +28 -21
  78. package/dist/module/runtime/native/conditions/container-query.js.map +1 -1
  79. package/dist/module/runtime/native/conditions/guards.js.map +1 -1
  80. package/dist/module/runtime/native/conditions/index.js +10 -46
  81. package/dist/module/runtime/native/conditions/index.js.map +1 -1
  82. package/dist/module/runtime/native/conditions/media-query.js +17 -17
  83. package/dist/module/runtime/native/conditions/media-query.js.map +1 -1
  84. package/dist/module/runtime/native/injection.js +2 -1
  85. package/dist/module/runtime/native/injection.js.map +1 -1
  86. package/dist/module/runtime/native/react/interaction.js +10 -10
  87. package/dist/module/runtime/native/react/interaction.js.map +1 -1
  88. package/dist/module/runtime/native/react/rules.js +9 -9
  89. package/dist/module/runtime/native/react/rules.js.map +1 -1
  90. package/dist/module/runtime/native/react/useNativeCss.js +1 -0
  91. package/dist/module/runtime/native/react/useNativeCss.js.map +1 -1
  92. package/dist/module/runtime/native/reactivity.js +0 -11
  93. package/dist/module/runtime/native/reactivity.js.map +1 -1
  94. package/dist/module/runtime/native/root.js +24 -0
  95. package/dist/module/runtime/native/root.js.map +1 -0
  96. package/dist/module/runtime/native/styles/calculate-props.js +53 -48
  97. package/dist/module/runtime/native/styles/calculate-props.js.map +1 -1
  98. package/dist/module/runtime/native/styles/index.js +12 -12
  99. package/dist/module/runtime/native/styles/index.js.map +1 -1
  100. package/dist/module/runtime/native/styles/units.js +6 -3
  101. package/dist/module/runtime/native/styles/units.js.map +1 -1
  102. package/dist/module/runtime/native/styles/variables.js +2 -1
  103. package/dist/module/runtime/native/styles/variables.js.map +1 -1
  104. package/dist/module/runtime/utils/specificity.js +2 -1
  105. package/dist/module/runtime/utils/specificity.js.map +1 -1
  106. package/dist/typescript/commonjs/src/compiler/compiler.d.ts +9 -2
  107. package/dist/typescript/commonjs/src/compiler/compiler.d.ts.map +1 -1
  108. package/dist/typescript/commonjs/src/compiler/compiler.types.d.ts +5 -4
  109. package/dist/typescript/commonjs/src/compiler/compiler.types.d.ts.map +1 -1
  110. package/dist/typescript/commonjs/src/compiler/declarations.d.ts +16 -19
  111. package/dist/typescript/commonjs/src/compiler/declarations.d.ts.map +1 -1
  112. package/dist/typescript/commonjs/src/compiler/selector-builder.d.ts +23 -0
  113. package/dist/typescript/commonjs/src/compiler/selector-builder.d.ts.map +1 -0
  114. package/dist/typescript/commonjs/src/compiler/selectors.d.ts +3 -2
  115. package/dist/typescript/commonjs/src/compiler/selectors.d.ts.map +1 -1
  116. package/dist/typescript/commonjs/src/compiler/stylesheet.d.ts +21 -7
  117. package/dist/typescript/commonjs/src/compiler/stylesheet.d.ts.map +1 -1
  118. package/dist/typescript/commonjs/src/jest/index.d.ts +10 -3
  119. package/dist/typescript/commonjs/src/jest/index.d.ts.map +1 -1
  120. package/dist/typescript/commonjs/src/metro/index.d.ts.map +1 -1
  121. package/dist/typescript/commonjs/src/poison.pill.d.ts.map +1 -1
  122. package/dist/typescript/commonjs/src/runtime/native/conditions/attributes.d.ts +5 -0
  123. package/dist/typescript/commonjs/src/runtime/native/conditions/attributes.d.ts.map +1 -0
  124. package/dist/typescript/commonjs/src/runtime/native/conditions/container-query.d.ts +3 -3
  125. package/dist/typescript/commonjs/src/runtime/native/conditions/container-query.d.ts.map +1 -1
  126. package/dist/typescript/commonjs/src/runtime/native/conditions/guards.d.ts +2 -2
  127. package/dist/typescript/commonjs/src/runtime/native/conditions/guards.d.ts.map +1 -1
  128. package/dist/typescript/commonjs/src/runtime/native/conditions/index.d.ts +2 -2
  129. package/dist/typescript/commonjs/src/runtime/native/conditions/index.d.ts.map +1 -1
  130. package/dist/typescript/commonjs/src/runtime/native/conditions/media-query.d.ts +2 -2
  131. package/dist/typescript/commonjs/src/runtime/native/conditions/media-query.d.ts.map +1 -1
  132. package/dist/typescript/commonjs/src/runtime/native/injection.d.ts.map +1 -1
  133. package/dist/typescript/commonjs/src/runtime/native/react/interaction.d.ts +2 -2
  134. package/dist/typescript/commonjs/src/runtime/native/react/interaction.d.ts.map +1 -1
  135. package/dist/typescript/commonjs/src/runtime/native/react/useNativeCss.d.ts +2 -1
  136. package/dist/typescript/commonjs/src/runtime/native/react/useNativeCss.d.ts.map +1 -1
  137. package/dist/typescript/commonjs/src/runtime/native/reactivity.d.ts +2 -10
  138. package/dist/typescript/commonjs/src/runtime/native/reactivity.d.ts.map +1 -1
  139. package/dist/typescript/commonjs/src/runtime/native/root.d.ts +11 -0
  140. package/dist/typescript/commonjs/src/runtime/native/root.d.ts.map +1 -0
  141. package/dist/typescript/commonjs/src/runtime/native/styles/calculate-props.d.ts.map +1 -1
  142. package/dist/typescript/commonjs/src/runtime/native/styles/units.d.ts.map +1 -1
  143. package/dist/typescript/commonjs/src/runtime/native/styles/variables.d.ts.map +1 -1
  144. package/dist/typescript/commonjs/src/runtime/utils/specificity.d.ts +1 -0
  145. package/dist/typescript/commonjs/src/runtime/utils/specificity.d.ts.map +1 -1
  146. package/dist/typescript/module/src/compiler/compiler.d.ts +9 -2
  147. package/dist/typescript/module/src/compiler/compiler.d.ts.map +1 -1
  148. package/dist/typescript/module/src/compiler/compiler.types.d.ts +5 -4
  149. package/dist/typescript/module/src/compiler/compiler.types.d.ts.map +1 -1
  150. package/dist/typescript/module/src/compiler/declarations.d.ts +16 -19
  151. package/dist/typescript/module/src/compiler/declarations.d.ts.map +1 -1
  152. package/dist/typescript/module/src/compiler/selector-builder.d.ts +23 -0
  153. package/dist/typescript/module/src/compiler/selector-builder.d.ts.map +1 -0
  154. package/dist/typescript/module/src/compiler/selectors.d.ts +3 -2
  155. package/dist/typescript/module/src/compiler/selectors.d.ts.map +1 -1
  156. package/dist/typescript/module/src/compiler/stylesheet.d.ts +21 -7
  157. package/dist/typescript/module/src/compiler/stylesheet.d.ts.map +1 -1
  158. package/dist/typescript/module/src/jest/index.d.ts +10 -3
  159. package/dist/typescript/module/src/jest/index.d.ts.map +1 -1
  160. package/dist/typescript/module/src/metro/index.d.ts.map +1 -1
  161. package/dist/typescript/module/src/poison.pill.d.ts.map +1 -1
  162. package/dist/typescript/module/src/runtime/native/conditions/attributes.d.ts +5 -0
  163. package/dist/typescript/module/src/runtime/native/conditions/attributes.d.ts.map +1 -0
  164. package/dist/typescript/module/src/runtime/native/conditions/container-query.d.ts +3 -3
  165. package/dist/typescript/module/src/runtime/native/conditions/container-query.d.ts.map +1 -1
  166. package/dist/typescript/module/src/runtime/native/conditions/guards.d.ts +2 -2
  167. package/dist/typescript/module/src/runtime/native/conditions/guards.d.ts.map +1 -1
  168. package/dist/typescript/module/src/runtime/native/conditions/index.d.ts +2 -2
  169. package/dist/typescript/module/src/runtime/native/conditions/index.d.ts.map +1 -1
  170. package/dist/typescript/module/src/runtime/native/conditions/media-query.d.ts +2 -2
  171. package/dist/typescript/module/src/runtime/native/conditions/media-query.d.ts.map +1 -1
  172. package/dist/typescript/module/src/runtime/native/injection.d.ts.map +1 -1
  173. package/dist/typescript/module/src/runtime/native/react/interaction.d.ts +2 -2
  174. package/dist/typescript/module/src/runtime/native/react/interaction.d.ts.map +1 -1
  175. package/dist/typescript/module/src/runtime/native/react/useNativeCss.d.ts +2 -1
  176. package/dist/typescript/module/src/runtime/native/react/useNativeCss.d.ts.map +1 -1
  177. package/dist/typescript/module/src/runtime/native/reactivity.d.ts +2 -10
  178. package/dist/typescript/module/src/runtime/native/reactivity.d.ts.map +1 -1
  179. package/dist/typescript/module/src/runtime/native/root.d.ts +11 -0
  180. package/dist/typescript/module/src/runtime/native/root.d.ts.map +1 -0
  181. package/dist/typescript/module/src/runtime/native/styles/calculate-props.d.ts.map +1 -1
  182. package/dist/typescript/module/src/runtime/native/styles/units.d.ts.map +1 -1
  183. package/dist/typescript/module/src/runtime/native/styles/variables.d.ts.map +1 -1
  184. package/dist/typescript/module/src/runtime/utils/specificity.d.ts +1 -0
  185. package/dist/typescript/module/src/runtime/utils/specificity.d.ts.map +1 -1
  186. package/package.json +4 -3
  187. package/src/compiler/atRules.ts +1 -1
  188. package/src/compiler/attributes.test.ts +1 -1
  189. package/src/compiler/compiler.ts +30 -31
  190. package/src/compiler/compiler.types.ts +7 -5
  191. package/src/compiler/declarations.ts +293 -69
  192. package/src/compiler/inheritance.test.ts +6 -6
  193. package/src/compiler/selector-builder.ts +531 -0
  194. package/src/compiler/selectors.ts +20 -6
  195. package/src/compiler/stylesheet.ts +154 -45
  196. package/src/jest/index.ts +30 -6
  197. package/src/metro/index.ts +6 -3
  198. package/src/poison.pill.ts +5 -1
  199. package/src/runtime/native/conditions/attributes.ts +52 -0
  200. package/src/runtime/native/conditions/container-query.ts +27 -22
  201. package/src/runtime/native/conditions/guards.ts +1 -2
  202. package/src/runtime/native/conditions/index.ts +12 -66
  203. package/src/runtime/native/conditions/media-query.ts +18 -20
  204. package/src/runtime/native/injection.ts +1 -1
  205. package/src/runtime/native/react/interaction.ts +12 -12
  206. package/src/runtime/native/react/rules.ts +9 -9
  207. package/src/runtime/native/react/useNativeCss.ts +3 -0
  208. package/src/runtime/native/reactivity.ts +2 -21
  209. package/src/runtime/native/root.ts +31 -0
  210. package/src/runtime/native/styles/calculate-props.ts +59 -49
  211. package/src/runtime/native/styles/index.ts +12 -12
  212. package/src/runtime/native/styles/units.ts +7 -3
  213. package/src/runtime/native/styles/variables.ts +2 -6
  214. package/src/runtime/utils/specificity.ts +1 -0
@@ -1,3 +1,5 @@
1
+ import type { SelectorList } from "lightningcss";
2
+
1
3
  import {
2
4
  isStyleDescriptorArray,
3
5
  Specificity,
@@ -17,8 +19,9 @@ import type {
17
19
  StyleRuleMapping,
18
20
  StyleRuleSet,
19
21
  VariableRecord,
22
+ VariableValue,
20
23
  } from "./compiler.types";
21
- import { toRNProperty, type NormalizeSelector } from "./selectors";
24
+ import { getClassNameSelectors, toRNProperty } from "./selector-builder";
22
25
 
23
26
  type BuilderMode = "style" | "media" | "container" | "keyframes";
24
27
 
@@ -56,15 +59,37 @@ export class StylesheetBuilder {
56
59
  animations?: AnimationRecord;
57
60
  rem: number;
58
61
  ruleOrder: number;
59
- } = { ruleSets: {}, rem: 14, ruleOrder: 0 },
60
- private selectors?: NormalizeSelector[],
62
+ warningProperty?: string;
63
+ warningProperties: string[];
64
+ warningValues: Record<string, unknown[]>;
65
+ warningFunctions: string[];
66
+ } = {
67
+ ruleSets: {},
68
+ rem: 14,
69
+ ruleOrder: 0,
70
+ warningProperties: [],
71
+ warningValues: {},
72
+ warningFunctions: [],
73
+ },
74
+ private selectors: SelectorList = [],
61
75
  ) {}
62
76
 
63
- fork(
64
- mode = this.mode,
65
- selectors: NormalizeSelector[] | undefined = this.selectors,
66
- ): StylesheetBuilder {
77
+ fork(mode = this.mode, selectors: SelectorList = []): StylesheetBuilder {
67
78
  this.shared.ruleOrder++;
79
+
80
+ /**
81
+ * If we already have selectors and we are added more
82
+ * Then these must be nested selectors.
83
+ *
84
+ * We need to extrapolate out the selectors to their full values
85
+ */
86
+ selectors =
87
+ this.selectors.length && selectors.length
88
+ ? this.selectors.flatMap((selectorA) => {
89
+ return selectors.map((selectorB) => [...selectorA, ...selectorB]);
90
+ })
91
+ : [...this.selectors, ...selectors];
92
+
68
93
  return new StylesheetBuilder(
69
94
  this.options,
70
95
  mode,
@@ -76,7 +101,7 @@ export class StylesheetBuilder {
76
101
  );
77
102
  }
78
103
 
79
- cloneRule({ ...rule } = this.rule): StyleRule {
104
+ cloneRule({ ...rule } = this.ruleTemplate): StyleRule {
80
105
  rule.s = [...rule.s];
81
106
  rule.aq &&= [...rule.aq];
82
107
  rule.c &&= [...rule.c];
@@ -128,11 +153,17 @@ export class StylesheetBuilder {
128
153
  }
129
154
 
130
155
  if (this.shared.rootVariables) {
131
- stylesheetOptions.vr = Object.entries(this.shared.rootVariables);
156
+ stylesheetOptions.vr = Object.entries(this.shared.rootVariables).map(
157
+ // Reverse these so the most specific variables are first
158
+ ([key, value]) => [key, value.reverse()] as const,
159
+ );
132
160
  }
133
161
 
134
162
  if (this.shared.universalVariables) {
135
- stylesheetOptions.vu = Object.entries(this.shared.universalVariables);
163
+ stylesheetOptions.vu = Object.entries(this.shared.universalVariables).map(
164
+ // Reverse these so the most specific variables are first
165
+ ([key, value]) => [key, value.reverse()] as const,
166
+ );
136
167
  }
137
168
 
138
169
  if (this.shared.animations) {
@@ -155,11 +186,64 @@ export class StylesheetBuilder {
155
186
  );
156
187
  }
157
188
 
189
+ setWarningProperty(property: string) {
190
+ this.shared.warningProperty = property;
191
+ }
192
+
193
+ addWarning(type: "property" | "value", property: string): void;
194
+ addWarning(type: "style", property: string, value: unknown): void;
158
195
  addWarning(
159
- _type: "property" | "value" | "function",
160
- _property: string | number,
196
+ type: "property" | "style" | "value",
197
+ property: string,
198
+ value?: unknown,
161
199
  ): void {
162
- // TODO
200
+ switch (type) {
201
+ case "property":
202
+ this.shared.warningProperties.push(property);
203
+ break;
204
+ case "value": {
205
+ value = property;
206
+ property = this.shared.warningProperty ?? "";
207
+
208
+ if (!property) {
209
+ return;
210
+ }
211
+
212
+ this.shared.warningValues[property] ??= [];
213
+ this.shared.warningValues[property]?.push(value);
214
+ break;
215
+ }
216
+ case "style":
217
+ this.shared.warningValues[property] ??= [];
218
+ this.shared.warningValues[property]?.push(value);
219
+ break;
220
+ }
221
+ }
222
+
223
+ getWarnings() {
224
+ const result: {
225
+ properties?: string[];
226
+ values?: Record<string, unknown[]>;
227
+ functions?: string[];
228
+ } = {};
229
+
230
+ if (this.shared.warningProperties.length) {
231
+ result.properties = this.shared.warningProperties;
232
+ }
233
+
234
+ if (Object.keys(this.shared.warningValues).length) {
235
+ result.values = this.shared.warningValues;
236
+ }
237
+
238
+ if (this.shared.warningFunctions.length) {
239
+ result.functions = this.shared.warningFunctions;
240
+ }
241
+
242
+ return result;
243
+ }
244
+
245
+ addMapping(mapping: StyleRuleMapping) {
246
+ this.mapping = { ...this.mapping, ...mapping };
163
247
  }
164
248
 
165
249
  newRule(mapping = this.mapping, { important = false } = {}) {
@@ -171,14 +255,12 @@ export class StylesheetBuilder {
171
255
  }
172
256
  }
173
257
 
174
- newRuleFork({ important = false } = {}) {
175
- this.rule = this.cloneRule(this.rule);
176
- this.rule.s[Specificity.Order] = this.shared.ruleOrder;
177
- if (important) {
178
- this.rule.s[Specificity.Important] = 1;
179
- }
258
+ /** Used by nested declarations (for example @media inside a RuleSet) */
259
+ newNestedRule({ important = false } = {}) {
260
+ this.newRule(this.mapping, { important });
180
261
  }
181
262
 
263
+ /** Hack for light-dark, which requires adding a new rule without changing the current rule */
182
264
  addExtraRule(rule: Partial<StyleRule>) {
183
265
  let extraRuleArray = extraRules.get(this.rule);
184
266
  if (!extraRuleArray) {
@@ -197,8 +279,8 @@ export class StylesheetBuilder {
197
279
  }
198
280
 
199
281
  addMediaQuery(condition: MediaCondition) {
200
- this.rule.m ??= [];
201
- this.rule.m.push(condition);
282
+ this.ruleTemplate.m ??= [];
283
+ this.ruleTemplate.m.push(condition);
202
284
  }
203
285
 
204
286
  addContainer(value: string[] | false) {
@@ -297,30 +379,29 @@ export class StylesheetBuilder {
297
379
  }
298
380
 
299
381
  private pushDescriptor(
300
- property: string,
382
+ rawProperty: string,
301
383
  value: StyleDescriptor,
302
384
  declarations: StyleDeclaration[],
303
385
  forceTuple = false,
304
386
  delayed = false,
305
387
  ) {
306
- property = toRNProperty(property);
388
+ const property = toRNProperty(rawProperty);
307
389
 
308
- let propPath: string | string[] =
309
- this.mapping[property] ?? this.mapping["*"] ?? property;
390
+ let propPath: string | string[] | undefined =
391
+ this.mapping[rawProperty] ?? this.mapping[property] ?? this.mapping["*"];
310
392
 
311
393
  if (Array.isArray(propPath)) {
312
- const first = propPath[0];
394
+ const [first, second] = propPath;
313
395
 
314
- if (!first) {
315
- // This should not happen, but if it does, we skip the property
316
- return;
317
- }
318
-
319
- if (propPath.length === 1) {
320
- propPath = first;
396
+ if (propPath.length === 2 && first === "*" && second) {
397
+ propPath = second;
321
398
  } else {
322
399
  forceTuple = true;
323
400
  }
401
+ } else if (propPath) {
402
+ forceTuple = true;
403
+ } else {
404
+ propPath = property;
324
405
  }
325
406
 
326
407
  if (isStyleFunction(value)) {
@@ -345,17 +426,23 @@ export class StylesheetBuilder {
345
426
  }
346
427
 
347
428
  applyRuleToSelectors(selectorList = this.selectors): void {
348
- if (!selectorList?.length) {
429
+ if (!selectorList.length) {
349
430
  // If there are no selectors, we cannot apply the rule
350
431
  return;
351
432
  }
352
433
 
353
- if (!this.rule.d && !this.rule.v) {
434
+ if (!this.rule.d && !this.rule.v && !this.rule.c) {
354
435
  return;
355
436
  }
356
437
 
357
- for (const selector of selectorList) {
358
- const rule = this.cloneRule();
438
+ const normalizedSelectors = getClassNameSelectors(
439
+ selectorList,
440
+ this.options,
441
+ );
442
+
443
+ for (const selector of normalizedSelectors) {
444
+ // We are going to be apply the current rule to n selectors, so we clone the rule
445
+ const rule = this.cloneRule(this.rule);
359
446
 
360
447
  if (selector.type === "className") {
361
448
  const {
@@ -367,6 +454,10 @@ export class StylesheetBuilder {
367
454
  attributeQuery,
368
455
  } = selector;
369
456
 
457
+ if (!className) {
458
+ continue; // No className, nothing to do
459
+ }
460
+
370
461
  // Combine the specificity of the selector with the rule's specificity
371
462
  for (let i = 0; i < specificity.length; i++) {
372
463
  const spec = specificity[i];
@@ -390,14 +481,29 @@ export class StylesheetBuilder {
390
481
  continue;
391
482
  }
392
483
 
484
+ const [first, ...rest] = name.split(".");
485
+
486
+ if (typeof first !== "string") {
487
+ continue;
488
+ }
489
+
393
490
  const containerRule: StyleRule = {
394
491
  // These are not "real" rules, so they use the lowest specificity
395
492
  s: [0],
396
493
  c: [name],
397
494
  };
398
495
 
496
+ if (rest.length) {
497
+ containerRule.aq = rest.map((attr) => [
498
+ "a",
499
+ "className",
500
+ "*=",
501
+ attr,
502
+ ]);
503
+ }
504
+
399
505
  // Create rules for the parent classes
400
- this.addRuleToRuleSet(name, containerRule);
506
+ this.addRuleToRuleSet(first, containerRule);
401
507
  }
402
508
  }
403
509
 
@@ -426,21 +532,24 @@ export class StylesheetBuilder {
426
532
  if (!this.rule.v) {
427
533
  continue;
428
534
  }
429
-
430
- const { type, subtype } = selector;
431
-
535
+ const { type } = selector;
432
536
  for (const [name, value] of this.rule.v) {
433
537
  this.shared[type] ??= {};
434
- this.shared[type][name] ??= [undefined];
435
- this.shared[type][name][subtype === "light" ? 0 : 1] = value;
538
+ this.shared[type][name] ??= [];
539
+ const mediaQueries = this.rule.m;
540
+ const variableValue: VariableValue = mediaQueries
541
+ ? [value, [...mediaQueries]]
542
+ : [value];
543
+ // Append extra media queries if they exist
544
+ this.shared[type][name].push(variableValue);
436
545
  }
437
546
  }
438
547
  }
439
548
  }
440
549
 
441
550
  addContainerQuery(query: ContainerQuery) {
442
- this.rule.cq ??= [];
443
- this.rule.cq.push(query);
551
+ this.ruleTemplate.cq ??= [];
552
+ this.ruleTemplate.cq.push(query);
444
553
  }
445
554
 
446
555
  newAnimationFrames(name: string) {
package/src/jest/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { Appearance, Dimensions } from "react-native";
2
2
 
3
+ import { inspect } from "node:util";
4
+
3
5
  import { compile, type CompilerOptions } from "../compiler";
4
6
  import { StyleCollection } from "../runtime/native/injection";
5
7
  import { colorScheme, dimensions, rem } from "../runtime/native/reactivity";
@@ -23,19 +25,41 @@ beforeEach(() => {
23
25
  colorScheme.set(null);
24
26
  });
25
27
 
28
+ const debugDefault = Boolean(
29
+ process.env.REACT_NATIVE_CSS_TEST_DEBUG &&
30
+ process.env.NODE_OPTIONS?.includes("--inspect"),
31
+ );
32
+
26
33
  export function registerCSS(
27
34
  css: string,
28
35
  {
29
- debugCompiled = process.env.NODE_OPTIONS?.includes("--inspect"),
36
+ debug = debugDefault,
30
37
  ...options
31
- }: CompilerOptions & { debugCompiled?: boolean } = {},
38
+ }: CompilerOptions & { debug?: boolean } = {},
32
39
  ) {
33
- const compiled = compile(css, options);
34
- if (debugCompiled) {
35
- console.log(`Compiled styles:\n\n${JSON.stringify({ compiled }, null, 2)}`);
40
+ const logger = debug
41
+ ? (text: string) => {
42
+ // Just log the rules
43
+ if (text.startsWith("[")) {
44
+ console.log(`Rules:\n---\n${text}`);
45
+ }
46
+ }
47
+ : undefined;
48
+
49
+ const compiled = compile(css, { ...options, logger });
50
+ if (debug) {
51
+ console.log(
52
+ `Compiled:\n---\n${inspect(
53
+ {
54
+ stylesheet: compiled.stylesheet(),
55
+ warnings: compiled.warnings(),
56
+ },
57
+ { depth: null, colors: true, compact: false },
58
+ )}`,
59
+ );
36
60
  }
37
61
 
38
- StyleCollection.inject(compiled);
62
+ StyleCollection.inject(compiled.stylesheet());
39
63
 
40
64
  return compiled;
41
65
  }
@@ -6,7 +6,7 @@ import connect from "connect";
6
6
  import debug from "debug";
7
7
  import type { MetroConfig } from "metro-config";
8
8
 
9
- import type { CompilerOptions } from "../compiler";
9
+ import type { CompilerOptions, ReactNativeCssStyleSheet_V2 } from "../compiler";
10
10
  import { compile } from "../compiler/compiler";
11
11
  import { getNativeInjectionCode, getWebInjectionCode } from "./injection-code";
12
12
  import { nativeResolver, webResolver } from "./resolver";
@@ -93,7 +93,10 @@ export function withReactNativeCSS<
93
93
  if (!bundler.__react_native_css__patched) {
94
94
  bundler.__react_native_css__patched = true;
95
95
 
96
- const nativeCSSFiles = new Map();
96
+ const nativeCSSFiles = new Map<
97
+ string,
98
+ [string, ReactNativeCssStyleSheet_V2]
99
+ >();
97
100
  const webCSSFiles = new Set<string>();
98
101
 
99
102
  const nativeInjectionPath = require.resolve(
@@ -174,7 +177,7 @@ export function withReactNativeCSS<
174
177
  next,
175
178
  compile(next, {
176
179
  hexColors: options?.hexColors,
177
- }),
180
+ }).stylesheet(),
178
181
  ]);
179
182
 
180
183
  watcher.emit("change", {
@@ -1,4 +1,7 @@
1
- throw new Error(`react-native-css has encountered a setup error.
1
+ const canWarn = process.env.NODE_ENV !== "test";
2
+
3
+ if (canWarn) {
4
+ throw new Error(`react-native-css has encountered a setup error.
2
5
 
3
6
  ┌─────-─┐
4
7
  | Metro |
@@ -28,5 +31,6 @@ If you are using NativeWind with the 'withNativeWind' function, follow the Metro
28
31
 
29
32
  If you are using another bundler (Vite, Webpack, etc), or non-Metro framework (Next.js, Remix, etc), please ensure you have included 'react-native-css/babel' as a babel preset.
30
33
  `);
34
+ }
31
35
 
32
36
  export {};
@@ -0,0 +1,52 @@
1
+ import type { AttributeQuery } from "../../../compiler";
2
+ import type { Props } from "../../runtime.types";
3
+ import type { RenderGuard } from "./guards";
4
+
5
+ export function testAttributes(
6
+ queries: AttributeQuery[],
7
+ props: Props,
8
+ guards: RenderGuard[],
9
+ ) {
10
+ return queries.every((query) => testAttribute(query, props, guards));
11
+ }
12
+
13
+ function testAttribute(
14
+ [type, prop, operator, testValue]: AttributeQuery,
15
+ props: Props,
16
+ guards: RenderGuard[],
17
+ ) {
18
+ let value: unknown;
19
+
20
+ if (type === "a") {
21
+ value = props?.[prop];
22
+ } else {
23
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
24
+ value = props?.dataSet?.[prop];
25
+ }
26
+
27
+ guards.push([type, prop, value]);
28
+
29
+ if (!operator) {
30
+ return value !== undefined && value !== null && value !== false;
31
+ }
32
+
33
+ switch (operator) {
34
+ case "!":
35
+ return !value;
36
+ case "=":
37
+ return value == testValue;
38
+ case "~=":
39
+ return testValue && value?.toString().split(" ").includes(testValue);
40
+ case "|=":
41
+ return testValue && value?.toString().startsWith(testValue + "-");
42
+ case "^=":
43
+ return testValue && value?.toString().startsWith(testValue);
44
+ case "$=":
45
+ return testValue && value?.toString().endsWith(testValue);
46
+ case "*=":
47
+ return testValue && value?.toString().includes(testValue);
48
+ default:
49
+ operator satisfies never;
50
+ return false;
51
+ }
52
+ }
@@ -14,8 +14,9 @@ import {
14
14
  focusFamily,
15
15
  hoverFamily,
16
16
  type ContainerContextValue,
17
- type Effect,
17
+ type Getter,
18
18
  } from "../reactivity";
19
+ // import { testAttributes } from "./attributes";
19
20
  import type { RenderGuard } from "./guards";
20
21
 
21
22
  export const DEFAULT_CONTAINER_NAME = "c:___default___";
@@ -24,10 +25,10 @@ export function testContainerQueries(
24
25
  queries: ContainerQuery[],
25
26
  inheritedContainers: ContainerContextValue,
26
27
  guards: RenderGuard[],
27
- effect: Effect,
28
+ get: Getter,
28
29
  ) {
29
30
  return queries.every((query) => {
30
- return testContainerQuery(query, inheritedContainers, guards, effect);
31
+ return testContainerQuery(query, inheritedContainers, guards, get);
31
32
  });
32
33
  }
33
34
 
@@ -35,7 +36,7 @@ export function testContainerQuery(
35
36
  query: ContainerQuery,
36
37
  inheritedContainers: ContainerContextValue,
37
38
  guards: RenderGuard[],
38
- effect?: Effect,
39
+ get: Getter,
39
40
  ): boolean {
40
41
  const name = query.n ?? DEFAULT_CONTAINER_NAME;
41
42
  const container = inheritedContainers[name]!;
@@ -46,11 +47,15 @@ export function testContainerQuery(
46
47
  return false;
47
48
  }
48
49
 
49
- if (query.m && !testContainerMediaCondition(query.m, container, effect)) {
50
+ // if (query.a && !testAttributes(query.a, container.props, guards)) {
51
+ // return false;
52
+ // }
53
+
54
+ if (query.m && !testContainerMediaCondition(query.m, container, get)) {
50
55
  return false;
51
56
  }
52
57
 
53
- if (query.p && !testContainerPseudoCondition(query.p, container, effect)) {
58
+ if (query.p && !testContainerPseudoCondition(query.p, container, get)) {
54
59
  return false;
55
60
  }
56
61
 
@@ -60,15 +65,15 @@ export function testContainerQuery(
60
65
  function testContainerPseudoCondition(
61
66
  query: PseudoClassesQuery,
62
67
  containerKey: WeakKey,
63
- effect?: Effect,
68
+ get: Getter,
64
69
  ): boolean {
65
- if (query.h && !hoverFamily(containerKey).get(effect)) {
70
+ if (query.h && !get(hoverFamily(containerKey))) {
66
71
  return false;
67
72
  }
68
- if (query.a && !activeFamily(containerKey).get(effect)) {
73
+ if (query.a && !get(activeFamily(containerKey))) {
69
74
  return false;
70
75
  }
71
- if (query.f && !focusFamily(containerKey).get(effect)) {
76
+ if (query.f && !get(focusFamily(containerKey))) {
72
77
  return false;
73
78
  }
74
79
  return true;
@@ -77,18 +82,18 @@ function testContainerPseudoCondition(
77
82
  function testContainerMediaCondition(
78
83
  condition: MediaCondition,
79
84
  containerKey: WeakKey,
80
- effect?: Effect,
85
+ get: Getter,
81
86
  ): boolean {
82
87
  switch (condition[0]) {
83
88
  case "!":
84
- return !testContainerMediaCondition(condition[1], containerKey, effect);
89
+ return !testContainerMediaCondition(condition[1], containerKey, get);
85
90
  case "&":
86
91
  return condition[1].every((query) => {
87
- return testContainerMediaCondition(query, containerKey, effect);
92
+ return testContainerMediaCondition(query, containerKey, get);
88
93
  });
89
94
  case "|":
90
95
  return condition[1].some((query) => {
91
- return testContainerMediaCondition(query, containerKey, effect);
96
+ return testContainerMediaCondition(query, containerKey, get);
92
97
  });
93
98
  case "!!":
94
99
  return false;
@@ -99,7 +104,7 @@ function testContainerMediaCondition(
99
104
  case "<":
100
105
  case "<=":
101
106
  case "=": {
102
- const left = getContainerFeatureValue(condition[1], containerKey, effect);
107
+ const left = getContainerFeatureValue(condition[1], containerKey, get);
103
108
  const right = condition[2];
104
109
 
105
110
  if (condition[0] === "=") {
@@ -133,21 +138,21 @@ function testContainerMediaCondition(
133
138
  function getContainerFeatureValue(
134
139
  name: MediaFeatureNameFor_ContainerSizeFeatureId,
135
140
  containerKey: WeakKey,
136
- effect?: Effect,
141
+ get: Getter,
137
142
  ): StyleDescriptor {
138
143
  switch (name) {
139
144
  case "width":
140
- return containerWidthFamily(containerKey).get(effect);
145
+ return get(containerWidthFamily(containerKey));
141
146
  case "height":
142
- return containerHeightFamily(containerKey).get(effect);
147
+ return get(containerHeightFamily(containerKey));
143
148
  case "aspect-ratio": {
144
- const width = containerWidthFamily(containerKey).get(effect);
145
- const height = containerWidthFamily(containerKey).get(effect);
149
+ const width = get(containerWidthFamily(containerKey));
150
+ const height = get(containerHeightFamily(containerKey));
146
151
  return width / height;
147
152
  }
148
153
  case "orientation":
149
- const width = containerWidthFamily(containerKey).get(effect);
150
- const height = containerWidthFamily(containerKey).get(effect);
154
+ const width = get(containerWidthFamily(containerKey));
155
+ const height = get(containerHeightFamily(containerKey));
151
156
  return width > height ? "landscape" : "portrait";
152
157
  case "inline-size":
153
158
  case "block-size":
@@ -2,7 +2,6 @@
2
2
  import type { ComponentState } from "../react/useNativeCss";
3
3
  import type {
4
4
  ContainerContextValue,
5
- Effect,
6
5
  VariableContextValue,
7
6
  } from "../reactivity";
8
7
 
@@ -10,7 +9,7 @@ export type RenderGuard =
10
9
  | ["a", string, any]
11
10
  | ["d", string, any]
12
11
  | ["v", string, any]
13
- | ["c", string, Effect];
12
+ | ["c", string, WeakKey];
14
13
 
15
14
  export function testGuards(
16
15
  state: ComponentState,