@telefonica/mistica 18.0.0-beta.2 → 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 (261) 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/date-field.css-mistica.js +1 -1
  38. package/dist/date-time-picker.css-mistica.js +1 -1
  39. package/dist/date-time-picker.js +5 -2
  40. package/dist/dialog.css-mistica.js +4 -4
  41. package/dist/divider.css-mistica.js +5 -5
  42. package/dist/double-field.css-mistica.js +2 -2
  43. package/dist/drawer.css-mistica.js +1 -1
  44. package/dist/empty-state-card.css-mistica.js +1 -1
  45. package/dist/empty-state.css-mistica.js +5 -5
  46. package/dist/fade-in.css-mistica.js +1 -1
  47. package/dist/fade-out.css-mistica.js +1 -1
  48. package/dist/feedback.css-mistica.js +1 -1
  49. package/dist/file-upload.css-mistica.js +7 -7
  50. package/dist/fixed-footer-layout.css-mistica.js +2 -2
  51. package/dist/form.css-mistica.js +1 -1
  52. package/dist/grid-layout.css-mistica.js +3 -3
  53. package/dist/grid.css-mistica.js +120 -120
  54. package/dist/header.css-mistica.js +1 -1
  55. package/dist/hero.css-mistica.js +2 -2
  56. package/dist/hooks.js +32 -29
  57. package/dist/horizontal-scroll.css-mistica.js +1 -1
  58. package/dist/icon-button.css-mistica.js +53 -53
  59. package/dist/icons/icon-chevron.css-mistica.js +2 -2
  60. package/dist/icons/icon-error.css-mistica.js +1 -1
  61. package/dist/image.css-mistica.js +2 -2
  62. package/dist/inline.css-mistica.js +11 -11
  63. package/dist/list.css-mistica.js +7 -7
  64. package/dist/loading-bar.css-mistica.js +1 -1
  65. package/dist/loading-screen.css-mistica.js +4 -4
  66. package/dist/logo.css-mistica.js +5 -5
  67. package/dist/menu.css-mistica.js +12 -12
  68. package/dist/mosaic.css-mistica.js +1 -1
  69. package/dist/navigation-bar.css-mistica.js +9 -9
  70. package/dist/navigation-breadcrumbs.css-mistica.js +1 -1
  71. package/dist/navigation-shared.css-mistica.js +9 -9
  72. package/dist/package-version.js +1 -1
  73. package/dist/pagination.css-mistica.js +18 -18
  74. package/dist/pin-field.css-mistica.js +1 -1
  75. package/dist/popover.css-mistica.js +1 -1
  76. package/dist/progress-bar.css-mistica.js +6 -6
  77. package/dist/radio-button.css-mistica.js +19 -19
  78. package/dist/rating.css-mistica.js +2 -2
  79. package/dist/responsive-layout.css-mistica.js +6 -6
  80. package/dist/screen-reader-only.css-mistica.js +1 -1
  81. package/dist/select.css-mistica.js +15 -15
  82. package/dist/sheet-action-row.css-mistica.js +1 -1
  83. package/dist/sheet-common.css-mistica.js +1 -1
  84. package/dist/sheet-info.css-mistica.js +1 -1
  85. package/dist/sidenav-bar-layout.css-mistica.js +1 -1
  86. package/dist/sidenav-bar.css-mistica.js +71 -71
  87. package/dist/skeletons.css-mistica.js +6 -6
  88. package/dist/skins/blau.js +12 -1
  89. package/dist/skins/defaults.js +11 -0
  90. package/dist/skins/esimflag.js +12 -1
  91. package/dist/skins/movistar.js +11 -0
  92. package/dist/skins/o2.js +12 -1
  93. package/dist/skins/skin-contract.css-mistica.js +743 -738
  94. package/dist/skins/skin-contract.css.d.ts +5 -0
  95. package/dist/skins/telefonica.js +12 -1
  96. package/dist/skins/types/index.d.ts +1 -0
  97. package/dist/skins/vivo-evolution.js +11 -0
  98. package/dist/skins/vivo.js +11 -0
  99. package/dist/skip-link.css-mistica.js +1 -1
  100. package/dist/slider.css-mistica.js +18 -18
  101. package/dist/snackbar.css-mistica.js +4 -4
  102. package/dist/spinner.css-mistica.js +1 -1
  103. package/dist/square.css-mistica.js +1 -1
  104. package/dist/stack.css-mistica.js +5 -5
  105. package/dist/stacking-group.css-mistica.js +1 -1
  106. package/dist/stepper.css-mistica.js +2 -2
  107. package/dist/switch-component.css-mistica.js +35 -35
  108. package/dist/table.css-mistica.js +9 -9
  109. package/dist/tabs.css-mistica.js +17 -17
  110. package/dist/tag.css-mistica.js +1 -1
  111. package/dist/text-field-base.css-mistica.js +18 -18
  112. package/dist/text-field-components.css-mistica.js +3 -3
  113. package/dist/text-link.css-mistica.js +6 -6
  114. package/dist/text.css-mistica.js +6 -6
  115. package/dist/theme-context.d.ts +1 -2
  116. package/dist/theme-context.js +3 -44
  117. package/dist/theme-variant-context.js +9 -8
  118. package/dist/timeline.css-mistica.js +9 -9
  119. package/dist/timer.css-mistica.js +6 -6
  120. package/dist/tooltip.css-mistica.js +1 -1
  121. package/dist/touchable.css-mistica.js +1 -1
  122. package/dist/utils/aspect-ratio-support.css-mistica.js +2 -2
  123. package/dist/utils/shared-context.d.ts +13 -0
  124. package/dist/utils/shared-context.js +63 -0
  125. package/dist/video.css-mistica.js +1 -1
  126. package/dist/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  127. package/dist-es/accordion.css-mistica.js +6 -6
  128. package/dist-es/align.css-mistica.js +1 -1
  129. package/dist-es/autocomplete.css-mistica.js +1 -1
  130. package/dist-es/avatar.css-mistica.js +1 -1
  131. package/dist-es/badge.css-mistica.js +1 -1
  132. package/dist-es/box.css-mistica.js +13 -13
  133. package/dist-es/boxed.css-mistica.js +23 -23
  134. package/dist-es/button-group.css-mistica.js +1 -1
  135. package/dist-es/button-layout.css-mistica.js +14 -14
  136. package/dist-es/button.css-mistica.js +34 -34
  137. package/dist-es/callout.css-mistica.js +11 -11
  138. package/dist-es/card-internal.css-mistica.js +21 -21
  139. package/dist-es/carousel.css-mistica.js +8 -8
  140. package/dist-es/checkbox.css-mistica.js +11 -11
  141. package/dist-es/chip.css-mistica.js +15 -15
  142. package/dist-es/chip.js +38 -38
  143. package/dist-es/circle.css-mistica.js +1 -1
  144. package/dist-es/community/advanced-data-card.css-mistica.js +8 -8
  145. package/dist-es/community/ai-card.css-mistica.js +2 -2
  146. package/dist-es/community/blocks.css-mistica.js +1 -1
  147. package/dist-es/community/cyber/example-component.css-mistica.js +1 -1
  148. package/dist-es/community/example-component.css-mistica.js +1 -1
  149. package/dist-es/community/skins/cyber-skin.js +12 -1
  150. package/dist-es/counter.css-mistica.js +1 -1
  151. package/dist-es/cover-hero.css-mistica.js +2 -2
  152. package/dist-es/credit-card-number-field.css-mistica.js +3 -3
  153. package/dist-es/date-field.css-mistica.js +1 -1
  154. package/dist-es/date-time-picker.css-mistica.js +1 -1
  155. package/dist-es/date-time-picker.js +5 -2
  156. package/dist-es/dialog.css-mistica.js +4 -4
  157. package/dist-es/divider.css-mistica.js +5 -5
  158. package/dist-es/double-field.css-mistica.js +2 -2
  159. package/dist-es/drawer.css-mistica.js +1 -1
  160. package/dist-es/empty-state-card.css-mistica.js +1 -1
  161. package/dist-es/empty-state.css-mistica.js +5 -5
  162. package/dist-es/fade-in.css-mistica.js +1 -1
  163. package/dist-es/fade-out.css-mistica.js +1 -1
  164. package/dist-es/feedback.css-mistica.js +1 -1
  165. package/dist-es/file-upload.css-mistica.js +7 -7
  166. package/dist-es/fixed-footer-layout.css-mistica.js +2 -2
  167. package/dist-es/form.css-mistica.js +1 -1
  168. package/dist-es/grid-layout.css-mistica.js +3 -3
  169. package/dist-es/grid.css-mistica.js +120 -120
  170. package/dist-es/header.css-mistica.js +1 -1
  171. package/dist-es/hero.css-mistica.js +2 -2
  172. package/dist-es/hooks.js +24 -21
  173. package/dist-es/horizontal-scroll.css-mistica.js +1 -1
  174. package/dist-es/icon-button.css-mistica.js +53 -53
  175. package/dist-es/icons/icon-chevron.css-mistica.js +2 -2
  176. package/dist-es/icons/icon-error.css-mistica.js +1 -1
  177. package/dist-es/image.css-mistica.js +2 -2
  178. package/dist-es/inline.css-mistica.js +11 -11
  179. package/dist-es/list.css-mistica.js +7 -7
  180. package/dist-es/loading-bar.css-mistica.js +1 -1
  181. package/dist-es/loading-screen.css-mistica.js +4 -4
  182. package/dist-es/logo.css-mistica.js +5 -5
  183. package/dist-es/menu.css-mistica.js +12 -12
  184. package/dist-es/mosaic.css-mistica.js +1 -1
  185. package/dist-es/navigation-bar.css-mistica.js +9 -9
  186. package/dist-es/navigation-breadcrumbs.css-mistica.js +1 -1
  187. package/dist-es/navigation-shared.css-mistica.js +9 -9
  188. package/dist-es/package-version.js +1 -1
  189. package/dist-es/pagination.css-mistica.js +18 -18
  190. package/dist-es/pin-field.css-mistica.js +1 -1
  191. package/dist-es/popover.css-mistica.js +1 -1
  192. package/dist-es/progress-bar.css-mistica.js +6 -6
  193. package/dist-es/radio-button.css-mistica.js +19 -19
  194. package/dist-es/rating.css-mistica.js +2 -2
  195. package/dist-es/responsive-layout.css-mistica.js +6 -6
  196. package/dist-es/screen-reader-only.css-mistica.js +1 -1
  197. package/dist-es/select.css-mistica.js +15 -15
  198. package/dist-es/sheet-action-row.css-mistica.js +1 -1
  199. package/dist-es/sheet-common.css-mistica.js +1 -1
  200. package/dist-es/sheet-info.css-mistica.js +1 -1
  201. package/dist-es/sidenav-bar-layout.css-mistica.js +1 -1
  202. package/dist-es/sidenav-bar.css-mistica.js +71 -71
  203. package/dist-es/skeletons.css-mistica.js +6 -6
  204. package/dist-es/skins/blau.js +12 -1
  205. package/dist-es/skins/defaults.js +11 -0
  206. package/dist-es/skins/esimflag.js +12 -1
  207. package/dist-es/skins/movistar.js +11 -0
  208. package/dist-es/skins/o2.js +12 -1
  209. package/dist-es/skins/skin-contract.css-mistica.js +743 -738
  210. package/dist-es/skins/telefonica.js +12 -1
  211. package/dist-es/skins/vivo-evolution.js +11 -0
  212. package/dist-es/skins/vivo.js +11 -0
  213. package/dist-es/skip-link.css-mistica.js +1 -1
  214. package/dist-es/slider.css-mistica.js +18 -18
  215. package/dist-es/snackbar.css-mistica.js +4 -4
  216. package/dist-es/spinner.css-mistica.js +1 -1
  217. package/dist-es/square.css-mistica.js +1 -1
  218. package/dist-es/stack.css-mistica.js +5 -5
  219. package/dist-es/stacking-group.css-mistica.js +1 -1
  220. package/dist-es/stepper.css-mistica.js +2 -2
  221. package/dist-es/style.css +1 -1
  222. package/dist-es/switch-component.css-mistica.js +35 -35
  223. package/dist-es/table.css-mistica.js +9 -9
  224. package/dist-es/tabs.css-mistica.js +17 -17
  225. package/dist-es/tag.css-mistica.js +1 -1
  226. package/dist-es/text-field-base.css-mistica.js +17 -17
  227. package/dist-es/text-field-components.css-mistica.js +3 -3
  228. package/dist-es/text-link.css-mistica.js +6 -6
  229. package/dist-es/text.css-mistica.js +6 -6
  230. package/dist-es/theme-context.js +3 -3
  231. package/dist-es/theme-variant-context.js +8 -7
  232. package/dist-es/timeline.css-mistica.js +9 -9
  233. package/dist-es/timer.css-mistica.js +6 -6
  234. package/dist-es/tooltip.css-mistica.js +1 -1
  235. package/dist-es/touchable.css-mistica.js +1 -1
  236. package/dist-es/utils/aspect-ratio-support.css-mistica.js +2 -2
  237. package/dist-es/utils/shared-context.js +13 -0
  238. package/dist-es/video.css-mistica.js +1 -1
  239. package/dist-es/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  240. package/doc/module-federation.md +24 -18
  241. package/package.json +2 -2
  242. package/src/chip.tsx +4 -2
  243. package/src/community/skins/cyber-skin.tsx +7 -2
  244. package/src/date-time-picker.css.ts +0 -1
  245. package/src/date-time-picker.tsx +1 -0
  246. package/src/hooks.tsx +8 -4
  247. package/src/package-version.tsx +1 -1
  248. package/src/skins/blau.tsx +7 -2
  249. package/src/skins/defaults.tsx +6 -1
  250. package/src/skins/esimflag.tsx +7 -2
  251. package/src/skins/movistar.tsx +5 -0
  252. package/src/skins/o2.tsx +7 -2
  253. package/src/skins/skin-contract.css.ts +1 -0
  254. package/src/skins/telefonica.tsx +7 -2
  255. package/src/skins/types/index.tsx +1 -0
  256. package/src/skins/vivo-evolution.tsx +5 -0
  257. package/src/skins/vivo.tsx +5 -0
  258. package/src/theme-context.tsx +2 -2
  259. package/src/theme-variant-context.tsx +2 -1
  260. package/src/utils/__tests__/shared-context-test.tsx +48 -0
  261. package/src/utils/shared-context.tsx +29 -0
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
  }
@@ -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.2' 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
+ };