@telefonica/mistica 18.0.0-beta.1 → 18.0.0-beta.3

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 (273) hide show
  1. package/css/blau.css +7 -2
  2. package/css/community/cyber.css +7 -2
  3. package/css/esimflag.css +7 -2
  4. package/css/mistica-common.css +5 -0
  5. package/css/mistica.css +1 -1
  6. package/css/movistar.css +5 -0
  7. package/css/o2.css +7 -2
  8. package/css/telefonica.css +7 -2
  9. package/css/vivo-evolution.css +5 -0
  10. package/css/vivo.css +5 -0
  11. package/dist/accordion.css-mistica.js +6 -6
  12. package/dist/align.css-mistica.js +1 -1
  13. package/dist/autocomplete.css-mistica.js +1 -1
  14. package/dist/avatar.css-mistica.js +1 -1
  15. package/dist/badge.css-mistica.js +1 -1
  16. package/dist/box.css-mistica.js +13 -13
  17. package/dist/boxed.css-mistica.js +24 -24
  18. package/dist/button-group.css-mistica.js +1 -1
  19. package/dist/button-layout.css-mistica.js +14 -14
  20. package/dist/button.css-mistica.js +34 -34
  21. package/dist/callout.css-mistica.js +11 -11
  22. package/dist/card-internal.css-mistica.js +21 -21
  23. package/dist/carousel.css-mistica.js +8 -8
  24. package/dist/checkbox.css-mistica.js +11 -11
  25. package/dist/chip.css-mistica.js +15 -15
  26. package/dist/chip.js +26 -26
  27. package/dist/circle.css-mistica.js +1 -1
  28. package/dist/community/advanced-data-card.css-mistica.js +8 -8
  29. package/dist/community/ai-card.css-mistica.js +2 -2
  30. package/dist/community/blocks.css-mistica.js +1 -1
  31. package/dist/community/cyber/example-component.css-mistica.js +1 -1
  32. package/dist/community/example-component.css-mistica.js +1 -1
  33. package/dist/community/skins/cyber-skin.js +12 -1
  34. package/dist/counter.css-mistica.js +1 -1
  35. package/dist/cover-hero.css-mistica.js +2 -2
  36. package/dist/credit-card-number-field.css-mistica.js +3 -3
  37. package/dist/credit-card-number-field.js +15 -15
  38. package/dist/date-field.css-mistica.js +1 -1
  39. package/dist/date-time-picker.css-mistica.js +1 -1
  40. package/dist/date-time-picker.js +5 -2
  41. package/dist/dialog.css-mistica.js +4 -4
  42. package/dist/divider.css-mistica.js +5 -5
  43. package/dist/double-field.css-mistica.js +2 -2
  44. package/dist/drawer.css-mistica.js +1 -1
  45. package/dist/empty-state-card.css-mistica.js +1 -1
  46. package/dist/empty-state.css-mistica.js +5 -5
  47. package/dist/fade-in.css-mistica.js +1 -1
  48. package/dist/fade-out.css-mistica.js +1 -1
  49. package/dist/feedback.css-mistica.js +1 -1
  50. package/dist/file-upload.css-mistica.js +7 -7
  51. package/dist/fixed-footer-layout.css-mistica.js +2 -2
  52. package/dist/form.css-mistica.js +1 -1
  53. package/dist/grid-layout.css-mistica.js +3 -3
  54. package/dist/grid.css-mistica.js +120 -120
  55. package/dist/header.css-mistica.js +1 -1
  56. package/dist/hero.css-mistica.js +2 -2
  57. package/dist/hooks.js +32 -29
  58. package/dist/horizontal-scroll.css-mistica.js +1 -1
  59. package/dist/icon-button.css-mistica.js +53 -53
  60. package/dist/icon-runtime.d.ts +17 -0
  61. package/dist/icon-runtime.js +28 -0
  62. package/dist/icons/icon-chevron.css-mistica.js +2 -2
  63. package/dist/icons/icon-error.css-mistica.js +1 -1
  64. package/dist/image.css-mistica.js +2 -2
  65. package/dist/index.d.ts +0 -5
  66. package/dist/index.js +0 -4
  67. package/dist/inline.css-mistica.js +11 -11
  68. package/dist/list.css-mistica.js +7 -7
  69. package/dist/loading-bar.css-mistica.js +1 -1
  70. package/dist/loading-screen.css-mistica.js +4 -4
  71. package/dist/logo.css-mistica.js +5 -5
  72. package/dist/menu.css-mistica.js +12 -12
  73. package/dist/mosaic.css-mistica.js +1 -1
  74. package/dist/navigation-bar.css-mistica.js +9 -9
  75. package/dist/navigation-breadcrumbs.css-mistica.js +1 -1
  76. package/dist/navigation-shared.css-mistica.js +9 -9
  77. package/dist/package-version.js +1 -1
  78. package/dist/pagination.css-mistica.js +18 -18
  79. package/dist/pin-field.css-mistica.js +1 -1
  80. package/dist/popover.css-mistica.js +1 -1
  81. package/dist/progress-bar.css-mistica.js +6 -6
  82. package/dist/radio-button.css-mistica.js +19 -19
  83. package/dist/rating.css-mistica.js +2 -2
  84. package/dist/responsive-layout.css-mistica.js +6 -6
  85. package/dist/screen-reader-only.css-mistica.js +1 -1
  86. package/dist/select.css-mistica.js +15 -15
  87. package/dist/sheet-action-row.css-mistica.js +1 -1
  88. package/dist/sheet-common.css-mistica.js +1 -1
  89. package/dist/sheet-info.css-mistica.js +1 -1
  90. package/dist/sidenav-bar-layout.css-mistica.js +1 -1
  91. package/dist/sidenav-bar.css-mistica.js +71 -71
  92. package/dist/skeletons.css-mistica.js +6 -6
  93. package/dist/skins/blau.js +12 -1
  94. package/dist/skins/defaults.js +11 -0
  95. package/dist/skins/esimflag.js +12 -1
  96. package/dist/skins/movistar.js +11 -0
  97. package/dist/skins/o2.js +12 -1
  98. package/dist/skins/skin-contract.css-mistica.js +743 -738
  99. package/dist/skins/skin-contract.css.d.ts +5 -0
  100. package/dist/skins/telefonica.js +12 -1
  101. package/dist/skins/types/index.d.ts +1 -0
  102. package/dist/skins/vivo-evolution.js +11 -0
  103. package/dist/skins/vivo.js +11 -0
  104. package/dist/skip-link.css-mistica.js +1 -1
  105. package/dist/slider.css-mistica.js +18 -18
  106. package/dist/snackbar.css-mistica.js +4 -4
  107. package/dist/spinner.css-mistica.js +1 -1
  108. package/dist/square.css-mistica.js +1 -1
  109. package/dist/stack.css-mistica.js +5 -5
  110. package/dist/stacking-group.css-mistica.js +1 -1
  111. package/dist/stepper.css-mistica.js +2 -2
  112. package/dist/switch-component.css-mistica.js +35 -35
  113. package/dist/table.css-mistica.js +9 -9
  114. package/dist/tabs.css-mistica.js +17 -17
  115. package/dist/tag.css-mistica.js +1 -1
  116. package/dist/text-field-base.css-mistica.js +18 -18
  117. package/dist/text-field-components.css-mistica.js +3 -3
  118. package/dist/text-link.css-mistica.js +6 -6
  119. package/dist/text.css-mistica.js +6 -6
  120. package/dist/theme-context.d.ts +1 -2
  121. package/dist/theme-context.js +3 -44
  122. package/dist/theme-variant-context.js +9 -8
  123. package/dist/timeline.css-mistica.js +9 -9
  124. package/dist/timer.css-mistica.js +6 -6
  125. package/dist/tooltip.css-mistica.js +1 -1
  126. package/dist/touchable.css-mistica.js +1 -1
  127. package/dist/utils/aspect-ratio-support.css-mistica.js +2 -2
  128. package/dist/utils/shared-context.d.ts +13 -0
  129. package/dist/utils/shared-context.js +63 -0
  130. package/dist/video.css-mistica.js +1 -1
  131. package/dist/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  132. package/dist-es/accordion.css-mistica.js +6 -6
  133. package/dist-es/align.css-mistica.js +1 -1
  134. package/dist-es/autocomplete.css-mistica.js +1 -1
  135. package/dist-es/avatar.css-mistica.js +1 -1
  136. package/dist-es/badge.css-mistica.js +1 -1
  137. package/dist-es/box.css-mistica.js +13 -13
  138. package/dist-es/boxed.css-mistica.js +23 -23
  139. package/dist-es/button-group.css-mistica.js +1 -1
  140. package/dist-es/button-layout.css-mistica.js +14 -14
  141. package/dist-es/button.css-mistica.js +34 -34
  142. package/dist-es/callout.css-mistica.js +11 -11
  143. package/dist-es/card-internal.css-mistica.js +21 -21
  144. package/dist-es/carousel.css-mistica.js +8 -8
  145. package/dist-es/checkbox.css-mistica.js +11 -11
  146. package/dist-es/chip.css-mistica.js +15 -15
  147. package/dist-es/chip.js +38 -38
  148. package/dist-es/circle.css-mistica.js +1 -1
  149. package/dist-es/community/advanced-data-card.css-mistica.js +8 -8
  150. package/dist-es/community/ai-card.css-mistica.js +2 -2
  151. package/dist-es/community/blocks.css-mistica.js +1 -1
  152. package/dist-es/community/cyber/example-component.css-mistica.js +1 -1
  153. package/dist-es/community/example-component.css-mistica.js +1 -1
  154. package/dist-es/community/skins/cyber-skin.js +12 -1
  155. package/dist-es/counter.css-mistica.js +1 -1
  156. package/dist-es/cover-hero.css-mistica.js +2 -2
  157. package/dist-es/credit-card-number-field.css-mistica.js +3 -3
  158. package/dist-es/credit-card-number-field.js +22 -22
  159. package/dist-es/date-field.css-mistica.js +1 -1
  160. package/dist-es/date-time-picker.css-mistica.js +1 -1
  161. package/dist-es/date-time-picker.js +5 -2
  162. package/dist-es/dialog.css-mistica.js +4 -4
  163. package/dist-es/divider.css-mistica.js +5 -5
  164. package/dist-es/double-field.css-mistica.js +2 -2
  165. package/dist-es/drawer.css-mistica.js +1 -1
  166. package/dist-es/empty-state-card.css-mistica.js +1 -1
  167. package/dist-es/empty-state.css-mistica.js +5 -5
  168. package/dist-es/fade-in.css-mistica.js +1 -1
  169. package/dist-es/fade-out.css-mistica.js +1 -1
  170. package/dist-es/feedback.css-mistica.js +1 -1
  171. package/dist-es/file-upload.css-mistica.js +7 -7
  172. package/dist-es/fixed-footer-layout.css-mistica.js +2 -2
  173. package/dist-es/form.css-mistica.js +1 -1
  174. package/dist-es/grid-layout.css-mistica.js +3 -3
  175. package/dist-es/grid.css-mistica.js +120 -120
  176. package/dist-es/header.css-mistica.js +1 -1
  177. package/dist-es/hero.css-mistica.js +2 -2
  178. package/dist-es/hooks.js +24 -21
  179. package/dist-es/horizontal-scroll.css-mistica.js +1 -1
  180. package/dist-es/icon-button.css-mistica.js +53 -53
  181. package/dist-es/icon-runtime.js +5 -0
  182. package/dist-es/icons/icon-chevron.css-mistica.js +2 -2
  183. package/dist-es/icons/icon-error.css-mistica.js +1 -1
  184. package/dist-es/image.css-mistica.js +2 -2
  185. package/dist-es/index.js +23 -24
  186. package/dist-es/inline.css-mistica.js +11 -11
  187. package/dist-es/list.css-mistica.js +7 -7
  188. package/dist-es/loading-bar.css-mistica.js +1 -1
  189. package/dist-es/loading-screen.css-mistica.js +4 -4
  190. package/dist-es/logo.css-mistica.js +5 -5
  191. package/dist-es/menu.css-mistica.js +12 -12
  192. package/dist-es/mosaic.css-mistica.js +1 -1
  193. package/dist-es/navigation-bar.css-mistica.js +9 -9
  194. package/dist-es/navigation-breadcrumbs.css-mistica.js +1 -1
  195. package/dist-es/navigation-shared.css-mistica.js +9 -9
  196. package/dist-es/package-version.js +1 -1
  197. package/dist-es/pagination.css-mistica.js +18 -18
  198. package/dist-es/pin-field.css-mistica.js +1 -1
  199. package/dist-es/popover.css-mistica.js +1 -1
  200. package/dist-es/progress-bar.css-mistica.js +6 -6
  201. package/dist-es/radio-button.css-mistica.js +19 -19
  202. package/dist-es/rating.css-mistica.js +2 -2
  203. package/dist-es/responsive-layout.css-mistica.js +6 -6
  204. package/dist-es/screen-reader-only.css-mistica.js +1 -1
  205. package/dist-es/select.css-mistica.js +15 -15
  206. package/dist-es/sheet-action-row.css-mistica.js +1 -1
  207. package/dist-es/sheet-common.css-mistica.js +1 -1
  208. package/dist-es/sheet-info.css-mistica.js +1 -1
  209. package/dist-es/sidenav-bar-layout.css-mistica.js +1 -1
  210. package/dist-es/sidenav-bar.css-mistica.js +71 -71
  211. package/dist-es/skeletons.css-mistica.js +6 -6
  212. package/dist-es/skins/blau.js +12 -1
  213. package/dist-es/skins/defaults.js +11 -0
  214. package/dist-es/skins/esimflag.js +12 -1
  215. package/dist-es/skins/movistar.js +11 -0
  216. package/dist-es/skins/o2.js +12 -1
  217. package/dist-es/skins/skin-contract.css-mistica.js +743 -738
  218. package/dist-es/skins/telefonica.js +12 -1
  219. package/dist-es/skins/vivo-evolution.js +11 -0
  220. package/dist-es/skins/vivo.js +11 -0
  221. package/dist-es/skip-link.css-mistica.js +1 -1
  222. package/dist-es/slider.css-mistica.js +18 -18
  223. package/dist-es/snackbar.css-mistica.js +4 -4
  224. package/dist-es/spinner.css-mistica.js +1 -1
  225. package/dist-es/square.css-mistica.js +1 -1
  226. package/dist-es/stack.css-mistica.js +5 -5
  227. package/dist-es/stacking-group.css-mistica.js +1 -1
  228. package/dist-es/stepper.css-mistica.js +2 -2
  229. package/dist-es/style.css +1 -1
  230. package/dist-es/switch-component.css-mistica.js +35 -35
  231. package/dist-es/table.css-mistica.js +9 -9
  232. package/dist-es/tabs.css-mistica.js +17 -17
  233. package/dist-es/tag.css-mistica.js +1 -1
  234. package/dist-es/text-field-base.css-mistica.js +17 -17
  235. package/dist-es/text-field-components.css-mistica.js +3 -3
  236. package/dist-es/text-link.css-mistica.js +6 -6
  237. package/dist-es/text.css-mistica.js +6 -6
  238. package/dist-es/theme-context.js +3 -3
  239. package/dist-es/theme-variant-context.js +8 -7
  240. package/dist-es/timeline.css-mistica.js +9 -9
  241. package/dist-es/timer.css-mistica.js +6 -6
  242. package/dist-es/tooltip.css-mistica.js +1 -1
  243. package/dist-es/touchable.css-mistica.js +1 -1
  244. package/dist-es/utils/aspect-ratio-support.css-mistica.js +2 -2
  245. package/dist-es/utils/shared-context.js +13 -0
  246. package/dist-es/video.css-mistica.js +1 -1
  247. package/dist-es/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  248. package/doc/module-federation.md +38 -5
  249. package/icon-runtime/package.json +6 -0
  250. package/package.json +6 -5
  251. package/src/chip.tsx +4 -2
  252. package/src/community/skins/cyber-skin.tsx +7 -2
  253. package/src/credit-card-number-field.tsx +15 -4
  254. package/src/date-time-picker.css.ts +0 -1
  255. package/src/date-time-picker.tsx +1 -0
  256. package/src/hooks.tsx +8 -4
  257. package/src/icon-runtime.tsx +18 -0
  258. package/src/index.tsx +0 -6
  259. package/src/package-version.tsx +1 -1
  260. package/src/skins/blau.tsx +7 -2
  261. package/src/skins/defaults.tsx +6 -1
  262. package/src/skins/esimflag.tsx +7 -2
  263. package/src/skins/movistar.tsx +5 -0
  264. package/src/skins/o2.tsx +7 -2
  265. package/src/skins/skin-contract.css.ts +1 -0
  266. package/src/skins/telefonica.tsx +7 -2
  267. package/src/skins/types/index.tsx +1 -0
  268. package/src/skins/vivo-evolution.tsx +5 -0
  269. package/src/skins/vivo.tsx +5 -0
  270. package/src/theme-context.tsx +2 -2
  271. package/src/theme-variant-context.tsx +2 -1
  272. package/src/utils/__tests__/shared-context-test.tsx +48 -0
  273. package/src/utils/shared-context.tsx +29 -0
@@ -89,14 +89,21 @@ const getAnimationTarget = (value?: string) => {
89
89
  return null;
90
90
  };
91
91
 
92
- const initialState = {
92
+ type AdornmentState = {
93
+ showBackface: boolean;
94
+ animationTarget: JSX.Element | null;
95
+ isAnimating: boolean;
96
+ };
97
+
98
+ // The icon module and this module load in either order, so the first element waits for the render
99
+ const createInitialState = (): AdornmentState => ({
93
100
  showBackface: false,
94
101
  animationTarget: <IconCreditCardVisaRegular size={iconSize.small} />,
95
102
  isAnimating: false,
96
- };
103
+ });
97
104
 
98
105
  const reducer = (
99
- state: typeof initialState,
106
+ state: AdornmentState,
100
107
  {
101
108
  type,
102
109
  value,
@@ -127,7 +134,11 @@ const reducer = (
127
134
  };
128
135
 
129
136
  const CreditcardAdornment = ({value}: {value?: string}) => {
130
- const [{showBackface, animationTarget, isAnimating}, dispatch] = React.useReducer(reducer, initialState);
137
+ const [{showBackface, animationTarget, isAnimating}, dispatch] = React.useReducer(
138
+ reducer,
139
+ undefined,
140
+ createInitialState
141
+ );
131
142
  React.useEffect(() => {
132
143
  dispatch({type: 'INPUT', value});
133
144
  }, [value]);
@@ -16,7 +16,6 @@ globalStyle(`${reactDatePicker} .rdtPicker`, {
16
16
  minWidth: 250,
17
17
  padding: 4,
18
18
  marginTop: 1,
19
- zIndex: '99999 !important',
20
19
  background: '#fff',
21
20
  boxShadow: '0 1px 3px rgba(0,0,0,.1)',
22
21
  border: '1px solid #f9f9f9',
@@ -162,6 +162,7 @@ const DateTimePicker = ({
162
162
  setShowPicker(false);
163
163
  }}
164
164
  disableScroll
165
+ style={{zIndex: 999}}
165
166
  >
166
167
  <div
167
168
  ref={pickerContainerRef}
package/src/hooks.tsx CHANGED
@@ -6,6 +6,7 @@ import ScreenSizeContext from './screen-size-context';
6
6
  import {listenResize} from './utils/dom';
7
7
  import {isClientSide} from './utils/environment';
8
8
  import {isEqual} from './utils/helpers';
9
+ import {isFirefox} from './utils/platform';
9
10
 
10
11
  import type {Theme} from './theme';
11
12
  import type {ScreenSizeContextType} from './screen-size-context';
@@ -43,16 +44,19 @@ export const useDisableBodyScroll = (disable: boolean): void => {
43
44
  // if the scrollbar is visible, we don't want to hide it because content will be resized
44
45
  const overflowY = hasScrollbar ? 'scroll' : 'hidden';
45
46
 
47
+ // Firefox correctly respects overflow:hidden on body without needing position:fixed.
48
+ // Using position:fixed in Firefox breaks position:sticky elements (e.g. Sidenavbar).
49
+ const fixedPositionStyles = isFirefox()
50
+ ? []
51
+ : ['position: fixed;', `top: ${-bodyScrollTop}px;`, 'left: 0px;', 'right: 0px;'];
52
+
46
53
  document.body.style.cssText =
47
54
  bodyStyles +
48
55
  (bodyStyles.endsWith(';') ? '' : ';') +
49
56
  [
50
57
  'overflow: hidden;',
51
58
  `overflow-y: ${overflowY};`,
52
- 'position: fixed;',
53
- `top: ${-bodyScrollTop}px;`,
54
- 'left: 0px;',
55
- 'right: 0px;',
59
+ ...fixedPositionStyles,
56
60
  'overscroll-behavior-y: contain;', // disable overscroll
57
61
  ].join('');
58
62
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Entry point of @telefonica/mistica/icon-runtime, which @telefonica/mistica-icons consumes.
3
+ *
4
+ * A generated icon reads the theme of this package, so it needs these four values and this type. It
5
+ * must not reach them through src/index.tsx: that barrel exports the components that render an icon,
6
+ * and the import closes a dependency cycle. A module level read of an icon inside that cycle sees an
7
+ * incomplete module. See doc/module-federation.md for the sharing rule that this entry point needs.
8
+ *
9
+ * This entry point is the only public home of useIconGradient, because only an icon uses that hook.
10
+ *
11
+ * Every module below is a leaf, so this file adds no cycle. Keep it that way.
12
+ */
13
+ export {vars as skinVars} from './skins/skin-contract.css';
14
+ export {useTheme} from './hooks';
15
+ export {useThemeVariant} from './theme-variant-context';
16
+ export {useIconGradient} from './utils/icon-gradient';
17
+
18
+ export type {IconProps} from './utils/types';
package/src/index.tsx CHANGED
@@ -196,12 +196,6 @@ export {TrackingConfig, useTrackingConfig} from './utils/analytics';
196
196
 
197
197
  export {useDocumentVisibility} from './utils/document-visibility';
198
198
 
199
- /**
200
- * The icons of @telefonica/mistica-icons need this hook, and they reach it through this barrel,
201
- * because a federated host shares this package by its name. See doc/module-federation.md.
202
- */
203
- export {useIconGradient} from './utils/icon-gradient';
204
-
205
199
  export {ThemeVariant, useThemeVariant} from './theme-variant-context';
206
200
 
207
201
  export type {Skin, KnownSkinName, SkinName} from './skins/types';
@@ -1,2 +1,2 @@
1
1
  // DO NOT EDIT THIS FILE. It's autogenerated by set-version.js
2
- export const PACKAGE_VERSION = '18.0.0-beta.1' as string;
2
+ export const PACKAGE_VERSION = '18.0.0-beta.3' as string;
@@ -699,8 +699,13 @@ export const getBlauSkin: GetKnownSkin = () => {
699
699
  cardTitleDefault: {lineHeight: {desktop: 28, mobile: 24}, size: {desktop: 20, mobile: 18}},
700
700
  cardTitleSnap: {lineHeight: {desktop: 24, mobile: 20}, size: {desktop: 16, mobile: 14}},
701
701
  chipLabel: {
702
- lineHeight: {desktop: 24, mobile: 20},
703
- size: {desktop: 16, mobile: 14},
702
+ lineHeight: {desktop: 24, mobile: 24},
703
+ size: {desktop: 16, mobile: 16},
704
+ weight: 'medium',
705
+ },
706
+ chipLabelSmall: {
707
+ lineHeight: {desktop: 20, mobile: 20},
708
+ size: {desktop: 14, mobile: 14},
704
709
  weight: 'medium',
705
710
  },
706
711
  drawerTitle: {
@@ -56,7 +56,12 @@ export const defaultTextPresetsConfig: TextPresetsConfig = {
56
56
  tabsLabel: {weight: 'medium', size: {mobile: 16, desktop: 18}, lineHeight: {mobile: 24, desktop: 24}},
57
57
  chipLabel: {
58
58
  lineHeight: {desktop: 24, mobile: 20},
59
- size: {desktop: 16, mobile: 14},
59
+ size: {desktop: 16, mobile: 16},
60
+ weight: 'medium',
61
+ },
62
+ chipLabelSmall: {
63
+ lineHeight: {desktop: 24, mobile: 20},
64
+ size: {desktop: 14, mobile: 14},
60
65
  weight: 'medium',
61
66
  },
62
67
  inputHelperText: {lineHeight: {desktop: 20, mobile: 16}, size: {desktop: 14, mobile: 12}},
@@ -703,8 +703,13 @@ export const getEsimflagSkin: GetKnownSkin = () => {
703
703
  cardTitleDefault: {lineHeight: {desktop: 28, mobile: 24}, size: {desktop: 20, mobile: 18}},
704
704
  cardTitleSnap: {lineHeight: {desktop: 24, mobile: 20}, size: {desktop: 16, mobile: 14}},
705
705
  chipLabel: {
706
- lineHeight: {desktop: 24, mobile: 20},
707
- size: {desktop: 16, mobile: 14},
706
+ lineHeight: {desktop: 24, mobile: 24},
707
+ size: {desktop: 16, mobile: 16},
708
+ weight: 'medium',
709
+ },
710
+ chipLabelSmall: {
711
+ lineHeight: {desktop: 20, mobile: 20},
712
+ size: {desktop: 14, mobile: 14},
708
713
  weight: 'medium',
709
714
  },
710
715
  drawerTitle: {
@@ -714,6 +714,11 @@ export const getMovistarSkin: GetKnownSkin = () => {
714
714
  size: {desktop: 18, mobile: 14},
715
715
  weight: 'medium',
716
716
  },
717
+ chipLabelSmall: {
718
+ lineHeight: {desktop: 22, mobile: 20},
719
+ size: {desktop: 16, mobile: 14},
720
+ weight: 'medium',
721
+ },
717
722
  drawerTitle: {
718
723
  lineHeight: {desktop: 26, mobile: 26},
719
724
  size: {desktop: 20, mobile: 20},
package/src/skins/o2.tsx CHANGED
@@ -706,8 +706,13 @@ export const getO2Skin: GetKnownSkin = () => {
706
706
  cardTitleDefault: {lineHeight: {desktop: 28, mobile: 24}, size: {desktop: 20, mobile: 18}},
707
707
  cardTitleSnap: {lineHeight: {desktop: 24, mobile: 20}, size: {desktop: 16, mobile: 14}},
708
708
  chipLabel: {
709
- lineHeight: {desktop: 24, mobile: 20},
710
- size: {desktop: 16, mobile: 14},
709
+ lineHeight: {desktop: 24, mobile: 24},
710
+ size: {desktop: 16, mobile: 16},
711
+ weight: 'medium',
712
+ },
713
+ chipLabelSmall: {
714
+ lineHeight: {desktop: 20, mobile: 20},
715
+ size: {desktop: 14, mobile: 14},
711
716
  weight: 'medium',
712
717
  },
713
718
  drawerTitle: {
@@ -357,6 +357,7 @@ const textPresets: ToThemeTokens<TextPresetsConfig> = {
357
357
  text9: {weight: '', size: '', lineHeight: ''},
358
358
  text10: {weight: '', size: '', lineHeight: ''},
359
359
  chipLabel: {weight: '', size: '', lineHeight: ''},
360
+ chipLabelSmall: {weight: '', size: '', lineHeight: ''},
360
361
  inputHelperText: {size: '', lineHeight: ''},
361
362
  inputLabel: {size: '', lineHeight: ''},
362
363
  inputValue: {size: '', lineHeight: ''},
@@ -707,8 +707,13 @@ export const getTelefonicaSkin: GetKnownSkin = () => {
707
707
  cardTitleDefault: {lineHeight: {desktop: 28, mobile: 24}, size: {desktop: 20, mobile: 18}},
708
708
  cardTitleSnap: {lineHeight: {desktop: 24, mobile: 20}, size: {desktop: 16, mobile: 14}},
709
709
  chipLabel: {
710
- lineHeight: {desktop: 24, mobile: 20},
711
- size: {desktop: 16, mobile: 14},
710
+ lineHeight: {desktop: 24, mobile: 24},
711
+ size: {desktop: 16, mobile: 16},
712
+ weight: 'medium',
713
+ },
714
+ chipLabelSmall: {
715
+ lineHeight: {desktop: 20, mobile: 20},
716
+ size: {desktop: 14, mobile: 14},
712
717
  weight: 'medium',
713
718
  },
714
719
  drawerTitle: {
@@ -67,6 +67,7 @@ export type TextPresetsConfig = {
67
67
  cardTitleSnap: TextSizeTokenConfig;
68
68
  drawerTitle: TextTokenConfig;
69
69
  chipLabel: TextTokenConfig;
70
+ chipLabelSmall: TextTokenConfig;
70
71
  link: TextWeightTokenConfig<'regular' | 'medium'>;
71
72
  loadingScreenTitle: TextSizeTokenConfig;
72
73
  title1: TextTokenConfig<'regular' | 'medium'>;
@@ -744,6 +744,11 @@ export const getVivoEvolutionSkin: GetKnownSkin = () => {
744
744
  size: {desktop: 16, mobile: 14},
745
745
  weight: 'medium',
746
746
  },
747
+ chipLabelSmall: {
748
+ lineHeight: {desktop: 24, mobile: 20},
749
+ size: {desktop: 16, mobile: 14},
750
+ weight: 'medium',
751
+ },
747
752
  drawerTitle: {
748
753
  lineHeight: {desktop: 32, mobile: 24},
749
754
  size: {desktop: 28, mobile: 20},
@@ -700,6 +700,11 @@ export const getVivoSkin: GetKnownSkin = () => {
700
700
  size: {desktop: 16, mobile: 14},
701
701
  weight: 'medium',
702
702
  },
703
+ chipLabelSmall: {
704
+ lineHeight: {desktop: 24, mobile: 20},
705
+ size: {desktop: 16, mobile: 14},
706
+ weight: 'medium',
707
+ },
703
708
  drawerTitle: {
704
709
  lineHeight: {desktop: 32, mobile: 24},
705
710
  size: {desktop: 28, mobile: 20},
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- import * as React from 'react';
2
+ import {getSharedContext} from './utils/shared-context';
3
3
 
4
4
  import type {Theme} from './theme';
5
5
 
6
- const ThemeContext = React.createContext<Theme | null>(null);
6
+ const ThemeContext = getSharedContext<Theme | null>('theme', null);
7
7
 
8
8
  export default ThemeContext;
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import * as React from 'react';
3
+ import {getSharedContext} from './utils/shared-context';
3
4
 
4
5
  export type NonDeprecatedVariant = 'default' | 'brand' | 'negative' | 'alternative' | 'media';
5
6
 
@@ -19,7 +20,7 @@ export const normalizeVariant = <T extends Variant>(variant: T): T extends 'inve
19
20
  return variant as T extends 'inverse' ? 'brand' : T;
20
21
  };
21
22
 
22
- const ThemeVariantContext = React.createContext<Variant>('default');
23
+ const ThemeVariantContext = getSharedContext<Variant>('theme-variant', 'default');
23
24
 
24
25
  type ThemeVariantProps = {
25
26
  variant?: Variant;
@@ -0,0 +1,48 @@
1
+ import * as React from 'react';
2
+ import {render, screen} from '@testing-library/react';
3
+
4
+ /**
5
+ * A federated remote that does not share @telefonica/mistica/icon-runtime evaluates the context
6
+ * modules a second time, but it shares react. Each isolated registry below plays one of those copies.
7
+ */
8
+ const loadIsolatedCopy = <T,>(modulePath: string): T => {
9
+ let loadedModule: T | undefined;
10
+ jest.isolateModules(() => {
11
+ jest.doMock('react', () => React);
12
+ loadedModule = require(modulePath);
13
+ });
14
+ return loadedModule as T;
15
+ };
16
+
17
+ test('two copies of the theme context module share one context', () => {
18
+ const first = loadIsolatedCopy<typeof import('../../theme-context')>('../../theme-context');
19
+ const second = loadIsolatedCopy<typeof import('../../theme-context')>('../../theme-context');
20
+
21
+ expect(second.default).toBe(first.default);
22
+ });
23
+
24
+ test('two copies of the theme variant module read one provider', () => {
25
+ const first = loadIsolatedCopy<typeof import('../../theme-variant-context')>(
26
+ '../../theme-variant-context'
27
+ );
28
+ const second = loadIsolatedCopy<typeof import('../../theme-variant-context')>(
29
+ '../../theme-variant-context'
30
+ );
31
+
32
+ const VariantName = () => <span>{second.useThemeVariant()}</span>;
33
+
34
+ render(
35
+ <first.ThemeVariant variant="brand">
36
+ <VariantName />
37
+ </first.ThemeVariant>
38
+ );
39
+
40
+ expect(screen.getByText('brand')).toBeInTheDocument();
41
+ });
42
+
43
+ test('different contexts keep their own identity', () => {
44
+ const themeContext = loadIsolatedCopy<typeof import('../../theme-context')>('../../theme-context');
45
+ const {getSharedContext} = loadIsolatedCopy<typeof import('../shared-context')>('../shared-context');
46
+
47
+ expect(getSharedContext('another-context', null)).not.toBe(themeContext.default);
48
+ });
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import {PACKAGE_VERSION} from '../package-version';
4
+
5
+ type ContextRegistry = Record<symbol, React.Context<any> | undefined>;
6
+
7
+ /**
8
+ * A module federation remote, or a page that mixes the CommonJS and the ES builds, can evaluate a
9
+ * module of this package twice. Each evaluation would create its own context, and a consumer of one
10
+ * copy would never see the provider of the other one. The icons of @telefonica/mistica-icons read
11
+ * the theme through @telefonica/mistica/icon-runtime, so they hit this case unless the application
12
+ * shares that entry point.
13
+ *
14
+ * React is always a singleton on the page, so the context lives on it. Apollo Client applies the
15
+ * same pattern. The key holds the version, because the CSS variables of each version have different
16
+ * names, and two versions must not share a theme.
17
+ */
18
+ export const getSharedContext = <T,>(name: string, defaultValue: T): React.Context<T> => {
19
+ const key = Symbol.for(`@telefonica/mistica/${name}@${PACKAGE_VERSION}`);
20
+ const registry = React.createContext as unknown as ContextRegistry;
21
+ const existingContext = registry[key];
22
+ if (existingContext) {
23
+ return existingContext;
24
+ }
25
+
26
+ const context = React.createContext<T>(defaultValue);
27
+ Object.defineProperty(registry, key, {value: context, enumerable: false});
28
+ return context;
29
+ };