@tamagui/web 1.74.14 → 1.74.16

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 (51) hide show
  1. package/dist/cjs/createComponent.js +2 -2
  2. package/dist/cjs/createComponent.js.map +1 -1
  3. package/dist/cjs/createComponent.native.js +13 -1
  4. package/dist/cjs/createComponent.native.js.map +1 -1
  5. package/dist/cjs/helpers/ThemeManager.js +42 -62
  6. package/dist/cjs/helpers/ThemeManager.js.map +2 -2
  7. package/dist/cjs/helpers/ThemeManager.native.js +42 -62
  8. package/dist/cjs/helpers/ThemeManager.native.js.map +2 -2
  9. package/dist/cjs/helpers/scheme.js +1 -0
  10. package/dist/cjs/helpers/scheme.js.map +6 -0
  11. package/dist/cjs/helpers/scheme.native.js +2 -0
  12. package/dist/cjs/helpers/scheme.native.js.map +6 -0
  13. package/dist/cjs/hooks/useTheme.js +1 -1
  14. package/dist/cjs/hooks/useTheme.js.map +1 -1
  15. package/dist/cjs/hooks/useTheme.native.js +24 -16
  16. package/dist/cjs/hooks/useTheme.native.js.map +1 -1
  17. package/dist/cjs/setupReactNative.js.map +1 -1
  18. package/dist/cjs/setupReactNative.native.js.map +1 -1
  19. package/dist/esm/createComponent.js +2 -2
  20. package/dist/esm/createComponent.js.map +1 -1
  21. package/dist/esm/createComponent.native.js +13 -1
  22. package/dist/esm/createComponent.native.js.map +1 -1
  23. package/dist/esm/helpers/ThemeManager.js +41 -59
  24. package/dist/esm/helpers/ThemeManager.js.map +2 -2
  25. package/dist/esm/helpers/ThemeManager.native.js +41 -59
  26. package/dist/esm/helpers/ThemeManager.native.js.map +2 -2
  27. package/dist/esm/helpers/scheme.js +1 -0
  28. package/dist/esm/helpers/scheme.js.map +6 -0
  29. package/dist/esm/helpers/scheme.native.js +1 -0
  30. package/dist/esm/helpers/scheme.native.js.map +6 -0
  31. package/dist/esm/hooks/useTheme.js +1 -1
  32. package/dist/esm/hooks/useTheme.js.map +1 -1
  33. package/dist/esm/hooks/useTheme.native.js +24 -16
  34. package/dist/esm/hooks/useTheme.native.js.map +1 -1
  35. package/dist/esm/setupReactNative.js.map +1 -1
  36. package/dist/esm/setupReactNative.native.js.map +1 -1
  37. package/package.json +9 -9
  38. package/src/createComponent.tsx +17 -16
  39. package/src/helpers/ThemeManager.tsx +87 -93
  40. package/src/hooks/useTheme.tsx +20 -9
  41. package/src/setupReactNative.ts +3 -0
  42. package/src/types.tsx +4 -0
  43. package/types/createComponent.d.ts.map +1 -1
  44. package/types/helpers/ThemeManager.d.ts +7 -7
  45. package/types/helpers/ThemeManager.d.ts.map +1 -1
  46. package/types/helpers/scheme.d.ts.map +1 -0
  47. package/types/hooks/useTheme.d.ts +1 -1
  48. package/types/hooks/useTheme.d.ts.map +1 -1
  49. package/types/setupReactNative.d.ts.map +1 -1
  50. package/types/types.d.ts +3 -0
  51. package/types/types.d.ts.map +1 -1
@@ -43,7 +43,7 @@ If this is intended and you are using Tamagui without any themes, you can disabl
43
43
  const themeProxied = useMemo(() => !themeManager || !state?.theme ? {} : getThemeProxied(state, props.deopt, themeManager, keys.current, props.debug), [state, themeManager, props.deopt, props.debug]);
44
44
  return process.env.NODE_ENV === "development" && props.debug === "verbose" && (console.groupCollapsed(" \u{1F539} useTheme =>", state?.name), console.info("returning state", changedThemeState, "from props", props), console.groupEnd()), [changedThemeState, themeProxied];
45
45
  };
46
- function getThemeProxied({ theme, name }, deopt = !1, themeManager, keys, debug) {
46
+ function getThemeProxied({ theme, name, scheme }, deopt = !1, themeManager, keys, debug) {
47
47
  if (!theme)
48
48
  return {};
49
49
  const config = getConfig();
@@ -76,21 +76,18 @@ function getThemeProxied({ theme, name }, deopt = !1, themeManager, keys, debug)
76
76
  else if (subkey === "get")
77
77
  return (platform) => {
78
78
  const outVal = getVariable(val);
79
- if (platform !== "web" && isIos && !deopt && config.settings.fastSchemeChange) {
80
- const isDark = name.startsWith("dark"), isLight = !isDark && name.startsWith("light");
81
- if (isDark || isLight) {
82
- const oppositeThemeName = name.replace(
83
- isDark ? "dark" : "light",
84
- isDark ? "light" : "dark"
85
- ), oppositeTheme = config.themes[oppositeThemeName], oppositeVal = getVariable(oppositeTheme?.[keyString]);
86
- if (oppositeVal)
87
- return {
88
- dynamic: {
89
- dark: isDark ? outVal : oppositeVal,
90
- light: isLight ? outVal : oppositeVal
91
- }
92
- };
93
- }
79
+ if (platform !== "web" && isIos && !deopt && config.settings.fastSchemeChange && !someParentIsInversed(themeManager) && scheme) {
80
+ const oppositeThemeName = name.replace(
81
+ scheme === "dark" ? "dark" : "light",
82
+ scheme === "dark" ? "light" : "dark"
83
+ ), oppositeTheme = config.themes[oppositeThemeName], oppositeVal = getVariable(oppositeTheme?.[keyString]);
84
+ if (oppositeVal)
85
+ return {
86
+ dynamic: {
87
+ dark: scheme === "dark" ? outVal : oppositeVal,
88
+ light: scheme === "light" ? outVal : oppositeVal
89
+ }
90
+ };
94
91
  }
95
92
  return track(keyString), outVal;
96
93
  };
@@ -102,6 +99,17 @@ function getThemeProxied({ theme, name }, deopt = !1, themeManager, keys, debug)
102
99
  }
103
100
  });
104
101
  }
102
+ function someParentIsInversed(manager) {
103
+ {
104
+ let cur = manager;
105
+ for (; cur; ) {
106
+ if (cur.state.inverse)
107
+ return !0;
108
+ cur = cur.parentManager;
109
+ }
110
+ }
111
+ return !1;
112
+ }
105
113
  const activeThemeManagers = /* @__PURE__ */ new Set(), useChangeThemeEffect = (props, isRoot = !1, keys, shouldUpdate) => {
106
114
  const { disable } = props, parentManager = useContext(ThemeManagerContext);
107
115
  if (!isRoot && !parentManager || disable)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useTheme.tsx"],
4
- "mappings": "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",
4
+ "mappings": "AAAA,SAAS,UAAU,OAAO,gBAAgB;AAC1C,SAAS,YAAY,WAAW,iBAAiB,SAAS,QAAQ,gBAAgB;AAElF,SAAS,iBAAiB;AAC1B,SAAmB,mBAAmB;AACtC,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,2BAA2B;AASpC,SAAS,yBAAyB;AASlC,MAAM,aAAa,EAAE,MAAM,KAAK;AAEhC,IAAI;AACJ,SAAS,yBAAyB;AAChC,MAAI;AAAQ,WAAO;AACnB,QAAM,SAAS,UAAU,GACnB,OAAO,OAAO,OAAO,QAAQ,UAAU,OAAO,KAAK,OAAO,MAAM,EAAE,CAAC,GACnE,eAAe,OAAO,OAAO,IAAI;AACvC,kBAAS,gBAAgB,EAAE,OAAO,cAAc,KAAK,CAAC,GAC/C;AACT;AA8BO,MAAM,WAAW,CAAC,QAAoB,eAAe;AAC1D,QAAM,CAAC,GAAG,KAAK,IAAI,kBAAkB,KAAK;AAE1C,SADY,SAAS,uBAAuB;AAE9C,GAEa,oBAAoB,CAC/B,UACwC;AACxC,QAAM,OAAO,OAAiB,CAAC,CAAC,GAE1B,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACJ,WAiBG,SAhBA,MAAM;AACJ,YAAM,OACJ,MAAM,eAAe,MAAM,KAAK,QAAQ,SAAS,IAAI,KAAO;AAE9D,aACE,QAAQ,IAAI,aAAa,iBACzB,MAAM,SACN,MAAM,UAAU,aAEhB,QAAQ,KAAK,wCAAiC,MAAM;AAAA,QAClD,kBAAkB,MAAM,eAAe;AAAA,QACvC,MAAM,CAAC,GAAG,KAAK,OAAO;AAAA,MACxB,CAAC,GAEI;AAAA,IACT;AAAA,EAEN,GAEM,EAAE,cAAc,MAAM,IAAI;AAEhC,EAAK,OAAO,SACN,QAAQ,IAAI,aAAa,iBACvB,QAAQ,IAAI,qCAAqC,OACnD,QAAQ;AAAA,IACN,2FAA2F,KAAK;AAAA,MAC9F;AAAA,IACF,CAAC;AAAA;AAAA;AAAA,EACH;AAKN,QAAM,eAAe,QAAQ,MACvB,CAAC,gBAAgB,CAAC,OAAO,QACpB,CAAC,IAEH,gBAAgB,OAAO,MAAM,OAAO,cAAc,KAAK,SAAS,MAAM,KAAK,GACjF,CAAC,OAAO,cAAc,MAAM,OAAO,MAAM,KAAK,CAAC;AAElD,SAAI,QAAQ,IAAI,aAAa,iBAAiB,MAAM,UAAU,cAC5D,QAAQ,eAAe,2BAAoB,OAAO,IAAI,GACtD,QAAQ,KAAK,mBAAmB,mBAAmB,cAAc,KAAK,GACtE,QAAQ,SAAS,IAGZ,CAAC,mBAAmB,YAAY;AACzC;AAEO,SAAS,gBACd,EAAE,OAAO,MAAM,OAAO,GACtB,QAAQ,IACR,cACA,MACA,OACgB;AAChB,MAAI,CAAC;AAAO,WAAO,CAAC;AAEpB,QAAM,SAAS,UAAU;AAEzB,WAAS,MAAM,KAAa;AAC1B,IAAI,QAAQ,CAAC,KAAK,SAAS,GAAG,MAC5B,KAAK,KAAK,GAAG,GACT,QAAQ,IAAI,aAAa,iBAAiB,SAC5C,QAAQ,KAAK,2CAAoC,GAAG,EAAE;AAAA,EAG5D;AAEA,SAAO,YAAY,OAAO;AAAA,IACxB,IAAI,GAAG,KAAK;AACV,UAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,eAAO;AAET,UAAI,OAAO,OAAQ;AACjB,eAAI,IAAI,CAAC,MAAM,QAAK,MAAM,IAAI,MAAM,CAAC,IAC9B,cAAc,QAAQ,IAAI,GAAG;AAAA,IAExC;AAAA,IACA,IAAI,GAAG,KAAK;AACV,UAAI,QAAQ;AACV,eAAO;AAGT;AAAA;AAAA;AAAA,QAGE,QAAQ,eACR,OAAO,OAAQ;AAAA,QACf;AAEA,cAAM,YAAY,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,KAC5C,MAAM,MAAM,SAAS;AAE3B,YAAI,OAAO,OAAO,OAAQ;AAGxB,iBAAO,IAAI,MAAM,KAAY;AAAA;AAAA;AAAA,YAG3B,IAAIA,IAAG,QAAQ;AACb,kBAAI,WAAW;AAEb,sBAAM,SAAS;AAAA,uBACN,WAAW;AACpB,uBAAO,CAAC,aAAqB;AAC3B,wBAAM,SAAS,YAAY,GAAG;AAK5B,sBACE,aAAa,SACb,SACA,CAAC,SACD,OAAO,SAAS,oBAChB,CAAC,qBAAqB,YAAY,KAE9B,QAAQ;AACV,0BAAM,oBAAoB,KAAK;AAAA,sBAC7B,WAAW,SAAS,SAAS;AAAA,sBAC7B,WAAW,SAAS,UAAU;AAAA,oBAChC,GACM,gBAAgB,OAAO,OAAO,iBAAiB,GAC/C,cAAc,YAAY,gBAAgB,SAAS,CAAC;AAC1D,wBAAI;AAOF,6BANmB;AAAA,wBACjB,SAAS;AAAA,0BACP,MAAM,WAAW,SAAS,SAAS;AAAA,0BACnC,OAAO,WAAW,UAAU,SAAS;AAAA,wBACvC;AAAA,sBACF;AAAA,kBAGJ;AAIF,+BAAM,SAAS,GAGV;AAAA,gBACT;AAGF,qBAAO,QAAQ,IAAI,KAAY,MAAM;AAAA,YACvC;AAAA,UACF,CAAC;AAAA,MAEL;AAEA,aAAO,QAAQ,IAAI,GAAG,GAAG;AAAA,IAC3B;AAAA,EACF,CAAC;AACH;AAGA,SAAS,qBAAqB,SAAwB;AACP;AAC3C,QAAI,MAAuC;AAC3C,WAAO,OAAK;AACV,UAAI,IAAI,MAAM;AAAS,eAAO;AAC9B,YAAM,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEO,MAAM,sBAAsB,oBAAI,IAAkB,GAE5C,uBAAuB,CAClC,OACA,SAAS,IACT,MACA,iBACyB;AACzB,QAAM,EAAE,QAAQ,IAAI,OAEd,gBAAgB,WAAW,mBAAmB;AAEpD,MAAK,CAAC,UAAU,CAAC,iBAAkB;AACjC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO,eAAe;AAAA,MACtB,cAAc;AAAA,IAChB;AAgBF,QAAM,CAAC,YAAY,aAAa,IAAI,SAA+B,WAAW,GACxE,EAAE,OAAO,SAAS,YAAY,aAAa,IAAI,YAC/C,qBAAqB,GAAQ,CAAC,WAAW,WAAW,MAAM;AAEhE,WAAS,qBACP,UAAU,cACV,WACA,YAA2C,OAC3C,oBAAoB,IACpB;AACA,UAAM,cAAc,eAAe;AACnC,QAAI,CAAC,WAAY,CAAC,qBAAqB,gBAAgB;AAAQ;AAC/D,UAAM,OAAO,aAAa,QAAQ,SAAS,OAAO,aAAa;AAC/D,QAAI;AAAmB,aAAO;AAC9B,QAAK,QACD,kBAAgB,MAAQ,CAAC,QAAQ,qBAAqB,MAAM,SAAS;AAGzE,aAAO;AAAA,EACT;AAoFA,MAlFK,aAEH,gBAAgB,MAAM;AACpB,QAAI,CAAC;AAAc;AAKnB,QAAI,MAAM,WAAW,CAAC,SAAS;AAC7B,oBAAc,EAAE,GAAG,YAAY,SAAS,GAAK,CAAC;AAC9C;AAAA,IACF;AAEA,IAAI,cAAc,gBAChB,oBAAoB,IAAI,YAAY,IAGlC,cAAc,qBAAqB,YAAY,MACjD,cAAc,WAAW;AAI3B,UAAM,sBAAsB,aAAa,cAAc,CAAC,IAAI,IAAI,WAAW;AACzE,MAAI,UACF,cAAc,CAAC,SAAS,YAAY,MAAM,EAAI,CAAC;AAAA,IAEnD,CAAC,GAEK,wBAAwB,eAAe,cAAc,CAAC,MAAM,YAAY;AAC5E,YAAM,QACJ,eAAe,KACf,MAAM,SAGF,MAAM,qBAAqB,GAG3B,kBAAkB,SAAS,GAAQ,MAAM,UAAU;AAEzD,MAAI,QAAQ,IAAI,aAAa,iBAAiB,MAAM,SAClD,QAAQ,KAAK,uBAAgB,aAAa,IAAI;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,GAGC,mBACF,cAAc,WAAW;AAAA,IAE7B,GAAG,aAAa,EAAE;AAElB,WAAO,MAAM;AACX,0BAAoB,GACpB,wBAAwB,GACxB,oBAAoB,OAAO,YAAY;AAAA,IACzC;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,EACF,CAAC,GAEG,QAAQ,IAAI,aAAa,iBAAiB,MAAM,UAAU,aAC5D,UAAU,OACR,WAAW,yBAA4B,oBAAI,IAAI,GAC/C,WAAW,qBAAwB,IAAI,YAAY,GAC5C,MAAM;AACX,eAAW,qBAAwB,OAAO,YAAY;AAAA,EACxD,IACC,CAAC,YAAY,CAAC,IAIjB;AACF,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,OAAO;AAAA,QACL,MAAM;AAAA,QACN,GAAG,eAAe;AAAA,QAClB,WAAW;AAAA,MACb;AAAA,IACF;AAGF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,WAAS,YAAY,MAA6B,QAAQ,IAA6B;AACrF,QAAI,QAAQ,eAAe,MAAM;AAC/B,aAAO;AAIT,QAAIC,gBAA6B,eAC7BC;AAGJ,QAF8B,yBAAyB,KAAK,GAEjC;AACzB,YAAM,qBAAqB,MAClB,IAAI,aAAa,OAAO,SAAS,SAAS,aAAa;AAGhE,UAAI,MAAM,cAAc;AACtB,QAAAD,gBAAe,KAAK;AAQpB,cAAM,cAAc,EAAQ,MAAM,QAC5B,OAAOA,cAAa,SAAS,OAAO,aAAa,GACjD,YAAY;AAAA,UAChBA;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QACF;AAEA,QAAI,aACFC,SAAQ,WAEH,KAAK,aAGRD,cAAa,YAAY,SAAS,IAFlCA,gBAAe,mBAAmB,KAKhC,KAAK,cAEH,iBAAiB,CAAC,SACpBA,gBAAe;AAAA,MAIvB;AACE,QAAAA,gBAAe,mBAAmB,GAClCC,SAAQ,EAAE,GAAGD,cAAa,MAAM;AAAA,IAEpC;AAEA,UAAME,cAAa,GAAQF,kBAAiB,iBAAiB,MAAM,UAG7DG,WAAW,MAAM,UAAiB,UAAU,MAAM,UAAvB;AAWjC,QATKF,WACCC,cACFD,SAAQD,cAAa,SAErBC,SAAQ,cAAe,OACvBD,gBAAe,iBAIf,CAAC,SAASC,QAAO,SAAS,MAAM,OAAO;AACzC,aAAO;AAGT,UAAM,WAAW;AAAA,MACf,OAAAA;AAAA,MACA,cAAAD;AAAA,MACA,YAAAE;AAAA,MACA,SAAAC;AAAA,IACF;AAEA,QAAI,QAAQ,IAAI,aAAa,iBAAiB,MAAM,SAAY,UAAU;AACxE,cAAQ,eAAe,cAAOH,cAAa,EAAE,mCAAmC;AAChF,YAAM,cAAc,EAAE,GAAG,eAAe,MAAM,GACxC,WAAW,eAAe,IAC1B,oBAAoB,EAAE,GAAGA,cAAa,MAAM;AAClD,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,GACD,QAAQ,SAAS;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AACF;",
5
5
  "names": ["_", "themeManager", "state", "isNewTheme", "mounted"]
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/setupReactNative.ts"],
4
- "mappings": "AAEA,MAAM,2BAA2B,oBAAI,QAA2C;AAEzE,SAAS,qBAAqB,WAAgB;AACnD,MAAK;AAeH,WAAI,UAAU,WAAW,UAAU,WAC1B,UAAU,QAEf,UAAU,gBAAgB,UAAU,UAAU,SACzC,UAAU,OAGjB,UAAU,WACT,UAAU,gBAAgB,gBAAgB,UAAU,gBAAgB,UAE9D,UAAU,UAEf,UAAU,OAAO,gBACZ,UAAU,YAId,yBAAyB,IAAI,SAAS;AAC/C;AAEA,MAAM,YAAY;AAAA,EAChB,OAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,oBAAI,IAAI,CAAC,OAAO,SAAS,QAAQ,CAAC;AAAA,EACjD;AAAA,EACA,MAAM;AAAA,IACJ,eAAe;AAAA,IACf,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,EACjB;AACF;AAKO,SAAS,iBAAiB,WAAgC;AAcjE;",
4
+ "mappings": "AAEA,MAAM,2BAA2B,oBAAI,QAA2C;AAEzE,SAAS,qBAAqB,WAAgB;AACnD,MAAK;AAkBH,WAAI,UAAU,WAAW,UAAU,WAC1B,UAAU,QAEf,UAAU,gBAAgB,UAAU,UAAU,SACzC,UAAU,OAGjB,UAAU,WACT,UAAU,gBAAgB,gBAAgB,UAAU,gBAAgB,UAE9D,UAAU,UAEf,UAAU,OAAO,gBACZ,UAAU,YAId,yBAAyB,IAAI,SAAS;AAC/C;AAEA,MAAM,YAAY;AAAA,EAChB,OAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,oBAAI,IAAI,CAAC,OAAO,SAAS,QAAQ,CAAC;AAAA,EACjD;AAAA,EACA,MAAM;AAAA,IACJ,eAAe;AAAA,IACf,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,EACjB;AACF;AAKO,SAAS,iBAAiB,WAAgC;AAcjE;",
5
5
  "names": []
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/setupReactNative.ts"],
4
- "mappings": "AAEA,MAAM,2BAA2B,oBAAI,QAA2C;AAEzE,SAAS,qBAAqB,WAAgB;AACnD,MAAK;AAGH,WAAI,UAAU,WAAW,eAAe,UAAU,WAAW,eACpD,UAAU,YAEf,UAAU,qBACL,UAAU,QAEf,UAAU,WAAW,oBAChB,UAAU,OAGZ,UAAU;AAoBrB;AAEA,MAAM,YAAY;AAAA,EAChB,OAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,oBAAI,IAAI,CAAC,OAAO,SAAS,QAAQ,CAAC;AAAA,EACjD;AAAA,EACA,MAAM;AAAA,IACJ,eAAe;AAAA,IACf,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,EACjB;AACF;AAKO,SAAS,iBAAiB,WAAgC;AAcjE;",
4
+ "mappings": "AAEA,MAAM,2BAA2B,oBAAI,QAA2C;AAEzE,SAAS,qBAAqB,WAAgB;AACnD,MAAK;AAGH,WAAI,UAAU,WAAW,eAAe,UAAU,WAAW,eACpD,UAAU,YAEf,UAAU,qBACL,UAAU,QAEf,UAAU,WAAW,oBAChB,UAAU,OAMZ,UAAU;AAoBrB;AAEA,MAAM,YAAY;AAAA,EAChB,OAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,oBAAI,IAAI,CAAC,OAAO,SAAS,QAAQ,CAAC;AAAA,EACjD;AAAA,EACA,MAAM;AAAA,IACJ,eAAe;AAAA,IACf,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,EACjB;AACF;AAKO,SAAS,iBAAiB,WAAgC;AAcjE;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/web",
3
- "version": "1.74.14",
3
+ "version": "1.74.16",
4
4
  "source": "src/index.ts",
5
5
  "main": "dist/cjs",
6
6
  "module": "dist/esm",
@@ -27,19 +27,19 @@
27
27
  "reset.css"
28
28
  ],
29
29
  "dependencies": {
30
- "@tamagui/compose-refs": "1.74.14",
31
- "@tamagui/constants": "1.74.14",
32
- "@tamagui/helpers": "1.74.14",
33
- "@tamagui/normalize-css-color": "1.74.14",
34
- "@tamagui/timer": "1.74.14",
35
- "@tamagui/use-did-finish-ssr": "1.74.14",
36
- "@tamagui/use-force-update": "1.74.14"
30
+ "@tamagui/compose-refs": "1.74.16",
31
+ "@tamagui/constants": "1.74.16",
32
+ "@tamagui/helpers": "1.74.16",
33
+ "@tamagui/normalize-css-color": "1.74.16",
34
+ "@tamagui/timer": "1.74.16",
35
+ "@tamagui/use-did-finish-ssr": "1.74.16",
36
+ "@tamagui/use-force-update": "1.74.16"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "react": "*"
40
40
  },
41
41
  "devDependencies": {
42
- "@tamagui/build": "1.74.14",
42
+ "@tamagui/build": "1.74.16",
43
43
  "@testing-library/react": "^14.0.0",
44
44
  "csstype": "^3.0.10",
45
45
  "react": "^18.2.0",
@@ -951,6 +951,7 @@ export function createComponent<
951
951
 
952
952
  const runtimePressStyle = !disabled && noClassNames && pseudos?.pressStyle
953
953
  const runtimeFocusStyle = !disabled && noClassNames && pseudos?.focusStyle
954
+ const attachFocus = Boolean(runtimePressStyle || onFocus || onBlur)
954
955
  const attachPress = Boolean(
955
956
  groupName ||
956
957
  runtimePressStyle ||
@@ -970,7 +971,8 @@ export function createComponent<
970
971
  // check presence rather than value to prevent reparenting bugs
971
972
  // allows for onPress={x ? function : undefined} without re-ordering dom
972
973
  const shouldAttach = Boolean(
973
- attachPress ||
974
+ attachFocus ||
975
+ attachPress ||
974
976
  isHoverable ||
975
977
  runtimePressStyle ||
976
978
  runtimeHoverStyle ||
@@ -1055,21 +1057,20 @@ export function createComponent<
1055
1057
  onLongPress?.(e)
1056
1058
  },
1057
1059
  }),
1058
- ...(process.env.TAMAGUI_TARGET === 'web' &&
1059
- runtimeFocusStyle && {
1060
- onFocus: (e) => {
1061
- setStateShallow({
1062
- focus: true,
1063
- })
1064
- onFocus?.(e)
1065
- },
1066
- onBlur: (e) => {
1067
- setStateShallow({
1068
- focus: false,
1069
- })
1070
- onBlur?.(e)
1071
- },
1072
- }),
1060
+ ...(attachFocus && {
1061
+ onFocus: (e) => {
1062
+ setStateShallow({
1063
+ focus: true,
1064
+ })
1065
+ onFocus?.(e)
1066
+ },
1067
+ onBlur: (e) => {
1068
+ setStateShallow({
1069
+ focus: false,
1070
+ })
1071
+ onBlur?.(e)
1072
+ },
1073
+ }),
1073
1074
  }
1074
1075
  : null
1075
1076
 
@@ -2,7 +2,7 @@ import { isWeb } from '@tamagui/constants'
2
2
 
3
3
  import { getThemes } from '../config'
4
4
  import { THEME_CLASSNAME_PREFIX, THEME_NAME_SEPARATOR } from '../constants/constants'
5
- import { ThemeParsed, ThemeProps } from '../types'
5
+ import { ColorScheme, ThemeParsed, ThemeProps } from '../types'
6
6
 
7
7
  type ThemeListener = (
8
8
  name: string | null,
@@ -20,11 +20,12 @@ export type SetActiveThemeProps = {
20
20
 
21
21
  export type ThemeManagerState = {
22
22
  name: string
23
+ parentName?: string
23
24
  theme?: ThemeParsed | null
25
+ isComponent?: boolean
24
26
  className?: string
25
- parentName?: string
26
- componentName?: string
27
27
  inverse?: boolean
28
+ scheme?: ColorScheme
28
29
  }
29
30
 
30
31
  const emptyState: ThemeManagerState = { name: '' }
@@ -37,22 +38,20 @@ let uid = 0
37
38
 
38
39
  export class ThemeManager {
39
40
  id = uid++
40
- isComponent = false
41
41
  themeListeners = new Set<ThemeListener>()
42
42
  parentManager: ThemeManager | null = null
43
43
  state: ThemeManagerState = emptyState
44
- scheme: 'light' | 'dark' | null = null
45
44
 
46
45
  constructor(
47
46
  public props: ThemeProps = {},
48
- parentManagerIn?: ThemeManager | 'root' | null | undefined
47
+ parentManager?: ThemeManager | 'root' | null | undefined
49
48
  ) {
50
- if (parentManagerIn === 'root') {
49
+ if (parentManager === 'root') {
51
50
  this.updateStateFromProps(props, false)
52
51
  return
53
52
  }
54
53
 
55
- if (!parentManagerIn) {
54
+ if (!parentManager) {
56
55
  if (process.env.NODE_ENV !== 'production') {
57
56
  throw new Error(
58
57
  `No parent manager given, this is likely due to duplicated Tamagui dependencies. Check your lockfile for mis-matched versions. It could also be from an error somewhere else in your stack causing Tamagui to recieve undefined context, you can try putting some ErrorBoundary components around other areas of your app, or a Suspense boundary.`
@@ -61,13 +60,14 @@ export class ThemeManager {
61
60
  throw `❌ 0`
62
61
  }
63
62
 
64
- this.parentManager = parentManagerIn
63
+ // this is used in updateStateFromProps so must be set
64
+ this.parentManager = parentManager
65
65
 
66
66
  if (this.updateStateFromProps(props, false)) {
67
67
  return
68
68
  }
69
69
 
70
- return parentManagerIn || this
70
+ return parentManager
71
71
  }
72
72
 
73
73
  updateStateFromProps(
@@ -81,6 +81,7 @@ export class ThemeManager {
81
81
  return true
82
82
  }
83
83
  const nextState = this.getStateIfChanged(props)
84
+
84
85
  if (nextState) {
85
86
  this.updateState(nextState, shouldNotify)
86
87
  return nextState
@@ -89,11 +90,7 @@ export class ThemeManager {
89
90
 
90
91
  updateState(nextState: ThemeManagerState, shouldNotify = true) {
91
92
  this.state = nextState
92
- const names = this.state.name.split('_')
93
- const lastName = names[names.length - 1][0]
94
- this.isComponent = lastName[0] === lastName[0].toUpperCase()
95
93
  this._allKeys = null
96
- this.scheme = names[0] === 'light' ? 'light' : names[0] === 'dark' ? 'dark' : null
97
94
  if (process.env.NODE_ENV === 'development') {
98
95
  this['_numChangeEventsSent'] ??= 0
99
96
  this['_numChangeEventsSent']++
@@ -166,86 +163,61 @@ export class ThemeManager {
166
163
  }
167
164
  }
168
165
 
169
- function getNextThemeClassName(name: string) {
170
- const next = `t_sub_theme ${THEME_CLASSNAME_PREFIX}${name}`
171
- return next.replace('light_', '').replace('dark_', '')
172
- }
173
-
174
166
  function getState(
175
167
  props: ThemeProps,
176
- parentManager?: ThemeManager | null
168
+ manager?: ThemeManager | null
177
169
  ): ThemeManagerState | null {
178
- const validManagerAndAllComponentThemes = getNonComponentParentManager(parentManager)
179
- parentManager = validManagerAndAllComponentThemes[0]
180
- const allComponentThemes = validManagerAndAllComponentThemes[1]
181
- const themes = getThemes()
182
- const isDirectParentAComponentTheme = allComponentThemes.length > 0
183
-
184
170
  if (props.name && props.reset) {
185
- throw new Error('Cannot reset + set new name')
171
+ throw new Error(
172
+ process.env.NODE_ENV === 'production'
173
+ ? `❌004`
174
+ : 'Cannot reset and set a new name at the same time.'
175
+ )
186
176
  }
187
177
 
188
- if (!props.name && !props.inverse && !props.reset && !props.componentName) {
178
+ if (!getHasThemeUpdatingProps(props)) {
189
179
  return null
190
180
  }
191
181
 
192
- if (props.reset && !isDirectParentAComponentTheme && !parentManager?.parentManager) {
193
- if (process.env.NODE_ENV === 'development') {
194
- console.warn('Cannot reset no grandparent exists')
182
+ const themes = getThemes()
183
+ const [allManagers, componentManagers] = getManagers(manager)
184
+
185
+ const isDirectParentAComponentTheme = !!manager?.state.isComponent
186
+ const startIndex =
187
+ allManagers.findIndex((x) => !x?.state.isComponent) +
188
+ (props.reset && !isDirectParentAComponentTheme ? 1 : 0)
189
+
190
+ let baseManager = allManagers[startIndex]
191
+ let parentManager = allManagers[startIndex + 1]
192
+
193
+ if (!baseManager && props.reset) {
194
+ if (process.env.NODE_ENV !== 'production') {
195
+ console.warn('Cannot reset, no parent theme exists')
195
196
  }
196
197
  return null
197
198
  }
198
199
 
199
200
  let result: ThemeManagerState | null = null
200
201
 
201
- const nextName = props.reset
202
- ? isDirectParentAComponentTheme
203
- ? parentManager?.state?.name || ''
204
- : parentManager?.parentManager?.state?.name || ''
205
- : props.name || ''
206
- const { componentName } = props
207
- const parentName = props.reset
208
- ? isDirectParentAComponentTheme
209
- ? // here because parentManager already skipped componentTheme so we have to only go up once
210
- parentManager?.parentManager?.state.name || ''
211
- : parentManager?.parentManager?.parentManager?.state.name || ''
212
- : isDirectParentAComponentTheme
213
- ? allComponentThemes[0] || ''
214
- : parentManager?.state.name || ''
202
+ const baseName = baseManager?.state.name || ''
203
+ const nextName = props.reset ? baseName : props.name || ''
215
204
 
205
+ const allComponentThemes = componentManagers.map((x) => x?.state.name || '')
216
206
  if (props.reset && isDirectParentAComponentTheme) {
217
- // skip nearest component theme
218
207
  allComponentThemes.shift()
219
208
  }
220
209
 
221
210
  // components look for most specific, fallback upwards
222
- const base = parentName.split(THEME_NAME_SEPARATOR)
223
- const lastSegment = base[base.length - 1]
224
- const isParentComponentTheme =
225
- parentName && lastSegment[0].toUpperCase() === lastSegment[0]
226
- if (isParentComponentTheme) {
227
- base.pop() // always remove componentName they can't nest
228
- }
229
- const parentBaseTheme = isParentComponentTheme
230
- ? base.slice(0, base.length).join(THEME_NAME_SEPARATOR)
231
- : parentName
211
+ const base = baseName.split(THEME_NAME_SEPARATOR)
232
212
  const max = base.length
233
213
  const min =
234
- componentName && !nextName
214
+ props.componentName && !nextName
235
215
  ? max // component name only don't search upwards
236
216
  : 0
237
217
 
238
218
  if (process.env.NODE_ENV === 'development' && typeof props.debug === 'string') {
239
219
  console.groupCollapsed('ThemeManager.getState()')
240
- console.info({
241
- props,
242
- parentName,
243
- parentBaseTheme,
244
- base,
245
- min,
246
- max,
247
- isParentComponentTheme,
248
- })
220
+ console.info({ props, baseName, base, min, max })
249
221
  }
250
222
 
251
223
  for (let i = max; i >= min; i--) {
@@ -256,7 +228,7 @@ function getState(
256
228
  }
257
229
  let potentials: string[] = []
258
230
 
259
- if (prefix && prefix !== parentBaseTheme) {
231
+ if (prefix && prefix !== baseName) {
260
232
  potentials.push(prefix)
261
233
  }
262
234
  if (nextName) {
@@ -269,41 +241,63 @@ function getState(
269
241
  }
270
242
  }
271
243
 
272
- if (componentName) {
244
+ if (props.componentName) {
273
245
  let componentPotentials: string[] = []
274
246
  // components only look for component themes
275
247
  if (nextName) {
276
248
  const beforeSeparator = prefix.slice(0, prefix.indexOf(THEME_NAME_SEPARATOR))
277
- componentPotentials.push(`${beforeSeparator}_${nextName}_${componentName}`)
249
+ componentPotentials.push(`${beforeSeparator}_${nextName}_${props.componentName}`)
278
250
  }
279
- componentPotentials.push(`${prefix}_${componentName}`)
251
+ componentPotentials.push(`${prefix}_${props.componentName}`)
280
252
  if (nextName) {
281
253
  // do this one and one level up
282
254
  const prefixLessOne = base.slice(0, i - 1).join(THEME_NAME_SEPARATOR)
283
255
  if (prefixLessOne) {
284
- const lessSpecific = `${prefixLessOne}_${nextName}_${componentName}`
256
+ const lessSpecific = `${prefixLessOne}_${nextName}_${props.componentName}`
285
257
  componentPotentials.unshift(lessSpecific)
286
258
  }
287
- const moreSpecific = `${prefix}_${nextName}_${componentName}`
259
+ const moreSpecific = `${prefix}_${nextName}_${props.componentName}`
288
260
  componentPotentials.unshift(moreSpecific)
289
261
  }
290
262
  potentials = [...componentPotentials, ...potentials, ...allComponentThemes]
291
263
  }
264
+
292
265
  const found = potentials.find((t) => t in themes)
293
266
 
294
267
  if (process.env.NODE_ENV === 'development' && typeof props.debug === 'string') {
295
- console.info(' - ', { found, potentials, parentManager })
268
+ console.info(' - ', { found, potentials, baseManager })
296
269
  }
297
270
 
298
271
  if (found) {
272
+ const names = found.split('_')
273
+ const [firstName, ...restNames] = names
274
+ const lastName = names[names.length - 1]
275
+ const isComponent = lastName[0] === lastName[0].toUpperCase()
276
+ const scheme =
277
+ firstName === 'light' ? 'light' : firstName === 'dark' ? 'dark' : undefined
278
+ const pre = THEME_CLASSNAME_PREFIX
279
+ const className = !isWeb
280
+ ? ''
281
+ : `${pre}sub_theme ${pre}${
282
+ !scheme || !restNames.length ? firstName : restNames.join('_')
283
+ }`
284
+
285
+ // because its a new theme the baseManager is now the parent
286
+ const parentState = baseManager?.state
287
+ const parentScheme = parentState?.scheme
288
+ const parentName = parentState?.name
289
+ const inverse = parentScheme && scheme !== parentScheme
290
+
299
291
  result = {
300
292
  name: found,
301
- theme: themes[found],
302
- className: isWeb ? getNextThemeClassName(found) : '',
303
293
  parentName,
304
- componentName,
305
- inverse: props.inverse,
294
+ theme: themes[found],
295
+ className,
296
+ inverse,
297
+ isComponent,
298
+ scheme,
306
299
  }
300
+
307
301
  break
308
302
  }
309
303
  }
@@ -313,9 +307,7 @@ function getState(
313
307
  typeof props.debug === 'string' &&
314
308
  typeof window !== 'undefined'
315
309
  ) {
316
- console.warn('ThemeManager.getState():', {
317
- result,
318
- })
310
+ console.warn('ThemeManager.getState():', { result })
319
311
  console.trace()
320
312
  console.groupEnd()
321
313
  }
@@ -329,19 +321,21 @@ const inverseThemeName = (themeName: string) => {
329
321
  : themeName.replace(/^dark/, 'light')
330
322
  }
331
323
 
332
- export function getNonComponentParentManager(themeManager?: ThemeManager | null) {
333
- // components never inherit from components
334
- // example <Switch><Switch.Thumb /></Switch>
335
- // the Switch theme shouldn't be considered parent of Thumb
336
- let res = themeManager
337
- let componentThemeNames: string[] = []
338
- while (res) {
339
- if (res?.isComponent) {
340
- componentThemeNames.push(res?.state?.name!)
341
- res = res.parentManager
342
- } else {
343
- break
324
+ type MaybeThemeManager = ThemeManager | undefined
325
+
326
+ // components never inherit from components
327
+ // example <Switch><Switch.Thumb /></Switch>
328
+ // the Switch theme shouldn't be considered parent of Thumb
329
+ export function getManagers(themeManager?: ThemeManager | null) {
330
+ const comp: MaybeThemeManager[] = []
331
+ const all: MaybeThemeManager[] = []
332
+ let cur = themeManager
333
+ while (cur) {
334
+ all.push(cur)
335
+ if (cur.state.isComponent) {
336
+ comp.push(cur)
344
337
  }
338
+ cur = cur.parentManager
345
339
  }
346
- return [res || null, componentThemeNames] as const
340
+ return [all, comp] as const
347
341
  }
@@ -133,7 +133,7 @@ export const useThemeWithState = (
133
133
  }
134
134
 
135
135
  export function getThemeProxied(
136
- { theme, name }: ThemeManagerState,
136
+ { theme, name, scheme }: ThemeManagerState,
137
137
  deopt = false,
138
138
  themeManager?: ThemeManager,
139
139
  keys?: string[],
@@ -198,22 +198,21 @@ export function getThemeProxied(
198
198
  platform !== 'web' &&
199
199
  isIos &&
200
200
  !deopt &&
201
- config.settings.fastSchemeChange
201
+ config.settings.fastSchemeChange &&
202
+ !someParentIsInversed(themeManager)
202
203
  ) {
203
- const isDark = name.startsWith('dark')
204
- const isLight = !isDark && name.startsWith('light')
205
- if (isDark || isLight) {
204
+ if (scheme) {
206
205
  const oppositeThemeName = name.replace(
207
- isDark ? 'dark' : 'light',
208
- isDark ? 'light' : 'dark'
206
+ scheme === 'dark' ? 'dark' : 'light',
207
+ scheme === 'dark' ? 'light' : 'dark'
209
208
  )
210
209
  const oppositeTheme = config.themes[oppositeThemeName]
211
210
  const oppositeVal = getVariable(oppositeTheme?.[keyString])
212
211
  if (oppositeVal) {
213
212
  const dynamicVal = {
214
213
  dynamic: {
215
- dark: isDark ? outVal : oppositeVal,
216
- light: isLight ? outVal : oppositeVal,
214
+ dark: scheme === 'dark' ? outVal : oppositeVal,
215
+ light: scheme === 'light' ? outVal : oppositeVal,
217
216
  },
218
217
  }
219
218
  return dynamicVal
@@ -240,6 +239,18 @@ export function getThemeProxied(
240
239
  }) as UseThemeResult
241
240
  }
242
241
 
242
+ // to tell if we are inversing the scheme anywhere in the tree, if so we need to de-opt
243
+ function someParentIsInversed(manager?: ThemeManager) {
244
+ if (process.env.TAMAGUI_TARGET === 'native') {
245
+ let cur: ThemeManager | null | undefined = manager
246
+ while (cur) {
247
+ if (cur.state.inverse) return true
248
+ cur = cur.parentManager
249
+ }
250
+ }
251
+ return false
252
+ }
253
+
243
254
  export const activeThemeManagers = new Set<ThemeManager>()
244
255
 
245
256
  export const useChangeThemeEffect = (
@@ -15,6 +15,9 @@ export function getReactNativeConfig(Component: any) {
15
15
  if (Component.propTypes?.textBreakStrategy) {
16
16
  return RNConfigs.Text
17
17
  }
18
+
19
+ // can optimize plain View or Text to not be react native specific
20
+
18
21
  // can assume everything else is react native on native
19
22
  return RNConfigs.default
20
23
  } else {
package/src/types.tsx CHANGED
@@ -29,6 +29,8 @@ import type { ThemeProviderProps } from './views/ThemeProvider'
29
29
 
30
30
  export type { MediaStyleObject, StyleObject } from '@tamagui/helpers'
31
31
 
32
+ export type ColorScheme = 'light' | 'dark'
33
+
32
34
  export type IsMediaType = boolean | 'platform' | 'theme' | 'group'
33
35
 
34
36
  export type SpaceDirection = 'vertical' | 'horizontal' | 'both'
@@ -2010,6 +2012,8 @@ export type TamaguiComponentEvents = {
2010
2012
  onMouseEnter?: ((e: any) => void) | undefined
2011
2013
  onMouseLeave?: ((e: any) => void) | undefined
2012
2014
  onPressOut: ((e: any) => void) | undefined
2015
+ onFocus?: ((e: any) => void) | undefined
2016
+ onBlur?: ((e: any) => void) | undefined
2013
2017
  }
2014
2018
 
2015
2019
  export type ModifyTamaguiComponentStyleProps<
@@ -1 +1 @@
1
- {"version":3,"file":"createComponent.d.ts","sourceRoot":"","sources":["../src/createComponent.tsx"],"names":[],"mappings":"AAIA,OAAO,KAaN,MAAM,OAAO,CAAA;AAsBd,OAAO,EAEL,SAAS,EAKT,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EAEZ,gBAAgB,EAGhB,cAAc,EAEd,SAAS,EAMV,MAAM,SAAS,CAAA;AAoBhB,eAAO,MAAM,QAAQ,eAAsB,CAAA;AA6D3C,wBAAgB,eAAe,CAC7B,kBAAkB,SAAS,UAAU,GAAG,SAAS,GAAG,EAAE,EACtD,GAAG,GAAG,cAAc,EACpB,SAAS,GAAG,KAAK,EACjB,YAAY,EAAE,YAAY,4DAwsC3B;AAsBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,OAEjD;AAiBD,eAAO,MAAM,MAAM,0DAqCjB,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,mBAiGxD"}
1
+ {"version":3,"file":"createComponent.d.ts","sourceRoot":"","sources":["../src/createComponent.tsx"],"names":[],"mappings":"AAIA,OAAO,KAaN,MAAM,OAAO,CAAA;AAsBd,OAAO,EAEL,SAAS,EAKT,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EAEZ,gBAAgB,EAGhB,cAAc,EAEd,SAAS,EAMV,MAAM,SAAS,CAAA;AAoBhB,eAAO,MAAM,QAAQ,eAAsB,CAAA;AA6D3C,wBAAgB,eAAe,CAC7B,kBAAkB,SAAS,UAAU,GAAG,SAAS,GAAG,EAAE,EACtD,GAAG,GAAG,cAAc,EACpB,SAAS,GAAG,KAAK,EACjB,YAAY,EAAE,YAAY,4DAysC3B;AAsBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,OAEjD;AAiBD,eAAO,MAAM,MAAM,0DAqCjB,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,mBAiGxD"}