@tamagui/core 1.0.0-alpha.4 → 1.0.0-alpha.8

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 (225) hide show
  1. package/dist/cjs/constants/constants.js +50 -0
  2. package/{_ → dist/cjs}/constants/constants.js.map +2 -2
  3. package/dist/cjs/constants/platform.js +43 -0
  4. package/dist/cjs/constants/platform.js.map +7 -0
  5. package/dist/cjs/constants/pseudos.js +25 -0
  6. package/{_ → dist/cjs}/constants/pseudos.js.map +2 -2
  7. package/{_ → dist/cjs}/constants/rnw.js +9 -3
  8. package/{_ → dist/cjs}/constants/rnw.js.map +2 -2
  9. package/dist/cjs/createComponent.js +531 -0
  10. package/dist/cjs/createComponent.js.map +7 -0
  11. package/dist/cjs/createFont.js +50 -0
  12. package/dist/cjs/createFont.js.map +7 -0
  13. package/{_ → dist/cjs}/createShorthands.js +9 -3
  14. package/{_ → dist/cjs}/createShorthands.js.map +2 -2
  15. package/dist/cjs/createTamagui.js +206 -0
  16. package/dist/cjs/createTamagui.js.map +7 -0
  17. package/dist/cjs/createTheme.js +42 -0
  18. package/{_ → dist/cjs}/createTheme.js.map +2 -2
  19. package/dist/cjs/createTokens.js +55 -0
  20. package/dist/cjs/createTokens.js.map +7 -0
  21. package/dist/cjs/createVariable.js +47 -0
  22. package/dist/cjs/createVariable.js.map +7 -0
  23. package/dist/cjs/helpers/addStylesUsingClassname.js +79 -0
  24. package/dist/cjs/helpers/addStylesUsingClassname.js.map +7 -0
  25. package/dist/cjs/helpers/createMediaStyle.js +56 -0
  26. package/{_ → dist/cjs}/helpers/createMediaStyle.js.map +2 -2
  27. package/dist/cjs/helpers/createPropMapper.js +190 -0
  28. package/dist/cjs/helpers/createPropMapper.js.map +7 -0
  29. package/dist/cjs/helpers/createTamaguiProvider.js +74 -0
  30. package/dist/cjs/helpers/createTamaguiProvider.js.map +7 -0
  31. package/dist/cjs/helpers/extendStaticConfig.js +82 -0
  32. package/dist/cjs/helpers/extendStaticConfig.js.map +7 -0
  33. package/dist/cjs/helpers/fixNativeShadow.js +14 -0
  34. package/dist/cjs/helpers/fixNativeShadow.js.map +7 -0
  35. package/{_ → dist/cjs}/helpers/fixNativeShadow.native.js +9 -3
  36. package/{_ → dist/cjs}/helpers/fixNativeShadow.native.js.map +2 -2
  37. package/dist/cjs/helpers/getSplitStyles.js +180 -0
  38. package/dist/cjs/helpers/getSplitStyles.js.map +7 -0
  39. package/dist/cjs/helpers/getStylesAtomic.js +117 -0
  40. package/{_ → dist/cjs}/helpers/getStylesAtomic.js.map +2 -2
  41. package/dist/cjs/helpers/getStylesAtomic.native.js +16 -0
  42. package/dist/cjs/helpers/getStylesAtomic.native.js.map +7 -0
  43. package/dist/cjs/helpers/insertStyleRule.js +46 -0
  44. package/{_ → dist/cjs}/helpers/insertStyleRule.js.map +2 -2
  45. package/dist/cjs/helpers/isObj.js +13 -0
  46. package/dist/cjs/helpers/isObj.js.map +7 -0
  47. package/dist/cjs/helpers/isTamaguiElement.js +33 -0
  48. package/dist/cjs/helpers/isTamaguiElement.js.map +7 -0
  49. package/dist/cjs/helpers/matchMedia.js +24 -0
  50. package/dist/cjs/helpers/matchMedia.js.map +7 -0
  51. package/dist/cjs/helpers/matchMedia.native.js +31 -0
  52. package/dist/cjs/helpers/matchMedia.native.js.map +7 -0
  53. package/dist/cjs/helpers/themeable.js +78 -0
  54. package/{_ → dist/cjs}/helpers/themeable.js.map +2 -2
  55. package/dist/cjs/helpers/validate.js +82 -0
  56. package/dist/cjs/helpers/validate.js.map +7 -0
  57. package/dist/cjs/hooks/useConstant.js +37 -0
  58. package/{_ → dist/cjs}/hooks/useConstant.js.map +2 -2
  59. package/dist/cjs/hooks/useFeatures.js +100 -0
  60. package/dist/cjs/hooks/useFeatures.js.map +7 -0
  61. package/{_ → dist/cjs}/hooks/useMedia.js +59 -28
  62. package/dist/cjs/hooks/useMedia.js.map +7 -0
  63. package/dist/cjs/hooks/usePressable.js +50 -0
  64. package/{_ → dist/cjs}/hooks/usePressable.js.map +2 -2
  65. package/dist/cjs/hooks/useTheme.js +111 -0
  66. package/dist/cjs/hooks/useTheme.js.map +7 -0
  67. package/dist/cjs/index.js +55 -0
  68. package/dist/cjs/index.js.map +7 -0
  69. package/dist/cjs/static/postProcessStyles.js +40 -0
  70. package/{_ → dist/cjs}/static/postProcessStyles.js.map +2 -2
  71. package/dist/cjs/static.js +34 -0
  72. package/dist/cjs/static.js.map +7 -0
  73. package/dist/cjs/styled.js +72 -0
  74. package/dist/cjs/styled.js.map +7 -0
  75. package/dist/cjs/types.js +4 -0
  76. package/dist/cjs/types.js.map +7 -0
  77. package/dist/cjs/views/Animated.js +129 -0
  78. package/{_ → dist/cjs}/views/Animated.js.map +2 -2
  79. package/dist/cjs/views/Stack.js +51 -0
  80. package/{_ → dist/cjs}/views/Stack.js.map +2 -2
  81. package/dist/cjs/views/Text.js +93 -0
  82. package/{_ → dist/cjs}/views/Text.js.map +2 -2
  83. package/dist/cjs/views/TextAncestorContext.js +41 -0
  84. package/{_ → dist/cjs}/views/TextAncestorContext.js.map +2 -2
  85. package/dist/cjs/views/Theme.js +88 -0
  86. package/dist/cjs/views/Theme.js.map +7 -0
  87. package/dist/cjs/views/ThemeContext.js +29 -0
  88. package/{_ → dist/cjs}/views/ThemeContext.js.map +2 -2
  89. package/dist/cjs/views/ThemeInverse.js +48 -0
  90. package/{_ → dist/cjs}/views/ThemeInverse.js.map +3 -3
  91. package/dist/cjs/views/ThemeManagerContext.js +84 -0
  92. package/dist/cjs/views/ThemeManagerContext.js.map +7 -0
  93. package/dist/cjs/views/ThemeProvider.js +67 -0
  94. package/{_ → dist/cjs}/views/ThemeProvider.js.map +2 -2
  95. package/dist/createComponent.js +49 -31
  96. package/dist/createComponent.js.map +2 -2
  97. package/dist/createFont.js +4 -0
  98. package/dist/createFont.js.map +2 -2
  99. package/dist/createTamagui.js +11 -2
  100. package/dist/createTamagui.js.map +2 -2
  101. package/dist/createTokens.js +4 -0
  102. package/dist/createTokens.js.map +2 -2
  103. package/dist/createVariable.js +3 -0
  104. package/dist/createVariable.js.map +2 -2
  105. package/dist/helpers/createPropMapper.js +2 -2
  106. package/dist/helpers/createPropMapper.js.map +1 -1
  107. package/dist/helpers/getSplitStyles.js +13 -23
  108. package/dist/helpers/getSplitStyles.js.map +2 -2
  109. package/dist/helpers/isComponent.js +10 -0
  110. package/dist/helpers/isComponent.js.map +7 -0
  111. package/dist/helpers/isTamaguiComponent.js +10 -0
  112. package/dist/helpers/isTamaguiComponent.js.map +7 -0
  113. package/dist/helpers/isTamaguiElement.js +10 -0
  114. package/dist/helpers/isTamaguiElement.js.map +7 -0
  115. package/dist/helpers/matchMedia.js +3 -0
  116. package/dist/helpers/matchMedia.js.map +2 -2
  117. package/dist/helpers/matchMedia.native.js +1 -0
  118. package/dist/helpers/matchMedia.native.js.map +2 -2
  119. package/dist/helpers/validate.js +60 -0
  120. package/dist/helpers/validate.js.map +7 -0
  121. package/dist/helpers/validateConfig.js +46 -0
  122. package/dist/helpers/validateConfig.js.map +7 -0
  123. package/dist/helpers/validateTokens.js +29 -0
  124. package/dist/helpers/validateTokens.js.map +7 -0
  125. package/dist/hooks/useFeatures.js +39 -51
  126. package/dist/hooks/useFeatures.js.map +2 -2
  127. package/dist/hooks/useMedia.js.map +1 -1
  128. package/dist/hooks/useTheme.js +5 -9
  129. package/dist/hooks/useTheme.js.map +2 -2
  130. package/dist/index.cjs +234 -135
  131. package/dist/index.cjs.map +3 -3
  132. package/dist/index.js +1 -1
  133. package/dist/index.js.map +2 -2
  134. package/dist/views/Theme.js +16 -7
  135. package/dist/views/Theme.js.map +2 -2
  136. package/dist/views/ThemeInverse.js +0 -1
  137. package/dist/views/ThemeInverse.js.map +2 -2
  138. package/dist/views/ThemeManagerContext.js +11 -5
  139. package/dist/views/ThemeManagerContext.js.map +2 -2
  140. package/package.json +18 -12
  141. package/src/createComponent.tsx +55 -40
  142. package/src/createFont.ts +5 -0
  143. package/src/createTamagui.ts +11 -1
  144. package/src/createTokens.ts +6 -1
  145. package/src/createVariable.ts +4 -0
  146. package/src/helpers/createPropMapper.ts +2 -2
  147. package/src/helpers/getSplitStyles.tsx +16 -26
  148. package/src/helpers/isTamaguiElement.tsx +5 -0
  149. package/src/helpers/matchMedia.native.ts +3 -0
  150. package/src/helpers/matchMedia.ts +9 -1
  151. package/src/helpers/validate.ts +59 -0
  152. package/src/hooks/useFeatures.tsx +54 -53
  153. package/src/hooks/useMedia.tsx +1 -1
  154. package/src/hooks/useTheme.tsx +7 -8
  155. package/src/index.ts +1 -1
  156. package/src/types.tsx +3 -2
  157. package/src/views/Theme.tsx +26 -9
  158. package/src/views/ThemeInverse.tsx +0 -1
  159. package/src/views/ThemeManagerContext.tsx +18 -6
  160. package/types.d.ts +10 -8
  161. package/.ultra.cache.json +0 -1
  162. package/_/constants/constants.js +0 -14
  163. package/_/constants/platform.js +0 -20
  164. package/_/constants/platform.js.map +0 -7
  165. package/_/constants/pseudos.js +0 -18
  166. package/_/createComponent.js +0 -427
  167. package/_/createComponent.js.map +0 -7
  168. package/_/createTamagui.js +0 -122
  169. package/_/createTamagui.js.map +0 -7
  170. package/_/createTheme.js +0 -20
  171. package/_/createTokens.js +0 -29
  172. package/_/createTokens.js.map +0 -7
  173. package/_/createVariable.js +0 -22
  174. package/_/createVariable.js.map +0 -7
  175. package/_/helpers/addStylesUsingClassname.js +0 -32
  176. package/_/helpers/addStylesUsingClassname.js.map +0 -7
  177. package/_/helpers/createMediaStyle.js +0 -34
  178. package/_/helpers/createTamaguiProvider.js +0 -42
  179. package/_/helpers/createTamaguiProvider.js.map +0 -7
  180. package/_/helpers/extendStaticConfig.js +0 -176
  181. package/_/helpers/extendStaticConfig.js.map +0 -7
  182. package/_/helpers/fixNativeShadow.js +0 -8
  183. package/_/helpers/fixNativeShadow.js.map +0 -7
  184. package/_/helpers/getSplitStyles.js +0 -160
  185. package/_/helpers/getSplitStyles.js.map +0 -7
  186. package/_/helpers/getStylesAtomic.js +0 -84
  187. package/_/helpers/getStylesAtomic.native.js +0 -10
  188. package/_/helpers/getStylesAtomic.native.js.map +0 -7
  189. package/_/helpers/insertStyleRule.js +0 -24
  190. package/_/helpers/matchMedia.js +0 -15
  191. package/_/helpers/matchMedia.js.map +0 -7
  192. package/_/helpers/matchMedia.native.js +0 -8
  193. package/_/helpers/matchMedia.native.js.map +0 -7
  194. package/_/helpers/themeable.js +0 -26
  195. package/_/hooks/useConstant.js +0 -15
  196. package/_/hooks/useFeatures.js +0 -75
  197. package/_/hooks/useFeatures.js.map +0 -7
  198. package/_/hooks/useForceUpdate.js +0 -28
  199. package/_/hooks/useForceUpdate.js.map +0 -7
  200. package/_/hooks/useMedia.js.map +0 -7
  201. package/_/hooks/usePressable.js +0 -14
  202. package/_/hooks/useTheme.js +0 -94
  203. package/_/hooks/useTheme.js.map +0 -7
  204. package/_/index.js +0 -30
  205. package/_/index.js.map +0 -7
  206. package/_/static/postProcessStyles.js +0 -18
  207. package/_/static.js +0 -12
  208. package/_/static.js.map +0 -7
  209. package/_/styled.js +0 -21
  210. package/_/styled.js.map +0 -7
  211. package/_/types.js +0 -1
  212. package/_/types.js.map +0 -7
  213. package/_/views/Animated.js +0 -79
  214. package/_/views/Stack.js +0 -12
  215. package/_/views/Text.js +0 -60
  216. package/_/views/TextAncestorContext.js +0 -19
  217. package/_/views/Theme.js +0 -57
  218. package/_/views/Theme.js.map +0 -7
  219. package/_/views/ThemeContext.js +0 -6
  220. package/_/views/ThemeInverse.js +0 -27
  221. package/_/views/ThemeManagerContext.js +0 -56
  222. package/_/views/ThemeManagerContext.js.map +0 -7
  223. package/_/views/ThemeProvider.js +0 -45
  224. package/src/views/SafeAreaProvider.tsx +0 -33
  225. package/tsconfig.json +0 -8
package/dist/index.cjs CHANGED
@@ -56,7 +56,6 @@ var __toModule = (module2) => {
56
56
  __export(exports, {
57
57
  AnimatedStack: () => AnimatedStack,
58
58
  GET_DEFAULT_THEME: () => GET_DEFAULT_THEME,
59
- SafeAreaProvider: () => SafeAreaProvider,
60
59
  Spacer: () => Spacer,
61
60
  Stack: () => Stack,
62
61
  Text: () => Text2,
@@ -83,6 +82,7 @@ __export(exports, {
83
82
  isChrome: () => isChrome,
84
83
  isObj: () => isObj,
85
84
  isSSR: () => isSSR,
85
+ isTamaguiElement: () => isTamaguiElement,
86
86
  isTouchDevice: () => isTouchDevice,
87
87
  isVariable: () => isVariable,
88
88
  isWeb: () => isWeb,
@@ -166,6 +166,9 @@ var Variable = class {
166
166
  this.name = name;
167
167
  this.variable = isWeb ? `var(--${name})` : this.val;
168
168
  }
169
+ toString() {
170
+ return isWeb ? this.variable : this.val;
171
+ }
169
172
  };
170
173
  __name(Variable, "Variable");
171
174
  var createVariable = /* @__PURE__ */ __name((props) => new Variable(props), "createVariable");
@@ -216,16 +219,22 @@ var import_react5 = __toModule(require("react"));
216
219
  var ThemeManager = class {
217
220
  constructor() {
218
221
  this.name = "light";
222
+ this.parentName = null;
219
223
  this.keys = new Map();
220
224
  this.listeners = new Map();
221
225
  this.callbacks = new Set();
222
226
  this.theme = null;
223
227
  }
224
- setActiveTheme(name, theme) {
228
+ setActiveTheme({
229
+ name,
230
+ theme,
231
+ parentName
232
+ }) {
225
233
  if (name === this.name)
226
234
  return;
227
235
  this.name = name;
228
236
  this.theme = theme;
237
+ this.parentName = parentName || null;
229
238
  this.update();
230
239
  }
231
240
  track(uuid, keys) {
@@ -269,28 +278,37 @@ var Theme = /* @__PURE__ */ __name((props) => {
269
278
  const themes = (0, import_react6.useContext)(ThemeContext);
270
279
  const [parentName, setParentName] = (0, import_react6.useState)(parent.name || "light");
271
280
  if (!themes) {
272
- console.warn("no themes???", props);
281
+ console.warn("Error, no themes in context", props);
273
282
  return props.children;
274
283
  }
275
284
  const name = props.name;
276
- const theme = themes[name] || themes[`${name}-${parentName}`];
285
+ const nextNameParent = `${name}-${parentName}`;
286
+ const nextNameParentParent = `${name}-${parent.parentName}`;
287
+ const activeName = !name ? null : name in themes ? name : nextNameParent in themes ? nextNameParent : nextNameParentParent in themes ? nextNameParentParent : null;
288
+ const theme = activeName ? themes[activeName] : null;
277
289
  const themeManager = useConstant(() => {
290
+ if (!theme) {
291
+ return null;
292
+ }
278
293
  const manager = new ThemeManager();
279
294
  if (name) {
280
- manager.setActiveTheme(name, themes[name]);
295
+ manager.setActiveTheme({ name, theme: themes[name], parentName });
281
296
  }
282
297
  return manager;
283
298
  });
284
299
  useIsomorphicLayoutEffect(() => {
285
- themeManager.setActiveTheme(name, theme);
300
+ if (!themeManager) {
301
+ return;
302
+ }
303
+ themeManager.setActiveTheme({ name: activeName, theme, parentName });
286
304
  return parent.onChangeTheme((next) => {
287
305
  if (next) {
288
- themeManager.setActiveTheme(next, themes[next]);
306
+ themeManager.setActiveTheme({ name: next, theme: themes[next], parentName });
289
307
  setParentName(next);
290
308
  }
291
309
  });
292
- }, [themes, name]);
293
- if (!name) {
310
+ }, [themes, activeName, parentName]);
311
+ if (!name || !theme) {
294
312
  return props.children;
295
313
  }
296
314
  const contents = themeManager ? /* @__PURE__ */ import_react6.default.createElement(ThemeManagerContext.Provider, {
@@ -363,6 +381,60 @@ function createTamaguiProvider(themeProps) {
363
381
  }
364
382
  __name(createTamaguiProvider, "createTamaguiProvider");
365
383
 
384
+ // src/helpers/validate.ts
385
+ var import_ow = __toModule(require("@tamagui/ow"));
386
+ var validateConfig = /* @__PURE__ */ __name((conf3) => {
387
+ if (!conf3) {
388
+ console.warn("no conf?");
389
+ return;
390
+ }
391
+ try {
392
+ (0, import_ow.default)(conf3, validConfig);
393
+ } catch (err) {
394
+ console.log("Given config:\n", JSON.stringify(conf3, null, 2));
395
+ throw err;
396
+ }
397
+ }, "validateConfig");
398
+ var validConfig = import_ow.default.object.exactShape({
399
+ defaultTheme: import_ow.default.optional.string,
400
+ disableRootThemeClass: import_ow.default.optional.boolean,
401
+ shorthands: import_ow.default.optional.object.valuesOfType(import_ow.default.string),
402
+ themes: import_ow.default.object.valuesOfType(import_ow.default.object),
403
+ tokens: import_ow.default.object.valuesOfType(import_ow.default.object),
404
+ media: import_ow.default.object.valuesOfType(import_ow.default.object)
405
+ });
406
+ var validFont = import_ow.default.object.exactShape({
407
+ family: import_ow.default.string,
408
+ size: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.number),
409
+ lineHeight: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.number),
410
+ weight: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.string),
411
+ letterSpacing: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.number)
412
+ });
413
+ var validTokens = import_ow.default.object.exactShape({
414
+ font: import_ow.default.object.valuesOfType(validFont),
415
+ size: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.number),
416
+ space: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.number),
417
+ zIndex: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.number),
418
+ radius: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.number),
419
+ color: import_ow.default.object.nonEmpty.valuesOfType(import_ow.default.string)
420
+ });
421
+ var validateTokens = /* @__PURE__ */ __name((tokens) => {
422
+ try {
423
+ (0, import_ow.default)(tokens, validTokens);
424
+ } catch (err) {
425
+ console.log("Given tokens:\n", JSON.stringify(tokens, null, 2));
426
+ throw err;
427
+ }
428
+ }, "validateTokens");
429
+ var validateFont = /* @__PURE__ */ __name((font) => {
430
+ try {
431
+ (0, import_ow.default)(font, validFont);
432
+ } catch (err) {
433
+ console.log("Given font:\n", JSON.stringify(font, null, 2));
434
+ throw err;
435
+ }
436
+ }, "validateFont");
437
+
366
438
  // src/hooks/useMedia.tsx
367
439
  var import_use_force_update = __toModule(require("@tamagui/use-force-update"));
368
440
  var import_react8 = __toModule(require("react"));
@@ -371,6 +443,9 @@ var import_react8 = __toModule(require("react"));
371
443
  var matchMedia = typeof window !== "undefined" && window.matchMedia || /* @__PURE__ */ __name(function matchMediaFallback(query) {
372
444
  return {
373
445
  addListener() {
446
+ if (process.env.NODE_ENV === "development") {
447
+ console.log("warning: matchMedia not loading! Is native picking up .native.js files?");
448
+ }
374
449
  },
375
450
  removeListener() {
376
451
  },
@@ -544,6 +619,11 @@ var onConfiguredOnce = /* @__PURE__ */ __name((cb) => {
544
619
  }, "onConfiguredOnce");
545
620
  var PREFIX = `theme--`;
546
621
  function createTamagui(config) {
622
+ if (process.env.NODE_ENV === "development") {
623
+ if (!config["parsed"]) {
624
+ validateConfig(config);
625
+ }
626
+ }
547
627
  if (conf2) {
548
628
  console.warn("Called createTamagui twice! Should never do so");
549
629
  }
@@ -630,6 +710,7 @@ ${vars}
630
710
  themeConfig,
631
711
  themeParsed,
632
712
  tokensParsed,
713
+ parsed: true,
633
714
  getCSS() {
634
715
  return `${themeConfig.css}
635
716
  ${[...(0, import_helpers.getStyleRules)()].join("\n")}`;
@@ -1067,7 +1148,6 @@ var getSplitStyles = /* @__PURE__ */ __name((props, staticConfig, theme, isSplit
1067
1148
  const validStyleProps = staticConfig.isText ? import_helpers3.stylePropsText : import_helpers3.validStyles;
1068
1149
  const viewProps = {};
1069
1150
  const style = [];
1070
- const blacklistProps = isSplittingDefaultProps ? blacklistDefaultProps : blacklistFinalProps;
1071
1151
  let pseudos2 = null;
1072
1152
  let cur = null;
1073
1153
  let classNames = null;
@@ -1081,14 +1161,14 @@ var getSplitStyles = /* @__PURE__ */ __name((props, staticConfig, theme, isSplit
1081
1161
  }
1082
1162
  const mediaProps = __spreadValues(__spreadValues({}, props), valInit);
1083
1163
  const mediaStyle = getSubStyle(valInit, staticConfig, theme, props);
1084
- const mediaStyles = getStylesAtomic(mediaStyle);
1085
- if (process.env.NODE_ENV === "development") {
1086
- if (props["debug"]) {
1087
- console.log("mediaStyles", keyInit, { mediaProps, mediaStyle, mediaStyles });
1164
+ if (isWeb) {
1165
+ const mediaStyles = getStylesAtomic(mediaStyle);
1166
+ if (process.env.NODE_ENV === "development") {
1167
+ if (props["debug"]) {
1168
+ console.log("mediaStyles", keyInit, { mediaProps, mediaStyle, mediaStyles });
1169
+ }
1088
1170
  }
1089
- }
1090
- for (const style2 of mediaStyles) {
1091
- if (isWeb) {
1171
+ for (const style2 of mediaStyles) {
1092
1172
  const out2 = createMediaStyle(style2, mediaKey, mediaQueryConfig);
1093
1173
  classNames = classNames || [];
1094
1174
  classNames.push(out2.identifier);
@@ -1097,8 +1177,10 @@ var getSplitStyles = /* @__PURE__ */ __name((props, staticConfig, theme, isSplit
1097
1177
  if (process.env.NODE_ENV === "development" && props["debug"]) {
1098
1178
  console.log("mediaProp", style2.identifier, out2, mediaProps, mediaStyle, mediaStyles);
1099
1179
  }
1100
- } else {
1101
- console.log("TODO native media style logic");
1180
+ }
1181
+ } else {
1182
+ if (mediaState[mediaKey]) {
1183
+ style.push(mediaStyle);
1102
1184
  }
1103
1185
  }
1104
1186
  continue;
@@ -1146,7 +1228,7 @@ var getSplitStyles = /* @__PURE__ */ __name((props, staticConfig, theme, isSplit
1146
1228
  cur[key] = val;
1147
1229
  continue;
1148
1230
  }
1149
- if (!blacklistProps[key]) {
1231
+ if (!staticConfig.variants || !(key in staticConfig.variants)) {
1150
1232
  viewProps[key] = val;
1151
1233
  }
1152
1234
  }
@@ -1184,13 +1266,6 @@ var getSubStyle = /* @__PURE__ */ __name((styleIn, staticConfig, theme, props) =
1184
1266
  fixNativeShadow(styleOut);
1185
1267
  return styleOut;
1186
1268
  }, "getSubStyle");
1187
- var blacklistDefaultProps = __spreadValues(__spreadValues({}, import_helpers3.validStyles), import_helpers3.stylePropsText);
1188
- var blacklistFinalProps = __spreadProps(__spreadValues({}, blacklistDefaultProps), {
1189
- tag: true,
1190
- debug: true,
1191
- space: true,
1192
- hitSlop: true
1193
- });
1194
1269
  var mapTransformKeys = {
1195
1270
  x: "translateX",
1196
1271
  y: "translateY"
@@ -1203,61 +1278,20 @@ var mergeTransform = /* @__PURE__ */ __name((obj, key, val) => {
1203
1278
 
1204
1279
  // src/hooks/useFeatures.tsx
1205
1280
  var import_react10 = __toModule(require("react"));
1206
- var createDefinition = /* @__PURE__ */ __name(({ Component, propNames }) => ({
1281
+ var createDefinition = /* @__PURE__ */ __name(({
1282
+ Component,
1283
+ propNames
1284
+ }) => ({
1207
1285
  isEnabled: (props) => propNames.some((name) => !!props[name]),
1208
1286
  Component
1209
1287
  }), "createDefinition");
1210
- var mediaQueryPropNames = [
1211
- "$xs",
1212
- "$sm",
1213
- "$md",
1214
- "$lg",
1215
- "$xl",
1216
- "$xxl",
1217
- "$pointerCoarse",
1218
- "$hoverNone",
1219
- "$tall",
1220
- "$short",
1221
- "$gtSm",
1222
- "$notXs",
1223
- "$gtMd",
1224
- "$gtLg"
1225
- ];
1226
- var featureDefinitions = {
1227
- measureLayout: createDefinition({
1228
- Component: (props) => {
1229
- console.log("measure", props);
1230
- return null;
1231
- },
1232
- propNames: ["onLayout"]
1233
- }),
1234
- mediaQuery: createDefinition({
1235
- Component: (props) => {
1236
- if (isWeb) {
1237
- return;
1238
- }
1239
- const keys = mediaQueryPropNames.flatMap((x) => x in props ? x.slice(1) : []);
1240
- useIsomorphicLayoutEffect(() => {
1241
- for (const key of keys) {
1242
- addMediaQueryListener(key, props._utils.forceUpdate);
1243
- }
1244
- return () => {
1245
- for (const key of keys) {
1246
- removeMediaQueryListener(key, props._utils.forceUpdate);
1247
- }
1248
- };
1249
- }, [keys.join(",")]);
1250
- return null;
1251
- },
1252
- propNames: mediaQueryPropNames
1253
- })
1254
- };
1255
- var featureNames = Object.keys(featureDefinitions);
1256
- var numFeatures = featureNames.length;
1288
+ var featureDefinitions = null;
1257
1289
  var useFeatures = /* @__PURE__ */ __name((props, utils) => {
1290
+ if (!featureDefinitions) {
1291
+ featureDefinitions = loadFeatures();
1292
+ }
1258
1293
  const features = [];
1259
- for (let i = 0; i < numFeatures; i++) {
1260
- const name = featureNames[i];
1294
+ for (const name in featureDefinitions) {
1261
1295
  const { isEnabled, Component } = featureDefinitions[name];
1262
1296
  if (isEnabled(props) && Component) {
1263
1297
  features.push(/* @__PURE__ */ import_react10.default.createElement(Component, __spreadProps(__spreadValues({
@@ -1269,6 +1303,33 @@ var useFeatures = /* @__PURE__ */ __name((props, utils) => {
1269
1303
  }
1270
1304
  return features;
1271
1305
  }, "useFeatures");
1306
+ function loadFeatures() {
1307
+ return __spreadValues({}, !isWeb && {
1308
+ mediaQuery: loadMediaQueryFeature()
1309
+ });
1310
+ }
1311
+ __name(loadFeatures, "loadFeatures");
1312
+ function loadMediaQueryFeature() {
1313
+ const mediaPropNames = Object.keys(mediaState);
1314
+ return createDefinition({
1315
+ Component: (props) => {
1316
+ const keys = mediaPropNames.flatMap((x) => x in props ? x.slice(1) : []);
1317
+ useIsomorphicLayoutEffect(() => {
1318
+ for (const key of keys) {
1319
+ addMediaQueryListener(key, props._utils.forceUpdate);
1320
+ }
1321
+ return () => {
1322
+ for (const key of keys) {
1323
+ removeMediaQueryListener(key, props._utils.forceUpdate);
1324
+ }
1325
+ };
1326
+ }, [keys.join(",")]);
1327
+ return null;
1328
+ },
1329
+ propNames: mediaPropNames
1330
+ });
1331
+ }
1332
+ __name(loadMediaQueryFeature, "loadMediaQueryFeature");
1272
1333
 
1273
1334
  // src/hooks/usePressable.tsx
1274
1335
  var import_react_native2 = __toModule(require("react-native"));
@@ -1303,8 +1364,40 @@ function createComponent(configIn) {
1303
1364
  let defaultsClassName = "";
1304
1365
  let initialTheme;
1305
1366
  const component = (0, import_react11.forwardRef)((props, forwardedRef) => {
1306
- var _a4;
1367
+ var _b2;
1368
+ const forceUpdate = (0, import_use_force_update2.useForceUpdate)();
1369
+ const features = useFeatures(props, { forceUpdate });
1370
+ const manager = (0, import_react11.useContext)(ThemeManagerContext);
1371
+ const [state, set_] = (0, import_react11.useState)(() => ({
1372
+ hover: false,
1373
+ press: false,
1374
+ pressIn: false,
1375
+ theme: manager.name
1376
+ }));
1377
+ const set = /* @__PURE__ */ __name((next) => set_((prev) => {
1378
+ for (const key in next) {
1379
+ if (prev[key] !== next[key]) {
1380
+ return __spreadValues(__spreadValues({}, prev), next);
1381
+ }
1382
+ }
1383
+ return prev;
1384
+ }), "set");
1385
+ if (process.env.NODE_ENV === "development" && !isText && isWeb) {
1386
+ import_react11.Children.toArray(props.children).forEach((item) => {
1387
+ if (typeof item === "string") {
1388
+ console.error(`Unexpected text node: ${item}. A text node cannot be a child of a <View>.`);
1389
+ }
1390
+ });
1391
+ }
1392
+ const hasTextAncestor = isWeb ? (0, import_react11.useContext)(TextAncestorContext) : false;
1393
+ const hostRef = (0, import_react11.useRef)(null);
1307
1394
  const {
1395
+ viewProps: viewPropsIn,
1396
+ pseudos: pseudos2,
1397
+ style,
1398
+ classNames
1399
+ } = getSplitStyles(props, staticConfig, manager.theme || initialTheme);
1400
+ const _a4 = viewPropsIn, {
1308
1401
  tag,
1309
1402
  hitSlop,
1310
1403
  children,
@@ -1337,34 +1430,52 @@ function createComponent(configIn) {
1337
1430
  onStartShouldSetResponderCapture,
1338
1431
  onMouseDown,
1339
1432
  onClick,
1433
+ accessible,
1434
+ accessibilityRole,
1340
1435
  onLayout
1341
- } = props;
1342
- const forceUpdate = (0, import_use_force_update2.useForceUpdate)();
1343
- const features = useFeatures(props, { forceUpdate });
1344
- const manager = (0, import_react11.useContext)(ThemeManagerContext);
1345
- const [state, set_] = (0, import_react11.useState)(() => ({
1346
- hover: false,
1347
- press: false,
1348
- pressIn: false,
1349
- theme: manager.name
1350
- }));
1351
- const set = /* @__PURE__ */ __name((next) => set_((prev) => {
1352
- for (const key in next) {
1353
- if (prev[key] !== next[key]) {
1354
- return __spreadValues(__spreadValues({}, prev), next);
1355
- }
1356
- }
1357
- return prev;
1358
- }), "set");
1359
- if (process.env.NODE_ENV === "development" && !isText && isWeb) {
1360
- import_react11.Children.toArray(props.children).forEach((item) => {
1361
- if (typeof item === "string") {
1362
- console.error(`Unexpected text node: ${item}. A text node cannot be a child of a <View>.`);
1363
- }
1364
- });
1436
+ } = _a4, viewProps = __objRest(_a4, [
1437
+ "tag",
1438
+ "hitSlop",
1439
+ "children",
1440
+ "pointerEvents",
1441
+ "onPress",
1442
+ "onPressIn",
1443
+ "onPressOut",
1444
+ "onHoverIn",
1445
+ "onHoverOut",
1446
+ "space",
1447
+ "disabled",
1448
+ "onMouseEnter",
1449
+ "onMouseLeave",
1450
+ "hrefAttrs",
1451
+ "onMoveShouldSetResponder",
1452
+ "onMoveShouldSetResponderCapture",
1453
+ "onResponderEnd",
1454
+ "onResponderGrant",
1455
+ "onResponderMove",
1456
+ "onResponderReject",
1457
+ "onResponderRelease",
1458
+ "onResponderStart",
1459
+ "onResponderTerminate",
1460
+ "onResponderTerminationRequest",
1461
+ "onScrollShouldSetResponder",
1462
+ "onScrollShouldSetResponderCapture",
1463
+ "onSelectionChangeShouldSetResponder",
1464
+ "onSelectionChangeShouldSetResponderCapture",
1465
+ "onStartShouldSetResponder",
1466
+ "onStartShouldSetResponderCapture",
1467
+ "onMouseDown",
1468
+ "onClick",
1469
+ "accessible",
1470
+ "accessibilityRole",
1471
+ "onLayout"
1472
+ ]);
1473
+ if (!isWeb) {
1474
+ if (accessible)
1475
+ viewProps.accessible = accessible;
1476
+ if (accessibilityRole)
1477
+ viewProps.accessibilityRole = accessibilityRole;
1365
1478
  }
1366
- const hasTextAncestor = isWeb ? (0, import_react11.useContext)(TextAncestorContext) : false;
1367
- const hostRef = (0, import_react11.useRef)(null);
1368
1479
  if (isWeb) {
1369
1480
  rnw.useResponderEvents(hostRef, {
1370
1481
  onMoveShouldSetResponder,
@@ -1386,7 +1497,6 @@ function createComponent(configIn) {
1386
1497
  });
1387
1498
  }
1388
1499
  const isTracking = (0, import_react11.useRef)(false);
1389
- const { viewProps, pseudos: pseudos2, style, classNames } = getSplitStyles(props, staticConfig, manager.theme || initialTheme);
1390
1500
  const internal = (0, import_react11.useRef)();
1391
1501
  if (!internal.current) {
1392
1502
  internal.current = {
@@ -1565,7 +1675,7 @@ function createComponent(configIn) {
1565
1675
  viewProps["debug"] = true;
1566
1676
  console.log("\u{1F95A} props in:", props);
1567
1677
  console.log("\u{1F95A} props out:", viewProps);
1568
- console.log((_a4 = props.onClick) == null ? void 0 : _a4.toString());
1678
+ console.log((_b2 = props.onClick) == null ? void 0 : _b2.toString());
1569
1679
  console.log("\u{1F95A} etc:", { shouldAttach, ViewComponent, viewProps, styles, pseudos: pseudos2, content, childEls });
1570
1680
  if (isWeb) {
1571
1681
  console.log("\u{1F95A} component info", { staticConfig, tamaguiConfig });
@@ -1587,7 +1697,7 @@ function createComponent(configIn) {
1587
1697
  } else {
1588
1698
  if (!hasWarnedOnce) {
1589
1699
  hasWarnedOnce = true;
1590
- console.log("\u26A0\uFE0F we need to account for default styles for media queries");
1700
+ console.log("\u26A0\uFE0F TODO account for default styles for media queries");
1591
1701
  }
1592
1702
  }
1593
1703
  component.defaultProps = __spreadValues(__spreadValues({}, next.viewProps), component.defaultProps);
@@ -1712,6 +1822,9 @@ var createTheme = /* @__PURE__ */ __name((theme) => {
1712
1822
 
1713
1823
  // src/createFont.ts
1714
1824
  var createFont = /* @__PURE__ */ __name((font) => {
1825
+ if (process.env.NODE_ENV === "development") {
1826
+ validateFont(font);
1827
+ }
1715
1828
  const sizeKeys = Object.keys(font.size);
1716
1829
  for (const key in font) {
1717
1830
  if (key === "size" || key === "family")
@@ -1732,6 +1845,9 @@ var createFont = /* @__PURE__ */ __name((font) => {
1732
1845
 
1733
1846
  // src/createTokens.ts
1734
1847
  function createTokens(tokens) {
1848
+ if (process.env.NODE_ENV === "development") {
1849
+ validateTokens(tokens);
1850
+ }
1735
1851
  return setupTokens(tokens);
1736
1852
  }
1737
1853
  __name(createTokens, "createTokens");
@@ -1869,7 +1985,6 @@ var ThemeInverse = /* @__PURE__ */ __name((props) => {
1869
1985
  const themeName = useThemeName();
1870
1986
  const defaultTheme = useDefaultThemeName();
1871
1987
  const name = inversions[themeName] || inversions[defaultTheme] || null;
1872
- console.log("todo fixme invert", { themeName, defaultTheme, next: name });
1873
1988
  return /* @__PURE__ */ import_react13.default.createElement(Theme, {
1874
1989
  name
1875
1990
  }, props.children);
@@ -1895,8 +2010,15 @@ var themeable = /* @__PURE__ */ __name(function graphql(component) {
1895
2010
  return withTheme;
1896
2011
  }, "graphql");
1897
2012
 
1898
- // src/views/Animated.tsx
2013
+ // src/helpers/isTamaguiElement.tsx
1899
2014
  var import_react15 = __toModule(require("react"));
2015
+ var isTamaguiElement = /* @__PURE__ */ __name((child) => {
2016
+ var _a4;
2017
+ return (0, import_react15.isValidElement)(child) && !!((_a4 = child.type["staticConfig"]) == null ? void 0 : _a4.parsed);
2018
+ }, "isTamaguiElement");
2019
+
2020
+ // src/views/Animated.tsx
2021
+ var import_react16 = __toModule(require("react"));
1900
2022
  var import_react_native4 = __toModule(require("react-native"));
1901
2023
 
1902
2024
  // src/views/Stack.tsx
@@ -1939,7 +2061,7 @@ var AnimatedStack = /* @__PURE__ */ __name((_a4) => {
1939
2061
  const driver = useConstant(() => {
1940
2062
  return new import_react_native4.Animated.Value(0);
1941
2063
  });
1942
- const animatedProps = (0, import_react15.useMemo)(() => {
2064
+ const animatedProps = (0, import_react16.useMemo)(() => {
1943
2065
  if (!animated) {
1944
2066
  return null;
1945
2067
  }
@@ -1972,8 +2094,8 @@ var AnimatedStack = /* @__PURE__ */ __name((_a4) => {
1972
2094
  toValue: animateState === "in" ? 1 : 0
1973
2095
  }).start();
1974
2096
  }, [animated, animateState]);
1975
- const childrenMemo = (0, import_react15.useMemo)(() => children, [children]);
1976
- return /* @__PURE__ */ import_react15.default.createElement(Stack, __spreadValues(__spreadValues({
2097
+ const childrenMemo = (0, import_react16.useMemo)(() => children, [children]);
2098
+ return /* @__PURE__ */ import_react16.default.createElement(Stack, __spreadValues(__spreadValues({
1977
2099
  animated
1978
2100
  }, props), animatedProps), childrenMemo);
1979
2101
  }, "AnimatedStack");
@@ -2077,27 +2199,4 @@ var Text2 = createComponent({
2077
2199
  cursor: true
2078
2200
  })
2079
2201
  });
2080
-
2081
- // src/views/SafeAreaProvider.tsx
2082
- var import_react16 = __toModule(require("react"));
2083
- var import_react_native5 = __toModule(require("react-native"));
2084
- var import_react_native_safe_area_context = __toModule(require("react-native-safe-area-context"));
2085
- var defaultMetrics = null;
2086
- var SafeAreaProvider = /* @__PURE__ */ __name(({
2087
- initialWindowMetrics,
2088
- children
2089
- }) => {
2090
- if (!initialWindowMetrics && !defaultMetrics) {
2091
- defaultMetrics = import_react_native5.Platform.select({
2092
- web: {
2093
- frame: { x: 0, y: 0, width: 0, height: 0 },
2094
- insets: { top: 0, left: 0, right: 0, bottom: 0 }
2095
- },
2096
- default: import_react_native_safe_area_context.initialWindowMetrics
2097
- });
2098
- }
2099
- return /* @__PURE__ */ import_react16.default.createElement(import_react_native_safe_area_context.SafeAreaProvider, {
2100
- initialMetrics: initialWindowMetrics ?? defaultMetrics
2101
- }, children);
2102
- }, "SafeAreaProvider");
2103
2202
  //# sourceMappingURL=index.cjs.map