@telefonica/mistica 16.59.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.
- package/css/mistica.css +1 -1
- package/dist/accordion.css-mistica.js +6 -6
- package/dist/align.css-mistica.js +1 -1
- package/dist/autocomplete.css-mistica.js +1 -1
- package/dist/avatar.css-mistica.js +1 -1
- package/dist/badge.css-mistica.js +1 -1
- package/dist/box.css-mistica.js +13 -13
- package/dist/boxed.css-mistica.js +24 -24
- package/dist/button-fixed-footer-layout.d.ts +2 -1
- package/dist/button-fixed-footer-layout.js +4 -3
- package/dist/button-group.css-mistica.js +1 -1
- package/dist/button-layout.css-mistica.js +14 -14
- package/dist/button.css-mistica.js +30 -30
- package/dist/callout.css-mistica.js +11 -11
- package/dist/card-internal.css-mistica.js +15 -15
- package/dist/carousel.css-mistica.js +8 -8
- package/dist/checkbox.css-mistica.js +11 -11
- package/dist/chip.css-mistica.js +15 -15
- package/dist/circle.css-mistica.js +1 -1
- package/dist/community/advanced-data-card.css-mistica.js +6 -6
- package/dist/community/blocks.css-mistica.js +1 -1
- package/dist/community/example-component.css-mistica.js +1 -1
- package/dist/counter.css-mistica.js +1 -1
- package/dist/cover-hero.css-mistica.js +2 -2
- package/dist/credit-card-number-field.css-mistica.js +3 -3
- package/dist/date-field.css-mistica.js +1 -1
- package/dist/date-time-picker.css-mistica.js +1 -1
- package/dist/dialog.css-mistica.js +4 -4
- package/dist/divider.css-mistica.js +5 -5
- package/dist/double-field.css-mistica.js +2 -2
- package/dist/drawer.css-mistica.js +1 -1
- package/dist/empty-state-card.css-mistica.js +1 -1
- package/dist/empty-state.css-mistica.js +5 -5
- package/dist/fade-in.css-mistica.js +1 -1
- package/dist/feedback.css-mistica.js +1 -1
- package/dist/file-upload.css-mistica.js +7 -7
- package/dist/fixed-footer-layout.css-mistica.js +2 -2
- package/dist/fixed-footer-layout.d.ts +6 -1
- package/dist/fixed-footer-layout.js +29 -28
- package/dist/form.css-mistica.js +1 -1
- package/dist/grid-layout.css-mistica.js +3 -3
- package/dist/grid.css-mistica.js +120 -120
- package/dist/header.css-mistica.js +1 -1
- package/dist/hero.css-mistica.js +2 -2
- package/dist/horizontal-scroll.css-mistica.js +1 -1
- package/dist/icon-button.css-mistica.js +53 -53
- package/dist/icons/icon-chevron.css-mistica.js +2 -2
- package/dist/icons/icon-error.css-mistica.js +1 -1
- package/dist/image.css-mistica.js +2 -2
- package/dist/image.js +8 -1
- package/dist/inline.css-mistica.js +9 -9
- package/dist/list.css-mistica.js +1 -1
- package/dist/loading-bar.css-mistica.js +1 -1
- package/dist/loading-screen.css-mistica.js +4 -4
- package/dist/logo.css-mistica.js +5 -5
- package/dist/menu.css-mistica.js +13 -13
- package/dist/mosaic.css-mistica.js +1 -1
- package/dist/navigation-bar.css-mistica.js +18 -18
- package/dist/navigation-breadcrumbs.css-mistica.js +1 -1
- package/dist/package-version.js +1 -1
- package/dist/pin-field.css-mistica.js +1 -1
- package/dist/popover.css-mistica.js +1 -1
- package/dist/progress-bar.css-mistica.js +6 -6
- package/dist/radio-button.css-mistica.js +19 -19
- package/dist/rating.css-mistica.js +2 -2
- package/dist/responsive-layout.css-mistica.js +6 -6
- package/dist/screen-reader-only.css-mistica.js +1 -1
- package/dist/select.css-mistica.js +15 -15
- package/dist/sheet-action-row.css-mistica.js +1 -1
- package/dist/sheet-common.css-mistica.js +1 -1
- package/dist/sheet-info.css-mistica.js +1 -1
- package/dist/skeletons.css-mistica.js +6 -6
- package/dist/skins/skin-contract.css-mistica.js +684 -684
- package/dist/skip-link.css-mistica.js +1 -1
- package/dist/slider.css-mistica.js +18 -18
- package/dist/snackbar.css-mistica.js +4 -4
- package/dist/spinner.css-mistica.js +1 -1
- package/dist/square.css-mistica.js +1 -1
- package/dist/stack.css-mistica.js +5 -5
- package/dist/stacking-group.css-mistica.js +1 -1
- package/dist/stepper.css-mistica.js +2 -2
- package/dist/switch-component.css-mistica.js +35 -35
- package/dist/table.css-mistica.js +9 -9
- package/dist/tabs.css-mistica.js +17 -17
- package/dist/tag.css-mistica.js +1 -1
- package/dist/text-field-base.css-mistica.js +15 -15
- package/dist/text-field-components.css-mistica.js +3 -3
- package/dist/text-link.css-mistica.js +6 -6
- package/dist/text.css-mistica.js +6 -6
- package/dist/theme-context.css-mistica.js +1 -1
- package/dist/timeline.css-mistica.js +9 -9
- package/dist/timer.css-mistica.js +6 -6
- package/dist/tooltip.css-mistica.js +1 -1
- package/dist/touchable.css-mistica.js +1 -1
- package/dist/utils/aspect-ratio-support.css-mistica.js +2 -2
- package/dist/video.css-mistica.js +1 -1
- package/dist/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
- package/dist-es/accordion.css-mistica.js +6 -6
- package/dist-es/align.css-mistica.js +1 -1
- package/dist-es/autocomplete.css-mistica.js +1 -1
- package/dist-es/avatar.css-mistica.js +1 -1
- package/dist-es/badge.css-mistica.js +1 -1
- package/dist-es/box.css-mistica.js +13 -13
- package/dist-es/boxed.css-mistica.js +23 -23
- package/dist-es/button-fixed-footer-layout.js +12 -11
- package/dist-es/button-group.css-mistica.js +1 -1
- package/dist-es/button-layout.css-mistica.js +14 -14
- package/dist-es/button.css-mistica.js +30 -30
- package/dist-es/callout.css-mistica.js +11 -11
- package/dist-es/card-internal.css-mistica.js +15 -15
- package/dist-es/carousel.css-mistica.js +8 -8
- package/dist-es/checkbox.css-mistica.js +11 -11
- package/dist-es/chip.css-mistica.js +15 -15
- package/dist-es/circle.css-mistica.js +1 -1
- package/dist-es/community/advanced-data-card.css-mistica.js +6 -6
- package/dist-es/community/blocks.css-mistica.js +1 -1
- package/dist-es/community/example-component.css-mistica.js +1 -1
- package/dist-es/counter.css-mistica.js +1 -1
- package/dist-es/cover-hero.css-mistica.js +2 -2
- package/dist-es/credit-card-number-field.css-mistica.js +3 -3
- package/dist-es/date-field.css-mistica.js +1 -1
- package/dist-es/date-time-picker.css-mistica.js +1 -1
- package/dist-es/dialog.css-mistica.js +4 -4
- package/dist-es/divider.css-mistica.js +5 -5
- package/dist-es/double-field.css-mistica.js +2 -2
- package/dist-es/drawer.css-mistica.js +1 -1
- package/dist-es/empty-state-card.css-mistica.js +1 -1
- package/dist-es/empty-state.css-mistica.js +5 -5
- package/dist-es/fade-in.css-mistica.js +1 -1
- package/dist-es/feedback.css-mistica.js +1 -1
- package/dist-es/file-upload.css-mistica.js +7 -7
- package/dist-es/fixed-footer-layout.css-mistica.js +2 -2
- package/dist-es/fixed-footer-layout.js +57 -56
- package/dist-es/form.css-mistica.js +1 -1
- package/dist-es/grid-layout.css-mistica.js +3 -3
- package/dist-es/grid.css-mistica.js +120 -120
- package/dist-es/header.css-mistica.js +1 -1
- package/dist-es/hero.css-mistica.js +2 -2
- package/dist-es/horizontal-scroll.css-mistica.js +1 -1
- package/dist-es/icon-button.css-mistica.js +53 -53
- package/dist-es/icons/icon-chevron.css-mistica.js +2 -2
- package/dist-es/icons/icon-error.css-mistica.js +1 -1
- package/dist-es/image.css-mistica.js +2 -2
- package/dist-es/image.js +8 -1
- package/dist-es/inline.css-mistica.js +9 -9
- package/dist-es/list.css-mistica.js +1 -1
- package/dist-es/loading-bar.css-mistica.js +1 -1
- package/dist-es/loading-screen.css-mistica.js +4 -4
- package/dist-es/logo.css-mistica.js +5 -5
- package/dist-es/menu.css-mistica.js +13 -13
- package/dist-es/mosaic.css-mistica.js +1 -1
- package/dist-es/navigation-bar.css-mistica.js +18 -18
- package/dist-es/navigation-breadcrumbs.css-mistica.js +1 -1
- package/dist-es/package-version.js +1 -1
- package/dist-es/pin-field.css-mistica.js +1 -1
- package/dist-es/popover.css-mistica.js +1 -1
- package/dist-es/progress-bar.css-mistica.js +6 -6
- package/dist-es/radio-button.css-mistica.js +19 -19
- package/dist-es/rating.css-mistica.js +2 -2
- package/dist-es/responsive-layout.css-mistica.js +6 -6
- package/dist-es/screen-reader-only.css-mistica.js +1 -1
- package/dist-es/select.css-mistica.js +15 -15
- package/dist-es/sheet-action-row.css-mistica.js +1 -1
- package/dist-es/sheet-common.css-mistica.js +1 -1
- package/dist-es/sheet-info.css-mistica.js +1 -1
- package/dist-es/skeletons.css-mistica.js +6 -6
- package/dist-es/skins/skin-contract.css-mistica.js +684 -684
- package/dist-es/skip-link.css-mistica.js +1 -1
- package/dist-es/slider.css-mistica.js +18 -18
- package/dist-es/snackbar.css-mistica.js +4 -4
- package/dist-es/spinner.css-mistica.js +1 -1
- package/dist-es/square.css-mistica.js +1 -1
- package/dist-es/stack.css-mistica.js +5 -5
- package/dist-es/stacking-group.css-mistica.js +1 -1
- package/dist-es/stepper.css-mistica.js +2 -2
- package/dist-es/style.css +1 -1
- package/dist-es/switch-component.css-mistica.js +35 -35
- package/dist-es/table.css-mistica.js +9 -9
- package/dist-es/tabs.css-mistica.js +17 -17
- package/dist-es/tag.css-mistica.js +1 -1
- package/dist-es/text-field-base.css-mistica.js +15 -15
- package/dist-es/text-field-components.css-mistica.js +3 -3
- package/dist-es/text-link.css-mistica.js +6 -6
- package/dist-es/text.css-mistica.js +6 -6
- package/dist-es/theme-context.css-mistica.js +1 -1
- package/dist-es/timeline.css-mistica.js +9 -9
- package/dist-es/timer.css-mistica.js +6 -6
- package/dist-es/tooltip.css-mistica.js +1 -1
- package/dist-es/touchable.css-mistica.js +1 -1
- package/dist-es/utils/aspect-ratio-support.css-mistica.js +2 -2
- package/dist-es/video.css-mistica.js +1 -1
- package/dist-es/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
- package/doc/llms.md +11 -0
- package/package.json +14 -2
- package/src/accordion.css.ts +121 -0
- package/src/accordion.tsx +366 -0
- package/src/align.css.ts +7 -0
- package/src/align.tsx +32 -0
- package/src/autocomplete.css.ts +62 -0
- package/src/autocomplete.tsx +239 -0
- package/src/avatar.css.ts +14 -0
- package/src/avatar.tsx +120 -0
- package/src/badge.css.ts +51 -0
- package/src/badge.tsx +79 -0
- package/src/box.css.ts +51 -0
- package/src/box.tsx +114 -0
- package/src/boxed.css.ts +132 -0
- package/src/boxed.tsx +153 -0
- package/src/button-fixed-footer-layout.tsx +65 -0
- package/src/button-group.css.ts +75 -0
- package/src/button-group.tsx +91 -0
- package/src/button-layout.css.ts +162 -0
- package/src/button-layout.tsx +91 -0
- package/src/button.css.ts +758 -0
- package/src/button.tsx +632 -0
- package/src/callout.css.ts +50 -0
- package/src/callout.tsx +147 -0
- package/src/card-cover.tsx +242 -0
- package/src/card-data.tsx +152 -0
- package/src/card-internal.css.ts +271 -0
- package/src/card-internal.tsx +1724 -0
- package/src/card-media.tsx +157 -0
- package/src/card-naked.tsx +63 -0
- package/src/carousel.css.ts +522 -0
- package/src/carousel.tsx +1300 -0
- package/src/checkbox.css.ts +94 -0
- package/src/checkbox.tsx +192 -0
- package/src/chip.css.ts +204 -0
- package/src/chip.tsx +191 -0
- package/src/circle.css.ts +14 -0
- package/src/circle.tsx +52 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-extras-0-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-extras-1-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-extras-3-1-snap.png +0 -0
- 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
- package/src/community/__screenshot_tests__/__image_snapshots__/advanced-data-card-screenshot-test-tsx-advanced-data-card-inside-carousel-1-snap.png +0 -0
- 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
- package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-highlighted-value-block-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-information-block-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-progress-block-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-progress-block-2-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-row-block-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-simple-block-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/__image_snapshots__/blocks-screenshot-test-tsx-blocks-value-block-1-snap.png +0 -0
- package/src/community/__screenshot_tests__/advanced-data-card-screenshot-test.tsx +84 -0
- package/src/community/__screenshot_tests__/blocks-screenshot-test.tsx +72 -0
- package/src/community/__stories__/advanced-data-card-carousel-story.tsx +66 -0
- package/src/community/__stories__/advanced-data-card-story.tsx +158 -0
- package/src/community/__stories__/blocks-story.tsx +272 -0
- package/src/community/__stories__/example-component-story.tsx +15 -0
- package/src/community/__stories__/index-story.tsx +154 -0
- package/src/community/__type_tests__/advanced-data-card-type-test.tsx +40 -0
- package/src/community/advanced-data-card.css.ts +271 -0
- package/src/community/advanced-data-card.tsx +431 -0
- package/src/community/blocks.css.ts +12 -0
- package/src/community/blocks.tsx +290 -0
- package/src/community/example-component.css.ts +7 -0
- package/src/community/example-component.tsx +17 -0
- package/src/community/index.tsx +10 -0
- package/src/counter.css.ts +150 -0
- package/src/counter.tsx +215 -0
- package/src/cover-hero-media.tsx +39 -0
- package/src/cover-hero.css.ts +133 -0
- package/src/cover-hero.tsx +262 -0
- package/src/credit-card-expiration-field.tsx +187 -0
- package/src/credit-card-fields.tsx +56 -0
- package/src/credit-card-number-field.css.ts +47 -0
- package/src/credit-card-number-field.tsx +245 -0
- package/src/cvv-field.tsx +169 -0
- package/src/date-field.css.ts +14 -0
- package/src/date-field.tsx +130 -0
- package/src/date-time-field.tsx +141 -0
- package/src/date-time-picker.css.ts +126 -0
- package/src/date-time-picker.tsx +188 -0
- package/src/decimal-field.tsx +160 -0
- package/src/desktop-container-type-context.tsx +15 -0
- package/src/dialog-context.tsx +81 -0
- package/src/dialog.css.ts +155 -0
- package/src/dialog.tsx +423 -0
- package/src/divider.css.ts +10 -0
- package/src/divider.tsx +11 -0
- package/src/double-field.css.ts +33 -0
- package/src/double-field.tsx +71 -0
- package/src/drawer.css.ts +123 -0
- package/src/drawer.tsx +304 -0
- package/src/email-field.tsx +76 -0
- package/src/empty-state-card.css.ts +40 -0
- package/src/empty-state-card.tsx +92 -0
- package/src/empty-state.css.ts +119 -0
- package/src/empty-state.tsx +141 -0
- package/src/fade-in.css.ts +12 -0
- package/src/fade-in.tsx +40 -0
- package/src/feedback.css.ts +119 -0
- package/src/feedback.tsx +432 -0
- package/src/file-upload.css.ts +156 -0
- package/src/file-upload.tsx +612 -0
- package/src/fixed-footer-layout.css.ts +96 -0
- package/src/fixed-footer-layout.tsx +227 -0
- package/src/fixed-to-top.tsx +21 -0
- package/src/focus-trap.tsx +17 -0
- package/src/form-context.tsx +198 -0
- package/src/form.css.ts +5 -0
- package/src/form.tsx +287 -0
- package/src/grid-layout.css.ts +68 -0
- package/src/grid-layout.tsx +201 -0
- package/src/grid.css.ts +203 -0
- package/src/grid.tsx +241 -0
- package/src/header.css.ts +30 -0
- package/src/header.tsx +319 -0
- package/src/hero.css.ts +71 -0
- package/src/hero.tsx +318 -0
- package/src/hooks.tsx +313 -0
- package/src/horizontal-scroll.css.ts +43 -0
- package/src/horizontal-scroll.tsx +18 -0
- package/src/iban-field.tsx +218 -0
- package/src/icon-button.css.ts +561 -0
- package/src/icon-button.tsx +221 -0
- package/src/icons/__stories__/mistica-icons-story.tsx +192 -0
- package/src/icons/icon-amex.tsx +40 -0
- package/src/icons/icon-chevron.css.ts +23 -0
- package/src/icons/icon-chevron.tsx +150 -0
- package/src/icons/icon-cvv-amex.tsx +31 -0
- package/src/icons/icon-cvv-visa-mc.tsx +31 -0
- package/src/icons/icon-error.css.ts +27 -0
- package/src/icons/icon-error.tsx +207 -0
- package/src/icons/icon-info.tsx +86 -0
- package/src/icons/icon-mastercard.tsx +36 -0
- package/src/icons/icon-success-vivo-new.tsx +51 -0
- package/src/icons/icon-success-vivo.tsx +36 -0
- package/src/icons/icon-success.tsx +211 -0
- package/src/icons/icon-visa.tsx +32 -0
- package/src/image.css.ts +48 -0
- package/src/image.tsx +352 -0
- package/src/index.tsx +2466 -0
- package/src/inline.css.ts +131 -0
- package/src/inline.tsx +135 -0
- package/src/integer-field.tsx +93 -0
- package/src/list.css.ts +281 -0
- package/src/list.tsx +963 -0
- package/src/loading-bar.css.ts +69 -0
- package/src/loading-bar.tsx +25 -0
- package/src/loading-screen.css.ts +114 -0
- package/src/loading-screen.tsx +376 -0
- package/src/logo-blau-shell.tsx +30 -0
- package/src/logo-blau.tsx +60 -0
- package/src/logo-common.tsx +29 -0
- package/src/logo-esimflag-shell.tsx +30 -0
- package/src/logo-esimflag.tsx +56 -0
- package/src/logo-movistar-new-shell.tsx +30 -0
- package/src/logo-movistar-new.tsx +85 -0
- package/src/logo-movistar-shell.tsx +30 -0
- package/src/logo-movistar.tsx +63 -0
- package/src/logo-o2-new-shell.tsx +26 -0
- package/src/logo-o2-new.tsx +27 -0
- package/src/logo-o2-shell.tsx +26 -0
- package/src/logo-o2.tsx +27 -0
- package/src/logo-telefonica-shell.tsx +30 -0
- package/src/logo-telefonica.tsx +95 -0
- package/src/logo-tu-shell.tsx +26 -0
- package/src/logo-tu.tsx +28 -0
- package/src/logo-vivo-shell.tsx +30 -0
- package/src/logo-vivo.tsx +53 -0
- package/src/logo.css.ts +33 -0
- package/src/logo.tsx +313 -0
- package/src/master-detail-layout.tsx +28 -0
- package/src/maybe-dismissable.css.ts +37 -0
- package/src/maybe-dismissable.tsx +58 -0
- package/src/media-queries.css.ts +67 -0
- package/src/menu.css.ts +132 -0
- package/src/menu.tsx +468 -0
- package/src/meter.tsx +516 -0
- package/src/modal-context-provider.tsx +45 -0
- package/src/month-field.tsx +124 -0
- package/src/mosaic.css.ts +73 -0
- package/src/mosaic.tsx +205 -0
- package/src/navigation-bar.css.ts +558 -0
- package/src/navigation-bar.tsx +1637 -0
- package/src/navigation-breadcrumbs.css.ts +22 -0
- package/src/navigation-breadcrumbs.tsx +69 -0
- package/src/negative-box.tsx +15 -0
- package/src/nestable-context.tsx +139 -0
- package/src/overlay.tsx +86 -0
- package/src/overscroll-color-context.tsx +141 -0
- package/src/package-version.tsx +2 -0
- package/src/password-field.tsx +126 -0
- package/src/phone-number-field-lite.tsx +265 -0
- package/src/phone-number-field.tsx +171 -0
- package/src/pin-field.css.ts +90 -0
- package/src/pin-field.tsx +346 -0
- package/src/placeholder.tsx +41 -0
- package/src/popover.css.ts +8 -0
- package/src/popover.tsx +85 -0
- package/src/portal.tsx +43 -0
- package/src/progress-bar.css.ts +61 -0
- package/src/progress-bar.tsx +174 -0
- package/src/radio-button.css.ts +174 -0
- package/src/radio-button.tsx +322 -0
- package/src/rating.css.ts +128 -0
- package/src/rating.tsx +351 -0
- package/src/responsive-layout.css.ts +162 -0
- package/src/responsive-layout.tsx +106 -0
- package/src/screen-reader-only.css.ts +27 -0
- package/src/screen-reader-only.tsx +33 -0
- package/src/screen-size-context-provider.tsx +96 -0
- package/src/screen-size-context.tsx +23 -0
- package/src/search-field.tsx +126 -0
- package/src/select.css.ts +226 -0
- package/src/select.tsx +513 -0
- package/src/sheet-action-row.css.ts +33 -0
- package/src/sheet-actions-list.tsx +113 -0
- package/src/sheet-actions.tsx +95 -0
- package/src/sheet-common.css.ts +254 -0
- package/src/sheet-common.tsx +402 -0
- package/src/sheet-info.css.ts +19 -0
- package/src/sheet-info.tsx +127 -0
- package/src/sheet-native.tsx +189 -0
- package/src/sheet-radio-list.tsx +118 -0
- package/src/sheet-root.tsx +127 -0
- package/src/sheet-types.tsx +94 -0
- package/src/sheet-web.tsx +140 -0
- package/src/skeleton-base.tsx +38 -0
- package/src/skeletons.css.ts +56 -0
- package/src/skeletons.tsx +133 -0
- package/src/skins/blau.tsx +724 -0
- package/src/skins/constants.tsx +10 -0
- package/src/skins/defaults.tsx +104 -0
- package/src/skins/esimflag.tsx +728 -0
- package/src/skins/movistar-new.tsx +735 -0
- package/src/skins/movistar.tsx +740 -0
- package/src/skins/o2-new.tsx +731 -0
- package/src/skins/o2.tsx +727 -0
- package/src/skins/skin-contract.css.ts +380 -0
- package/src/skins/telefonica.tsx +768 -0
- package/src/skins/tu.tsx +741 -0
- package/src/skins/types/colors.tsx +286 -0
- package/src/skins/types/index.tsx +153 -0
- package/src/skins/utils.tsx +66 -0
- package/src/skins/vivo-new.tsx +745 -0
- package/src/skins/vivo.tsx +720 -0
- package/src/skip-link.css.ts +34 -0
- package/src/skip-link.tsx +52 -0
- package/src/slider.css.ts +181 -0
- package/src/slider.tsx +384 -0
- package/src/snackbar-context.tsx +98 -0
- package/src/snackbar-native.ts +37 -0
- package/src/snackbar.css.ts +176 -0
- package/src/snackbar.tsx +258 -0
- package/src/spinner.css.ts +66 -0
- package/src/spinner.tsx +136 -0
- package/src/sprinkles.css.ts +83 -0
- package/src/square.css.ts +15 -0
- package/src/square.tsx +55 -0
- package/src/stack.css.ts +44 -0
- package/src/stack.tsx +79 -0
- package/src/stacking-group.css.ts +15 -0
- package/src/stacking-group.tsx +82 -0
- package/src/stepper.css.ts +233 -0
- package/src/stepper.tsx +156 -0
- package/src/switch-component.css.ts +181 -0
- package/src/switch-component.tsx +187 -0
- package/src/tab-focus.tsx +68 -0
- package/src/table-actions-header.tsx +21 -0
- package/src/table-cell-text.tsx +35 -0
- package/src/table.css.ts +297 -0
- package/src/table.tsx +398 -0
- package/src/tabs.css.ts +212 -0
- package/src/tabs.tsx +263 -0
- package/src/tag.css.ts +42 -0
- package/src/tag.tsx +161 -0
- package/src/test-utils/environment/setup-ssr.tsx +10 -0
- package/src/test-utils/fail-test-on-console-error.tsx +22 -0
- package/src/test-utils/index.tsx +341 -0
- package/src/test-utils/setup-ssr-test-env.tsx +13 -0
- package/src/test-utils/ssr.tsx +197 -0
- package/src/text-field-base.css.ts +416 -0
- package/src/text-field-base.tsx +628 -0
- package/src/text-field-components.css.ts +165 -0
- package/src/text-field-components.tsx +230 -0
- package/src/text-field.tsx +118 -0
- package/src/text-link.css.ts +83 -0
- package/src/text-link.tsx +85 -0
- package/src/text-tokens.tsx +708 -0
- package/src/text.css.ts +60 -0
- package/src/text.tsx +516 -0
- package/src/theme-context-provider.tsx +370 -0
- package/src/theme-context.css.ts +3 -0
- package/src/theme-context.tsx +8 -0
- package/src/theme-variant-context.tsx +51 -0
- package/src/theme.tsx +184 -0
- package/src/time-field.tsx +99 -0
- package/src/timeline.css.ts +135 -0
- package/src/timeline.tsx +250 -0
- package/src/timer.css.ts +99 -0
- package/src/timer.tsx +420 -0
- package/src/title.tsx +119 -0
- package/src/tooltip-context-provider.tsx +57 -0
- package/src/tooltip.css.ts +106 -0
- package/src/tooltip.tsx +649 -0
- package/src/touchable.css.ts +56 -0
- package/src/touchable.tsx +355 -0
- package/src/types/font-face.d.ts +47 -0
- package/src/types/libs.d.ts +3 -0
- package/src/utils/__tests__/analytics-test.tsx +35 -0
- package/src/utils/__tests__/browser-test.tsx +28 -0
- package/src/utils/__tests__/dom-test.tsx +23 -0
- package/src/utils/__tests__/helpers-test.tsx +166 -0
- package/src/utils/analytics.tsx +28 -0
- package/src/utils/animation.tsx +201 -0
- package/src/utils/aspect-ratio-support.css.ts +28 -0
- package/src/utils/aspect-ratio-support.tsx +141 -0
- package/src/utils/browser.tsx +9 -0
- package/src/utils/color.tsx +46 -0
- package/src/utils/common.tsx +27 -0
- package/src/utils/credit-card.tsx +46 -0
- package/src/utils/css.tsx +25 -0
- package/src/utils/document-visibility.tsx +52 -0
- package/src/utils/dom.tsx +155 -0
- package/src/utils/environment.tsx +6 -0
- package/src/utils/headings.tsx +18 -0
- package/src/utils/helpers.tsx +182 -0
- package/src/utils/keys.tsx +8 -0
- package/src/utils/locale.tsx +27 -0
- package/src/utils/platform.tsx +94 -0
- package/src/utils/region-code.tsx +1 -0
- package/src/utils/renders-element.tsx +6 -0
- package/src/utils/time.tsx +22 -0
- package/src/utils/types.tsx +19 -0
- package/src/utils/utility-types.tsx +8 -0
- package/src/video.css.ts +11 -0
- package/src/video.tsx +355 -0
- package/src/vivinho-loading-animation/in-lottie.json +402 -0
- package/src/vivinho-loading-animation/index.tsx +90 -0
- package/src/vivinho-loading-animation/out-lottie.json +575 -0
- package/src/vivinho-loading-animation/pulse-lottie.json +551 -0
- package/src/vivinho-loading-animation/vivinho-loading-animation.css.ts +15 -0
- package/src/vivinho-loading-animation/wave-lottie.json +2829 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type Props = {
|
|
4
|
+
role?: string;
|
|
5
|
+
size?: number | string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const IconVisa = ({role = 'presentation', size = 24}: Props): JSX.Element => (
|
|
9
|
+
<svg role={role} width={size} height={size} viewBox="0 0 20 20" fill="none">
|
|
10
|
+
<g clipPath="url(#clip0_10652_7697)">
|
|
11
|
+
<path
|
|
12
|
+
d="M19 -2H1C-0.656854 -2 -2 -0.656854 -2 1V19C-2 20.6569 -0.656854 22 1 22H19C20.6569 22 22 20.6569 22 19V1C22 -0.656854 20.6569 -2 19 -2Z"
|
|
13
|
+
fill="white"
|
|
14
|
+
/>
|
|
15
|
+
<path
|
|
16
|
+
d="M8.6095 13.1725H7.02925L8.014 7.105H9.59425L8.6095 13.1725ZM5.6965 7.105L4.19125 11.275L4.01125 10.3773L3.47875 7.651C3.4472 7.48138 3.35189 7.33028 3.21241 7.22874C3.07293 7.1272 2.89986 7.08292 2.72875 7.105H0.25V7.21C0.833686 7.35578 1.39164 7.58999 1.9045 7.9045L3.274 13.1718H4.885L7.3945 7.105H5.6965ZM18.121 13.1725H19.5707L18.3317 7.105H17.0928C16.9385 7.0926 16.7843 7.12988 16.6527 7.21139C16.5211 7.29289 16.4191 7.41435 16.3615 7.558L14.0065 13.1718H15.655L15.9835 12.2733H17.9913L18.121 13.1718V13.1725ZM16.3862 11.0275L17.2165 8.7595L17.6815 11.0275H16.3862ZM14.0748 8.5675L14.2975 7.26625C13.8416 7.10272 13.3626 7.01285 12.8785 7C12.0985 7 10.2325 7.3405 10.2325 9.00775C10.2325 10.5752 12.4202 10.594 12.4202 11.4183C12.4202 12.2425 10.462 12.0933 9.8425 11.5728L9.607 12.9363C10.172 13.1723 10.7798 13.2885 11.392 13.2775C12.4698 13.2775 14.0935 12.7195 14.0935 11.2015C14.0935 9.6835 11.887 9.47875 11.887 8.791C11.887 8.10325 13.399 8.1895 14.0748 8.5675Z"
|
|
17
|
+
fill="#0F347D"
|
|
18
|
+
/>
|
|
19
|
+
<path
|
|
20
|
+
d="M4.01726 10.3773L3.48476 7.65104C3.45321 7.48142 3.3579 7.33032 3.21842 7.22878C3.07894 7.12724 2.90587 7.08296 2.73476 7.10504H0.256012V7.21004C1.11262 7.42881 1.91169 7.83052 2.59826 8.38754C3.23768 8.91477 3.72707 9.60101 4.01726 10.3773Z"
|
|
21
|
+
fill="#0F347D"
|
|
22
|
+
/>
|
|
23
|
+
</g>
|
|
24
|
+
<defs>
|
|
25
|
+
<clipPath id="clip0_10652_7697">
|
|
26
|
+
<rect width="20" height="20" fill="white" />
|
|
27
|
+
</clipPath>
|
|
28
|
+
</defs>
|
|
29
|
+
</svg>
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export default IconVisa;
|
package/src/image.css.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {createVar, fallbackVar, style} from '@vanilla-extract/css';
|
|
2
|
+
import {sprinkles} from './sprinkles.css';
|
|
3
|
+
import {vars as skinVars} from './skins/skin-contract.css';
|
|
4
|
+
|
|
5
|
+
export const FADE_IN_DURATION_MS = 300;
|
|
6
|
+
|
|
7
|
+
const mediaBorderRadius = createVar();
|
|
8
|
+
|
|
9
|
+
export const vars = {
|
|
10
|
+
mediaBorderRadius,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const imageWithBorder = style({
|
|
14
|
+
border: `1px solid ${skinVars.colors.borderLow}`,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const image = style([
|
|
18
|
+
sprinkles({
|
|
19
|
+
top: 0,
|
|
20
|
+
left: 0,
|
|
21
|
+
display: 'block',
|
|
22
|
+
width: '100%',
|
|
23
|
+
height: '100%',
|
|
24
|
+
objectFit: 'cover',
|
|
25
|
+
maxWidth: '100%',
|
|
26
|
+
maxHeight: '100%',
|
|
27
|
+
borderRadius: skinVars.borderRadii.container,
|
|
28
|
+
}),
|
|
29
|
+
{
|
|
30
|
+
transition: `opacity ${FADE_IN_DURATION_MS}ms`,
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
export const withoutBorderRadius = style({
|
|
35
|
+
borderRadius: 0,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export const circularBorderRadius = style({
|
|
39
|
+
borderRadius: '50%',
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export const withBorderRadius = style({
|
|
43
|
+
borderRadius: skinVars.borderRadii.container,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export const defaultBorderRadius = style({
|
|
47
|
+
borderRadius: fallbackVar(mediaBorderRadius, skinVars.borderRadii.container),
|
|
48
|
+
});
|
package/src/image.tsx
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import classnames from 'classnames';
|
|
4
|
+
import {SkeletonAnimation} from './skeletons';
|
|
5
|
+
import {AspectRatioContainer} from './utils/aspect-ratio-support';
|
|
6
|
+
import {getPrefixedDataAttributes} from './utils/dom';
|
|
7
|
+
import {useThemeVariant} from './theme-variant-context';
|
|
8
|
+
import {useTheme} from './hooks';
|
|
9
|
+
import {VIVO_SKIN, VIVO_NEW_SKIN} from './skins/constants';
|
|
10
|
+
import * as styles from './image.css';
|
|
11
|
+
import {vars} from './skins/skin-contract.css';
|
|
12
|
+
import {combineRefs} from './utils/common';
|
|
13
|
+
import SkeletonBase from './skeleton-base';
|
|
14
|
+
import {isServerSide} from './utils/environment';
|
|
15
|
+
import {isRunningAcceptanceTest} from './utils/platform';
|
|
16
|
+
|
|
17
|
+
import type {ExclusifyUnion} from './utils/utility-types';
|
|
18
|
+
import type {DataAttributes} from './utils/types';
|
|
19
|
+
|
|
20
|
+
type VivoLogoProps = {
|
|
21
|
+
style?: React.CSSProperties;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const VivoLogo = ({style}: VivoLogoProps) => {
|
|
25
|
+
return (
|
|
26
|
+
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" style={style}>
|
|
27
|
+
<path
|
|
28
|
+
d="M24.021 35.7235C24.8145 35.7694 25.0467 36.1913 25.3157 36.5138C25.586 36.8362 29.515 41.551 29.7823 41.8569C30.0475 42.1662 30.7822 42.7329 31.5901 42.8405C32.3967 42.9473 33.282 42.7842 33.8484 42.3748C34.4135 41.965 35.1313 41.4073 35.3833 41.0356C35.6337 40.6638 36.061 40.1302 35.9823 39.2534C35.9028 38.3783 35.7112 37.9204 35.0268 37.1691C34.3433 36.4185 30.2992 31.6657 29.5382 30.7537C29.5382 30.7537 28.8467 29.9423 28.9469 28.7956C29.0476 27.6468 29.567 27.1343 30.6608 26.8487C31.7534 26.5647 36.0267 25.5306 36.0267 25.5306C36.0267 25.5306 38.4728 24.3723 37.9182 22.0776L37.5997 20.904C37.5997 20.904 37.0672 18.2264 33.5519 19.0556C30.0344 19.8869 28.0803 20.377 28.0803 20.377C28.0803 20.377 26.9602 20.4838 26.7999 19.744C26.6417 19.0038 26.8494 18.6218 27.3443 18.4156C27.8387 18.209 30.9611 16.7175 31.3617 12.6853C31.7652 8.65158 28.3882 5.06573 24.0091 5.08104C19.6288 5.0976 16.4594 8.39988 16.4725 11.8185C16.4856 15.2387 18.7033 17.5144 20.4079 18.3638C21.3752 18.8453 21.0656 19.7122 21.0656 19.7122C21.0656 19.7122 20.8334 20.5554 19.8153 20.3311C18.7972 20.1025 13.8657 18.9736 13.8657 18.9736C13.8657 18.9736 10.8914 18.4226 10.1732 21.359C9.4541 24.2978 11.1261 25.4143 12.3532 25.6908C13.5798 25.9669 17.7296 26.9716 17.7296 26.9716C17.7296 26.9716 18.9643 27.581 19.0125 28.8308C19.0425 29.5697 19.0438 30.1824 18.266 31.2832C17.4894 32.3835 12.6598 38.0148 12.6598 38.0148C12.6598 38.0148 10.9997 39.9862 13.4051 41.763C15.8106 43.5401 17.1641 43.1262 18.5921 41.4889C20.0188 39.852 22.8383 36.4243 22.8383 36.4243C22.8383 36.4243 23.2275 35.6788 24.021 35.7235Z"
|
|
29
|
+
stroke={vars.colors.brand}
|
|
30
|
+
strokeWidth="2"
|
|
31
|
+
/>
|
|
32
|
+
</svg>
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type ImageErrorProps = {
|
|
37
|
+
withIcon?: boolean;
|
|
38
|
+
borderRadius?: string | number;
|
|
39
|
+
className?: string;
|
|
40
|
+
border?: boolean;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const ImageError = React.forwardRef<HTMLDivElement, ImageErrorProps>(
|
|
44
|
+
({borderRadius, withIcon = true, border, className}, ref) => {
|
|
45
|
+
const externalVariant = useThemeVariant();
|
|
46
|
+
const {skinName} = useTheme();
|
|
47
|
+
|
|
48
|
+
const color = {
|
|
49
|
+
default: vars.colors.neutralMedium,
|
|
50
|
+
alternative: vars.colors.neutralMedium,
|
|
51
|
+
brand: vars.colors.negative,
|
|
52
|
+
media: vars.colors.negative,
|
|
53
|
+
negative: vars.colors.negative,
|
|
54
|
+
}[externalVariant];
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<div
|
|
58
|
+
style={{
|
|
59
|
+
height: '100%',
|
|
60
|
+
width: '100%',
|
|
61
|
+
display: 'flex',
|
|
62
|
+
alignItems: 'center',
|
|
63
|
+
justifyContent: 'center',
|
|
64
|
+
backgroundColor:
|
|
65
|
+
externalVariant === 'brand' || externalVariant === 'media'
|
|
66
|
+
? vars.colors.backgroundSkeletonBrand
|
|
67
|
+
: externalVariant === 'negative'
|
|
68
|
+
? vars.colors.backgroundSkeletonNegative
|
|
69
|
+
: vars.colors.backgroundSkeleton,
|
|
70
|
+
boxSizing: 'border-box',
|
|
71
|
+
border: border ? `1px solid ${vars.colors.borderLow}` : 'none',
|
|
72
|
+
borderRadius,
|
|
73
|
+
}}
|
|
74
|
+
ref={ref}
|
|
75
|
+
className={className}
|
|
76
|
+
>
|
|
77
|
+
{withIcon ? (
|
|
78
|
+
skinName === VIVO_SKIN ? (
|
|
79
|
+
<VivoLogo style={{width: '10%', minWidth: 24, maxWidth: 48}} />
|
|
80
|
+
) : skinName === VIVO_NEW_SKIN ? (
|
|
81
|
+
<svg
|
|
82
|
+
viewBox="0 0 24 24"
|
|
83
|
+
role="presentation"
|
|
84
|
+
style={{width: '10%', minWidth: 24, maxWidth: 48}}
|
|
85
|
+
>
|
|
86
|
+
<path
|
|
87
|
+
d="M5.60044 14.585C5.49637 14.585 5.3983 14.5458 5.32396 14.4744L4.73612 13.9003C4.72555 13.8898 4.71068 13.8837 4.69552 13.8837C4.68037 13.8837 4.66579 13.8895 4.65493 13.9L4.06852 14.4698C3.99418 14.5411 3.89611 14.5806 3.79203 14.5806C3.68796 14.5806 3.59018 14.5411 3.5167 14.4698C3.36545 14.3226 3.36517 14.0833 3.5167 13.9361L4.10454 13.365C4.12656 13.3435 4.12656 13.3087 4.10454 13.2872L3.5167 12.7161C3.36517 12.5689 3.36517 12.3296 3.5167 12.1824C3.59047 12.1111 3.68796 12.0716 3.79203 12.0716C3.89611 12.0716 3.99389 12.1111 4.06737 12.1824L4.65407 12.7525C4.66493 12.763 4.67951 12.7687 4.69467 12.7687C4.70982 12.7687 4.7244 12.763 4.73527 12.7525L5.32511 12.1794C5.39859 12.108 5.49637 12.0686 5.60044 12.0686C5.70451 12.0686 5.80229 12.108 5.87577 12.1794C6.02731 12.3266 6.02731 12.5659 5.87577 12.7131L5.28479 13.2872C5.26278 13.3087 5.26278 13.3435 5.28479 13.365L5.87577 13.9391C6.02674 14.0858 6.02674 14.3256 5.87606 14.4739C5.80258 14.5456 5.70451 14.585 5.60044 14.585Z"
|
|
88
|
+
fill={color}
|
|
89
|
+
/>
|
|
90
|
+
<path
|
|
91
|
+
d="M13.0142 10.7496C12.953 10.7471 12.8819 10.7471 12.8132 10.7521H12.7598C12.2257 10.7571 10.2337 10.9373 10.2337 13.3694C10.2337 15.8061 12.2431 15.9965 12.7775 16.004H12.8638C12.8913 16.004 12.9193 16.0034 12.9465 16.0026C12.9725 16.0021 12.9979 16.0015 13.0214 16.0015C13.5326 15.9916 15.5677 15.8039 15.5677 13.3818C15.5683 10.9646 13.5357 10.762 13.0142 10.7496ZM13.0042 14.9461L12.8644 14.9485H12.7958C11.3282 14.9262 11.3282 13.7525 11.3282 13.3669C11.3282 12.9837 11.3282 11.8147 12.7729 11.8026H12.8161C12.8747 11.8026 12.9356 11.8026 12.9891 11.8051C14.4773 11.8395 14.4773 13.0011 14.4773 13.3818C14.477 13.7631 14.4761 14.9191 13.0042 14.9461Z"
|
|
92
|
+
fill={color}
|
|
93
|
+
/>
|
|
94
|
+
<path
|
|
95
|
+
d="M21.9997 17.2968H21.9971V9.45494C21.9971 8.78512 21.7301 8.39233 21.5062 8.17981C21.1062 7.80217 20.6039 7.76579 20.4609 7.75559L20.454 7.75506C20.4397 7.75398 20.4298 7.75324 20.4249 7.75228L15.6707 7.74732L14.9331 6.52152C14.7398 6.20012 14.3813 6 13.9996 6H12.0179C11.6033 6 11.2319 6.22493 11.0487 6.58575L10.4611 7.74732C8.26329 7.74732 6.43945 7.7498 5.96626 7.75228C5.21574 7.75476 4.79373 8.04391 4.56986 8.28372C4.10439 8.79036 4.16043 9.43537 4.16529 9.45274L4.16872 10.7C3.54515 10.7764 3.04937 10.9895 2.69141 11.3373C2.23395 11.7819 2.00208 12.4443 2.00208 13.3063C2.00208 14.1677 2.23395 14.8298 2.69141 15.2741C3.05252 15.6247 3.55372 15.8383 4.18502 15.913L4.18845 17.3119C4.23162 18.723 5.25176 18.9975 5.67148 18.9975L20.4275 19C21.005 19 21.3584 18.7627 21.552 18.5626C22.038 18.0628 22.0048 17.3412 21.9997 17.2968ZM2.78205 13.306C2.78205 12.6444 2.93301 12.1758 3.24408 11.8737C3.55516 11.5713 4.03692 11.4242 4.71739 11.4242H4.72254C5.39786 11.4242 5.87763 11.57 6.1887 11.8704C6.50263 12.1734 6.65474 12.6431 6.65417 13.3063C6.65417 13.9673 6.50292 14.4353 6.19184 14.7374C5.88077 15.0395 5.39844 15.1864 4.71768 15.1864C4.03749 15.1864 3.55544 15.0395 3.24465 14.7374C2.93301 14.435 2.78205 13.967 2.78205 13.306ZM20.7534 17.8428C20.7102 17.8872 20.6287 17.9468 20.4277 17.9514L5.65633 17.949L5.65394 17.9485L5.65244 17.9483L5.64947 17.9479C5.59908 17.9415 5.29865 17.9037 5.27978 17.3015L5.27607 15.9089C5.8782 15.8328 6.36168 15.628 6.71678 15.2959C7.19311 14.8504 7.43471 14.1809 7.43471 13.3057C7.43471 12.4305 7.19311 11.7607 6.71678 11.315C6.35796 10.9793 5.86848 10.7734 5.25805 10.6992L5.25434 9.40064C5.25176 9.39816 5.23918 9.15091 5.38414 8.99296C5.49107 8.87443 5.6895 8.81489 5.97169 8.81269C6.4703 8.80773 8.45667 8.80773 10.8019 8.80773C11.0103 8.80773 11.2016 8.69168 11.2931 8.51113L12.0182 7.05793L13.987 7.05297L14.885 8.54311C14.9817 8.70381 15.1624 8.80497 15.3582 8.80497L20.4355 8.80745C20.438 8.80745 20.6187 8.81737 20.7408 8.93342C20.8503 9.03486 20.9035 9.21017 20.9035 9.45494L20.9061 17.3312C20.9109 17.388 20.8984 17.6921 20.7534 17.8428Z"
|
|
96
|
+
fill={color}
|
|
97
|
+
/>
|
|
98
|
+
</svg>
|
|
99
|
+
) : (
|
|
100
|
+
// We cannot use IconImageRegular because we want to avoid the usage of width and height props to allow this icon to be responsive
|
|
101
|
+
<svg
|
|
102
|
+
viewBox="0 0 24 24"
|
|
103
|
+
role="presentation"
|
|
104
|
+
style={{width: '10%', minWidth: 24, maxWidth: 48}}
|
|
105
|
+
fill={color}
|
|
106
|
+
>
|
|
107
|
+
<path d="M2.46967 2.46967C2.76256 2.17678 3.23732 2.17678 3.53022 2.46967L21.5302 20.4697C21.8231 20.7626 21.8231 21.2373 21.5302 21.5302C21.2373 21.8231 20.7626 21.8231 20.4697 21.5302L19.1581 20.2187C18.616 20.5617 17.9846 20.7499 17.333 20.7499H6.66694C5.76081 20.7499 4.89166 20.3897 4.25092 19.749C3.61018 19.1082 3.24996 18.2391 3.24994 17.333V6.66694C3.24994 6.01504 3.43605 5.3821 3.77924 4.83979L2.46967 3.53022C2.17678 3.23732 2.17678 2.76256 2.46967 2.46967ZM4.88862 5.94916C4.79743 6.17503 4.74994 6.41868 4.74994 6.66694V10.538C5.10458 10.3537 5.48775 10.25 5.88862 10.2499C6.57746 10.25 7.21716 10.5495 7.74213 11.0546C7.74693 11.0593 7.75211 11.0645 7.75678 11.0693L15.8134 19.2499H17.333C17.5808 19.2499 17.8232 19.2002 18.0488 19.1093L4.88862 5.94916ZM5.88862 11.7499C5.65687 11.75 5.37569 11.8475 5.07612 12.1357C4.98165 12.2266 4.86823 12.2837 4.74994 12.3154V17.333C4.74996 17.8413 4.95204 18.329 5.31147 18.6884C5.67091 19.0478 6.15863 19.2499 6.66694 19.2499H13.7089L6.69135 12.1259C6.39555 11.8453 6.11774 11.75 5.88862 11.7499Z" />
|
|
108
|
+
<path d="M17.333 3.24994C18.2391 3.24996 19.1082 3.61018 19.749 4.25092C20.3897 4.89166 20.7499 5.76081 20.7499 6.66694V14.9999C20.7499 15.4141 20.4141 15.7499 19.9999 15.7499C19.5857 15.7499 19.25 15.4141 19.2499 14.9999V6.66694C19.2499 6.15863 19.0478 5.67091 18.6884 5.31147C18.329 4.95204 17.8413 4.74996 17.333 4.74994H8.99994C8.58575 4.74994 8.24997 4.41413 8.24994 3.99994C8.24994 3.58573 8.58573 3.24994 8.99994 3.24994H17.333Z" />
|
|
109
|
+
<path d="M15.4999 6.99994C16.3283 6.99997 16.9999 7.67154 16.9999 8.49994C16.9999 9.32833 16.3283 9.99991 15.4999 9.99994C14.6715 9.99994 14 9.32834 13.9999 8.49994C13.9999 7.67152 14.6715 6.99994 15.4999 6.99994Z" />
|
|
110
|
+
</svg>
|
|
111
|
+
)
|
|
112
|
+
) : undefined}
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
export type AspectRatio = '1:1' | '16:9' | '7:10' | '4:3' | undefined;
|
|
119
|
+
|
|
120
|
+
export const RATIO = {
|
|
121
|
+
'1:1': 1,
|
|
122
|
+
'16:9': 16 / 9,
|
|
123
|
+
'7:10': 7 / 10,
|
|
124
|
+
'4:3': 4 / 3,
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
type CommonImageProps = {
|
|
128
|
+
src: string;
|
|
129
|
+
srcSet?: string;
|
|
130
|
+
/** defaults to empty string */
|
|
131
|
+
alt?: string;
|
|
132
|
+
children?: void;
|
|
133
|
+
dataAttributes?: DataAttributes;
|
|
134
|
+
noBorderRadius?: boolean;
|
|
135
|
+
onError?: () => void;
|
|
136
|
+
onLoad?: () => void;
|
|
137
|
+
loadingFallback?: boolean;
|
|
138
|
+
errorFallback?: boolean;
|
|
139
|
+
border?: boolean;
|
|
140
|
+
objectFit?: 'contain' | 'cover' | 'fill' | 'none';
|
|
141
|
+
objectPosition?: 'center' | 'top' | 'bottom' | 'left' | 'right' | string;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
type RectangularImageProps = {
|
|
145
|
+
/** defaults to 0 (original image proportions). If both width and height are given, aspectRatio is ignored. */
|
|
146
|
+
aspectRatio?: AspectRatio | number;
|
|
147
|
+
/** defaults to 100% when no width and no height are given */
|
|
148
|
+
width?: string | number;
|
|
149
|
+
height?: string | number;
|
|
150
|
+
noBorderRadius?: boolean;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
type CircularImageProps = {
|
|
154
|
+
circular?: boolean;
|
|
155
|
+
} & ExclusifyUnion<
|
|
156
|
+
| {
|
|
157
|
+
width?: string | number;
|
|
158
|
+
}
|
|
159
|
+
| {
|
|
160
|
+
height?: string | number;
|
|
161
|
+
}
|
|
162
|
+
>;
|
|
163
|
+
|
|
164
|
+
type ImageProps = CommonImageProps & ExclusifyUnion<RectangularImageProps | CircularImageProps>;
|
|
165
|
+
|
|
166
|
+
export const ImageContent = React.forwardRef<HTMLImageElement, ImageProps>(
|
|
167
|
+
(
|
|
168
|
+
{
|
|
169
|
+
aspectRatio = 0,
|
|
170
|
+
alt = '',
|
|
171
|
+
dataAttributes,
|
|
172
|
+
noBorderRadius,
|
|
173
|
+
src,
|
|
174
|
+
srcSet,
|
|
175
|
+
onError,
|
|
176
|
+
onLoad,
|
|
177
|
+
loadingFallback = true,
|
|
178
|
+
errorFallback = true,
|
|
179
|
+
objectFit,
|
|
180
|
+
objectPosition,
|
|
181
|
+
...props
|
|
182
|
+
},
|
|
183
|
+
ref
|
|
184
|
+
) => {
|
|
185
|
+
const imageId = React.useId();
|
|
186
|
+
const imageRef = React.useRef<HTMLImageElement>(null);
|
|
187
|
+
const borderRadiusStyle = props.circular
|
|
188
|
+
? styles.circularBorderRadius
|
|
189
|
+
: noBorderRadius
|
|
190
|
+
? styles.withoutBorderRadius
|
|
191
|
+
: noBorderRadius === false // explicitly set to false, so we set border radius
|
|
192
|
+
? styles.withBorderRadius
|
|
193
|
+
: styles.defaultBorderRadius; // === undefined, use the default border radius (or the setting set by parent component, like cards or slideshow)
|
|
194
|
+
const [isError, setIsError] = React.useState(!src);
|
|
195
|
+
const [hideLoadingFallback, setHideLoadingFallback] = React.useState(false);
|
|
196
|
+
|
|
197
|
+
const ratio =
|
|
198
|
+
props.width && props.height
|
|
199
|
+
? undefined
|
|
200
|
+
: props.circular
|
|
201
|
+
? 1
|
|
202
|
+
: typeof aspectRatio === 'number'
|
|
203
|
+
? aspectRatio
|
|
204
|
+
: RATIO[aspectRatio];
|
|
205
|
+
|
|
206
|
+
const hasOnlyHeight = !!props.height && !props.width && ratio === 0 && !props.circular;
|
|
207
|
+
const hasOnlyWidth = !!props.width && !props.height && ratio === 0 && !props.circular;
|
|
208
|
+
const effectiveObjectFit = objectFit ?? (hasOnlyHeight || hasOnlyWidth ? 'contain' : 'cover'); // 'contain' is used for single-dimension cases (only width or only height) to ensure the image fits within the given dimension without cropping.
|
|
209
|
+
|
|
210
|
+
const withLoadingFallback = loadingFallback && !!(ratio !== 0 || (props.width && props.height));
|
|
211
|
+
const withErrorFallback = errorFallback && !!(ratio !== 0 || (props.width && props.height));
|
|
212
|
+
|
|
213
|
+
const onLoadHandler = React.useCallback(() => {
|
|
214
|
+
setIsError(false);
|
|
215
|
+
if (imageRef.current) {
|
|
216
|
+
imageRef.current.style.opacity = '1';
|
|
217
|
+
}
|
|
218
|
+
if (isRunningAcceptanceTest()) {
|
|
219
|
+
setHideLoadingFallback(true);
|
|
220
|
+
}
|
|
221
|
+
setTimeout(() => {
|
|
222
|
+
setHideLoadingFallback(true);
|
|
223
|
+
}, styles.FADE_IN_DURATION_MS);
|
|
224
|
+
|
|
225
|
+
onLoad?.();
|
|
226
|
+
}, [onLoad]);
|
|
227
|
+
|
|
228
|
+
React.useEffect(() => {
|
|
229
|
+
setIsError(!src);
|
|
230
|
+
setHideLoadingFallback(false);
|
|
231
|
+
}, [src]);
|
|
232
|
+
|
|
233
|
+
React.useEffect(() => {
|
|
234
|
+
// Needed because there is some race condition with SSR and onLoad events
|
|
235
|
+
// load event could be fired before the component is hydrated and mounted client side
|
|
236
|
+
// https://github.com/facebook/react/issues/15446
|
|
237
|
+
if (imageRef.current?.complete) {
|
|
238
|
+
onLoadHandler();
|
|
239
|
+
}
|
|
240
|
+
}, [onLoadHandler]);
|
|
241
|
+
|
|
242
|
+
const isLoading =
|
|
243
|
+
isServerSide() || !(document.getElementById(imageId) as HTMLImageElement | null)?.complete;
|
|
244
|
+
|
|
245
|
+
const img = (
|
|
246
|
+
<>
|
|
247
|
+
{/* https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/issues/309 */}
|
|
248
|
+
{/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
|
|
249
|
+
<img
|
|
250
|
+
// There is small hydration mismatch that we dont care about. (I think this is caused by te inline SSR script below)
|
|
251
|
+
// Warning: Prop `style` did not match. Server: "opacity: 1;" Client: "opacity:1"
|
|
252
|
+
suppressHydrationWarning
|
|
253
|
+
id={imageId}
|
|
254
|
+
style={{
|
|
255
|
+
opacity: isLoading && withLoadingFallback ? 0 : 1,
|
|
256
|
+
position: ratio !== 0 ? 'absolute' : 'static',
|
|
257
|
+
objectFit: effectiveObjectFit,
|
|
258
|
+
objectPosition,
|
|
259
|
+
}}
|
|
260
|
+
ref={combineRefs(imageRef, ref)}
|
|
261
|
+
src={src}
|
|
262
|
+
srcSet={srcSet}
|
|
263
|
+
className={classnames(borderRadiusStyle, styles.image, {
|
|
264
|
+
[styles.imageWithBorder]: props.border,
|
|
265
|
+
})}
|
|
266
|
+
alt={alt}
|
|
267
|
+
onError={() => {
|
|
268
|
+
setIsError(true);
|
|
269
|
+
setHideLoadingFallback(true);
|
|
270
|
+
onError?.();
|
|
271
|
+
}}
|
|
272
|
+
onLoad={onLoadHandler}
|
|
273
|
+
// Sometimes Safari doesn't render images completely
|
|
274
|
+
// https://stackoverflow.com/questions/58323768/ios-safari-images-not-rendering-fully-cut-off
|
|
275
|
+
// https://www.tunetheweb.com/blog/what-does-the-image-decoding-attribute-actually-do/
|
|
276
|
+
decoding="async"
|
|
277
|
+
/>
|
|
278
|
+
{/* When using SSR, we render a small script that makes the img visible as soon as it finishes loading, without waiting for React client hydrate. */}
|
|
279
|
+
{/* Note that this <script> does nothing when rendering client side (the browser only execute scripts injected inside <head>), it's only executed when the browser receives the SSRed html */}
|
|
280
|
+
{withLoadingFallback && (
|
|
281
|
+
<script
|
|
282
|
+
// eslint-disable-next-line react/no-danger
|
|
283
|
+
dangerouslySetInnerHTML={{
|
|
284
|
+
__html: `(function () {
|
|
285
|
+
var img = document.getElementById("${imageId}");
|
|
286
|
+
if (img.complete) {
|
|
287
|
+
img.style.opacity = "1";
|
|
288
|
+
} else {
|
|
289
|
+
img.addEventListener('load', function (e) { e.target.style.opacity = "1"; });
|
|
290
|
+
}
|
|
291
|
+
})();`,
|
|
292
|
+
}}
|
|
293
|
+
/>
|
|
294
|
+
)}
|
|
295
|
+
</>
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
return (
|
|
299
|
+
<>
|
|
300
|
+
{withLoadingFallback && !hideLoadingFallback && (
|
|
301
|
+
<div
|
|
302
|
+
style={{position: 'absolute', width: '100%', height: '100%', overflow: 'hidden'}}
|
|
303
|
+
className={borderRadiusStyle}
|
|
304
|
+
>
|
|
305
|
+
<SkeletonAnimation height={props.height ?? '100%'} width={props.width ?? '100%'}>
|
|
306
|
+
<SkeletonBase height="100%" width="100%" noBorderRadius />
|
|
307
|
+
</SkeletonAnimation>
|
|
308
|
+
</div>
|
|
309
|
+
)}
|
|
310
|
+
{isError && withErrorFallback && (
|
|
311
|
+
<div
|
|
312
|
+
style={{
|
|
313
|
+
position: 'absolute',
|
|
314
|
+
width: '100%',
|
|
315
|
+
height: '100%',
|
|
316
|
+
}}
|
|
317
|
+
>
|
|
318
|
+
<ImageError border={props.border} className={borderRadiusStyle} />
|
|
319
|
+
</div>
|
|
320
|
+
)}
|
|
321
|
+
{!isError && img}
|
|
322
|
+
</>
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
const Image = React.forwardRef<HTMLImageElement, ImageProps>((props, ref) => {
|
|
328
|
+
const ratio =
|
|
329
|
+
props.width && props.height
|
|
330
|
+
? undefined
|
|
331
|
+
: props.circular
|
|
332
|
+
? 1
|
|
333
|
+
: typeof props.aspectRatio === 'number' || !props.aspectRatio
|
|
334
|
+
? props.aspectRatio ?? 0
|
|
335
|
+
: RATIO[props.aspectRatio];
|
|
336
|
+
|
|
337
|
+
return (
|
|
338
|
+
<AspectRatioContainer
|
|
339
|
+
style={{position: 'relative'}}
|
|
340
|
+
aspectRatio={ratio}
|
|
341
|
+
width={props.width}
|
|
342
|
+
height={props.height}
|
|
343
|
+
dataAttributes={getPrefixedDataAttributes(props.dataAttributes, 'Image')}
|
|
344
|
+
// @ts-expect-error forceNonCssAspectRatio is intentionally not included in the props type and should only be used for testing purposes
|
|
345
|
+
forceNonCssAspectRatio={(props as any).forceNonCssAspectRatio}
|
|
346
|
+
>
|
|
347
|
+
<ImageContent {...props} ref={ref} />
|
|
348
|
+
</AspectRatioContainer>
|
|
349
|
+
);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
export default Image;
|