@telefonica/mistica 16.56.0 → 16.57.0-beta.1

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 (295) hide show
  1. package/README.md +31 -0
  2. package/css/mistica.css +1 -1
  3. package/dist/accordion.css-mistica.js +16 -16
  4. package/dist/align.css-mistica.js +2 -2
  5. package/dist/autocomplete.css-mistica.js +6 -6
  6. package/dist/avatar.css-mistica.js +3 -3
  7. package/dist/badge.css-mistica.js +7 -7
  8. package/dist/box.css-mistica.js +15 -15
  9. package/dist/boxed.css-mistica.js +31 -31
  10. package/dist/button-group.css-mistica.js +10 -10
  11. package/dist/button-layout.css-mistica.js +21 -21
  12. package/dist/button.css-mistica.js +51 -51
  13. package/dist/callout.css-mistica.js +16 -16
  14. package/dist/card-internal.css-mistica.js +36 -36
  15. package/dist/carousel.css-mistica.js +18 -18
  16. package/dist/checkbox.css-mistica.js +21 -21
  17. package/dist/chip.css-mistica.js +30 -30
  18. package/dist/circle.css-mistica.js +2 -2
  19. package/dist/community/advanced-data-card.css-mistica.js +26 -26
  20. package/dist/community/blocks.css-mistica.js +3 -3
  21. package/dist/community/example-component.css-mistica.js +2 -2
  22. package/dist/counter.css-mistica.js +12 -12
  23. package/dist/cover-hero.css-mistica.js +16 -16
  24. package/dist/credit-card-number-field.css-mistica.js +6 -6
  25. package/dist/date-field.css-mistica.js +1 -1
  26. package/dist/date-time-picker.css-mistica.js +2 -2
  27. package/dist/dialog.css-mistica.js +15 -15
  28. package/dist/divider.css-mistica.js +5 -5
  29. package/dist/double-field.css-mistica.js +4 -4
  30. package/dist/drawer.css-mistica.js +15 -15
  31. package/dist/empty-state-card.css-mistica.js +4 -4
  32. package/dist/empty-state.css-mistica.js +14 -14
  33. package/dist/fade-in.css-mistica.js +1 -1
  34. package/dist/feedback.css-mistica.js +14 -14
  35. package/dist/file-upload.css-mistica.js +14 -14
  36. package/dist/fixed-footer-layout.css-mistica.js +12 -12
  37. package/dist/form.css-mistica.js +2 -2
  38. package/dist/grid-layout.css-mistica.js +9 -9
  39. package/dist/grid.css-mistica.js +147 -147
  40. package/dist/header.css-mistica.js +5 -5
  41. package/dist/hero.css-mistica.js +11 -11
  42. package/dist/horizontal-scroll.css-mistica.js +3 -3
  43. package/dist/icon-button.css-mistica.js +66 -66
  44. package/dist/icons/icon-chevron.css-mistica.js +6 -6
  45. package/dist/icons/icon-error.css-mistica.js +3 -3
  46. package/dist/image.css-mistica.js +11 -11
  47. package/dist/inline.css-mistica.js +16 -16
  48. package/dist/list.css-mistica.js +15 -15
  49. package/dist/loading-bar.css-mistica.js +5 -5
  50. package/dist/loading-screen.css-mistica.js +15 -15
  51. package/dist/logo-blau-shell.d.ts +10 -0
  52. package/dist/logo-blau-shell.js +25 -0
  53. package/dist/logo-blau.d.ts +1 -1
  54. package/dist/logo-blau.js +25 -40
  55. package/dist/logo-common.d.ts +0 -1
  56. package/dist/logo-esimflag-shell.d.ts +10 -0
  57. package/dist/logo-esimflag-shell.js +25 -0
  58. package/dist/logo-esimflag.d.ts +1 -1
  59. package/dist/logo-esimflag.js +11 -26
  60. package/dist/logo-movistar-new-shell.d.ts +10 -0
  61. package/dist/logo-movistar-new-shell.js +25 -0
  62. package/dist/logo-movistar-new.d.ts +1 -1
  63. package/dist/logo-movistar-new.js +84 -103
  64. package/dist/logo-movistar-shell.d.ts +10 -0
  65. package/dist/logo-movistar-shell.js +25 -0
  66. package/dist/logo-movistar.d.ts +1 -1
  67. package/dist/logo-movistar.js +16 -31
  68. package/dist/logo-o2-new-shell.d.ts +8 -0
  69. package/dist/logo-o2-new-shell.js +24 -0
  70. package/dist/logo-o2-new.d.ts +1 -1
  71. package/dist/logo-o2-new.js +6 -13
  72. package/dist/logo-o2-shell.d.ts +8 -0
  73. package/dist/logo-o2-shell.js +24 -0
  74. package/dist/logo-o2.d.ts +1 -1
  75. package/dist/logo-o2.js +6 -13
  76. package/dist/logo-telefonica-shell.d.ts +10 -0
  77. package/dist/logo-telefonica-shell.js +25 -0
  78. package/dist/logo-telefonica.d.ts +1 -1
  79. package/dist/logo-telefonica.js +11 -26
  80. package/dist/logo-tu-shell.d.ts +8 -0
  81. package/dist/logo-tu-shell.js +24 -0
  82. package/dist/logo-tu.d.ts +1 -1
  83. package/dist/logo-tu.js +10 -14
  84. package/dist/logo-vivo-shell.d.ts +10 -0
  85. package/dist/logo-vivo-shell.js +25 -0
  86. package/dist/logo-vivo.d.ts +1 -1
  87. package/dist/logo-vivo.js +11 -26
  88. package/dist/logo.css-mistica.js +9 -9
  89. package/dist/logo.js +223 -205
  90. package/dist/menu.css-mistica.js +24 -24
  91. package/dist/mosaic.css-mistica.js +3 -3
  92. package/dist/navigation-bar.css-mistica.js +45 -45
  93. package/dist/navigation-breadcrumbs.css-mistica.js +5 -5
  94. package/dist/package-version.js +2 -2
  95. package/dist/pin-field.css-mistica.js +10 -10
  96. package/dist/popover.css-mistica.js +2 -2
  97. package/dist/progress-bar.css-mistica.js +12 -12
  98. package/dist/radio-button.css-mistica.js +33 -33
  99. package/dist/rating.css-mistica.js +12 -12
  100. package/dist/responsive-layout.css-mistica.js +20 -20
  101. package/dist/screen-reader-only.css-mistica.js +2 -2
  102. package/dist/select.css-mistica.js +29 -29
  103. package/dist/sheet-action-row.css-mistica.js +2 -2
  104. package/dist/sheet-common.css-mistica.js +16 -16
  105. package/dist/sheet-info.css-mistica.js +4 -4
  106. package/dist/skeletons.css-mistica.js +12 -12
  107. package/dist/skins/skin-contract.css-mistica.js +686 -686
  108. package/dist/skip-link.css-mistica.js +3 -3
  109. package/dist/slider.css-mistica.js +28 -28
  110. package/dist/snackbar.css-mistica.js +16 -16
  111. package/dist/spinner.css-mistica.js +5 -5
  112. package/dist/square.css-mistica.js +2 -2
  113. package/dist/stack.css-mistica.js +9 -9
  114. package/dist/stacking-group.css-mistica.js +2 -2
  115. package/dist/stepper.css-mistica.js +16 -16
  116. package/dist/switch-component.css-mistica.js +53 -53
  117. package/dist/table.css-mistica.js +24 -24
  118. package/dist/tabs.css-mistica.js +30 -30
  119. package/dist/tag.css-mistica.js +5 -5
  120. package/dist/text-field-base.css-mistica.js +30 -30
  121. package/dist/text-field-base.js +52 -51
  122. package/dist/text-field-components.css-mistica.js +20 -17
  123. package/dist/text-field-components.css.d.ts +1 -0
  124. package/dist/text-field-components.d.ts +2 -1
  125. package/dist/text-field-components.js +25 -25
  126. package/dist/text-link.css-mistica.js +10 -10
  127. package/dist/text.css-mistica.js +13 -13
  128. package/dist/theme-context.css-mistica.js +2 -2
  129. package/dist/timeline.css-mistica.js +18 -18
  130. package/dist/timer.css-mistica.js +13 -13
  131. package/dist/tooltip.css-mistica.js +12 -12
  132. package/dist/touchable.css-mistica.js +5 -5
  133. package/dist/utils/aspect-ratio-support.css-mistica.js +7 -7
  134. package/dist/video.css-mistica.js +2 -2
  135. package/dist/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +3 -3
  136. package/dist-es/accordion.css-mistica.js +7 -7
  137. package/dist-es/align.css-mistica.js +2 -2
  138. package/dist-es/autocomplete.css-mistica.js +2 -2
  139. package/dist-es/avatar.css-mistica.js +2 -2
  140. package/dist-es/badge.css-mistica.js +2 -2
  141. package/dist-es/box.css-mistica.js +15 -15
  142. package/dist-es/boxed.css-mistica.js +25 -25
  143. package/dist-es/button-group.css-mistica.js +2 -2
  144. package/dist-es/button-layout.css-mistica.js +16 -16
  145. package/dist-es/button.css-mistica.js +38 -38
  146. package/dist-es/callout.css-mistica.js +12 -12
  147. package/dist-es/card-internal.css-mistica.js +20 -20
  148. package/dist-es/carousel.css-mistica.js +10 -10
  149. package/dist-es/checkbox.css-mistica.js +14 -14
  150. package/dist-es/chip.css-mistica.js +17 -17
  151. package/dist-es/circle.css-mistica.js +2 -2
  152. package/dist-es/community/advanced-data-card.css-mistica.js +7 -7
  153. package/dist-es/community/blocks.css-mistica.js +2 -2
  154. package/dist-es/community/example-component.css-mistica.js +2 -2
  155. package/dist-es/counter.css-mistica.js +2 -2
  156. package/dist-es/cover-hero.css-mistica.js +4 -4
  157. package/dist-es/credit-card-number-field.css-mistica.js +4 -4
  158. package/dist-es/date-field.css-mistica.js +1 -1
  159. package/dist-es/date-time-picker.css-mistica.js +2 -2
  160. package/dist-es/dialog.css-mistica.js +5 -5
  161. package/dist-es/divider.css-mistica.js +5 -5
  162. package/dist-es/double-field.css-mistica.js +4 -4
  163. package/dist-es/drawer.css-mistica.js +2 -2
  164. package/dist-es/empty-state-card.css-mistica.js +2 -2
  165. package/dist-es/empty-state.css-mistica.js +7 -7
  166. package/dist-es/fade-in.css-mistica.js +1 -1
  167. package/dist-es/feedback.css-mistica.js +2 -2
  168. package/dist-es/file-upload.css-mistica.js +8 -8
  169. package/dist-es/fixed-footer-layout.css-mistica.js +4 -4
  170. package/dist-es/form.css-mistica.js +2 -2
  171. package/dist-es/grid-layout.css-mistica.js +4 -4
  172. package/dist-es/grid.css-mistica.js +127 -127
  173. package/dist-es/header.css-mistica.js +2 -2
  174. package/dist-es/hero.css-mistica.js +4 -4
  175. package/dist-es/horizontal-scroll.css-mistica.js +2 -2
  176. package/dist-es/icon-button.css-mistica.js +56 -56
  177. package/dist-es/icons/icon-chevron.css-mistica.js +4 -4
  178. package/dist-es/icons/icon-error.css-mistica.js +2 -2
  179. package/dist-es/image.css-mistica.js +4 -4
  180. package/dist-es/inline.css-mistica.js +10 -10
  181. package/dist-es/list.css-mistica.js +2 -2
  182. package/dist-es/loading-bar.css-mistica.js +2 -2
  183. package/dist-es/loading-screen.css-mistica.js +5 -5
  184. package/dist-es/logo-blau-shell.js +16 -0
  185. package/dist-es/logo-blau.js +36 -51
  186. package/dist-es/logo-esimflag-shell.js +16 -0
  187. package/dist-es/logo-esimflag.js +13 -28
  188. package/dist-es/logo-movistar-new-shell.js +16 -0
  189. package/dist-es/logo-movistar-new.js +86 -105
  190. package/dist-es/logo-movistar-shell.js +16 -0
  191. package/dist-es/logo-movistar.js +18 -33
  192. package/dist-es/logo-o2-new-shell.js +15 -0
  193. package/dist-es/logo-o2-new.js +7 -14
  194. package/dist-es/logo-o2-shell.js +15 -0
  195. package/dist-es/logo-o2.js +7 -14
  196. package/dist-es/logo-telefonica-shell.js +16 -0
  197. package/dist-es/logo-telefonica.js +13 -28
  198. package/dist-es/logo-tu-shell.js +15 -0
  199. package/dist-es/logo-tu.js +12 -16
  200. package/dist-es/logo-vivo-shell.js +16 -0
  201. package/dist-es/logo-vivo.js +13 -28
  202. package/dist-es/logo.css-mistica.js +7 -7
  203. package/dist-es/logo.js +221 -203
  204. package/dist-es/menu.css-mistica.js +15 -15
  205. package/dist-es/mosaic.css-mistica.js +2 -2
  206. package/dist-es/navigation-bar.css-mistica.js +20 -20
  207. package/dist-es/navigation-breadcrumbs.css-mistica.js +2 -2
  208. package/dist-es/package-version.js +2 -2
  209. package/dist-es/pin-field.css-mistica.js +2 -2
  210. package/dist-es/popover.css-mistica.js +2 -2
  211. package/dist-es/progress-bar.css-mistica.js +8 -8
  212. package/dist-es/radio-button.css-mistica.js +25 -25
  213. package/dist-es/rating.css-mistica.js +4 -4
  214. package/dist-es/responsive-layout.css-mistica.js +7 -7
  215. package/dist-es/screen-reader-only.css-mistica.js +2 -2
  216. package/dist-es/select.css-mistica.js +20 -20
  217. package/dist-es/sheet-action-row.css-mistica.js +2 -2
  218. package/dist-es/sheet-common.css-mistica.js +2 -2
  219. package/dist-es/sheet-info.css-mistica.js +2 -2
  220. package/dist-es/skeletons.css-mistica.js +8 -8
  221. package/dist-es/skins/skin-contract.css-mistica.js +686 -686
  222. package/dist-es/skip-link.css-mistica.js +2 -2
  223. package/dist-es/slider.css-mistica.js +20 -20
  224. package/dist-es/snackbar.css-mistica.js +5 -5
  225. package/dist-es/spinner.css-mistica.js +2 -2
  226. package/dist-es/square.css-mistica.js +2 -2
  227. package/dist-es/stack.css-mistica.js +7 -7
  228. package/dist-es/stacking-group.css-mistica.js +2 -2
  229. package/dist-es/stepper.css-mistica.js +4 -4
  230. package/dist-es/style.css +1 -1
  231. package/dist-es/switch-component.css-mistica.js +41 -41
  232. package/dist-es/table.css-mistica.js +11 -11
  233. package/dist-es/tabs.css-mistica.js +21 -21
  234. package/dist-es/tag.css-mistica.js +2 -2
  235. package/dist-es/text-field-base.css-mistica.js +17 -17
  236. package/dist-es/text-field-base.js +52 -51
  237. package/dist-es/text-field-components.css-mistica.js +4 -4
  238. package/dist-es/text-field-components.js +52 -52
  239. package/dist-es/text-link.css-mistica.js +9 -9
  240. package/dist-es/text.css-mistica.js +8 -8
  241. package/dist-es/theme-context.css-mistica.js +2 -2
  242. package/dist-es/timeline.css-mistica.js +11 -11
  243. package/dist-es/timer.css-mistica.js +7 -7
  244. package/dist-es/tooltip.css-mistica.js +3 -3
  245. package/dist-es/touchable.css-mistica.js +2 -2
  246. package/dist-es/utils/aspect-ratio-support.css-mistica.js +4 -4
  247. package/dist-es/video.css-mistica.js +2 -2
  248. package/dist-es/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +2 -2
  249. package/doc/analytics.md +145 -0
  250. package/doc/components.md +730 -0
  251. package/doc/design-tokens.md +199 -0
  252. package/doc/fonts.md +287 -0
  253. package/doc/forms.md +177 -0
  254. package/doc/images/layout/box.svg +6 -0
  255. package/doc/images/layout/grid-layout-desktop-5-4.svg +8 -0
  256. package/doc/images/layout/grid-layout-desktop-6-6.svg +8 -0
  257. package/doc/images/layout/grid-layout-desktop-8-4.svg +8 -0
  258. package/doc/images/layout/grid-layout-desktop.svg +16 -0
  259. package/doc/images/layout/grid-layout-mobile-5-4.svg +9 -0
  260. package/doc/images/layout/grid-layout-mobile-6-6.svg +9 -0
  261. package/doc/images/layout/grid-layout-mobile-8-4.svg +9 -0
  262. package/doc/images/layout/grid-layout-mobile.svg +5 -0
  263. package/doc/images/layout/grid-layout-tablet-5-4.svg +8 -0
  264. package/doc/images/layout/grid-layout-tablet-6-6.svg +8 -0
  265. package/doc/images/layout/grid-layout-tablet-8-4.svg +8 -0
  266. package/doc/images/layout/grid-layout-tablet.svg +5 -0
  267. package/doc/images/layout/header-layout-desktop.svg +6 -0
  268. package/doc/images/layout/header-layout-mobile.svg +6 -0
  269. package/doc/images/layout/header-layout-tablet.svg +6 -0
  270. package/doc/images/layout/inline-around.svg +6 -0
  271. package/doc/images/layout/inline-between.svg +6 -0
  272. package/doc/images/layout/inline-evenly.svg +6 -0
  273. package/doc/images/layout/inline.svg +6 -0
  274. package/doc/images/layout/master-detail-layout-desktop.svg +8 -0
  275. package/doc/images/layout/master-detail-layout-mobile-detail.svg +6 -0
  276. package/doc/images/layout/master-detail-layout-mobile-master.svg +6 -0
  277. package/doc/images/layout/negative-box-ok-outline.svg +17 -0
  278. package/doc/images/layout/negative-box-ok-preview.svg +11 -0
  279. package/doc/images/layout/negative-box-wrong-outline.svg +14 -0
  280. package/doc/images/layout/negative-box-wrong-preview.svg +11 -0
  281. package/doc/images/layout/responsive-layout-desktop.svg +4 -0
  282. package/doc/images/layout/responsive-layout-mobile.svg +4 -0
  283. package/doc/images/layout/responsive-layout-tablet.svg +4 -0
  284. package/doc/images/layout/stack.svg +8 -0
  285. package/doc/images/layout/vertical-rhythm.png +0 -0
  286. package/doc/layout.md +527 -0
  287. package/doc/llms.md +290 -0
  288. package/doc/lottie.md +17 -0
  289. package/doc/migration-guide.md +76 -0
  290. package/doc/patterns.md +548 -0
  291. package/doc/sheet.md +122 -0
  292. package/doc/testing.md +43 -0
  293. package/doc/texts.md +42 -0
  294. package/doc/theme-config.md +124 -0
  295. package/package.json +2 -1
@@ -0,0 +1,730 @@
1
+ # Components Reference
2
+
3
+ All components are imported from `@telefonica/mistica`.
4
+
5
+ ```tsx
6
+ import {ButtonPrimary, Stack, Text2, ...} from '@telefonica/mistica';
7
+ ```
8
+
9
+ ## Buttons
10
+
11
+ ### Button variants
12
+
13
+ | Component | Usage |
14
+ | ------------------ | ------------------------- |
15
+ | `ButtonPrimary` | Primary action |
16
+ | `ButtonSecondary` | Secondary action |
17
+ | `ButtonDanger` | Destructive action |
18
+ | `ButtonLink` | Link-styled button |
19
+ | `ButtonLinkDanger` | Danger link-styled button |
20
+
21
+ ### Button interaction props (mutually exclusive)
22
+
23
+ - `onPress={() => {}}` -- click handler
24
+ - `href="https://..."` -- external link (add `newTab` for target blank)
25
+ - `to="/path"` -- client-side navigation (uses configured Link component)
26
+ - `submit` -- form submit button (use inside `<Form>`)
27
+
28
+ ### Button common props
29
+
30
+ - `small` -- smaller size
31
+ - `disabled` -- disabled state
32
+ - `showSpinner` / `loadingText` -- loading state
33
+ - `StartIcon` / `EndIcon` -- icon components
34
+ - `trackingEvent` -- analytics event
35
+ - `trackEvent` -- default analytics tracking
36
+
37
+ ```tsx
38
+ <ButtonPrimary onPress={() => console.log('clicked')}>Action</ButtonPrimary>
39
+ <ButtonSecondary href="https://example.com" newTab>Open link</ButtonSecondary>
40
+ <ButtonPrimary submit>Submit form</ButtonPrimary>
41
+ <ButtonPrimary small StartIcon={IconSearchRegular} onPress={() => {}}>Search</ButtonPrimary>
42
+ ```
43
+
44
+ ### ButtonGroup
45
+
46
+ Groups up to 3 buttons (primary + secondary + link):
47
+
48
+ ```tsx
49
+ <ButtonGroup
50
+ primaryButton={<ButtonPrimary onPress={() => {}}>Primary</ButtonPrimary>}
51
+ secondaryButton={<ButtonSecondary onPress={() => {}}>Secondary</ButtonSecondary>}
52
+ link={<ButtonLink onPress={() => {}}>Link</ButtonLink>}
53
+ />
54
+ ```
55
+
56
+ ### ButtonLayout
57
+
58
+ Positions a primary and optional secondary button:
59
+
60
+ ```tsx
61
+ <ButtonLayout
62
+ primaryButton={<ButtonPrimary onPress={() => {}}>Continue</ButtonPrimary>}
63
+ secondaryButton={<ButtonSecondary onPress={() => {}}>Cancel</ButtonSecondary>}
64
+ />
65
+ ```
66
+
67
+ ### IconButton / ToggleIconButton
68
+
69
+ ```tsx
70
+ <IconButton
71
+ aria-label="Search"
72
+ onPress={() => {}}
73
+ Icon={IconSearchRegular}
74
+ />
75
+
76
+ <ToggleIconButton
77
+ checkedProps={{Icon: IconHeartFilled, 'aria-label': 'Remove from favorites'}}
78
+ uncheckedProps={{Icon: IconHeartRegular, 'aria-label': 'Add to favorites'}}
79
+ checked={isFavorite}
80
+ onChange={setIsFavorite}
81
+ />
82
+ ```
83
+
84
+ ## Text and Titles
85
+
86
+ ### Text components
87
+
88
+ `Text1` through `Text10` render text at progressively larger sizes. `Text1`-`Text4` accept a `weight` prop.
89
+
90
+ Common props: `color`, `truncate`, `textAlign`, `as` (HTML tag), `wordBreak`, `decoration`, `transform`.
91
+
92
+ ```tsx
93
+ <Text2 regular>Regular body text</Text2>
94
+ <Text2 medium>Medium body text</Text2>
95
+ <Text3 light color={skinVars.colors.textSecondary}>Light secondary text</Text3>
96
+ <Text5>Large display text</Text5>
97
+ ```
98
+
99
+ ### Title components
100
+
101
+ `Title1` through `Title4`. Accept `as` (heading level), `right` (right-side content), `id`.
102
+
103
+ ```tsx
104
+ <Title1 as="h1">Page Title</Title1>
105
+ <Title2 as="h2" right={<ButtonLink small onPress={() => {}}>See all</ButtonLink>}>Section</Title2>
106
+ ```
107
+
108
+ ### TextLink
109
+
110
+ ```tsx
111
+ <TextLink href="https://example.com">External link</TextLink>
112
+ <TextLink to="/page">Internal link</TextLink>
113
+ <TextLink onPress={() => {}}>Clickable text</TextLink>
114
+ ```
115
+
116
+ ## Cards
117
+
118
+ All cards support touchable props (`onPress`, `href`, `to`), buttons (`buttonPrimary`, `buttonSecondary`,
119
+ `buttonLink`), and content props (`headline`, `pretitle`, `title`, `subtitle`, `description`, `slot`).
120
+
121
+ ### DataCard
122
+
123
+ General-purpose card for data display. Supports `size`: `'default'`, `'snap'`, `'display'`.
124
+
125
+ ```tsx
126
+ <DataCard
127
+ asset={
128
+ <Circle backgroundColor={skinVars.colors.brandLow} size={40}>
129
+ <IconShopRegular color={skinVars.colors.brand} />
130
+ </Circle>
131
+ }
132
+ headline={<Tag type="promo">Promo</Tag>}
133
+ title="Card title"
134
+ subtitle="Subtitle"
135
+ description="Description text"
136
+ buttonPrimary={
137
+ <ButtonPrimary small onPress={() => {}}>
138
+ Action
139
+ </ButtonPrimary>
140
+ }
141
+ buttonLink={
142
+ <ButtonLink small onPress={() => {}}>
143
+ Link
144
+ </ButtonLink>
145
+ }
146
+ />
147
+ ```
148
+
149
+ ### MediaCard
150
+
151
+ Card with image or video media. Supports `mediaPosition`: `'top'`, `'left'`, `'right'`.
152
+
153
+ ```tsx
154
+ <MediaCard
155
+ imageSrc="https://example.com/image.jpg"
156
+ mediaAspectRatio="16:9"
157
+ headline={<Tag type="active">Active</Tag>}
158
+ pretitle="Pretitle"
159
+ title="Media card title"
160
+ description="Description"
161
+ buttonPrimary={
162
+ <ButtonPrimary small onPress={() => {}}>
163
+ Action
164
+ </ButtonPrimary>
165
+ }
166
+ />
167
+ ```
168
+
169
+ ### CoverCard
170
+
171
+ Full-bleed image/video background card. Supports `size`: `'default'`, `'display'`.
172
+
173
+ ```tsx
174
+ <CoverCard
175
+ imageSrc="https://example.com/cover.jpg"
176
+ headline={<Tag type="promo">Featured</Tag>}
177
+ title="Cover card title"
178
+ description="Description"
179
+ buttonPrimary={
180
+ <ButtonPrimary small onPress={() => {}}>
181
+ Action
182
+ </ButtonPrimary>
183
+ }
184
+ />
185
+ ```
186
+
187
+ ### NakedCard
188
+
189
+ Card without container background. Supports `size`: `'default'`, `'snap'`.
190
+
191
+ ```tsx
192
+ <NakedCard
193
+ imageSrc="https://example.com/image.jpg"
194
+ mediaAspectRatio="16:9"
195
+ title="Naked card"
196
+ description="Description"
197
+ />
198
+ ```
199
+
200
+ ### Card in carousels and grids
201
+
202
+ ```tsx
203
+ <Carousel
204
+ itemsPerPage={{mobile: 1, tablet: 2, desktop: 3}}
205
+ items={[
206
+ <DataCard key="1" title="Card 1" description="Desc" />,
207
+ <DataCard key="2" title="Card 2" description="Desc" />,
208
+ <DataCard key="3" title="Card 3" description="Desc" />,
209
+ ]}
210
+ />
211
+ ```
212
+
213
+ ## Lists
214
+
215
+ ### RowList / Row (unbounded)
216
+
217
+ ```tsx
218
+ <RowList>
219
+ <Row
220
+ asset={
221
+ <Circle backgroundColor={skinVars.colors.brandLow} size={40}>
222
+ <IconMobileDeviceRegular color={skinVars.colors.brand} />
223
+ </Circle>
224
+ }
225
+ title="Row title"
226
+ description="Description"
227
+ onPress={() => {}}
228
+ />
229
+ <Row title="Simple row" href="https://example.com" />
230
+ <Row title="Row with badge" badge={3} onPress={() => {}} />
231
+ </RowList>
232
+ ```
233
+
234
+ ### BoxedRowList / BoxedRow (boxed container)
235
+
236
+ Same API as RowList/Row but rendered inside a boxed container.
237
+
238
+ ```tsx
239
+ <BoxedRowList>
240
+ <BoxedRow title="Boxed row" description="In a container" onPress={() => {}} />
241
+ </BoxedRowList>
242
+ ```
243
+
244
+ ### Row variants
245
+
246
+ Rows support different right-side controls:
247
+
248
+ ```tsx
249
+ <Row title="With switch" switch={{defaultValue: false, onChange: (v) => {}}} />
250
+ <Row title="With checkbox" checkbox={{defaultValue: false, onChange: (v) => {}}} />
251
+ <Row title="With radio" radioValue="option1" /> {/* Inside RadioGroup */}
252
+ <Row title="With chevron" onPress={() => {}} /> {/* Auto chevron on press/href/to */}
253
+ <Row title="With icon button" iconButton={{Icon: IconTrashCanRegular, onPress: () => {}, 'aria-label': 'Delete'}} />
254
+ <Row title="Custom right" right={<Text2 regular color={skinVars.colors.textSecondary}>Detail</Text2>} />
255
+ ```
256
+
257
+ ### UnorderedList / OrderedList
258
+
259
+ ```tsx
260
+ <UnorderedList>
261
+ <ListItem>First item</ListItem>
262
+ <ListItem>Second item</ListItem>
263
+ </UnorderedList>
264
+ ```
265
+
266
+ ## Navigation
267
+
268
+ ### MainNavigationBar
269
+
270
+ Full app navigation with logo, sections, burger menu on mobile:
271
+
272
+ ```tsx
273
+ <MainNavigationBar
274
+ selectedIndex={0}
275
+ sections={[
276
+ {title: 'Home', onPress: () => {}},
277
+ {
278
+ title: 'Products',
279
+ onPress: () => {},
280
+ menu: {
281
+ columns: [{title: 'Category', items: [{title: 'Item 1', onPress: () => {}}]}],
282
+ },
283
+ },
284
+ ]}
285
+ right={
286
+ <NavigationBarActionGroup>
287
+ <NavigationBarAction aria-label="Profile" onPress={() => {}}>
288
+ <Avatar size={32} initials="JD" />
289
+ </NavigationBarAction>
290
+ </NavigationBarActionGroup>
291
+ }
292
+ />
293
+ ```
294
+
295
+ ### NavigationBar
296
+
297
+ Simple navigation bar with back button:
298
+
299
+ ```tsx
300
+ <NavigationBar
301
+ onBack={() => navigate(-1)}
302
+ title="Page Title"
303
+ right={
304
+ <NavigationBarActionGroup>
305
+ <NavigationBarAction aria-label="Search" onPress={() => {}}>
306
+ <IconSearchRegular color="currentColor" />
307
+ </NavigationBarAction>
308
+ </NavigationBarActionGroup>
309
+ }
310
+ />
311
+ ```
312
+
313
+ ### FunnelNavigationBar
314
+
315
+ For step-by-step flows:
316
+
317
+ ```tsx
318
+ <FunnelNavigationBar
319
+ right={
320
+ <NavigationBarActionGroup>
321
+ <NavigationBarAction aria-label="Close" onPress={() => {}}>
322
+ <IconCloseRegular color="currentColor" />
323
+ </NavigationBarAction>
324
+ </NavigationBarActionGroup>
325
+ }
326
+ />
327
+ ```
328
+
329
+ ### Tabs
330
+
331
+ ```tsx
332
+ const [selectedIndex, setSelectedIndex] = React.useState(0);
333
+
334
+ <Tabs
335
+ selectedIndex={selectedIndex}
336
+ onChange={setSelectedIndex}
337
+ tabs={[{text: 'Tab 1'}, {text: 'Tab 2', Icon: IconSettingsRegular}]}
338
+ />;
339
+ ```
340
+
341
+ ### NavigationBreadcrumbs
342
+
343
+ ```tsx
344
+ <NavigationBreadcrumbs
345
+ title="Current Page"
346
+ breadcrumbs={[
347
+ {title: 'Home', url: '/'},
348
+ {title: 'Section', url: '/section'},
349
+ ]}
350
+ />
351
+ ```
352
+
353
+ ## Headers
354
+
355
+ ### Header + HeaderLayout
356
+
357
+ ```tsx
358
+ <HeaderLayout
359
+ variant="brand"
360
+ breadcrumbs={<NavigationBreadcrumbs title="Page" breadcrumbs={[{title: 'Home', url: '/'}]} />}
361
+ header={
362
+ <Header
363
+ headline={<Tag type="promo">New</Tag>}
364
+ pretitle="Section"
365
+ title="Page Title"
366
+ description="Page description text"
367
+ />
368
+ }
369
+ extra={<Placeholder />}
370
+ sideBySideExtraOnDesktop
371
+ />
372
+ ```
373
+
374
+ ### MainSectionHeader + MainSectionHeaderLayout
375
+
376
+ ```tsx
377
+ <MainSectionHeaderLayout>
378
+ <MainSectionHeader
379
+ title="Section Title"
380
+ description="Section description"
381
+ button={<ButtonPrimary onPress={() => {}}>Action</ButtonPrimary>}
382
+ />
383
+ </MainSectionHeaderLayout>
384
+ ```
385
+
386
+ ## Feedback
387
+
388
+ ### FeedbackScreen variants
389
+
390
+ ```tsx
391
+ <SuccessFeedbackScreen
392
+ title="Payment completed"
393
+ description="Your payment was processed successfully"
394
+ primaryButton={<ButtonPrimary onPress={() => {}}>Continue</ButtonPrimary>}
395
+ />
396
+
397
+ <ErrorFeedbackScreen
398
+ title="Something went wrong"
399
+ description="Please try again later"
400
+ errorReference="Error: 5001"
401
+ primaryButton={<ButtonPrimary onPress={() => {}}>Retry</ButtonPrimary>}
402
+ />
403
+
404
+ <InfoFeedbackScreen
405
+ title="Information"
406
+ description="Informational message"
407
+ primaryButton={<ButtonPrimary onPress={() => {}}>Got it</ButtonPrimary>}
408
+ />
409
+ ```
410
+
411
+ ### Dialogs (imperative)
412
+
413
+ ```tsx
414
+ import {alert, confirm, useDialog} from '@telefonica/mistica';
415
+
416
+ // Simple alert
417
+ alert({title: 'Title', message: 'Message', acceptText: 'OK'});
418
+
419
+ // Confirm dialog
420
+ confirm({title: 'Confirm?', message: 'Are you sure?', acceptText: 'Yes', cancelText: 'No'});
421
+
422
+ // Rich dialog via hook
423
+ const {dialog} = useDialog();
424
+ dialog({
425
+ title: 'Title',
426
+ subtitle: 'Subtitle',
427
+ message: 'Message',
428
+ extra: <Placeholder />,
429
+ acceptText: 'Accept',
430
+ cancelText: 'Cancel',
431
+ });
432
+ ```
433
+
434
+ ### Snackbar
435
+
436
+ ```tsx
437
+ const {openSnackbar} = useSnackbar();
438
+
439
+ openSnackbar({
440
+ message: 'Item saved',
441
+ type: 'INFORMATIVE',
442
+ buttonText: 'Undo',
443
+ withDismiss: true,
444
+ });
445
+ ```
446
+
447
+ ## Empty states
448
+
449
+ ```tsx
450
+ <EmptyState
451
+ largeImageUrl="https://example.com/empty.png"
452
+ title="No results found"
453
+ description="Try a different search term"
454
+ button={<ButtonPrimary onPress={() => {}}>Search again</ButtonPrimary>}
455
+ />
456
+
457
+ <EmptyStateCard
458
+ asset={<IconBoxLight size="100%" color={skinVars.colors.brand} />}
459
+ title="Empty section"
460
+ description="Nothing here yet"
461
+ button={<ButtonPrimary small onPress={() => {}}>Add item</ButtonPrimary>}
462
+ />
463
+ ```
464
+
465
+ ## Loading states
466
+
467
+ ### Skeletons
468
+
469
+ ```tsx
470
+ <SkeletonLine width="60%" /> {/* Single line placeholder */}
471
+ <SkeletonText /> {/* Multi-line paragraph placeholder */}
472
+ <SkeletonCircle size={48} /> {/* Circle placeholder (avatar) */}
473
+ <SkeletonRow /> {/* Circle + line (list item) */}
474
+ <SkeletonRectangle width={200} height={150} /> {/* Rectangle placeholder */}
475
+ ```
476
+
477
+ ### LoadingScreen / BrandLoadingScreen
478
+
479
+ ```tsx
480
+ <LoadingScreen />
481
+ <BrandLoadingScreen texts={['Loading...', 'Almost there...', 'Ready!']} />
482
+ ```
483
+
484
+ ### Spinner
485
+
486
+ ```tsx
487
+ <Spinner size={24} />
488
+ ```
489
+
490
+ ## Other components
491
+
492
+ ### Tag
493
+
494
+ ```tsx
495
+ <Tag type="promo">Promo</Tag>
496
+ <Tag type="success" Icon={IconCheckRegular}>Success</Tag>
497
+ <Tag type="error" small>Error</Tag>
498
+ ```
499
+
500
+ Types: `'promo'`, `'info'`, `'active'`, `'inactive'`, `'success'`, `'warning'`, `'error'`.
501
+
502
+ ### Chip
503
+
504
+ ```tsx
505
+ <Chip onClose={() => {}}>Closeable chip</Chip>
506
+ <Chip active>Active toggle</Chip>
507
+ <Chip Icon={IconFilterRegular} onPress={() => {}}>Filter</Chip>
508
+ ```
509
+
510
+ ### Badge
511
+
512
+ ```tsx
513
+ <Badge value={3}>
514
+ <IconBellRegular />
515
+ </Badge>
516
+ ```
517
+
518
+ ### Callout
519
+
520
+ ```tsx
521
+ <Callout
522
+ title="Important notice"
523
+ description="This is a callout message"
524
+ asset={<IconInfoRegular color={skinVars.colors.brand} />}
525
+ button={
526
+ <ButtonPrimary small onPress={() => {}}>
527
+ Action
528
+ </ButtonPrimary>
529
+ }
530
+ onClose={() => {}}
531
+ />
532
+ ```
533
+
534
+ ### Hero
535
+
536
+ ```tsx
537
+ <Hero
538
+ background="brand"
539
+ media={<Image src="https://example.com/hero.jpg" aspectRatio="16:9" />}
540
+ headline={<Tag type="promo">New</Tag>}
541
+ pretitle="Welcome"
542
+ title="Hero Title"
543
+ description="Hero description"
544
+ button={<ButtonPrimary onPress={() => {}}>Get started</ButtonPrimary>}
545
+ desktopMediaPosition="right"
546
+ />
547
+ ```
548
+
549
+ ### Carousel / Slideshow
550
+
551
+ ```tsx
552
+ <Carousel
553
+ itemsPerPage={{mobile: 1, tablet: 2, desktop: 3}}
554
+ withBullets
555
+ items={cards.map((card, i) => <DataCard key={i} {...card} />)}
556
+ />
557
+
558
+ <Slideshow
559
+ withBullets
560
+ autoplay={{time: 5000, loop: true}}
561
+ items={slides}
562
+ />
563
+ ```
564
+
565
+ ### Avatar
566
+
567
+ ```tsx
568
+ <Avatar size={64} src="https://example.com/avatar.jpg" />
569
+ <Avatar size={40} initials="JD" />
570
+ <Badge value={3}><Avatar size={40} initials="ML" /></Badge>
571
+ ```
572
+
573
+ ### Image / Video
574
+
575
+ ```tsx
576
+ <Image src="https://example.com/photo.jpg" aspectRatio="16:9" />
577
+ <Image src="https://example.com/avatar.jpg" circular width={100} />
578
+ <Video src="https://example.com/video.mp4" aspectRatio="16:9" />
579
+ ```
580
+
581
+ ### Divider
582
+
583
+ ```tsx
584
+ <Divider /> {/* Adapts to current variant context */}
585
+ ```
586
+
587
+ ### Tooltip / Popover
588
+
589
+ ```tsx
590
+ <Tooltip target={<IconButton Icon={IconInfoRegular} aria-label="Info" />}>
591
+ Tooltip content
592
+ </Tooltip>
593
+
594
+ <Popover
595
+ target={<IconButton Icon={IconInfoRegular} aria-label="Info" />}
596
+ title="Title"
597
+ description="Description"
598
+ />
599
+ ```
600
+
601
+ ### Timer / TextTimer
602
+
603
+ ```tsx
604
+ <Timer dateTime={new Date(Date.now() + 3600000)} />
605
+ <TextTimer dateTime={new Date(Date.now() + 3600000)}>Time left:</TextTimer>
606
+ ```
607
+
608
+ ### ProgressBar / Stepper
609
+
610
+ ```tsx
611
+ <ProgressBar progressPercent={60} />
612
+ <ProgressBarStepped currentStep={2} steps={4} />
613
+ <Stepper currentIndex={1} steps={['Cart', 'Shipping', 'Payment', 'Done']} />
614
+ ```
615
+
616
+ ### Meter / Rating
617
+
618
+ ```tsx
619
+ <Meter value={75} max={100} />
620
+ <Rating value={4} max={5} />
621
+ <InfoRating value={4.5} count={128} />
622
+ ```
623
+
624
+ ### Timeline
625
+
626
+ ```tsx
627
+ <Timeline>
628
+ <TimelineItem title="Step 1" description="Completed" asset="1" status="done" />
629
+ <TimelineItem title="Step 2" description="In progress" asset="2" status="active" />
630
+ <TimelineItem title="Step 3" description="Pending" asset="3" status="inactive" />
631
+ </Timeline>
632
+ ```
633
+
634
+ ### Table
635
+
636
+ ```tsx
637
+ <Table
638
+ heading={['Name', 'Email', 'Status']}
639
+ content={[
640
+ ['John Doe', 'john@example.com', <Tag type="active">Active</Tag>],
641
+ ['Jane Smith', 'jane@example.com', <Tag type="inactive">Inactive</Tag>],
642
+ ]}
643
+ />
644
+ ```
645
+
646
+ ### Grid / GridItem
647
+
648
+ For CSS Grid layouts (different from `GridLayout`):
649
+
650
+ ```tsx
651
+ <Grid columns={3} gap={16}>
652
+ <GridItem>Item 1</GridItem>
653
+ <GridItem>Item 2</GridItem>
654
+ <GridItem columnSpan={2}>Wide item</GridItem>
655
+ </Grid>
656
+
657
+ <Grid columns={{minSize: 200}} gap={16}>
658
+ {items.map((item) => <GridItem key={item.id}>{item.content}</GridItem>)}
659
+ </Grid>
660
+ ```
661
+
662
+ ### Drawer
663
+
664
+ ```tsx
665
+ const [isOpen, setIsOpen] = React.useState(false);
666
+
667
+ <Drawer
668
+ open={isOpen}
669
+ onClose={() => setIsOpen(false)}
670
+ title="Drawer title"
671
+ subtitle="Subtitle"
672
+ description="Description"
673
+ button={<ButtonPrimary onPress={() => setIsOpen(false)}>Action</ButtonPrimary>}
674
+ secondaryButton={<ButtonSecondary onPress={() => setIsOpen(false)}>Cancel</ButtonSecondary>}
675
+ >
676
+ <Stack space={16}>
677
+ <Placeholder />
678
+ <Placeholder />
679
+ </Stack>
680
+ </Drawer>;
681
+ ```
682
+
683
+ ### Menu
684
+
685
+ ```tsx
686
+ <Menu
687
+ renderTarget={({ref, onPress, isMenuOpen}) => (
688
+ <IconButton ref={ref} onPress={onPress} Icon={IconMoreOptionsRegular} aria-label="Options" />
689
+ )}
690
+ renderMenu={({ref, className}) => (
691
+ <div ref={ref} className={className}>
692
+ <MenuSection>
693
+ <MenuItem label="Edit" onPress={() => {}} />
694
+ <MenuItem label="Share" onPress={() => {}} />
695
+ <MenuItem label="Delete" onPress={() => {}} destructive />
696
+ </MenuSection>
697
+ </div>
698
+ )}
699
+ />
700
+ ```
701
+
702
+ ## Icons
703
+
704
+ Mistica ships ~2000 icons following the pattern `Icon{Name}{Variant}`:
705
+
706
+ - Variants: `Regular`, `Filled`, `Light`
707
+ - All accept `size` (number) and `color` (string) props
708
+
709
+ ```tsx
710
+ import {IconSearchRegular, IconHeartFilled, IconInfoLight} from '@telefonica/mistica';
711
+
712
+ <IconSearchRegular size={24} color={skinVars.colors.neutralHigh} />
713
+ <IconHeartFilled size={24} color={skinVars.colors.error} />
714
+ ```
715
+
716
+ Always use `color="currentColor"` when the icon should inherit color from its parent (e.g. inside buttons or
717
+ navigation actions).
718
+
719
+ ## Hooks
720
+
721
+ | Hook | Returns | Usage |
722
+ | ----------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------ |
723
+ | `useTheme()` | Theme context + `t()` translate function | Access theme config, translate text tokens |
724
+ | `useScreenSize()` | `{isMobile, isTablet, isDesktop, isDesktopOrBigger, isTabletOrSmaller, ...}` | Responsive rendering |
725
+ | `useDialog()` | `{alert, confirm, dialog}` | Show imperative dialogs |
726
+ | `useSnackbar()` | `{openSnackbar}` | Show snackbar notifications |
727
+ | `useForm()` | Form context | Advanced form logic |
728
+ | `useThemeVariant()` | Current variant string | Check current variant context |
729
+ | `useIsInViewport({ref})` | boolean | Detect if element is visible |
730
+ | `useElementDimensions({ref})` | `{width, height}` | Get element dimensions |