@tamagui/core 1.0.1-beta.66 → 1.0.1-beta.69

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 (47) hide show
  1. package/dist/cjs/constants/rnw.js +2 -13
  2. package/dist/cjs/constants/rnw.js.map +2 -2
  3. package/dist/cjs/createComponent.js +69 -47
  4. package/dist/cjs/createComponent.js.map +2 -2
  5. package/dist/cjs/helpers/createPropMapper.js +3 -0
  6. package/dist/cjs/helpers/createPropMapper.js.map +2 -2
  7. package/dist/cjs/helpers/generateAtomicStyles.js +133 -89
  8. package/dist/cjs/helpers/generateAtomicStyles.js.map +2 -2
  9. package/dist/cjs/helpers/getSplitStyles.js +27 -21
  10. package/dist/cjs/helpers/getSplitStyles.js.map +2 -2
  11. package/dist/cjs/helpers/getStylesAtomic.js +22 -67
  12. package/dist/cjs/helpers/getStylesAtomic.js.map +2 -2
  13. package/dist/cjs/helpers/pseudos.js.map +1 -1
  14. package/dist/cjs/types.js.map +1 -1
  15. package/dist/esm/constants/rnw.js +2 -13
  16. package/dist/esm/constants/rnw.js.map +2 -2
  17. package/dist/esm/createComponent.js +69 -47
  18. package/dist/esm/createComponent.js.map +2 -2
  19. package/dist/esm/helpers/createPropMapper.js +3 -0
  20. package/dist/esm/helpers/createPropMapper.js.map +2 -2
  21. package/dist/esm/helpers/generateAtomicStyles.js +133 -89
  22. package/dist/esm/helpers/generateAtomicStyles.js.map +2 -2
  23. package/dist/esm/helpers/getSplitStyles.js +27 -22
  24. package/dist/esm/helpers/getSplitStyles.js.map +2 -2
  25. package/dist/esm/helpers/getStylesAtomic.js +22 -67
  26. package/dist/esm/helpers/getStylesAtomic.js.map +2 -2
  27. package/dist/esm/helpers/pseudos.js.map +1 -1
  28. package/dist/jsx/constants/rnw.js +2 -13
  29. package/dist/jsx/createComponent.js +67 -44
  30. package/dist/jsx/helpers/createPropMapper.js +3 -0
  31. package/dist/jsx/helpers/generateAtomicStyles.js +133 -89
  32. package/dist/jsx/helpers/getSplitStyles.js +27 -22
  33. package/dist/jsx/helpers/getStylesAtomic.js +22 -67
  34. package/package.json +6 -5
  35. package/types/constants/rnw.d.ts.map +1 -1
  36. package/types/createComponent.d.ts +3 -1
  37. package/types/createComponent.d.ts.map +1 -1
  38. package/types/helpers/generateAtomicStyles.d.ts +3 -12
  39. package/types/helpers/generateAtomicStyles.d.ts.map +1 -1
  40. package/types/helpers/getSplitStyles.d.ts +6 -0
  41. package/types/helpers/getSplitStyles.d.ts.map +1 -1
  42. package/types/helpers/getStylesAtomic.d.ts +0 -5
  43. package/types/helpers/getStylesAtomic.d.ts.map +1 -1
  44. package/types/helpers/pseudos.d.ts +1 -0
  45. package/types/helpers/pseudos.d.ts.map +1 -1
  46. package/types/types.d.ts +2 -1
  47. package/types/types.d.ts.map +1 -1
@@ -21,21 +21,10 @@ __export(rnw_exports, {
21
21
  rnw: () => rnw
22
22
  });
23
23
  module.exports = __toCommonJS(rnw_exports);
24
- const interopRequire = /* @__PURE__ */ __name((src) => "default" in src ? src.default : src, "interopRequire");
24
+ const interopRequire = /* @__PURE__ */ __name((x) => "default" in x ? x.default : x, "interopRequire");
25
25
  const rnw = {};
26
26
  if (process.env.IS_STATIC === "is_static") {
27
- const createDOMProps = require("react-native-web/dist/cjs/modules/createDOMProps/index.js");
28
- const createCompileableStyle = require("react-native-web/dist/cjs/exports/StyleSheet/createCompileableStyle");
29
- const createReactDOMStyle = require("react-native-web/dist/cjs/exports/StyleSheet/createReactDOMStyle");
30
- const i18Style = require("react-native-web/dist/cjs/exports/StyleSheet/i18nStyle");
31
- const atomic = require("react-native-web/dist/cjs/exports/StyleSheet/compile").atomic;
32
- Object.assign(rnw, {
33
- createDOMProps,
34
- createCompileableStyle,
35
- createReactDOMStyle,
36
- i18Style,
37
- atomic
38
- });
27
+ Object.assign(rnw, interopRequire(require("react-native-web/dist/cjs/tamagui-exports")));
39
28
  } else if (process.env.TAMAGUI_TARGET === "web") {
40
29
  Object.assign(rnw, interopRequire(require("react-native-web").TamaguiExports));
41
30
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/constants/rnw.tsx"],
4
- "sourcesContent": ["const interopRequire = (src: any) => ('default' in src ? src.default : src)\n\nexport const rnw: any = {}\n\n// in static mode, require them directly since we can't import react-native-web at all (it has flow stuff in it)\nif (process.env.IS_STATIC === 'is_static') {\n const createDOMProps = require('react-native-web/dist/cjs/modules/createDOMProps/index.js')\n const createCompileableStyle = require('react-native-web/dist/cjs/exports/StyleSheet/createCompileableStyle')\n const createReactDOMStyle = require('react-native-web/dist/cjs/exports/StyleSheet/createReactDOMStyle')\n const i18Style = require('react-native-web/dist/cjs/exports/StyleSheet/i18nStyle')\n const atomic = require('react-native-web/dist/cjs/exports/StyleSheet/compile').atomic\n Object.assign(rnw, {\n createDOMProps,\n createCompileableStyle,\n createReactDOMStyle,\n i18Style,\n atomic,\n })\n} else if (process.env.TAMAGUI_TARGET === 'web') {\n // when targeting web (client) import it like so\n Object.assign(rnw, interopRequire(require('react-native-web').TamaguiExports))\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,iBAAiB,wBAAC,QAAc,aAAa,MAAM,IAAI,UAAU,KAAhD;AAEhB,MAAM,MAAW,CAAC;AAGzB,IAAI,QAAQ,IAAI,cAAc,aAAa;AACzC,QAAM,iBAAiB,QAAQ,2DAA2D;AAC1F,QAAM,yBAAyB,QAAQ,qEAAqE;AAC5G,QAAM,sBAAsB,QAAQ,kEAAkE;AACtG,QAAM,WAAW,QAAQ,wDAAwD;AACjF,QAAM,SAAS,QAAQ,sDAAsD,EAAE;AAC/E,SAAO,OAAO,KAAK;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH,WAAW,QAAQ,IAAI,mBAAmB,OAAO;AAE/C,SAAO,OAAO,KAAK,eAAe,QAAQ,kBAAkB,EAAE,cAAc,CAAC;AAC/E;",
4
+ "sourcesContent": ["const interopRequire = (x: any) => ('default' in x ? x.default : x)\nexport const rnw: any = {}\n\n// in static mode, require them directly since we can't import react-native-web at all (it has flow stuff in it)\nif (process.env.IS_STATIC === 'is_static') {\n Object.assign(rnw, interopRequire(require('react-native-web/dist/cjs/tamagui-exports')))\n} else if (process.env.TAMAGUI_TARGET === 'web') {\n Object.assign(rnw, interopRequire(require('react-native-web').TamaguiExports))\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,iBAAiB,wBAAC,MAAY,aAAa,IAAI,EAAE,UAAU,GAA1C;AAChB,MAAM,MAAW,CAAC;AAGzB,IAAI,QAAQ,IAAI,cAAc,aAAa;AACzC,SAAO,OAAO,KAAK,eAAe,QAAQ,2CAA2C,CAAC,CAAC;AACzF,WAAW,QAAQ,IAAI,mBAAmB,OAAO;AAC/C,SAAO,OAAO,KAAK,eAAe,QAAQ,kBAAkB,EAAE,cAAc,CAAC;AAC/E;",
6
6
  "names": []
7
7
  }
@@ -84,14 +84,14 @@ var import_Pressability = require("./Pressability");
84
84
  var import_Slot = require("./views/Slot");
85
85
  var import_TextAncestorContext = require("./views/TextAncestorContext");
86
86
  import_react.default["keep"];
87
- const defaultComponentState = {
87
+ const defaultComponentState = Object.freeze({
88
88
  hover: false,
89
89
  press: false,
90
90
  pressIn: false,
91
91
  focus: false,
92
92
  mounted: false,
93
93
  animation: null
94
- };
94
+ });
95
95
  const mouseUps = /* @__PURE__ */ new Set();
96
96
  if (typeof document !== "undefined") {
97
97
  document.addEventListener("mouseup", () => {
@@ -132,18 +132,6 @@ function createComponent(configIn, ParentComponent) {
132
132
  let defaultNativeStyleSheet;
133
133
  let tamaguiDefaultProps;
134
134
  let initialSplitStyles;
135
- function addPseudoToStyles(styles, name, pseudos) {
136
- const pseudoStyle = pseudos[name];
137
- const shouldNestObject = import_platform.isWeb && name !== "enterStyle" && name !== "exitStyle";
138
- const defaultPseudoStyle = initialSplitStyles.pseudos[name];
139
- if (defaultPseudoStyle) {
140
- styles.push(shouldNestObject ? { [name]: defaultPseudoStyle } : defaultPseudoStyle);
141
- }
142
- if (pseudoStyle) {
143
- styles.push(shouldNestObject ? { [name]: pseudoStyle } : pseudoStyle);
144
- }
145
- }
146
- __name(addPseudoToStyles, "addPseudoToStyles");
147
135
  const component = (0, import_react.forwardRef)((propsIn, forwardedRef) => {
148
136
  var _a, _d, _e, _f;
149
137
  let props;
@@ -155,7 +143,7 @@ function createComponent(configIn, ParentComponent) {
155
143
  const { Component, isText, isZStack } = staticConfig;
156
144
  const componentName = props.componentName || staticConfig.componentName;
157
145
  const componentClassName = props.asChild ? "" : props.componentName ? `is_${props.componentName}` : defaultComponentClassName;
158
- if (process.env.NODE_ENV === "development") {
146
+ if (true) {
159
147
  if (props["debug"]) {
160
148
  console.log("\u26A0\uFE0F", componentName || (Component == null ? void 0 : Component.displayName) || (Component == null ? void 0 : Component.name) || "[Unnamed Component]", "debug on");
161
149
  console.log("props in:", {
@@ -169,17 +157,27 @@ function createComponent(configIn, ParentComponent) {
169
157
  }
170
158
  const forceUpdate = (0, import_use_force_update.useForceUpdate)();
171
159
  const theme = (0, import_useTheme.useTheme)(props.theme, componentName, props, forceUpdate);
172
- const [state, set_] = (0, import_react.useState)(defaultComponentState);
173
- const setStateShallow = (0, import_createShallowUpdate.createShallowUpdate)(set_);
160
+ const statesUsed = (0, import_react.useState)(defaultComponentState);
161
+ const setStateShallow = (0, import_createShallowUpdate.createShallowUpdate)(statesUsed[1]);
162
+ let state = statesUsed[0];
163
+ if (propsIn.forceStyle) {
164
+ state = __spreadProps(__spreadValues({}, state), {
165
+ [propsIn.forceStyle]: true
166
+ });
167
+ }
174
168
  const shouldAvoidClasses = !!(props.animation && avoidClasses);
175
- const splitStyleState = !shouldAvoidClasses ? __spreadProps(__spreadValues({}, state), {
169
+ const shouldForcePseudo = !!propsIn.forceStyle;
170
+ const hasTextAncestor = !!(import_platform.isWeb ? (0, import_react.useContext)(import_TextAncestorContext.TextAncestorContext) : false);
171
+ const splitStyleState = !shouldAvoidClasses && !shouldForcePseudo ? __spreadProps(__spreadValues({}, state), {
172
+ hasTextAncestor,
176
173
  dynamicStylesInline: true
177
174
  }) : __spreadProps(__spreadValues({}, state), {
178
175
  noClassNames: true,
179
176
  dynamicStylesInline: true,
177
+ hasTextAncestor,
180
178
  resolveVariablesAs: "value"
181
179
  });
182
- const splitStyles = (0, import_getSplitStyles.useSplitStyles)(props, staticConfig, theme, splitStyleState, shouldAvoidClasses || props.asChild ? null : initialSplitStyles.classNames, props["debug"]);
180
+ const splitStyles = (0, import_getSplitStyles.useSplitStyles)(props, staticConfig, theme, splitStyleState, props.asChild ? null : initialSplitStyles.classNames, props["debug"]);
183
181
  const { viewProps: viewPropsIn, pseudos, medias, style, classNames } = splitStyles;
184
182
  const useAnimations = (_a = tamaguiConfig.animations) == null ? void 0 : _a.useAnimations;
185
183
  const isAnimated = !!(useAnimations && props.animation);
@@ -216,6 +214,7 @@ function createComponent(configIn, ParentComponent) {
216
214
  onMouseLeave,
217
215
  hrefAttrs,
218
216
  separator,
217
+ forceStyle: _forceStyle,
219
218
  onClick,
220
219
  theme: _themeProp,
221
220
  defaultVariants
@@ -237,12 +236,12 @@ function createComponent(configIn, ParentComponent) {
237
236
  "onMouseLeave",
238
237
  "hrefAttrs",
239
238
  "separator",
239
+ "forceStyle",
240
240
  "onClick",
241
241
  "theme",
242
242
  "defaultVariants"
243
243
  ]);
244
244
  const isTaggable = !Component || typeof Component === "string";
245
- const hasTextAncestor = import_platform.isWeb ? (0, import_react.useContext)(import_TextAncestorContext.TextAncestorContext) : false;
246
245
  const element = import_platform.isWeb ? isTaggable ? tag || Component : Component : Component;
247
246
  const BaseTextComponent = !import_platform.isWeb ? import_react_native.Text : element || "span";
248
247
  const BaseViewComponent = !import_platform.isWeb ? import_react_native.View : element || (hasTextAncestor ? "span" : "div");
@@ -461,7 +460,7 @@ function createComponent(configIn, ParentComponent) {
461
460
  viewProps.ref = forwardedRef;
462
461
  }
463
462
  }
464
- if (process.env.NODE_ENV === "development" && !isText && import_platform.isWeb) {
463
+ if (!isText && import_platform.isWeb) {
465
464
  import_react.Children.toArray(props.children).forEach((item) => {
466
465
  if (typeof item === "string") {
467
466
  console.error(`Unexpected text node: ${item}. A text node cannot be a child of a <View>.`);
@@ -490,7 +489,7 @@ function createComponent(configIn, ParentComponent) {
490
489
  }, [hasEnterStyle, props.animation]);
491
490
  let styles;
492
491
  const animationStyles = state.animation ? state.animation.style : null;
493
- if (isStringElement && shouldAvoidClasses) {
492
+ if (isStringElement && shouldAvoidClasses && !shouldForcePseudo) {
494
493
  styles = __spreadValues(__spreadValues(__spreadValues({}, defaultNativeStyle), animationStyles ?? style), medias);
495
494
  } else {
496
495
  styles = [
@@ -499,10 +498,21 @@ function createComponent(configIn, ParentComponent) {
499
498
  medias
500
499
  ];
501
500
  if (!animationStyles) {
502
- !state.mounted && addPseudoToStyles(styles, "enterStyle", pseudos);
503
- state.hover && addPseudoToStyles(styles, "hoverStyle", pseudos);
504
- state.focus && addPseudoToStyles(styles, "focusStyle", pseudos);
505
- state.press && addPseudoToStyles(styles, "pressStyle", pseudos);
501
+ const initPseudos = initialSplitStyles.pseudos;
502
+ const force = shouldForcePseudo;
503
+ !state.mounted && addPseudoToStyles(styles, initPseudos, pseudos, "enterStyle");
504
+ state.hover && addPseudoToStyles(styles, initPseudos, pseudos, "hoverStyle", force);
505
+ state.focus && addPseudoToStyles(styles, initPseudos, pseudos, "focusStyle", force);
506
+ state.press && addPseudoToStyles(styles, initPseudos, pseudos, "pressStyle", force);
507
+ }
508
+ if (shouldForcePseudo) {
509
+ const next = {};
510
+ for (const style2 of styles) {
511
+ if (style2) {
512
+ Object.assign(next, style2);
513
+ }
514
+ }
515
+ Object.assign(splitStyles.style, next);
506
516
  }
507
517
  }
508
518
  if (import_platform.isWeb) {
@@ -514,20 +524,20 @@ function createComponent(configIn, ParentComponent) {
514
524
  theme.className,
515
525
  classNames ? Object.values(classNames).join(" ") : ""
516
526
  ];
517
- if (!shouldAvoidClasses) {
518
- if (classNames) {
519
- classList.push(Object.values(classNames).join(" "));
520
- }
521
- }
522
527
  const className = classList.join(" ");
523
528
  const style2 = animationStyles ?? splitStyles.style;
524
529
  if (process.env.NODE_ENV === "development" && props["debug"]) {
525
530
  console.log(" \xBB className", { splitStyles, style: style2, isStringElement, pseudos, state, classNames, propsClassName: props.className, classList, className: className.trim().split(" "), themeClassName: theme.className, values: Object.fromEntries(Object.entries(classNames).map(([k, v]) => [v, (0, import_insertStyleRule.getAllSelectors)()[v]])) });
526
531
  }
527
- if (staticConfig.isReactNativeWeb) {
532
+ const isAnimatedReactNativeWeb = props.animation && avoidClasses;
533
+ if (staticConfig.isReactNativeWeb || isAnimatedReactNativeWeb) {
528
534
  viewProps.dataSet = __spreadProps(__spreadValues({}, viewProps.dataSet), {
529
- className
535
+ className,
536
+ id: props.id
530
537
  });
538
+ if (props["data-is"]) {
539
+ viewProps.dataSet.is = props["data-is"];
540
+ }
531
541
  } else {
532
542
  viewProps.className = className;
533
543
  }
@@ -719,7 +729,7 @@ function createComponent(configIn, ParentComponent) {
719
729
  }
720
730
  if (process.env.NODE_ENV === "development") {
721
731
  if (props["debug"]) {
722
- console.log(" \xBB ", __spreadValues({ propsIn: __spreadValues({}, props), propsOut: __spreadValues({}, viewProps), state, splitStyles, animationStyles, isStringElement, classNamesIn: (_e = props.className) == null ? void 0 : _e.split(" "), classNamesOut: (_f = viewProps.className) == null ? void 0 : _f.split(" "), events, shouldAttach, ViewComponent: elementType, viewProps, styles, pseudos, content, childEls, shouldAvoidClasses, avoidClasses, animation: props.animation, style, defaultNativeStyle, initialSplitStyles }, typeof window !== "undefined" ? { theme, themeClassName: theme.className, staticConfig, tamaguiConfig } : null));
732
+ console.log("\u2B50\uFE0F", __spreadValues({ propsIn: __spreadValues({}, props), propsOut: __spreadValues({}, viewProps), elementType, state, splitStyles, animationStyles, isStringElement, classNamesIn: (_e = props.className) == null ? void 0 : _e.split(" "), classNamesOut: (_f = viewProps.className) == null ? void 0 : _f.split(" "), events, shouldAttach, ViewComponent: elementType, viewProps, styles, pseudos, content, childEls, shouldAvoidClasses, avoidClasses, animation: props.animation, style, defaultNativeStyle, initialSplitStyles }, typeof window !== "undefined" ? { theme, themeClassName: theme.className, staticConfig, tamaguiConfig, events, shouldAvoidClasses, shouldForcePseudo } : null));
723
733
  }
724
734
  }
725
735
  if (features.elements.length) {
@@ -768,6 +778,9 @@ function createComponent(configIn, ParentComponent) {
768
778
  defaultPropsIn = (0, import_mergeProps.mergeProps)(defaultPropsIn, ourDefaultsMerged);
769
779
  }
770
780
  }
781
+ if (process.env.NODE_ENV === "development" && defaultPropsIn["debug"] === "break") {
782
+ debugger;
783
+ }
771
784
  initialSplitStyles = (0, import_getSplitStyles.insertSplitStyles)(defaultPropsIn, staticConfig, initialTheme, {
772
785
  mounted: true,
773
786
  hover: false,
@@ -782,7 +795,7 @@ function createComponent(configIn, ParentComponent) {
782
795
  const validStyles2 = staticConfig.validStyles || import_helpers.stylePropsView;
783
796
  for (const key in staticConfig.defaultProps) {
784
797
  const val = staticConfig.defaultProps[key];
785
- if (typeof val === "string" && val[0] === "$" || !validStyles2[key]) {
798
+ if (typeof val === "string" && val[0] === "$" || !validStyles2[key] || val[0] === "_") {
786
799
  defaults[key] = val;
787
800
  } else {
788
801
  defaultNativeStyle[key] = val;
@@ -881,11 +894,11 @@ function spacedChildren({
881
894
  }) {
882
895
  const hasSpace = !!(space || spaceFlex);
883
896
  const hasSeparator = !(separator === void 0 || separator === null);
884
- if (!hasSpace && !hasSeparator) {
897
+ if (!hasSpace && !hasSeparator && !isZStack) {
885
898
  return children;
886
899
  }
887
900
  const childrenList = import_react.Children.toArray(children);
888
- if (childrenList.length <= 1) {
901
+ if (childrenList.length <= 1 && !isZStack) {
889
902
  return childrenList;
890
903
  }
891
904
  const final = [];
@@ -898,6 +911,12 @@ function spacedChildren({
898
911
  key: index
899
912
  }, isZStack ? /* @__PURE__ */ import_react.default.createElement(AbsoluteFill, null, child) : child));
900
913
  }
914
+ if (isUnspaced(child) && index === 0) {
915
+ continue;
916
+ }
917
+ if (isZStack) {
918
+ continue;
919
+ }
901
920
  const next = childrenList[index + 1];
902
921
  if (next && !isUnspaced(next)) {
903
922
  if (separator) {
@@ -947,17 +966,10 @@ function isUnspaced(child) {
947
966
  }
948
967
  __name(isUnspaced, "isUnspaced");
949
968
  function AbsoluteFill(props) {
950
- return import_platform.isWeb ? /* @__PURE__ */ import_react.default.createElement("div", {
951
- style: {
952
- position: "absolute",
953
- top: 0,
954
- left: 0,
955
- right: 0,
956
- bottom: 0
957
- }
958
- }, props.children) : /* @__PURE__ */ import_react.default.createElement(import_react_native.View, {
969
+ return /* @__PURE__ */ import_react.default.createElement(import_react_native.View, {
970
+ pointerEvents: "box-none",
959
971
  style: import_react_native.StyleSheet.absoluteFill
960
- }, props.child);
972
+ }, props.children);
961
973
  }
962
974
  __name(AbsoluteFill, "AbsoluteFill");
963
975
  function processIDRefList(idRefList) {
@@ -1138,6 +1150,16 @@ function assignNativePropsToWeb(elementType, viewProps, nativeProps) {
1138
1150
  }
1139
1151
  }
1140
1152
  __name(assignNativePropsToWeb, "assignNativePropsToWeb");
1153
+ function addPseudoToStyles(styles, initialPseudos, pseudos, name, force = false) {
1154
+ const pseudoStyle = pseudos[name];
1155
+ const shouldNestObject = import_platform.isWeb && name !== "enterStyle" && name !== "exitStyle";
1156
+ const defaultPseudoStyle = initialPseudos[name];
1157
+ const style = defaultPseudoStyle ? __spreadValues(__spreadValues({}, defaultPseudoStyle), pseudoStyle) : pseudoStyle;
1158
+ if (style) {
1159
+ styles.push(shouldNestObject && !force ? { [name]: style } : style);
1160
+ }
1161
+ }
1162
+ __name(addPseudoToStyles, "addPseudoToStyles");
1141
1163
  // Annotate the CommonJS export names for ESM import in node:
1142
1164
  0 && (module.exports = {
1143
1165
  AbsoluteFill,