@telefonica/mistica 16.60.0 → 16.61.0

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 (544) hide show
  1. package/css/mistica.css +1 -1
  2. package/dist/accordion.css-mistica.js +6 -6
  3. package/dist/align.css-mistica.js +1 -1
  4. package/dist/autocomplete.css-mistica.js +1 -1
  5. package/dist/avatar.css-mistica.js +1 -1
  6. package/dist/badge.css-mistica.js +1 -1
  7. package/dist/box.css-mistica.js +13 -13
  8. package/dist/boxed.css-mistica.js +24 -24
  9. package/dist/button-fixed-footer-layout.d.ts +2 -1
  10. package/dist/button-fixed-footer-layout.js +4 -3
  11. package/dist/button-group.css-mistica.js +1 -1
  12. package/dist/button-layout.css-mistica.js +14 -14
  13. package/dist/button.css-mistica.js +30 -30
  14. package/dist/callout.css-mistica.js +11 -11
  15. package/dist/card-internal.css-mistica.js +15 -15
  16. package/dist/carousel.css-mistica.js +8 -8
  17. package/dist/checkbox.css-mistica.js +11 -11
  18. package/dist/chip.css-mistica.js +15 -15
  19. package/dist/circle.css-mistica.js +1 -1
  20. package/dist/community/advanced-data-card.css-mistica.js +6 -6
  21. package/dist/community/blocks.css-mistica.js +1 -1
  22. package/dist/community/example-component.css-mistica.js +1 -1
  23. package/dist/counter.css-mistica.js +1 -1
  24. package/dist/cover-hero.css-mistica.js +2 -2
  25. package/dist/credit-card-number-field.css-mistica.js +3 -3
  26. package/dist/date-field.css-mistica.js +1 -1
  27. package/dist/date-time-picker.css-mistica.js +1 -1
  28. package/dist/dialog.css-mistica.js +4 -4
  29. package/dist/divider.css-mistica.js +5 -5
  30. package/dist/double-field.css-mistica.js +2 -2
  31. package/dist/drawer.css-mistica.js +1 -1
  32. package/dist/empty-state-card.css-mistica.js +1 -1
  33. package/dist/empty-state.css-mistica.js +5 -5
  34. package/dist/fade-in.css-mistica.js +1 -1
  35. package/dist/feedback.css-mistica.js +1 -1
  36. package/dist/file-upload.css-mistica.js +7 -7
  37. package/dist/fixed-footer-layout.css-mistica.js +2 -2
  38. package/dist/fixed-footer-layout.d.ts +6 -1
  39. package/dist/fixed-footer-layout.js +29 -28
  40. package/dist/form.css-mistica.js +1 -1
  41. package/dist/grid-layout.css-mistica.js +3 -3
  42. package/dist/grid.css-mistica.js +120 -120
  43. package/dist/header.css-mistica.js +1 -1
  44. package/dist/hero.css-mistica.js +2 -2
  45. package/dist/horizontal-scroll.css-mistica.js +1 -1
  46. package/dist/icon-button.css-mistica.js +53 -53
  47. package/dist/icons/icon-chevron.css-mistica.js +2 -2
  48. package/dist/icons/icon-error.css-mistica.js +1 -1
  49. package/dist/image.css-mistica.js +2 -2
  50. package/dist/image.js +8 -1
  51. package/dist/inline.css-mistica.js +9 -9
  52. package/dist/list.css-mistica.js +1 -1
  53. package/dist/loading-bar.css-mistica.js +1 -1
  54. package/dist/loading-screen.css-mistica.js +4 -4
  55. package/dist/logo.css-mistica.js +5 -5
  56. package/dist/menu.css-mistica.js +13 -13
  57. package/dist/mosaic.css-mistica.js +1 -1
  58. package/dist/navigation-bar.css-mistica.js +18 -18
  59. package/dist/navigation-breadcrumbs.css-mistica.js +1 -1
  60. package/dist/package-version.js +1 -1
  61. package/dist/pin-field.css-mistica.js +1 -1
  62. package/dist/popover.css-mistica.js +1 -1
  63. package/dist/progress-bar.css-mistica.js +6 -6
  64. package/dist/radio-button.css-mistica.js +19 -19
  65. package/dist/rating.css-mistica.js +2 -2
  66. package/dist/responsive-layout.css-mistica.js +6 -6
  67. package/dist/screen-reader-only.css-mistica.js +1 -1
  68. package/dist/select.css-mistica.js +15 -15
  69. package/dist/sheet-action-row.css-mistica.js +1 -1
  70. package/dist/sheet-common.css-mistica.js +1 -1
  71. package/dist/sheet-info.css-mistica.js +1 -1
  72. package/dist/skeletons.css-mistica.js +6 -6
  73. package/dist/skins/skin-contract.css-mistica.js +684 -684
  74. package/dist/skip-link.css-mistica.js +1 -1
  75. package/dist/slider.css-mistica.js +18 -18
  76. package/dist/snackbar.css-mistica.js +4 -4
  77. package/dist/spinner.css-mistica.js +1 -1
  78. package/dist/square.css-mistica.js +1 -1
  79. package/dist/stack.css-mistica.js +5 -5
  80. package/dist/stacking-group.css-mistica.js +1 -1
  81. package/dist/stepper.css-mistica.js +2 -2
  82. package/dist/switch-component.css-mistica.js +35 -35
  83. package/dist/table.css-mistica.js +9 -9
  84. package/dist/tabs.css-mistica.js +17 -17
  85. package/dist/tag.css-mistica.js +1 -1
  86. package/dist/text-field-base.css-mistica.js +15 -15
  87. package/dist/text-field-components.css-mistica.js +3 -3
  88. package/dist/text-link.css-mistica.js +6 -6
  89. package/dist/text.css-mistica.js +6 -6
  90. package/dist/theme-context.css-mistica.js +1 -1
  91. package/dist/timeline.css-mistica.js +9 -9
  92. package/dist/timer.css-mistica.js +6 -6
  93. package/dist/tooltip.css-mistica.js +1 -1
  94. package/dist/touchable.css-mistica.js +1 -1
  95. package/dist/utils/aspect-ratio-support.css-mistica.js +2 -2
  96. package/dist/video.css-mistica.js +1 -1
  97. package/dist/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  98. package/dist-es/accordion.css-mistica.js +6 -6
  99. package/dist-es/align.css-mistica.js +1 -1
  100. package/dist-es/autocomplete.css-mistica.js +1 -1
  101. package/dist-es/avatar.css-mistica.js +1 -1
  102. package/dist-es/badge.css-mistica.js +1 -1
  103. package/dist-es/box.css-mistica.js +13 -13
  104. package/dist-es/boxed.css-mistica.js +23 -23
  105. package/dist-es/button-fixed-footer-layout.js +12 -11
  106. package/dist-es/button-group.css-mistica.js +1 -1
  107. package/dist-es/button-layout.css-mistica.js +14 -14
  108. package/dist-es/button.css-mistica.js +30 -30
  109. package/dist-es/callout.css-mistica.js +11 -11
  110. package/dist-es/card-internal.css-mistica.js +15 -15
  111. package/dist-es/carousel.css-mistica.js +8 -8
  112. package/dist-es/checkbox.css-mistica.js +11 -11
  113. package/dist-es/chip.css-mistica.js +15 -15
  114. package/dist-es/circle.css-mistica.js +1 -1
  115. package/dist-es/community/advanced-data-card.css-mistica.js +6 -6
  116. package/dist-es/community/blocks.css-mistica.js +1 -1
  117. package/dist-es/community/example-component.css-mistica.js +1 -1
  118. package/dist-es/counter.css-mistica.js +1 -1
  119. package/dist-es/cover-hero.css-mistica.js +2 -2
  120. package/dist-es/credit-card-number-field.css-mistica.js +3 -3
  121. package/dist-es/date-field.css-mistica.js +1 -1
  122. package/dist-es/date-time-picker.css-mistica.js +1 -1
  123. package/dist-es/dialog.css-mistica.js +4 -4
  124. package/dist-es/divider.css-mistica.js +5 -5
  125. package/dist-es/double-field.css-mistica.js +2 -2
  126. package/dist-es/drawer.css-mistica.js +1 -1
  127. package/dist-es/empty-state-card.css-mistica.js +1 -1
  128. package/dist-es/empty-state.css-mistica.js +5 -5
  129. package/dist-es/fade-in.css-mistica.js +1 -1
  130. package/dist-es/feedback.css-mistica.js +1 -1
  131. package/dist-es/file-upload.css-mistica.js +7 -7
  132. package/dist-es/fixed-footer-layout.css-mistica.js +2 -2
  133. package/dist-es/fixed-footer-layout.js +57 -56
  134. package/dist-es/form.css-mistica.js +1 -1
  135. package/dist-es/grid-layout.css-mistica.js +3 -3
  136. package/dist-es/grid.css-mistica.js +120 -120
  137. package/dist-es/header.css-mistica.js +1 -1
  138. package/dist-es/hero.css-mistica.js +2 -2
  139. package/dist-es/horizontal-scroll.css-mistica.js +1 -1
  140. package/dist-es/icon-button.css-mistica.js +53 -53
  141. package/dist-es/icons/icon-chevron.css-mistica.js +2 -2
  142. package/dist-es/icons/icon-error.css-mistica.js +1 -1
  143. package/dist-es/image.css-mistica.js +2 -2
  144. package/dist-es/image.js +8 -1
  145. package/dist-es/inline.css-mistica.js +9 -9
  146. package/dist-es/list.css-mistica.js +1 -1
  147. package/dist-es/loading-bar.css-mistica.js +1 -1
  148. package/dist-es/loading-screen.css-mistica.js +4 -4
  149. package/dist-es/logo.css-mistica.js +5 -5
  150. package/dist-es/menu.css-mistica.js +13 -13
  151. package/dist-es/mosaic.css-mistica.js +1 -1
  152. package/dist-es/navigation-bar.css-mistica.js +18 -18
  153. package/dist-es/navigation-breadcrumbs.css-mistica.js +1 -1
  154. package/dist-es/package-version.js +1 -1
  155. package/dist-es/pin-field.css-mistica.js +1 -1
  156. package/dist-es/popover.css-mistica.js +1 -1
  157. package/dist-es/progress-bar.css-mistica.js +6 -6
  158. package/dist-es/radio-button.css-mistica.js +19 -19
  159. package/dist-es/rating.css-mistica.js +2 -2
  160. package/dist-es/responsive-layout.css-mistica.js +6 -6
  161. package/dist-es/screen-reader-only.css-mistica.js +1 -1
  162. package/dist-es/select.css-mistica.js +15 -15
  163. package/dist-es/sheet-action-row.css-mistica.js +1 -1
  164. package/dist-es/sheet-common.css-mistica.js +1 -1
  165. package/dist-es/sheet-info.css-mistica.js +1 -1
  166. package/dist-es/skeletons.css-mistica.js +6 -6
  167. package/dist-es/skins/skin-contract.css-mistica.js +684 -684
  168. package/dist-es/skip-link.css-mistica.js +1 -1
  169. package/dist-es/slider.css-mistica.js +18 -18
  170. package/dist-es/snackbar.css-mistica.js +4 -4
  171. package/dist-es/spinner.css-mistica.js +1 -1
  172. package/dist-es/square.css-mistica.js +1 -1
  173. package/dist-es/stack.css-mistica.js +5 -5
  174. package/dist-es/stacking-group.css-mistica.js +1 -1
  175. package/dist-es/stepper.css-mistica.js +2 -2
  176. package/dist-es/style.css +1 -1
  177. package/dist-es/switch-component.css-mistica.js +35 -35
  178. package/dist-es/table.css-mistica.js +9 -9
  179. package/dist-es/tabs.css-mistica.js +17 -17
  180. package/dist-es/tag.css-mistica.js +1 -1
  181. package/dist-es/text-field-base.css-mistica.js +15 -15
  182. package/dist-es/text-field-components.css-mistica.js +3 -3
  183. package/dist-es/text-link.css-mistica.js +6 -6
  184. package/dist-es/text.css-mistica.js +6 -6
  185. package/dist-es/theme-context.css-mistica.js +1 -1
  186. package/dist-es/timeline.css-mistica.js +9 -9
  187. package/dist-es/timer.css-mistica.js +6 -6
  188. package/dist-es/tooltip.css-mistica.js +1 -1
  189. package/dist-es/touchable.css-mistica.js +1 -1
  190. package/dist-es/utils/aspect-ratio-support.css-mistica.js +2 -2
  191. package/dist-es/video.css-mistica.js +1 -1
  192. package/dist-es/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  193. package/doc/llms.md +11 -0
  194. package/package.json +13 -1
  195. package/src/accordion.css.ts +121 -0
  196. package/src/accordion.tsx +366 -0
  197. package/src/align.css.ts +7 -0
  198. package/src/align.tsx +32 -0
  199. package/src/autocomplete.css.ts +62 -0
  200. package/src/autocomplete.tsx +239 -0
  201. package/src/avatar.css.ts +14 -0
  202. package/src/avatar.tsx +120 -0
  203. package/src/badge.css.ts +51 -0
  204. package/src/badge.tsx +79 -0
  205. package/src/box.css.ts +51 -0
  206. package/src/box.tsx +114 -0
  207. package/src/boxed.css.ts +132 -0
  208. package/src/boxed.tsx +153 -0
  209. package/src/button-fixed-footer-layout.tsx +65 -0
  210. package/src/button-group.css.ts +75 -0
  211. package/src/button-group.tsx +91 -0
  212. package/src/button-layout.css.ts +162 -0
  213. package/src/button-layout.tsx +91 -0
  214. package/src/button.css.ts +758 -0
  215. package/src/button.tsx +632 -0
  216. package/src/callout.css.ts +50 -0
  217. package/src/callout.tsx +147 -0
  218. package/src/card-cover.tsx +242 -0
  219. package/src/card-data.tsx +152 -0
  220. package/src/card-internal.css.ts +271 -0
  221. package/src/card-internal.tsx +1724 -0
  222. package/src/card-media.tsx +157 -0
  223. package/src/card-naked.tsx +63 -0
  224. package/src/carousel.css.ts +522 -0
  225. package/src/carousel.tsx +1300 -0
  226. package/src/checkbox.css.ts +94 -0
  227. package/src/checkbox.tsx +192 -0
  228. package/src/chip.css.ts +204 -0
  229. package/src/chip.tsx +191 -0
  230. package/src/circle.css.ts +14 -0
  231. package/src/circle.tsx +52 -0
  232. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-button-and-link-footer-image-false-1-snap.png +0 -0
  233. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-button-and-link-footer-image-true-1-snap.png +0 -0
  234. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-button-footer-image-false-1-snap.png +0 -0
  235. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-button-footer-image-true-1-snap.png +0 -0
  236. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-link-footer-image-false-1-snap.png +0 -0
  237. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-link-footer-image-true-1-snap.png +0 -0
  238. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-none-footer-image-false-1-snap.png +0 -0
  239. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-actions-none-footer-image-true-1-snap.png +0 -0
  240. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-extras-0-1-snap.png +0 -0
  241. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-extras-1-1-snap.png +0 -0
  242. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-extras-3-1-snap.png +0 -0
  243. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-extras-3-no-divider-1-snap.png +0 -0
  244. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-inside-carousel-1-snap.png +0 -0
  245. package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-without-stacking-group-with-top-actions-and-too-long-title-1-snap.png +0 -0
  246. package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-highlighted-value-block-1-snap.png +0 -0
  247. package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-information-block-1-snap.png +0 -0
  248. package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-progress-block-1-snap.png +0 -0
  249. package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-progress-block-2-snap.png +0 -0
  250. package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-row-block-1-snap.png +0 -0
  251. package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-simple-block-1-snap.png +0 -0
  252. package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-value-block-1-snap.png +0 -0
  253. package/src/community/__screenshot_tests__/advanced-data-card-screenshot-test.tsx +84 -0
  254. package/src/community/__screenshot_tests__/blocks-screenshot-test.tsx +72 -0
  255. package/src/community/__stories__/advanced-data-card-carousel-story.tsx +66 -0
  256. package/src/community/__stories__/advanced-data-card-story.tsx +158 -0
  257. package/src/community/__stories__/blocks-story.tsx +272 -0
  258. package/src/community/__stories__/example-component-story.tsx +15 -0
  259. package/src/community/__stories__/index-story.tsx +154 -0
  260. package/src/community/__type_tests__/advanced-data-card-type-test.tsx +40 -0
  261. package/src/community/advanced-data-card.css.ts +271 -0
  262. package/src/community/advanced-data-card.tsx +431 -0
  263. package/src/community/blocks.css.ts +12 -0
  264. package/src/community/blocks.tsx +290 -0
  265. package/src/community/example-component.css.ts +7 -0
  266. package/src/community/example-component.tsx +17 -0
  267. package/src/community/index.tsx +10 -0
  268. package/src/counter.css.ts +150 -0
  269. package/src/counter.tsx +215 -0
  270. package/src/cover-hero-media.tsx +39 -0
  271. package/src/cover-hero.css.ts +133 -0
  272. package/src/cover-hero.tsx +262 -0
  273. package/src/credit-card-expiration-field.tsx +187 -0
  274. package/src/credit-card-fields.tsx +56 -0
  275. package/src/credit-card-number-field.css.ts +47 -0
  276. package/src/credit-card-number-field.tsx +245 -0
  277. package/src/cvv-field.tsx +169 -0
  278. package/src/date-field.css.ts +14 -0
  279. package/src/date-field.tsx +130 -0
  280. package/src/date-time-field.tsx +141 -0
  281. package/src/date-time-picker.css.ts +126 -0
  282. package/src/date-time-picker.tsx +188 -0
  283. package/src/decimal-field.tsx +160 -0
  284. package/src/desktop-container-type-context.tsx +15 -0
  285. package/src/dialog-context.tsx +81 -0
  286. package/src/dialog.css.ts +155 -0
  287. package/src/dialog.tsx +423 -0
  288. package/src/divider.css.ts +10 -0
  289. package/src/divider.tsx +11 -0
  290. package/src/double-field.css.ts +33 -0
  291. package/src/double-field.tsx +71 -0
  292. package/src/drawer.css.ts +123 -0
  293. package/src/drawer.tsx +304 -0
  294. package/src/email-field.tsx +76 -0
  295. package/src/empty-state-card.css.ts +40 -0
  296. package/src/empty-state-card.tsx +92 -0
  297. package/src/empty-state.css.ts +119 -0
  298. package/src/empty-state.tsx +141 -0
  299. package/src/fade-in.css.ts +12 -0
  300. package/src/fade-in.tsx +40 -0
  301. package/src/feedback.css.ts +119 -0
  302. package/src/feedback.tsx +432 -0
  303. package/src/file-upload.css.ts +156 -0
  304. package/src/file-upload.tsx +612 -0
  305. package/src/fixed-footer-layout.css.ts +96 -0
  306. package/src/fixed-footer-layout.tsx +227 -0
  307. package/src/fixed-to-top.tsx +21 -0
  308. package/src/focus-trap.tsx +17 -0
  309. package/src/form-context.tsx +198 -0
  310. package/src/form.css.ts +5 -0
  311. package/src/form.tsx +287 -0
  312. package/src/grid-layout.css.ts +68 -0
  313. package/src/grid-layout.tsx +201 -0
  314. package/src/grid.css.ts +203 -0
  315. package/src/grid.tsx +241 -0
  316. package/src/header.css.ts +30 -0
  317. package/src/header.tsx +319 -0
  318. package/src/hero.css.ts +71 -0
  319. package/src/hero.tsx +318 -0
  320. package/src/hooks.tsx +313 -0
  321. package/src/horizontal-scroll.css.ts +43 -0
  322. package/src/horizontal-scroll.tsx +18 -0
  323. package/src/iban-field.tsx +218 -0
  324. package/src/icon-button.css.ts +561 -0
  325. package/src/icon-button.tsx +221 -0
  326. package/src/icons/__stories__/mistica-icons-story.tsx +192 -0
  327. package/src/icons/icon-amex.tsx +40 -0
  328. package/src/icons/icon-chevron.css.ts +23 -0
  329. package/src/icons/icon-chevron.tsx +150 -0
  330. package/src/icons/icon-cvv-amex.tsx +31 -0
  331. package/src/icons/icon-cvv-visa-mc.tsx +31 -0
  332. package/src/icons/icon-error.css.ts +27 -0
  333. package/src/icons/icon-error.tsx +207 -0
  334. package/src/icons/icon-info.tsx +86 -0
  335. package/src/icons/icon-mastercard.tsx +36 -0
  336. package/src/icons/icon-success-vivo-new.tsx +51 -0
  337. package/src/icons/icon-success-vivo.tsx +36 -0
  338. package/src/icons/icon-success.tsx +211 -0
  339. package/src/icons/icon-visa.tsx +32 -0
  340. package/src/image.css.ts +48 -0
  341. package/src/image.tsx +352 -0
  342. package/src/index.tsx +2466 -0
  343. package/src/inline.css.ts +131 -0
  344. package/src/inline.tsx +135 -0
  345. package/src/integer-field.tsx +93 -0
  346. package/src/list.css.ts +281 -0
  347. package/src/list.tsx +963 -0
  348. package/src/loading-bar.css.ts +69 -0
  349. package/src/loading-bar.tsx +25 -0
  350. package/src/loading-screen.css.ts +114 -0
  351. package/src/loading-screen.tsx +376 -0
  352. package/src/logo-blau-shell.tsx +30 -0
  353. package/src/logo-blau.tsx +60 -0
  354. package/src/logo-common.tsx +29 -0
  355. package/src/logo-esimflag-shell.tsx +30 -0
  356. package/src/logo-esimflag.tsx +56 -0
  357. package/src/logo-movistar-new-shell.tsx +30 -0
  358. package/src/logo-movistar-new.tsx +85 -0
  359. package/src/logo-movistar-shell.tsx +30 -0
  360. package/src/logo-movistar.tsx +63 -0
  361. package/src/logo-o2-new-shell.tsx +26 -0
  362. package/src/logo-o2-new.tsx +27 -0
  363. package/src/logo-o2-shell.tsx +26 -0
  364. package/src/logo-o2.tsx +27 -0
  365. package/src/logo-telefonica-shell.tsx +30 -0
  366. package/src/logo-telefonica.tsx +95 -0
  367. package/src/logo-tu-shell.tsx +26 -0
  368. package/src/logo-tu.tsx +28 -0
  369. package/src/logo-vivo-shell.tsx +30 -0
  370. package/src/logo-vivo.tsx +53 -0
  371. package/src/logo.css.ts +33 -0
  372. package/src/logo.tsx +313 -0
  373. package/src/master-detail-layout.tsx +28 -0
  374. package/src/maybe-dismissable.css.ts +37 -0
  375. package/src/maybe-dismissable.tsx +58 -0
  376. package/src/media-queries.css.ts +67 -0
  377. package/src/menu.css.ts +132 -0
  378. package/src/menu.tsx +468 -0
  379. package/src/meter.tsx +516 -0
  380. package/src/modal-context-provider.tsx +45 -0
  381. package/src/month-field.tsx +124 -0
  382. package/src/mosaic.css.ts +73 -0
  383. package/src/mosaic.tsx +205 -0
  384. package/src/navigation-bar.css.ts +558 -0
  385. package/src/navigation-bar.tsx +1637 -0
  386. package/src/navigation-breadcrumbs.css.ts +22 -0
  387. package/src/navigation-breadcrumbs.tsx +69 -0
  388. package/src/negative-box.tsx +15 -0
  389. package/src/nestable-context.tsx +139 -0
  390. package/src/overlay.tsx +86 -0
  391. package/src/overscroll-color-context.tsx +141 -0
  392. package/src/package-version.tsx +2 -0
  393. package/src/password-field.tsx +126 -0
  394. package/src/phone-number-field-lite.tsx +265 -0
  395. package/src/phone-number-field.tsx +171 -0
  396. package/src/pin-field.css.ts +90 -0
  397. package/src/pin-field.tsx +346 -0
  398. package/src/placeholder.tsx +41 -0
  399. package/src/popover.css.ts +8 -0
  400. package/src/popover.tsx +85 -0
  401. package/src/portal.tsx +43 -0
  402. package/src/progress-bar.css.ts +61 -0
  403. package/src/progress-bar.tsx +174 -0
  404. package/src/radio-button.css.ts +174 -0
  405. package/src/radio-button.tsx +322 -0
  406. package/src/rating.css.ts +128 -0
  407. package/src/rating.tsx +351 -0
  408. package/src/responsive-layout.css.ts +162 -0
  409. package/src/responsive-layout.tsx +106 -0
  410. package/src/screen-reader-only.css.ts +27 -0
  411. package/src/screen-reader-only.tsx +33 -0
  412. package/src/screen-size-context-provider.tsx +96 -0
  413. package/src/screen-size-context.tsx +23 -0
  414. package/src/search-field.tsx +126 -0
  415. package/src/select.css.ts +226 -0
  416. package/src/select.tsx +513 -0
  417. package/src/sheet-action-row.css.ts +33 -0
  418. package/src/sheet-actions-list.tsx +113 -0
  419. package/src/sheet-actions.tsx +95 -0
  420. package/src/sheet-common.css.ts +254 -0
  421. package/src/sheet-common.tsx +402 -0
  422. package/src/sheet-info.css.ts +19 -0
  423. package/src/sheet-info.tsx +127 -0
  424. package/src/sheet-native.tsx +189 -0
  425. package/src/sheet-radio-list.tsx +118 -0
  426. package/src/sheet-root.tsx +127 -0
  427. package/src/sheet-types.tsx +94 -0
  428. package/src/sheet-web.tsx +140 -0
  429. package/src/skeleton-base.tsx +38 -0
  430. package/src/skeletons.css.ts +56 -0
  431. package/src/skeletons.tsx +133 -0
  432. package/src/skins/blau.tsx +724 -0
  433. package/src/skins/constants.tsx +10 -0
  434. package/src/skins/defaults.tsx +104 -0
  435. package/src/skins/esimflag.tsx +728 -0
  436. package/src/skins/movistar-new.tsx +735 -0
  437. package/src/skins/movistar.tsx +740 -0
  438. package/src/skins/o2-new.tsx +731 -0
  439. package/src/skins/o2.tsx +727 -0
  440. package/src/skins/skin-contract.css.ts +380 -0
  441. package/src/skins/telefonica.tsx +768 -0
  442. package/src/skins/tu.tsx +741 -0
  443. package/src/skins/types/colors.tsx +286 -0
  444. package/src/skins/types/index.tsx +153 -0
  445. package/src/skins/utils.tsx +66 -0
  446. package/src/skins/vivo-new.tsx +745 -0
  447. package/src/skins/vivo.tsx +720 -0
  448. package/src/skip-link.css.ts +34 -0
  449. package/src/skip-link.tsx +52 -0
  450. package/src/slider.css.ts +181 -0
  451. package/src/slider.tsx +384 -0
  452. package/src/snackbar-context.tsx +98 -0
  453. package/src/snackbar-native.ts +37 -0
  454. package/src/snackbar.css.ts +176 -0
  455. package/src/snackbar.tsx +258 -0
  456. package/src/spinner.css.ts +66 -0
  457. package/src/spinner.tsx +136 -0
  458. package/src/sprinkles.css.ts +83 -0
  459. package/src/square.css.ts +15 -0
  460. package/src/square.tsx +55 -0
  461. package/src/stack.css.ts +44 -0
  462. package/src/stack.tsx +79 -0
  463. package/src/stacking-group.css.ts +15 -0
  464. package/src/stacking-group.tsx +82 -0
  465. package/src/stepper.css.ts +233 -0
  466. package/src/stepper.tsx +156 -0
  467. package/src/switch-component.css.ts +181 -0
  468. package/src/switch-component.tsx +187 -0
  469. package/src/tab-focus.tsx +68 -0
  470. package/src/table-actions-header.tsx +21 -0
  471. package/src/table-cell-text.tsx +35 -0
  472. package/src/table.css.ts +297 -0
  473. package/src/table.tsx +398 -0
  474. package/src/tabs.css.ts +212 -0
  475. package/src/tabs.tsx +263 -0
  476. package/src/tag.css.ts +42 -0
  477. package/src/tag.tsx +161 -0
  478. package/src/test-utils/environment/setup-ssr.tsx +10 -0
  479. package/src/test-utils/fail-test-on-console-error.tsx +22 -0
  480. package/src/test-utils/index.tsx +341 -0
  481. package/src/test-utils/setup-ssr-test-env.tsx +13 -0
  482. package/src/test-utils/ssr.tsx +197 -0
  483. package/src/text-field-base.css.ts +416 -0
  484. package/src/text-field-base.tsx +628 -0
  485. package/src/text-field-components.css.ts +165 -0
  486. package/src/text-field-components.tsx +230 -0
  487. package/src/text-field.tsx +118 -0
  488. package/src/text-link.css.ts +83 -0
  489. package/src/text-link.tsx +85 -0
  490. package/src/text-tokens.tsx +708 -0
  491. package/src/text.css.ts +60 -0
  492. package/src/text.tsx +516 -0
  493. package/src/theme-context-provider.tsx +370 -0
  494. package/src/theme-context.css.ts +3 -0
  495. package/src/theme-context.tsx +8 -0
  496. package/src/theme-variant-context.tsx +51 -0
  497. package/src/theme.tsx +184 -0
  498. package/src/time-field.tsx +99 -0
  499. package/src/timeline.css.ts +135 -0
  500. package/src/timeline.tsx +250 -0
  501. package/src/timer.css.ts +99 -0
  502. package/src/timer.tsx +420 -0
  503. package/src/title.tsx +119 -0
  504. package/src/tooltip-context-provider.tsx +57 -0
  505. package/src/tooltip.css.ts +106 -0
  506. package/src/tooltip.tsx +649 -0
  507. package/src/touchable.css.ts +56 -0
  508. package/src/touchable.tsx +355 -0
  509. package/src/types/font-face.d.ts +47 -0
  510. package/src/types/libs.d.ts +3 -0
  511. package/src/utils/__tests__/analytics-test.tsx +35 -0
  512. package/src/utils/__tests__/browser-test.tsx +28 -0
  513. package/src/utils/__tests__/dom-test.tsx +23 -0
  514. package/src/utils/__tests__/helpers-test.tsx +166 -0
  515. package/src/utils/analytics.tsx +28 -0
  516. package/src/utils/animation.tsx +201 -0
  517. package/src/utils/aspect-ratio-support.css.ts +28 -0
  518. package/src/utils/aspect-ratio-support.tsx +141 -0
  519. package/src/utils/browser.tsx +9 -0
  520. package/src/utils/color.tsx +46 -0
  521. package/src/utils/common.tsx +27 -0
  522. package/src/utils/credit-card.tsx +46 -0
  523. package/src/utils/css.tsx +25 -0
  524. package/src/utils/document-visibility.tsx +52 -0
  525. package/src/utils/dom.tsx +155 -0
  526. package/src/utils/environment.tsx +6 -0
  527. package/src/utils/headings.tsx +18 -0
  528. package/src/utils/helpers.tsx +182 -0
  529. package/src/utils/keys.tsx +8 -0
  530. package/src/utils/locale.tsx +27 -0
  531. package/src/utils/platform.tsx +94 -0
  532. package/src/utils/region-code.tsx +1 -0
  533. package/src/utils/renders-element.tsx +6 -0
  534. package/src/utils/time.tsx +22 -0
  535. package/src/utils/types.tsx +19 -0
  536. package/src/utils/utility-types.tsx +8 -0
  537. package/src/video.css.ts +11 -0
  538. package/src/video.tsx +355 -0
  539. package/src/vivinho-loading-animation/in-lottie.json +402 -0
  540. package/src/vivinho-loading-animation/index.tsx +90 -0
  541. package/src/vivinho-loading-animation/out-lottie.json +575 -0
  542. package/src/vivinho-loading-animation/pulse-lottie.json +551 -0
  543. package/src/vivinho-loading-animation/vivinho-loading-animation.css.ts +15 -0
  544. package/src/vivinho-loading-animation/wave-lottie.json +2829 -0
@@ -0,0 +1,189 @@
1
+ import type {
2
+ NativeSheetImplementation,
3
+ SheetPropsByType,
4
+ SheetResultByType,
5
+ SheetType,
6
+ SheetTypeWithProps,
7
+ SheetTypeWithPropsUnion,
8
+ } from './sheet-types';
9
+
10
+ const normalizeDescriptionForNative = (description?: string | Array<string>): string | undefined => {
11
+ if (Array.isArray(description)) {
12
+ if (description.length) {
13
+ return description.join('\n\n');
14
+ } else {
15
+ return undefined;
16
+ }
17
+ }
18
+ return description;
19
+ };
20
+
21
+ const showRadioListNativeSheet = (
22
+ nativeSheetImplementation: NativeSheetImplementation,
23
+ {title, subtitle, description, selectedId, items}: SheetPropsByType['RADIO_LIST']
24
+ ): Promise<SheetResultByType['RADIO_LIST']> => {
25
+ return (nativeSheetImplementation as NativeSheetImplementation)({
26
+ title,
27
+ subtitle,
28
+ // TODO: add multiline support to native sheet
29
+ description: normalizeDescriptionForNative(description),
30
+ content: [
31
+ {
32
+ type: 'LIST',
33
+ id: 'list-0',
34
+ listType: 'SINGLE_SELECTION',
35
+ autoSubmit: true,
36
+ selectedIds: typeof selectedId === 'string' ? [selectedId] : [],
37
+ items,
38
+ },
39
+ ],
40
+ }).then(({action, result}) => {
41
+ if (action === 'SUBMIT') {
42
+ return {
43
+ action,
44
+ selectedId: result[0].selectedIds[0],
45
+ };
46
+ } else {
47
+ return {
48
+ action,
49
+ selectedId: null,
50
+ };
51
+ }
52
+ });
53
+ };
54
+
55
+ const showActionsListNativeSheet = (
56
+ nativeSheetImplementation: NativeSheetImplementation,
57
+ {title, subtitle, description, items}: SheetPropsByType['ACTIONS_LIST']
58
+ ): Promise<SheetResultByType['ACTIONS_LIST']> => {
59
+ return (nativeSheetImplementation as NativeSheetImplementation)({
60
+ title,
61
+ subtitle,
62
+ // TODO: add multiline support to native sheet
63
+ description: normalizeDescriptionForNative(description),
64
+ content: [
65
+ {
66
+ type: 'LIST',
67
+ id: 'list-0',
68
+ listType: 'ACTIONS',
69
+ autoSubmit: true,
70
+ selectedIds: [],
71
+ items,
72
+ },
73
+ ],
74
+ }).then(({action, result}) => {
75
+ if (action === 'SUBMIT') {
76
+ return {
77
+ action,
78
+ selectedId: result[0].selectedIds[0],
79
+ };
80
+ } else {
81
+ return {
82
+ action,
83
+ selectedId: null,
84
+ };
85
+ }
86
+ });
87
+ };
88
+
89
+ const showInfoNativeSheet = async (
90
+ nativeSheetImplementation: NativeSheetImplementation,
91
+ {title, subtitle, description, items, button}: SheetPropsByType['INFO']
92
+ ): Promise<SheetResultByType['INFO']> => {
93
+ const infoSheetContent = {
94
+ type: 'LIST' as const,
95
+ id: 'list-0',
96
+ listType: 'INFORMATIVE' as const,
97
+ autoSubmit: false,
98
+ selectedIds: [],
99
+ items,
100
+ };
101
+
102
+ return await (nativeSheetImplementation as NativeSheetImplementation)({
103
+ title,
104
+ subtitle,
105
+ // TODO: add multiline support to native sheet
106
+ description: normalizeDescriptionForNative(description),
107
+ content: button
108
+ ? [
109
+ infoSheetContent,
110
+ {
111
+ type: 'BOTTOM_ACTIONS',
112
+ id: 'bottom-actions-0',
113
+ button,
114
+ },
115
+ ]
116
+ : [infoSheetContent],
117
+ }).then(() => ({
118
+ // this is an informative sheet, it can only be dismissed
119
+ action: 'DISMISS',
120
+ }));
121
+ };
122
+
123
+ const showActionsNativeSheet = (
124
+ nativeSheetImplementation: NativeSheetImplementation,
125
+ {title, subtitle, description, button, secondaryButton, link}: SheetPropsByType['ACTIONS']
126
+ ): Promise<SheetResultByType['ACTIONS']> => {
127
+ return (nativeSheetImplementation as NativeSheetImplementation)({
128
+ title,
129
+ subtitle,
130
+ // TODO: add multiline support to native sheet
131
+ description: normalizeDescriptionForNative(description),
132
+ content: [
133
+ {
134
+ type: 'BOTTOM_ACTIONS',
135
+ id: 'bottom-actions-0',
136
+ button,
137
+ secondaryButton,
138
+ link,
139
+ },
140
+ ],
141
+ }).then(({action, result}) => {
142
+ if (action === 'SUBMIT') {
143
+ const bottomActionsResult = result.find(({id}) => id === 'bottom-actions-0');
144
+ const pressedAction = bottomActionsResult?.selectedIds[0];
145
+ if (pressedAction === 'PRIMARY' || pressedAction === 'SECONDARY' || pressedAction === 'LINK') {
146
+ return {
147
+ action: pressedAction,
148
+ };
149
+ }
150
+ }
151
+ return {
152
+ action: 'DISMISS',
153
+ };
154
+ });
155
+ };
156
+
157
+ export const showNativeSheet = <T extends SheetType>(
158
+ nativeSheetImplementation: NativeSheetImplementation,
159
+ sheetProps: SheetTypeWithProps<T>
160
+ ): Promise<SheetResultByType[T]> => {
161
+ let nativeResponse: Promise<SheetResultByType[T]>;
162
+ const {type, props} = sheetProps as SheetTypeWithPropsUnion;
163
+ switch (type) {
164
+ case 'INFO':
165
+ nativeResponse = showInfoNativeSheet(nativeSheetImplementation, props) as Promise<
166
+ SheetResultByType[T]
167
+ >;
168
+ break;
169
+ case 'ACTIONS_LIST':
170
+ nativeResponse = showActionsListNativeSheet(nativeSheetImplementation, props) as Promise<
171
+ SheetResultByType[T]
172
+ >;
173
+ break;
174
+ case 'RADIO_LIST':
175
+ nativeResponse = showRadioListNativeSheet(nativeSheetImplementation, props) as Promise<
176
+ SheetResultByType[T]
177
+ >;
178
+ break;
179
+ case 'ACTIONS':
180
+ nativeResponse = showActionsNativeSheet(nativeSheetImplementation, props) as Promise<
181
+ SheetResultByType[T]
182
+ >;
183
+ break;
184
+ default:
185
+ const unknownType: never = type;
186
+ throw new Error(`Unknown sheet type: ${unknownType}`);
187
+ }
188
+ return nativeResponse;
189
+ };
@@ -0,0 +1,118 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import Sheet, {SheetBody} from './sheet-common';
4
+ import {useScreenSize, useTheme} from './hooks';
5
+ import NegativeBox from './negative-box';
6
+ import {ButtonPrimary} from './button';
7
+ import {RadioGroup} from './radio-button';
8
+ import {Row, RowList} from './list';
9
+ import * as tokens from './text-tokens';
10
+ import Tag from './tag';
11
+
12
+ import type {TagType} from './tag';
13
+ import type {DataAttributes} from './utils/types';
14
+
15
+ type RadioListSheetProps = {
16
+ title?: string;
17
+ subtitle?: string;
18
+ description?: string | ReadonlyArray<string>;
19
+ items: ReadonlyArray<{
20
+ id: string;
21
+ tag?: {
22
+ type?: TagType;
23
+ text: string;
24
+ };
25
+ title?: string;
26
+ description?: string;
27
+ asset?: React.ReactNode;
28
+ }>;
29
+ selectedId?: string;
30
+ onClose?: () => void;
31
+ onSelect?: (id: string) => void;
32
+ dataAttributes?: DataAttributes;
33
+ button?: {
34
+ text: string;
35
+ };
36
+ };
37
+
38
+ const RadioListSheet = React.forwardRef<HTMLDivElement, RadioListSheetProps>(
39
+ ({title, subtitle, description, items, selectedId, onClose, onSelect, button, dataAttributes}, ref) => {
40
+ const [selectedItemId, setSelectedItemId] = React.useState(selectedId);
41
+ const hasSelectedRef = React.useRef(false);
42
+ const {isDesktopOrBigger} = useScreenSize();
43
+ const {texts, t} = useTheme();
44
+
45
+ return (
46
+ <Sheet
47
+ onClose={onClose}
48
+ ref={ref}
49
+ dataAttributes={{'component-name': 'RadioListSheet', ...dataAttributes}}
50
+ >
51
+ {({closeModal, modalTitleId}) => (
52
+ <SheetBody
53
+ title={title}
54
+ subtitle={subtitle}
55
+ description={description}
56
+ modalTitleId={modalTitleId}
57
+ button={
58
+ isDesktopOrBigger ? (
59
+ <ButtonPrimary
60
+ onPress={() => {
61
+ if (hasSelectedRef.current) {
62
+ onSelect?.(selectedItemId || '');
63
+ }
64
+ closeModal();
65
+ }}
66
+ >
67
+ {button?.text || texts.sheetConfirmButton || t(tokens.sheetConfirmButton)}
68
+ </ButtonPrimary>
69
+ ) : undefined
70
+ }
71
+ >
72
+ <NegativeBox>
73
+ <RadioGroup
74
+ aria-labelledby={modalTitleId}
75
+ name="sheetselection"
76
+ value={selectedItemId}
77
+ onChange={(value) => {
78
+ setSelectedItemId(value);
79
+ hasSelectedRef.current = true;
80
+
81
+ // In desktop, the modal is closed with the ButtonPrimary
82
+ if (isDesktopOrBigger) {
83
+ return;
84
+ }
85
+
86
+ onSelect?.(value);
87
+ // Wait for radio animation to finish before closing the modal
88
+ setTimeout(() => {
89
+ closeModal();
90
+ }, 200);
91
+ }}
92
+ >
93
+ <RowList>
94
+ {items.map((item) => (
95
+ <Row
96
+ key={item.id}
97
+ headline={
98
+ item.tag ? (
99
+ <Tag type={item.tag.type}>{item.tag.text}</Tag>
100
+ ) : undefined
101
+ }
102
+ title={item.title ?? ''}
103
+ description={item.description}
104
+ asset={item.asset}
105
+ radioValue={item.id}
106
+ />
107
+ ))}
108
+ </RowList>
109
+ </RadioGroup>
110
+ </NegativeBox>
111
+ </SheetBody>
112
+ )}
113
+ </Sheet>
114
+ );
115
+ }
116
+ );
117
+
118
+ export default RadioListSheet;
@@ -0,0 +1,127 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+
4
+ import type {
5
+ NativeSheetImplementation,
6
+ SheetPromiseResolve,
7
+ SheetResultByType,
8
+ SheetType,
9
+ SheetTypeWithProps,
10
+ SheetTypeWithPropsUnion,
11
+ } from './sheet-types';
12
+
13
+ const SheetWeb = React.lazy(
14
+ () =>
15
+ import(
16
+ /* webpackChunkName: "sheet-web" */
17
+ './sheet-web'
18
+ )
19
+ );
20
+
21
+ let nativeSheetImplementation: NativeSheetImplementation | null = null;
22
+
23
+ let configureSheet: ((sheetProps: SheetTypeWithPropsUnion) => void) | null = null;
24
+ let resolveSheetPromise: SheetPromiseResolve | null = null;
25
+
26
+ let isSheetOpen = false;
27
+ export const showSheet = <T extends SheetType>(
28
+ sheetProps: SheetTypeWithProps<T>
29
+ ): Promise<SheetResultByType[T]> => {
30
+ const activeElement = document.activeElement as HTMLElement;
31
+
32
+ const focusTriggerElement = () => {
33
+ activeElement?.focus();
34
+ };
35
+
36
+ const webImplementation = () => {
37
+ if (!configureSheet) {
38
+ return Promise.reject(
39
+ new Error('Tried to show a Sheet but the SheetRoot component was not mounted')
40
+ );
41
+ }
42
+
43
+ if (isSheetOpen) {
44
+ return Promise.reject(new Error('Tried to show a Sheet but there is already one open'));
45
+ }
46
+
47
+ isSheetOpen = true;
48
+ configureSheet(sheetProps as SheetTypeWithPropsUnion);
49
+
50
+ const sheetPromise = new Promise((resolve) => {
51
+ resolveSheetPromise = resolve;
52
+ });
53
+
54
+ sheetPromise.finally(() => {
55
+ isSheetOpen = false;
56
+ focusTriggerElement();
57
+ });
58
+
59
+ return sheetPromise as Promise<SheetResultByType[T]>;
60
+ };
61
+
62
+ if (nativeSheetImplementation) {
63
+ const impl = nativeSheetImplementation;
64
+ return import(/* webpackChunkName: "sheet-native" */ './sheet-native')
65
+ .then(({showNativeSheet}) => {
66
+ return showNativeSheet(impl, sheetProps).finally(() => {
67
+ focusTriggerElement();
68
+ });
69
+ })
70
+ .catch((error) => {
71
+ if (error.code === '400') {
72
+ // fallback to web implementation if native implementation doesn't support the sheet type
73
+ return webImplementation();
74
+ } else {
75
+ throw error;
76
+ }
77
+ });
78
+ } else {
79
+ return webImplementation();
80
+ }
81
+ };
82
+
83
+ type Props = {
84
+ nativeImplementation?: NativeSheetImplementation;
85
+ children?: React.ReactNode;
86
+ };
87
+
88
+ export const SheetRoot = (props: Props): JSX.Element => {
89
+ const [sheetProps, setSheetProps] = React.useState<SheetTypeWithPropsUnion | null>(null);
90
+
91
+ React.useEffect(() => {
92
+ if (props.nativeImplementation) {
93
+ nativeSheetImplementation = props.nativeImplementation;
94
+ return () => {
95
+ nativeSheetImplementation = null;
96
+ };
97
+ }
98
+ }, [props.nativeImplementation]);
99
+
100
+ React.useEffect(() => {
101
+ configureSheet = <T extends SheetType>(newSheetProps: SheetTypeWithProps<T>) => {
102
+ setSheetProps(newSheetProps as SheetTypeWithPropsUnion);
103
+ };
104
+ return () => {
105
+ configureSheet = null;
106
+ };
107
+ }, []);
108
+
109
+ return (
110
+ <>
111
+ {props.children}
112
+ {sheetProps && (
113
+ <React.Suspense fallback={null}>
114
+ <SheetWeb
115
+ sheetProps={sheetProps}
116
+ onResolve={(result) => {
117
+ setSheetProps(null);
118
+ resolveSheetPromise?.(result);
119
+ }}
120
+ />
121
+ </React.Suspense>
122
+ )}
123
+ </>
124
+ );
125
+ };
126
+
127
+ export default SheetRoot;
@@ -0,0 +1,94 @@
1
+ export type NativeSheetImplementation = (typeof import('@tef-novum/webview-bridge'))['bottomSheet'];
2
+
3
+ import type {TagType} from './tag';
4
+ import type {ExclusifyUnion, Id} from './utils/utility-types';
5
+
6
+ type InfoIcon = ExclusifyUnion<
7
+ | {
8
+ type: 'small' | 'regular';
9
+ url: string;
10
+ urlDark?: string;
11
+ }
12
+ | {type: 'bullet'}
13
+ >;
14
+
15
+ type SheetProps<T> = Id<
16
+ {
17
+ title?: string;
18
+ subtitle?: string;
19
+ description?: string | Array<string>;
20
+ } & T
21
+ >;
22
+
23
+ export type SheetPropsByType = {
24
+ RADIO_LIST: SheetProps<{
25
+ selectedId?: string;
26
+ items: Array<{
27
+ id: string;
28
+ tag?: {
29
+ type?: TagType;
30
+ text: string;
31
+ };
32
+ title?: string;
33
+ description?: string;
34
+ icon?: {
35
+ size?: 'small' | 'large';
36
+ url: string;
37
+ urlDark?: string;
38
+ };
39
+ }>;
40
+ }>;
41
+ ACTIONS_LIST: SheetProps<{
42
+ items: Array<{
43
+ id: string;
44
+ title: string;
45
+ style?: 'normal' | 'destructive';
46
+ icon?: {
47
+ url: string;
48
+ urlDark?: string;
49
+ };
50
+ }>;
51
+ }>;
52
+ INFO: SheetProps<{
53
+ items: Array<{
54
+ id: string;
55
+ title: string;
56
+ description?: string;
57
+ icon: InfoIcon;
58
+ }>;
59
+ button?: {
60
+ text: string;
61
+ };
62
+ }>;
63
+ ACTIONS: SheetProps<{
64
+ button: {
65
+ text: string;
66
+ };
67
+ secondaryButton?: {
68
+ text: string;
69
+ };
70
+ link?: {
71
+ text: string;
72
+ withChevron?: boolean;
73
+ };
74
+ }>;
75
+ };
76
+
77
+ export type SheetType = keyof SheetPropsByType;
78
+
79
+ export type SheetResultByType = {
80
+ RADIO_LIST: {action: 'SUBMIT'; selectedId: string} | {action: 'DISMISS'};
81
+ ACTIONS_LIST: {action: 'SUBMIT'; selectedId: string} | {action: 'DISMISS'};
82
+ INFO: {action: 'DISMISS'};
83
+ ACTIONS: {action: 'PRIMARY' | 'SECONDARY' | 'LINK' | 'DISMISS'};
84
+ };
85
+
86
+ export type SheetTypeWithProps<T extends SheetType> = Id<{type: T; props: SheetPropsByType[T]}>;
87
+
88
+ export type SheetTypeWithPropsUnion = {
89
+ [T in SheetType]: SheetTypeWithProps<T>;
90
+ }[SheetType];
91
+
92
+ export type SheetPromiseResolve = <T>(
93
+ value: T extends SheetType ? SheetResultByType[T] : 'You must provide a type parameter'
94
+ ) => void;
@@ -0,0 +1,140 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import {useTheme} from './hooks';
4
+ import Image from './image';
5
+
6
+ import type {SheetPromiseResolve, SheetTypeWithPropsUnion} from './sheet-types';
7
+
8
+ const ActionsSheet = React.lazy(
9
+ () =>
10
+ import(
11
+ /* webpackChunkName: "sheet-actions" */
12
+ './sheet-actions'
13
+ )
14
+ );
15
+
16
+ const InfoSheet = React.lazy(
17
+ () =>
18
+ import(
19
+ /* webpackChunkName: "sheet-info" */
20
+ './sheet-info'
21
+ )
22
+ );
23
+ const ActionsListSheet = React.lazy(
24
+ () =>
25
+ import(
26
+ /* webpackChunkName: "sheet-action-list" */
27
+ './sheet-actions-list'
28
+ )
29
+ );
30
+
31
+ const RadioListSheet = React.lazy(
32
+ () =>
33
+ import(
34
+ /* webpackChunkName: "sheet-radio-list" */
35
+ './sheet-radio-list'
36
+ )
37
+ );
38
+
39
+ type SheetWebProps = {
40
+ sheetProps: SheetTypeWithPropsUnion;
41
+ onResolve: SheetPromiseResolve;
42
+ };
43
+
44
+ const SheetWeb = ({sheetProps, onResolve}: SheetWebProps): JSX.Element => {
45
+ const {isDarkMode} = useTheme();
46
+ const selectionRef = React.useRef<string | null>(null);
47
+
48
+ const handleSelect = (id: string): void => {
49
+ selectionRef.current = id;
50
+ };
51
+
52
+ const handleClose = () => {
53
+ if (!onResolve) {
54
+ throw new Error('onResolve handler is not set');
55
+ }
56
+ switch (sheetProps.type) {
57
+ case 'INFO':
58
+ onResolve<'INFO'>({action: 'DISMISS'});
59
+ break;
60
+ case 'ACTIONS_LIST':
61
+ if (selectionRef.current) {
62
+ onResolve<'ACTIONS_LIST'>({
63
+ action: 'SUBMIT',
64
+ selectedId: selectionRef.current,
65
+ });
66
+ } else {
67
+ onResolve<'ACTIONS_LIST'>({action: 'DISMISS'});
68
+ }
69
+ break;
70
+ case 'RADIO_LIST':
71
+ if (selectionRef.current) {
72
+ onResolve<'RADIO_LIST'>({
73
+ action: 'SUBMIT',
74
+ selectedId: selectionRef.current,
75
+ });
76
+ } else {
77
+ onResolve<'RADIO_LIST'>({action: 'DISMISS'});
78
+ }
79
+ break;
80
+ case 'ACTIONS':
81
+ if (
82
+ selectionRef.current === 'PRIMARY' ||
83
+ selectionRef.current === 'SECONDARY' ||
84
+ selectionRef.current === 'LINK'
85
+ ) {
86
+ onResolve<'ACTIONS'>({action: selectionRef.current});
87
+ } else {
88
+ onResolve<'ACTIONS'>({action: 'DISMISS'});
89
+ }
90
+ break;
91
+ default:
92
+ // @ts-expect-error sheetProps is never
93
+ throw new Error(`Unknown sheet type: ${sheetProps.type}`);
94
+ }
95
+ selectionRef.current = null;
96
+ };
97
+
98
+ switch (sheetProps.type) {
99
+ case 'INFO':
100
+ return <InfoSheet {...sheetProps.props} onClose={handleClose} />;
101
+
102
+ case 'ACTIONS_LIST':
103
+ return <ActionsListSheet {...sheetProps.props} onClose={handleClose} onSelect={handleSelect} />;
104
+
105
+ case 'RADIO_LIST':
106
+ return (
107
+ <RadioListSheet
108
+ {...sheetProps.props}
109
+ items={sheetProps.props.items.map((item) => ({
110
+ ...item,
111
+ asset: item.icon && (
112
+ <Image
113
+ circular
114
+ src={isDarkMode && item.icon.urlDark ? item.icon.urlDark : item.icon.url}
115
+ width={item.icon.size === 'small' ? 24 : 40}
116
+ />
117
+ ),
118
+ }))}
119
+ onClose={handleClose}
120
+ onSelect={handleSelect}
121
+ />
122
+ );
123
+
124
+ case 'ACTIONS':
125
+ return (
126
+ <ActionsSheet
127
+ {...sheetProps.props}
128
+ buttonLink={sheetProps.props.link}
129
+ onClose={handleClose}
130
+ onPressButton={handleSelect}
131
+ />
132
+ );
133
+
134
+ default:
135
+ // @ts-expect-error sheetProps is never. This switch is exhaustive.
136
+ throw new Error(`Unknown sheet type: ${sheetProps.type}`);
137
+ }
138
+ };
139
+
140
+ export default SheetWeb;
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import {useThemeVariant} from './theme-variant-context';
3
+ import * as React from 'react';
4
+ import classnames from 'classnames';
5
+ import * as styles from './skeletons.css';
6
+ import {vars} from './skins/skin-contract.css';
7
+
8
+ type SkeletonBaseProps = {
9
+ width?: string | number;
10
+ height?: string | number;
11
+ radius?: string | number;
12
+ className?: string;
13
+ noBorderRadius?: boolean;
14
+ };
15
+
16
+ const SkeletonBase = ({
17
+ width = '100%',
18
+ height = 8,
19
+ radius = vars.borderRadii.container,
20
+ className,
21
+ noBorderRadius = false,
22
+ }: SkeletonBaseProps): JSX.Element => {
23
+ const variant = useThemeVariant();
24
+
25
+ return (
26
+ <div
27
+ className={classnames(className, styles.background[variant])}
28
+ style={{
29
+ borderRadius: noBorderRadius ? 0 : radius,
30
+ width,
31
+ height,
32
+ }}
33
+ aria-hidden
34
+ />
35
+ );
36
+ };
37
+
38
+ export default SkeletonBase;