@tamagui/core 1.0.0-alpha.2 → 1.0.0-alpha.7

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 (145) hide show
  1. package/dist/createComponent.js +43 -29
  2. package/dist/createComponent.js.map +2 -2
  3. package/dist/createFont.js +4 -0
  4. package/dist/createFont.js.map +2 -2
  5. package/dist/createTamagui.js +7 -0
  6. package/dist/createTamagui.js.map +2 -2
  7. package/dist/createTokens.js +4 -0
  8. package/dist/createTokens.js.map +2 -2
  9. package/dist/createVariable.js +3 -0
  10. package/dist/createVariable.js.map +2 -2
  11. package/dist/helpers/getSplitStyles.js +1 -13
  12. package/dist/helpers/getSplitStyles.js.map +2 -2
  13. package/dist/helpers/isComponent.js +10 -0
  14. package/dist/helpers/isComponent.js.map +7 -0
  15. package/dist/helpers/isTamaguiComponent.js +10 -0
  16. package/dist/helpers/isTamaguiComponent.js.map +7 -0
  17. package/dist/helpers/isTamaguiElement.js +10 -0
  18. package/dist/helpers/isTamaguiElement.js.map +7 -0
  19. package/dist/helpers/validate.js +60 -0
  20. package/dist/helpers/validate.js.map +7 -0
  21. package/dist/helpers/validateConfig.js +46 -0
  22. package/dist/helpers/validateConfig.js.map +7 -0
  23. package/dist/helpers/validateTokens.js +29 -0
  24. package/dist/helpers/validateTokens.js.map +7 -0
  25. package/dist/hooks/useMedia.js +1 -1
  26. package/dist/hooks/useMedia.js.map +2 -2
  27. package/dist/hooks/useTheme.js +1 -1
  28. package/dist/hooks/useTheme.js.map +2 -2
  29. package/dist/index.cjs +223 -137
  30. package/dist/index.cjs.map +3 -3
  31. package/dist/index.js +1 -2
  32. package/dist/index.js.map +2 -2
  33. package/dist/views/Theme.js +16 -7
  34. package/dist/views/Theme.js.map +2 -2
  35. package/dist/views/ThemeInverse.js +0 -1
  36. package/dist/views/ThemeInverse.js.map +2 -2
  37. package/dist/views/ThemeManagerContext.js +7 -1
  38. package/dist/views/ThemeManagerContext.js.map +2 -2
  39. package/package.json +12 -5
  40. package/src/createComponent.tsx +49 -38
  41. package/src/createFont.ts +5 -0
  42. package/src/createTamagui.ts +8 -0
  43. package/src/createTokens.ts +6 -1
  44. package/src/createVariable.ts +4 -0
  45. package/src/helpers/getSplitStyles.tsx +3 -16
  46. package/src/helpers/isTamaguiElement.tsx +5 -0
  47. package/src/helpers/validate.ts +59 -0
  48. package/src/hooks/useMedia.tsx +1 -1
  49. package/src/hooks/useTheme.tsx +1 -1
  50. package/src/index.ts +1 -2
  51. package/src/types.tsx +1 -0
  52. package/src/views/Theme.tsx +26 -9
  53. package/src/views/ThemeInverse.tsx +0 -1
  54. package/src/views/ThemeManagerContext.tsx +11 -1
  55. package/types.d.ts +3 -5
  56. package/.ultra.cache.json +0 -1
  57. package/_/constants/constants.js +0 -14
  58. package/_/constants/constants.js.map +0 -7
  59. package/_/constants/platform.js +0 -20
  60. package/_/constants/platform.js.map +0 -7
  61. package/_/constants/pseudos.js +0 -18
  62. package/_/constants/pseudos.js.map +0 -7
  63. package/_/constants/rnw.js +0 -22
  64. package/_/constants/rnw.js.map +0 -7
  65. package/_/createComponent.js +0 -427
  66. package/_/createComponent.js.map +0 -7
  67. package/_/createShorthands.js +0 -10
  68. package/_/createShorthands.js.map +0 -7
  69. package/_/createTamagui.js +0 -122
  70. package/_/createTamagui.js.map +0 -7
  71. package/_/createTheme.js +0 -20
  72. package/_/createTheme.js.map +0 -7
  73. package/_/createTokens.js +0 -29
  74. package/_/createTokens.js.map +0 -7
  75. package/_/createVariable.js +0 -22
  76. package/_/createVariable.js.map +0 -7
  77. package/_/helpers/addStylesUsingClassname.js +0 -32
  78. package/_/helpers/addStylesUsingClassname.js.map +0 -7
  79. package/_/helpers/createMediaStyle.js +0 -34
  80. package/_/helpers/createMediaStyle.js.map +0 -7
  81. package/_/helpers/createTamaguiProvider.js +0 -42
  82. package/_/helpers/createTamaguiProvider.js.map +0 -7
  83. package/_/helpers/extendStaticConfig.js +0 -176
  84. package/_/helpers/extendStaticConfig.js.map +0 -7
  85. package/_/helpers/fixNativeShadow.js +0 -8
  86. package/_/helpers/fixNativeShadow.js.map +0 -7
  87. package/_/helpers/fixNativeShadow.native.js +0 -30
  88. package/_/helpers/fixNativeShadow.native.js.map +0 -7
  89. package/_/helpers/getSplitStyles.js +0 -160
  90. package/_/helpers/getSplitStyles.js.map +0 -7
  91. package/_/helpers/getStylesAtomic.js +0 -84
  92. package/_/helpers/getStylesAtomic.js.map +0 -7
  93. package/_/helpers/getStylesAtomic.native.js +0 -10
  94. package/_/helpers/getStylesAtomic.native.js.map +0 -7
  95. package/_/helpers/insertStyleRule.js +0 -24
  96. package/_/helpers/insertStyleRule.js.map +0 -7
  97. package/_/helpers/matchMedia.js +0 -15
  98. package/_/helpers/matchMedia.js.map +0 -7
  99. package/_/helpers/matchMedia.native.js +0 -8
  100. package/_/helpers/matchMedia.native.js.map +0 -7
  101. package/_/helpers/themeable.js +0 -26
  102. package/_/helpers/themeable.js.map +0 -7
  103. package/_/hooks/useConstant.js +0 -15
  104. package/_/hooks/useConstant.js.map +0 -7
  105. package/_/hooks/useFeatures.js +0 -75
  106. package/_/hooks/useFeatures.js.map +0 -7
  107. package/_/hooks/useForceUpdate.js +0 -28
  108. package/_/hooks/useForceUpdate.js.map +0 -7
  109. package/_/hooks/useMedia.js +0 -173
  110. package/_/hooks/useMedia.js.map +0 -7
  111. package/_/hooks/usePressable.js +0 -14
  112. package/_/hooks/usePressable.js.map +0 -7
  113. package/_/hooks/useTheme.js +0 -94
  114. package/_/hooks/useTheme.js.map +0 -7
  115. package/_/index.js +0 -30
  116. package/_/index.js.map +0 -7
  117. package/_/static/postProcessStyles.js +0 -18
  118. package/_/static/postProcessStyles.js.map +0 -7
  119. package/_/static.js +0 -12
  120. package/_/static.js.map +0 -7
  121. package/_/styled.js +0 -21
  122. package/_/styled.js.map +0 -7
  123. package/_/types.js +0 -1
  124. package/_/types.js.map +0 -7
  125. package/_/views/Animated.js +0 -79
  126. package/_/views/Animated.js.map +0 -7
  127. package/_/views/Stack.js +0 -12
  128. package/_/views/Stack.js.map +0 -7
  129. package/_/views/Text.js +0 -60
  130. package/_/views/Text.js.map +0 -7
  131. package/_/views/TextAncestorContext.js +0 -19
  132. package/_/views/TextAncestorContext.js.map +0 -7
  133. package/_/views/Theme.js +0 -57
  134. package/_/views/Theme.js.map +0 -7
  135. package/_/views/ThemeContext.js +0 -6
  136. package/_/views/ThemeContext.js.map +0 -7
  137. package/_/views/ThemeInverse.js +0 -27
  138. package/_/views/ThemeInverse.js.map +0 -7
  139. package/_/views/ThemeManagerContext.js +0 -56
  140. package/_/views/ThemeManagerContext.js.map +0 -7
  141. package/_/views/ThemeProvider.js +0 -45
  142. package/_/views/ThemeProvider.js.map +0 -7
  143. package/src/hooks/useForceUpdate.tsx +0 -26
  144. package/src/views/SafeAreaProvider.tsx +0 -33
  145. 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,
@@ -104,7 +104,6 @@ __export(exports, {
104
104
  themeable: () => themeable,
105
105
  useConstant: () => useConstant,
106
106
  useDefaultThemeName: () => useDefaultThemeName,
107
- useForceUpdate: () => useForceUpdate,
108
107
  useIsomorphicLayoutEffect: () => useIsomorphicLayoutEffect,
109
108
  useMedia: () => useMedia,
110
109
  useTheme: () => useTheme,
@@ -113,7 +112,8 @@ __export(exports, {
113
112
 
114
113
  // src/createComponent.tsx
115
114
  var import_helpers4 = __toModule(require("@tamagui/helpers"));
116
- var import_react12 = __toModule(require("react"));
115
+ var import_use_force_update2 = __toModule(require("@tamagui/use-force-update"));
116
+ var import_react11 = __toModule(require("react"));
117
117
  var import_react_native3 = __toModule(require("react-native"));
118
118
 
119
119
  // src/constants/platform.ts
@@ -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,8 +381,63 @@ 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
- var import_react9 = __toModule(require("react"));
439
+ var import_use_force_update = __toModule(require("@tamagui/use-force-update"));
440
+ var import_react8 = __toModule(require("react"));
368
441
 
369
442
  // src/helpers/matchMedia.ts
370
443
  var matchMedia = typeof window !== "undefined" && window.matchMedia || /* @__PURE__ */ __name(function matchMediaFallback(query) {
@@ -377,30 +450,6 @@ var matchMedia = typeof window !== "undefined" && window.matchMedia || /* @__PUR
377
450
  };
378
451
  }, "matchMediaFallback");
379
452
 
380
- // src/hooks/useForceUpdate.tsx
381
- var import_react8 = __toModule(require("react"));
382
- function useForceUpdate() {
383
- const setState = (0, import_react8.useState)(0)[1];
384
- const internal = (0, import_react8.useRef)();
385
- if (!internal.current) {
386
- internal.current = {
387
- isMounted: true,
388
- update: () => {
389
- if (internal.current.isMounted) {
390
- setState(Math.random());
391
- }
392
- }
393
- };
394
- }
395
- (0, import_react8.useEffect)(() => {
396
- return () => {
397
- internal.current.isMounted = false;
398
- };
399
- }, []);
400
- return internal.current.update;
401
- }
402
- __name(useForceUpdate, "useForceUpdate");
403
-
404
453
  // src/hooks/useMedia.tsx
405
454
  var mediaState = {};
406
455
  var mediaQueryListeners = {};
@@ -477,8 +526,8 @@ var configureMedia = /* @__PURE__ */ __name(({
477
526
  }
478
527
  }, "configureMedia");
479
528
  var useMedia = /* @__PURE__ */ __name(() => {
480
- const forceUpdate = useForceUpdate();
481
- const state = (0, import_react9.useRef)();
529
+ const forceUpdate = (0, import_use_force_update.useForceUpdate)();
530
+ const state = (0, import_react8.useRef)();
482
531
  if (!state.current) {
483
532
  state.current = {
484
533
  selections: {},
@@ -567,6 +616,11 @@ var onConfiguredOnce = /* @__PURE__ */ __name((cb) => {
567
616
  }, "onConfiguredOnce");
568
617
  var PREFIX = `theme--`;
569
618
  function createTamagui(config) {
619
+ if (process.env.NODE_ENV === "development") {
620
+ if (!config["parsed"]) {
621
+ validateConfig(config);
622
+ }
623
+ }
570
624
  if (conf2) {
571
625
  console.warn("Called createTamagui twice! Should never do so");
572
626
  }
@@ -653,6 +707,7 @@ ${vars}
653
707
  themeConfig,
654
708
  themeParsed,
655
709
  tokensParsed,
710
+ parsed: true,
656
711
  getCSS() {
657
712
  return `${themeConfig.css}
658
713
  ${[...(0, import_helpers.getStyleRules)()].join("\n")}`;
@@ -700,7 +755,7 @@ var parseTokens = /* @__PURE__ */ __name((tokens) => {
700
755
  }, "parseTokens");
701
756
 
702
757
  // src/helpers/addStylesUsingClassname.tsx
703
- var import_react10 = __toModule(require("react"));
758
+ var import_react9 = __toModule(require("react"));
704
759
 
705
760
  // src/helpers/getStylesAtomic.ts
706
761
  var import_helpers2 = __toModule(require("@tamagui/helpers"));
@@ -817,7 +872,7 @@ __name(insertStyleRule, "insertStyleRule");
817
872
  // src/helpers/addStylesUsingClassname.tsx
818
873
  var added = new Set();
819
874
  function useStylesAsClassname(styles) {
820
- if (!import_react10.useInsertionEffect) {
875
+ if (!import_react9.useInsertionEffect) {
821
876
  return addStylesUsingClassname(styles);
822
877
  } else {
823
878
  const insertions = [];
@@ -826,7 +881,7 @@ function useStylesAsClassname(styles) {
826
881
  insertions.push(rule);
827
882
  }
828
883
  });
829
- (0, import_react10.useInsertionEffect)(() => {
884
+ (0, import_react9.useInsertionEffect)(() => {
830
885
  for (const ruleset of insertions) {
831
886
  insertStyleRule(ruleset);
832
887
  }
@@ -1090,7 +1145,6 @@ var getSplitStyles = /* @__PURE__ */ __name((props, staticConfig, theme, isSplit
1090
1145
  const validStyleProps = staticConfig.isText ? import_helpers3.stylePropsText : import_helpers3.validStyles;
1091
1146
  const viewProps = {};
1092
1147
  const style = [];
1093
- const blacklistProps = isSplittingDefaultProps ? blacklistDefaultProps : blacklistFinalProps;
1094
1148
  let pseudos2 = null;
1095
1149
  let cur = null;
1096
1150
  let classNames = null;
@@ -1169,7 +1223,7 @@ var getSplitStyles = /* @__PURE__ */ __name((props, staticConfig, theme, isSplit
1169
1223
  cur[key] = val;
1170
1224
  continue;
1171
1225
  }
1172
- if (!blacklistProps[key]) {
1226
+ if (!staticConfig.variants || !(key in staticConfig.variants)) {
1173
1227
  viewProps[key] = val;
1174
1228
  }
1175
1229
  }
@@ -1207,13 +1261,6 @@ var getSubStyle = /* @__PURE__ */ __name((styleIn, staticConfig, theme, props) =
1207
1261
  fixNativeShadow(styleOut);
1208
1262
  return styleOut;
1209
1263
  }, "getSubStyle");
1210
- var blacklistDefaultProps = __spreadValues(__spreadValues({}, import_helpers3.validStyles), import_helpers3.stylePropsText);
1211
- var blacklistFinalProps = __spreadProps(__spreadValues({}, blacklistDefaultProps), {
1212
- tag: true,
1213
- debug: true,
1214
- space: true,
1215
- hitSlop: true
1216
- });
1217
1264
  var mapTransformKeys = {
1218
1265
  x: "translateX",
1219
1266
  y: "translateY"
@@ -1225,7 +1272,7 @@ var mergeTransform = /* @__PURE__ */ __name((obj, key, val) => {
1225
1272
  }, "mergeTransform");
1226
1273
 
1227
1274
  // src/hooks/useFeatures.tsx
1228
- var import_react11 = __toModule(require("react"));
1275
+ var import_react10 = __toModule(require("react"));
1229
1276
  var createDefinition = /* @__PURE__ */ __name(({ Component, propNames }) => ({
1230
1277
  isEnabled: (props) => propNames.some((name) => !!props[name]),
1231
1278
  Component
@@ -1283,7 +1330,7 @@ var useFeatures = /* @__PURE__ */ __name((props, utils) => {
1283
1330
  const name = featureNames[i];
1284
1331
  const { isEnabled, Component } = featureDefinitions[name];
1285
1332
  if (isEnabled(props) && Component) {
1286
- features.push(/* @__PURE__ */ import_react11.default.createElement(Component, __spreadProps(__spreadValues({
1333
+ features.push(/* @__PURE__ */ import_react10.default.createElement(Component, __spreadProps(__spreadValues({
1287
1334
  key: name
1288
1335
  }, props), {
1289
1336
  _utils: utils
@@ -1325,9 +1372,41 @@ function createComponent(configIn) {
1325
1372
  let defaultsStyle;
1326
1373
  let defaultsClassName = "";
1327
1374
  let initialTheme;
1328
- const component = (0, import_react12.forwardRef)((props, forwardedRef) => {
1329
- var _a4;
1375
+ const component = (0, import_react11.forwardRef)((props, forwardedRef) => {
1376
+ var _b2;
1377
+ const forceUpdate = (0, import_use_force_update2.useForceUpdate)();
1378
+ const features = useFeatures(props, { forceUpdate });
1379
+ const manager = (0, import_react11.useContext)(ThemeManagerContext);
1380
+ const [state, set_] = (0, import_react11.useState)(() => ({
1381
+ hover: false,
1382
+ press: false,
1383
+ pressIn: false,
1384
+ theme: manager.name
1385
+ }));
1386
+ const set = /* @__PURE__ */ __name((next) => set_((prev) => {
1387
+ for (const key in next) {
1388
+ if (prev[key] !== next[key]) {
1389
+ return __spreadValues(__spreadValues({}, prev), next);
1390
+ }
1391
+ }
1392
+ return prev;
1393
+ }), "set");
1394
+ if (process.env.NODE_ENV === "development" && !isText && isWeb) {
1395
+ import_react11.Children.toArray(props.children).forEach((item) => {
1396
+ if (typeof item === "string") {
1397
+ console.error(`Unexpected text node: ${item}. A text node cannot be a child of a <View>.`);
1398
+ }
1399
+ });
1400
+ }
1401
+ const hasTextAncestor = isWeb ? (0, import_react11.useContext)(TextAncestorContext) : false;
1402
+ const hostRef = (0, import_react11.useRef)(null);
1330
1403
  const {
1404
+ viewProps: viewPropsIn,
1405
+ pseudos: pseudos2,
1406
+ style,
1407
+ classNames
1408
+ } = getSplitStyles(props, staticConfig, manager.theme || initialTheme);
1409
+ const _a4 = viewPropsIn, {
1331
1410
  tag,
1332
1411
  hitSlop,
1333
1412
  children,
@@ -1360,34 +1439,52 @@ function createComponent(configIn) {
1360
1439
  onStartShouldSetResponderCapture,
1361
1440
  onMouseDown,
1362
1441
  onClick,
1442
+ accessible,
1443
+ accessibilityRole,
1363
1444
  onLayout
1364
- } = props;
1365
- const forceUpdate = useForceUpdate();
1366
- const features = useFeatures(props, { forceUpdate });
1367
- const manager = (0, import_react12.useContext)(ThemeManagerContext);
1368
- const [state, set_] = (0, import_react12.useState)(() => ({
1369
- hover: false,
1370
- press: false,
1371
- pressIn: false,
1372
- theme: manager.name
1373
- }));
1374
- const set = /* @__PURE__ */ __name((next) => set_((prev) => {
1375
- for (const key in next) {
1376
- if (prev[key] !== next[key]) {
1377
- return __spreadValues(__spreadValues({}, prev), next);
1378
- }
1379
- }
1380
- return prev;
1381
- }), "set");
1382
- if (process.env.NODE_ENV === "development" && !isText && isWeb) {
1383
- import_react12.Children.toArray(props.children).forEach((item) => {
1384
- if (typeof item === "string") {
1385
- console.error(`Unexpected text node: ${item}. A text node cannot be a child of a <View>.`);
1386
- }
1387
- });
1445
+ } = _a4, viewProps = __objRest(_a4, [
1446
+ "tag",
1447
+ "hitSlop",
1448
+ "children",
1449
+ "pointerEvents",
1450
+ "onPress",
1451
+ "onPressIn",
1452
+ "onPressOut",
1453
+ "onHoverIn",
1454
+ "onHoverOut",
1455
+ "space",
1456
+ "disabled",
1457
+ "onMouseEnter",
1458
+ "onMouseLeave",
1459
+ "hrefAttrs",
1460
+ "onMoveShouldSetResponder",
1461
+ "onMoveShouldSetResponderCapture",
1462
+ "onResponderEnd",
1463
+ "onResponderGrant",
1464
+ "onResponderMove",
1465
+ "onResponderReject",
1466
+ "onResponderRelease",
1467
+ "onResponderStart",
1468
+ "onResponderTerminate",
1469
+ "onResponderTerminationRequest",
1470
+ "onScrollShouldSetResponder",
1471
+ "onScrollShouldSetResponderCapture",
1472
+ "onSelectionChangeShouldSetResponder",
1473
+ "onSelectionChangeShouldSetResponderCapture",
1474
+ "onStartShouldSetResponder",
1475
+ "onStartShouldSetResponderCapture",
1476
+ "onMouseDown",
1477
+ "onClick",
1478
+ "accessible",
1479
+ "accessibilityRole",
1480
+ "onLayout"
1481
+ ]);
1482
+ if (!isWeb) {
1483
+ if (accessible)
1484
+ viewProps.accessible = accessible;
1485
+ if (accessibilityRole)
1486
+ viewProps.accessibilityRole = accessibilityRole;
1388
1487
  }
1389
- const hasTextAncestor = isWeb ? (0, import_react12.useContext)(TextAncestorContext) : false;
1390
- const hostRef = (0, import_react12.useRef)(null);
1391
1488
  if (isWeb) {
1392
1489
  rnw.useResponderEvents(hostRef, {
1393
1490
  onMoveShouldSetResponder,
@@ -1408,15 +1505,14 @@ function createComponent(configIn) {
1408
1505
  onStartShouldSetResponderCapture
1409
1506
  });
1410
1507
  }
1411
- const isTracking = (0, import_react12.useRef)(false);
1412
- const { viewProps, pseudos: pseudos2, style, classNames } = getSplitStyles(props, staticConfig, manager.theme || initialTheme);
1413
- const internal = (0, import_react12.useRef)();
1508
+ const isTracking = (0, import_react11.useRef)(false);
1509
+ const internal = (0, import_react11.useRef)();
1414
1510
  if (!internal.current) {
1415
1511
  internal.current = {
1416
1512
  isMounted: true
1417
1513
  };
1418
1514
  }
1419
- (0, import_react12.useEffect)(() => {
1515
+ (0, import_react11.useEffect)(() => {
1420
1516
  internal.current.isMounted = true;
1421
1517
  const dispose = manager == null ? void 0 : manager.onChangeTheme((name) => {
1422
1518
  if (isTracking.current) {
@@ -1489,7 +1585,7 @@ function createComponent(configIn) {
1489
1585
  if (shouldAttach) {
1490
1586
  internal.current.hasEverHadEvents = true;
1491
1587
  }
1492
- const unPress = (0, import_react12.useCallback)(() => {
1588
+ const unPress = (0, import_react11.useCallback)(() => {
1493
1589
  if (!internal.current.isMounted)
1494
1590
  return;
1495
1591
  set({
@@ -1575,27 +1671,27 @@ function createComponent(configIn) {
1575
1671
  const className = domProps.className && domProps.className !== viewProps.className ? `${domProps.className} ${viewProps.className}` : viewProps.className;
1576
1672
  Object.assign(viewProps, domProps);
1577
1673
  viewProps.className = className;
1578
- content = (0, import_react12.createElement)(ViewComponent, viewProps, childEls);
1674
+ content = (0, import_react11.createElement)(ViewComponent, viewProps, childEls);
1579
1675
  } else {
1580
- content = (0, import_react12.createElement)(ViewComponent, viewProps, childEls);
1676
+ content = (0, import_react11.createElement)(ViewComponent, viewProps, childEls);
1581
1677
  }
1582
1678
  const shouldWrapTextAncestor = isWeb && isText && !hasTextAncestor;
1583
1679
  if (shouldWrapTextAncestor) {
1584
- content = (0, import_react12.createElement)(TextAncestorContext.Provider, { value: true }, content);
1680
+ content = (0, import_react11.createElement)(TextAncestorContext.Provider, { value: true }, content);
1585
1681
  }
1586
1682
  if (process.env.NODE_ENV === "development") {
1587
1683
  if (props["debug"]) {
1588
1684
  viewProps["debug"] = true;
1589
1685
  console.log("\u{1F95A} props in:", props);
1590
1686
  console.log("\u{1F95A} props out:", viewProps);
1591
- console.log((_a4 = props.onClick) == null ? void 0 : _a4.toString());
1687
+ console.log((_b2 = props.onClick) == null ? void 0 : _b2.toString());
1592
1688
  console.log("\u{1F95A} etc:", { shouldAttach, ViewComponent, viewProps, styles, pseudos: pseudos2, content, childEls });
1593
1689
  if (isWeb) {
1594
1690
  console.log("\u{1F95A} component info", { staticConfig, tamaguiConfig });
1595
1691
  }
1596
1692
  }
1597
1693
  }
1598
- return /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, features, content);
1694
+ return /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, features, content);
1599
1695
  });
1600
1696
  onConfiguredOnce((conf3) => {
1601
1697
  var _a4;
@@ -1669,7 +1765,7 @@ function spacedChildren({
1669
1765
  if (!space && !isZStack) {
1670
1766
  return children;
1671
1767
  }
1672
- const childrenList = import_react12.Children.toArray(children);
1768
+ const childrenList = import_react11.Children.toArray(children);
1673
1769
  const len = childrenList.length;
1674
1770
  if (len === 1) {
1675
1771
  return children;
@@ -1680,15 +1776,15 @@ function spacedChildren({
1680
1776
  continue;
1681
1777
  }
1682
1778
  const key = `${(child == null ? void 0 : child["key"]) ?? index}`;
1683
- next.push(/* @__PURE__ */ import_react12.default.createElement(import_react12.Fragment, {
1779
+ next.push(/* @__PURE__ */ import_react11.default.createElement(import_react11.Fragment, {
1684
1780
  key
1685
- }, isZStack ? /* @__PURE__ */ import_react12.default.createElement(Absolute, null, child) : child));
1781
+ }, isZStack ? /* @__PURE__ */ import_react11.default.createElement(Absolute, null, child) : child));
1686
1782
  if ((_a4 = child == null ? void 0 : child["type"]) == null ? void 0 : _a4["isVisuallyHidden"]) {
1687
1783
  continue;
1688
1784
  }
1689
1785
  if (index !== len - 1) {
1690
1786
  if (space) {
1691
- next.push(/* @__PURE__ */ import_react12.default.createElement(Spacer, {
1787
+ next.push(/* @__PURE__ */ import_react11.default.createElement(Spacer, {
1692
1788
  key: `${key}_spacer`,
1693
1789
  direction: flexDirection === "row" || flexDirection === "row-reverse" ? "horizontal" : "vertical",
1694
1790
  size: space
@@ -1699,7 +1795,7 @@ function spacedChildren({
1699
1795
  return next;
1700
1796
  }
1701
1797
  __name(spacedChildren, "spacedChildren");
1702
- var Absolute = /* @__PURE__ */ __name(({ children }) => /* @__PURE__ */ import_react12.default.createElement(import_react_native3.View, {
1798
+ var Absolute = /* @__PURE__ */ __name(({ children }) => /* @__PURE__ */ import_react11.default.createElement(import_react_native3.View, {
1703
1799
  style: sheet.fullscreen
1704
1800
  }, children), "Absolute");
1705
1801
  var sheet = import_react_native3.StyleSheet.create({
@@ -1735,6 +1831,9 @@ var createTheme = /* @__PURE__ */ __name((theme) => {
1735
1831
 
1736
1832
  // src/createFont.ts
1737
1833
  var createFont = /* @__PURE__ */ __name((font) => {
1834
+ if (process.env.NODE_ENV === "development") {
1835
+ validateFont(font);
1836
+ }
1738
1837
  const sizeKeys = Object.keys(font.size);
1739
1838
  for (const key in font) {
1740
1839
  if (key === "size" || key === "family")
@@ -1755,6 +1854,9 @@ var createFont = /* @__PURE__ */ __name((font) => {
1755
1854
 
1756
1855
  // src/createTokens.ts
1757
1856
  function createTokens(tokens) {
1857
+ if (process.env.NODE_ENV === "development") {
1858
+ validateTokens(tokens);
1859
+ }
1758
1860
  return setupTokens(tokens);
1759
1861
  }
1760
1862
  __name(createTokens, "createTokens");
@@ -1792,13 +1894,14 @@ function styled(Component, options, staticExtractionOptions) {
1792
1894
  __name(styled, "styled");
1793
1895
 
1794
1896
  // src/helpers/themeable.tsx
1795
- var import_react15 = __toModule(require("react"));
1897
+ var import_react14 = __toModule(require("react"));
1796
1898
 
1797
1899
  // src/views/ThemeInverse.tsx
1798
- var import_react14 = __toModule(require("react"));
1900
+ var import_react13 = __toModule(require("react"));
1799
1901
 
1800
1902
  // src/hooks/useTheme.tsx
1801
- var import_react13 = __toModule(require("react"));
1903
+ var import_use_force_update3 = __toModule(require("@tamagui/use-force-update"));
1904
+ var import_react12 = __toModule(require("react"));
1802
1905
  var areEqualSets = /* @__PURE__ */ __name((a, b) => {
1803
1906
  if (a.size !== b.size)
1804
1907
  return false;
@@ -1810,9 +1913,9 @@ var areEqualSets = /* @__PURE__ */ __name((a, b) => {
1810
1913
  return true;
1811
1914
  }, "areEqualSets");
1812
1915
  var useThemeName = /* @__PURE__ */ __name(() => {
1813
- const parent = (0, import_react13.useContext)(ThemeManagerContext);
1814
- const [name, setName] = (0, import_react13.useState)(parent.name);
1815
- (0, import_react13.useEffect)(() => {
1916
+ const parent = (0, import_react12.useContext)(ThemeManagerContext);
1917
+ const [name, setName] = (0, import_react12.useState)(parent.name);
1918
+ (0, import_react12.useEffect)(() => {
1816
1919
  return parent.onChangeTheme((next) => {
1817
1920
  setName((prev) => {
1818
1921
  if (prev === next)
@@ -1824,13 +1927,13 @@ var useThemeName = /* @__PURE__ */ __name(() => {
1824
1927
  return name || "light";
1825
1928
  }, "useThemeName");
1826
1929
  var useDefaultThemeName = /* @__PURE__ */ __name(() => {
1827
- return (0, import_react13.useContext)(ThemeContext)[GET_DEFAULT_THEME];
1930
+ return (0, import_react12.useContext)(ThemeContext)[GET_DEFAULT_THEME];
1828
1931
  }, "useDefaultThemeName");
1829
1932
  var useTheme = /* @__PURE__ */ __name(() => {
1830
- const forceUpdate = useForceUpdate();
1831
- const manager = (0, import_react13.useContext)(ThemeManagerContext);
1832
- const themes = (0, import_react13.useContext)(ThemeContext);
1833
- const state = (0, import_react13.useRef)();
1933
+ const forceUpdate = (0, import_use_force_update3.useForceUpdate)();
1934
+ const manager = (0, import_react12.useContext)(ThemeManagerContext);
1935
+ const themes = (0, import_react12.useContext)(ThemeContext);
1936
+ const state = (0, import_react12.useRef)();
1834
1937
  if (!state.current) {
1835
1938
  state.current = {
1836
1939
  uuid: {},
@@ -1847,11 +1950,11 @@ var useTheme = /* @__PURE__ */ __name(() => {
1847
1950
  manager.track(st.uuid, st.keys);
1848
1951
  }
1849
1952
  });
1850
- (0, import_react13.useEffect)(() => {
1953
+ (0, import_react12.useEffect)(() => {
1851
1954
  return manager.onUpdate(state.current.uuid, forceUpdate);
1852
1955
  }, []);
1853
1956
  const theme = (manager.name ? themes[manager.name] : themes.light) ?? themes.light;
1854
- return (0, import_react13.useMemo)(() => {
1957
+ return (0, import_react12.useMemo)(() => {
1855
1958
  return new Proxy(theme, {
1856
1959
  get(_, key) {
1857
1960
  const name = manager.name;
@@ -1891,22 +1994,21 @@ var ThemeInverse = /* @__PURE__ */ __name((props) => {
1891
1994
  const themeName = useThemeName();
1892
1995
  const defaultTheme = useDefaultThemeName();
1893
1996
  const name = inversions[themeName] || inversions[defaultTheme] || null;
1894
- console.log("todo fixme invert", { themeName, defaultTheme, next: name });
1895
- return /* @__PURE__ */ import_react14.default.createElement(Theme, {
1997
+ return /* @__PURE__ */ import_react13.default.createElement(Theme, {
1896
1998
  name
1897
1999
  }, props.children);
1898
2000
  }, "ThemeInverse");
1899
2001
 
1900
2002
  // src/helpers/themeable.tsx
1901
2003
  var themeable = /* @__PURE__ */ __name(function graphql(component) {
1902
- const withThemeComponent = (0, import_react15.forwardRef)(/* @__PURE__ */ __name(function WithTheme(_a4, ref) {
2004
+ const withThemeComponent = (0, import_react14.forwardRef)(/* @__PURE__ */ __name(function WithTheme(_a4, ref) {
1903
2005
  var _b2 = _a4, { themeInverse } = _b2, rest = __objRest(_b2, ["themeInverse"]);
1904
- const el = import_react15.default.createElement(component, __spreadProps(__spreadValues({}, rest), { ref }));
2006
+ const el = import_react14.default.createElement(component, __spreadProps(__spreadValues({}, rest), { ref }));
1905
2007
  if (themeInverse) {
1906
- return /* @__PURE__ */ import_react15.default.createElement(ThemeInverse, null, el);
2008
+ return /* @__PURE__ */ import_react14.default.createElement(ThemeInverse, null, el);
1907
2009
  }
1908
2010
  if (rest.theme) {
1909
- return /* @__PURE__ */ import_react15.default.createElement(Theme, {
2011
+ return /* @__PURE__ */ import_react14.default.createElement(Theme, {
1910
2012
  name: rest.theme || null
1911
2013
  }, el);
1912
2014
  }
@@ -1917,6 +2019,13 @@ var themeable = /* @__PURE__ */ __name(function graphql(component) {
1917
2019
  return withTheme;
1918
2020
  }, "graphql");
1919
2021
 
2022
+ // src/helpers/isTamaguiElement.tsx
2023
+ var import_react15 = __toModule(require("react"));
2024
+ var isTamaguiElement = /* @__PURE__ */ __name((child) => {
2025
+ var _a4;
2026
+ return (0, import_react15.isValidElement)(child) && !!((_a4 = child.type["staticConfig"]) == null ? void 0 : _a4.parsed);
2027
+ }, "isTamaguiElement");
2028
+
1920
2029
  // src/views/Animated.tsx
1921
2030
  var import_react16 = __toModule(require("react"));
1922
2031
  var import_react_native4 = __toModule(require("react-native"));
@@ -2099,27 +2208,4 @@ var Text2 = createComponent({
2099
2208
  cursor: true
2100
2209
  })
2101
2210
  });
2102
-
2103
- // src/views/SafeAreaProvider.tsx
2104
- var import_react17 = __toModule(require("react"));
2105
- var import_react_native5 = __toModule(require("react-native"));
2106
- var import_react_native_safe_area_context = __toModule(require("react-native-safe-area-context"));
2107
- var defaultMetrics = null;
2108
- var SafeAreaProvider = /* @__PURE__ */ __name(({
2109
- initialWindowMetrics,
2110
- children
2111
- }) => {
2112
- if (!initialWindowMetrics && !defaultMetrics) {
2113
- defaultMetrics = import_react_native5.Platform.select({
2114
- web: {
2115
- frame: { x: 0, y: 0, width: 0, height: 0 },
2116
- insets: { top: 0, left: 0, right: 0, bottom: 0 }
2117
- },
2118
- default: import_react_native_safe_area_context.initialWindowMetrics
2119
- });
2120
- }
2121
- return /* @__PURE__ */ import_react17.default.createElement(import_react_native_safe_area_context.SafeAreaProvider, {
2122
- initialMetrics: initialWindowMetrics ?? defaultMetrics
2123
- }, children);
2124
- }, "SafeAreaProvider");
2125
2211
  //# sourceMappingURL=index.cjs.map