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