@sorayasm/vietri-ds 0.0.0-stage → 0.2.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/CHANGELOG.md +53 -0
- package/LICENSE +21 -0
- package/README.md +254 -2
- package/dist/index.cjs +11 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +2012 -0
- package/dist/index.js.map +1 -0
- package/dist/types/components/BarChart/BarChart.d.ts +15 -0
- package/dist/types/components/BarChart/BarChart.d.ts.map +1 -0
- package/dist/types/components/BarChart/index.d.ts +3 -0
- package/dist/types/components/BarChart/index.d.ts.map +1 -0
- package/dist/types/components/Button/Button.d.ts +3 -0
- package/dist/types/components/Button/Button.d.ts.map +1 -0
- package/dist/types/components/Button/index.d.ts +3 -0
- package/dist/types/components/Button/index.d.ts.map +1 -0
- package/dist/types/components/Card/Card.d.ts +7 -0
- package/dist/types/components/Card/Card.d.ts.map +1 -0
- package/dist/types/components/Card/index.d.ts +3 -0
- package/dist/types/components/Card/index.d.ts.map +1 -0
- package/dist/types/components/Chip/Chip.d.ts +17 -0
- package/dist/types/components/Chip/Chip.d.ts.map +1 -0
- package/dist/types/components/Chip/index.d.ts +3 -0
- package/dist/types/components/Chip/index.d.ts.map +1 -0
- package/dist/types/components/ContentRail/ContentRail.d.ts +24 -0
- package/dist/types/components/ContentRail/ContentRail.d.ts.map +1 -0
- package/dist/types/components/ContentRail/index.d.ts +3 -0
- package/dist/types/components/ContentRail/index.d.ts.map +1 -0
- package/dist/types/components/CopyField/CopyField.d.ts +16 -0
- package/dist/types/components/CopyField/CopyField.d.ts.map +1 -0
- package/dist/types/components/CopyField/index.d.ts +3 -0
- package/dist/types/components/CopyField/index.d.ts.map +1 -0
- package/dist/types/components/DataTable/DataTable.d.ts +23 -0
- package/dist/types/components/DataTable/DataTable.d.ts.map +1 -0
- package/dist/types/components/DataTable/index.d.ts +3 -0
- package/dist/types/components/DataTable/index.d.ts.map +1 -0
- package/dist/types/components/Dialog/Dialog.d.ts +20 -0
- package/dist/types/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/types/components/Dialog/index.d.ts +3 -0
- package/dist/types/components/Dialog/index.d.ts.map +1 -0
- package/dist/types/components/Drawer/Drawer.d.ts +21 -0
- package/dist/types/components/Drawer/Drawer.d.ts.map +1 -0
- package/dist/types/components/Drawer/index.d.ts +3 -0
- package/dist/types/components/Drawer/index.d.ts.map +1 -0
- package/dist/types/components/EpisodeList/EpisodeList.d.ts +37 -0
- package/dist/types/components/EpisodeList/EpisodeList.d.ts.map +1 -0
- package/dist/types/components/EpisodeList/index.d.ts +3 -0
- package/dist/types/components/EpisodeList/index.d.ts.map +1 -0
- package/dist/types/components/FeatureCard/FeatureCard.d.ts +17 -0
- package/dist/types/components/FeatureCard/FeatureCard.d.ts.map +1 -0
- package/dist/types/components/FeatureCard/index.d.ts +3 -0
- package/dist/types/components/FeatureCard/index.d.ts.map +1 -0
- package/dist/types/components/Footer/Footer.d.ts +24 -0
- package/dist/types/components/Footer/Footer.d.ts.map +1 -0
- package/dist/types/components/Footer/index.d.ts +3 -0
- package/dist/types/components/Footer/index.d.ts.map +1 -0
- package/dist/types/components/Hero/Hero.d.ts +21 -0
- package/dist/types/components/Hero/Hero.d.ts.map +1 -0
- package/dist/types/components/Hero/index.d.ts +3 -0
- package/dist/types/components/Hero/index.d.ts.map +1 -0
- package/dist/types/components/Icon/Icon.d.ts +11 -0
- package/dist/types/components/Icon/Icon.d.ts.map +1 -0
- package/dist/types/components/Icon/icons.d.ts +6 -0
- package/dist/types/components/Icon/icons.d.ts.map +1 -0
- package/dist/types/components/Icon/index.d.ts +3 -0
- package/dist/types/components/Icon/index.d.ts.map +1 -0
- package/dist/types/components/Input/Input.d.ts +3 -0
- package/dist/types/components/Input/Input.d.ts.map +1 -0
- package/dist/types/components/Input/index.d.ts +3 -0
- package/dist/types/components/Input/index.d.ts.map +1 -0
- package/dist/types/components/LanguageSwitch/LanguageSwitch.d.ts +13 -0
- package/dist/types/components/LanguageSwitch/LanguageSwitch.d.ts.map +1 -0
- package/dist/types/components/LanguageSwitch/index.d.ts +3 -0
- package/dist/types/components/LanguageSwitch/index.d.ts.map +1 -0
- package/dist/types/components/MediaCard/MediaCard.d.ts +31 -0
- package/dist/types/components/MediaCard/MediaCard.d.ts.map +1 -0
- package/dist/types/components/MediaCard/index.d.ts +3 -0
- package/dist/types/components/MediaCard/index.d.ts.map +1 -0
- package/dist/types/components/NavBar/NavBar.d.ts +30 -0
- package/dist/types/components/NavBar/NavBar.d.ts.map +1 -0
- package/dist/types/components/NavBar/index.d.ts +3 -0
- package/dist/types/components/NavBar/index.d.ts.map +1 -0
- package/dist/types/components/PlaylistCard/PlaylistCard.d.ts +27 -0
- package/dist/types/components/PlaylistCard/PlaylistCard.d.ts.map +1 -0
- package/dist/types/components/PlaylistCard/index.d.ts +3 -0
- package/dist/types/components/PlaylistCard/index.d.ts.map +1 -0
- package/dist/types/components/ProfileCard/ProfileCard.d.ts +29 -0
- package/dist/types/components/ProfileCard/ProfileCard.d.ts.map +1 -0
- package/dist/types/components/ProfileCard/index.d.ts +3 -0
- package/dist/types/components/ProfileCard/index.d.ts.map +1 -0
- package/dist/types/components/SectionHeader/SectionHeader.d.ts +17 -0
- package/dist/types/components/SectionHeader/SectionHeader.d.ts.map +1 -0
- package/dist/types/components/SectionHeader/index.d.ts +3 -0
- package/dist/types/components/SectionHeader/index.d.ts.map +1 -0
- package/dist/types/components/Select/Select.d.ts +23 -0
- package/dist/types/components/Select/Select.d.ts.map +1 -0
- package/dist/types/components/Select/index.d.ts +3 -0
- package/dist/types/components/Select/index.d.ts.map +1 -0
- package/dist/types/components/SkipLink/SkipLink.d.ts +12 -0
- package/dist/types/components/SkipLink/SkipLink.d.ts.map +1 -0
- package/dist/types/components/SkipLink/index.d.ts +3 -0
- package/dist/types/components/SkipLink/index.d.ts.map +1 -0
- package/dist/types/components/StatCard/StatCard.d.ts +11 -0
- package/dist/types/components/StatCard/StatCard.d.ts.map +1 -0
- package/dist/types/components/StatCard/index.d.ts +3 -0
- package/dist/types/components/StatCard/index.d.ts.map +1 -0
- package/dist/types/components/Steps/Steps.d.ts +20 -0
- package/dist/types/components/Steps/Steps.d.ts.map +1 -0
- package/dist/types/components/Steps/index.d.ts +3 -0
- package/dist/types/components/Steps/index.d.ts.map +1 -0
- package/dist/types/components/Tabs/Tabs.d.ts +5 -0
- package/dist/types/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/types/components/Tabs/index.d.ts +3 -0
- package/dist/types/components/Tabs/index.d.ts.map +1 -0
- package/dist/types/components/Timeline/Timeline.d.ts +24 -0
- package/dist/types/components/Timeline/Timeline.d.ts.map +1 -0
- package/dist/types/components/Timeline/index.d.ts +3 -0
- package/dist/types/components/Timeline/index.d.ts.map +1 -0
- package/dist/types/components/Typography/Typography.d.ts +3 -0
- package/dist/types/components/Typography/Typography.d.ts.map +1 -0
- package/dist/types/components/Typography/index.d.ts +3 -0
- package/dist/types/components/Typography/index.d.ts.map +1 -0
- package/dist/types/components/VideoEmbed/VideoEmbed.d.ts +25 -0
- package/dist/types/components/VideoEmbed/VideoEmbed.d.ts.map +1 -0
- package/dist/types/components/VideoEmbed/index.d.ts +3 -0
- package/dist/types/components/VideoEmbed/index.d.ts.map +1 -0
- package/dist/types/components/VisuallyHidden/VisuallyHidden.d.ts +7 -0
- package/dist/types/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/types/components/VisuallyHidden/index.d.ts +2 -0
- package/dist/types/components/VisuallyHidden/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +61 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/components/internal/stretched.d.ts +18 -0
- package/dist/types/components/internal/stretched.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/theme/augmentation.d.ts +18 -0
- package/dist/types/theme/augmentation.d.ts.map +1 -0
- package/dist/types/theme/base.d.ts +17 -0
- package/dist/types/theme/base.d.ts.map +1 -0
- package/dist/types/theme/categorical.d.ts +35 -0
- package/dist/types/theme/categorical.d.ts.map +1 -0
- package/dist/types/theme/categorical.test.d.ts +2 -0
- package/dist/types/theme/categorical.test.d.ts.map +1 -0
- package/dist/types/theme/components.d.ts +8 -0
- package/dist/types/theme/components.d.ts.map +1 -0
- package/dist/types/theme/editorial.d.ts +2 -0
- package/dist/types/theme/editorial.d.ts.map +1 -0
- package/dist/types/theme/gradients.test.d.ts +2 -0
- package/dist/types/theme/gradients.test.d.ts.map +1 -0
- package/dist/types/theme/index.d.ts +13 -0
- package/dist/types/theme/index.d.ts.map +1 -0
- package/dist/types/theme/observatory.d.ts +2 -0
- package/dist/types/theme/observatory.d.ts.map +1 -0
- package/dist/types/theme/palettes.d.ts +74 -0
- package/dist/types/theme/palettes.d.ts.map +1 -0
- package/dist/types/theme/status.test.d.ts +2 -0
- package/dist/types/theme/status.test.d.ts.map +1 -0
- package/dist/types/theme/streaming.d.ts +2 -0
- package/dist/types/theme/streaming.d.ts.map +1 -0
- package/dist/types/theme/themes.test.d.ts +2 -0
- package/dist/types/theme/themes.test.d.ts.map +1 -0
- package/dist/types/theme/tokens.d.ts +49 -0
- package/dist/types/theme/tokens.d.ts.map +1 -0
- package/package.json +88 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Vietri DS are listed here. The project follows
|
|
4
|
+
[Semantic Versioning](https://semver.org/); while the version is 0.x, a minor
|
|
5
|
+
version may include breaking changes.
|
|
6
|
+
|
|
7
|
+
## 0.2.1
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- `NavBar` content is now limited to the large width (1200 px) by default, so
|
|
12
|
+
the header lines up with the page content instead of spanning the whole
|
|
13
|
+
screen. A new `maxWidth` prop (`"lg"` by default, `false` for full width)
|
|
14
|
+
controls it.
|
|
15
|
+
|
|
16
|
+
## 0.2.0
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- Shared components: `Icon`, `Chip`, `CategoryChip`, `Footer`, `SectionHeader`,
|
|
21
|
+
`Select`, `Dialog`, `Drawer`, `CopyField`, `SkipLink`, `VisuallyHidden`.
|
|
22
|
+
- Observatory components: `Hero`, `FeatureCard`, `Steps`, `Timeline`,
|
|
23
|
+
`ProfileCard`.
|
|
24
|
+
- Streaming components: `MediaCard`, `ContentRail`, `VideoEmbed`,
|
|
25
|
+
`EpisodeList`, `PlaylistCard`.
|
|
26
|
+
- A palette per theme (`editorialColors`, `streamingColors`,
|
|
27
|
+
`observatoryColors`), typed as `ThemeColors` and available as
|
|
28
|
+
`theme.vietri.color`.
|
|
29
|
+
- `createVietriTheme(colors)` to build a theme from a palette.
|
|
30
|
+
- Two category palettes: the default soft tints and
|
|
31
|
+
`observatoryCategoryPalette`.
|
|
32
|
+
- Automated accessibility checks (axe-core) for every component, contrast
|
|
33
|
+
tests for every theme, and an Accessibility panel in Storybook.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- Themes are flat: no theme uses gradients or decorative lights.
|
|
38
|
+
- Default text colors for success, warning, info and error meet WCAG AA in
|
|
39
|
+
every theme.
|
|
40
|
+
- Default chips are opaque, so they stay legible on any surface.
|
|
41
|
+
- `@mui/material` peer dependency is limited to 6.x until 7.x is verified.
|
|
42
|
+
- The package is now published as `@sorayasm/vietri-ds` under the MIT license.
|
|
43
|
+
|
|
44
|
+
### Breaking
|
|
45
|
+
|
|
46
|
+
- The global color exports `brand`, `derived` and `gradientStops` were removed.
|
|
47
|
+
Each theme now has its own palette in `palettes.ts`.
|
|
48
|
+
|
|
49
|
+
## 0.1.0
|
|
50
|
+
|
|
51
|
+
- Tokens, three themes, and the first components: `Button`, `Typography`,
|
|
52
|
+
`Card`, `Input`, `NavBar`, `LanguageSwitch`, `Tabs`, `StatCard`, `DataTable`
|
|
53
|
+
and `BarChart`.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Soraya Sacaan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,255 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Vietri DS
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A themeable design system built with React, TypeScript and MUI. It is the shared UI foundation for the projects in the [Soraya Sacaan](https://www.sorayasacaan.com) portfolio: the portfolio site, the streaming platform and the Mujeres del Blues Observatory.
|
|
4
|
+
|
|
5
|
+
> **Status:** early development (v0.1). Foundations, themes, tooling and the first set of components are in place.
|
|
6
|
+
|
|
7
|
+
## Goals
|
|
8
|
+
|
|
9
|
+
- Reusable, composable components
|
|
10
|
+
- Design tokens as a single source of truth
|
|
11
|
+
- Multi-theme architecture
|
|
12
|
+
- Storybook documentation
|
|
13
|
+
- Testing, including automated accessibility checks
|
|
14
|
+
- Responsive and accessible UI (WCAG 2.2 AA)
|
|
15
|
+
|
|
16
|
+
## Releases
|
|
17
|
+
|
|
18
|
+
The package is published on npm as [`@sorayasm/vietri-ds`](https://www.npmjs.com/package/@sorayasm/vietri-ds). Every release is listed in the [changelog](./CHANGELOG.md). Storybook is deployed to GitHub Pages by the `Storybook` workflow and lives at [sorayasm.github.io/vietri-ds](https://sorayasm.github.io/vietri-ds/) once Pages is enabled in the repository settings. Source code: [github.com/sorayasm/vietri-ds](https://github.com/sorayasm/vietri-ds).
|
|
19
|
+
|
|
20
|
+
## Themes
|
|
21
|
+
|
|
22
|
+
| Theme | Mode | Used by |
|
|
23
|
+
| ------------- | ----- | --------------------------- |
|
|
24
|
+
| `editorial` | Light | Portfolio (Soraya Sacaan) |
|
|
25
|
+
| `streaming` | Dark | El Blues es Femenino |
|
|
26
|
+
| `observatory` | Light | Mujeres del Blues Observatory |
|
|
27
|
+
|
|
28
|
+
All three themes are built from the same `baseOptions` (typography, spacing, shape, breakpoints, component styles) and only differ in their palette. Each palette lives in `src/theme/palettes.ts`, so changing a color means editing one file.
|
|
29
|
+
|
|
30
|
+
Tokens are also available inside components through `theme.vietri` (typed via MUI module augmentation).
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
import { ThemeProvider, CssBaseline } from "@mui/material";
|
|
34
|
+
import { streamingTheme } from "@sorayasm/vietri-ds";
|
|
35
|
+
|
|
36
|
+
<ThemeProvider theme={streamingTheme}>
|
|
37
|
+
<CssBaseline />
|
|
38
|
+
<App />
|
|
39
|
+
</ThemeProvider>;
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Palettes
|
|
43
|
+
|
|
44
|
+
Each theme has its own identity.
|
|
45
|
+
|
|
46
|
+
| Theme | Brand colors | Notes |
|
|
47
|
+
| ------------- | ------------------------------------------------------------------- | ----- |
|
|
48
|
+
| `editorial` | black `#000000`, gold `#DBAC5B`, white `#FFFFFF`, light gold `#FDD07A` | Gold is used as a fill with black text. Bronze `#7A5718` carries gold-colored text. |
|
|
49
|
+
| `streaming` | night `#20123A`, violet `#693BCC`, magenta `#CB1F9C`, orange `#F35F1C` | Dark theme. Orange is the primary action; violet fills footers and banners. |
|
|
50
|
+
| `observatory` | teal `#027381`, cyan `#0EB9CB`, amber `#FFC23D`, coral `#FF7751`, vermilion `#F33829`, crimson `#C41E32`, purple `#4A0875` | Light theme. Teal carries actions, purple the footer. Cyan, amber, coral and vermilion are fills for charts and highlights. |
|
|
51
|
+
|
|
52
|
+
Every palette is a typed `ThemeColors` object (`editorialColors`, `streamingColors`, `observatoryColors`). The active theme's palette is available inside components as `theme.vietri.color`.
|
|
53
|
+
|
|
54
|
+
Brand colors that cannot carry text on their own (gold on white, violet on deep purple, cyan or amber on white) are only used as **fills** next to a text color that reaches 4.5:1, or replaced by a text-safe sibling. Every text pair in every theme is tested for WCAG AA.
|
|
55
|
+
|
|
56
|
+
## Flat colors
|
|
57
|
+
|
|
58
|
+
No theme uses gradients: every fill is a solid color. The structure that would allow them is still there. A fill is described by a pair of colors in `ThemeColors` (`action`, `actionHover`, `surface`), and a flat theme simply repeats the same color twice. A theme that wants a gradient only needs two different colors, and the tests already check contrast at both ends of every fill.
|
|
59
|
+
|
|
60
|
+
They reach components through `theme.vietri.gradient`:
|
|
61
|
+
|
|
62
|
+
- `surface` — headers, footers and banners (light text on top)
|
|
63
|
+
- `action` and `actionHover` — primary buttons
|
|
64
|
+
|
|
65
|
+
`ThemeColors.glow` can also add soft decorative lights to the footer. It is `null` in every theme today.
|
|
66
|
+
|
|
67
|
+
## Categorical colors
|
|
68
|
+
|
|
69
|
+
`createCategoryColors(["USA", "Chile", …])` assigns a stable color to each category (country, role, decade). The category name is always shown as text, so color is never the only cue. Use it with `CategoryChip` and `ProfileCard`.
|
|
70
|
+
|
|
71
|
+
There are two palettes. The default one has soft tints (text at AAA, 7:1). `observatoryCategoryPalette` uses the seven brand fills of the Observatory, with dark or white text chosen for AA: `createCategoryColors(keys, observatoryCategoryPalette)`. Pass the keys ordered by importance (for example countries by number of profiles); with more than seven categories the colors repeat.
|
|
72
|
+
|
|
73
|
+
## Components
|
|
74
|
+
|
|
75
|
+
Use the theme switcher in the Storybook toolbar to see every component in the three themes.
|
|
76
|
+
|
|
77
|
+
| Group | Components |
|
|
78
|
+
| ---------------- | -------------------------------------------------------------------------- |
|
|
79
|
+
| Basics | `Button`, `Typography`, `Card`, `Input`, `Select`, `Chip`, `CategoryChip` |
|
|
80
|
+
| Navigation | `NavBar`, `LanguageSwitch`, `Tabs`, `SkipLink` |
|
|
81
|
+
| Layout & content | `Footer`, `SectionHeader`, `Hero`, `FeatureCard`, `Steps`, `Timeline` |
|
|
82
|
+
| Overlays | `Dialog`, `Drawer` |
|
|
83
|
+
| Streaming | `MediaCard`, `ContentRail`, `VideoEmbed`, `EpisodeList`, `PlaylistCard` |
|
|
84
|
+
| Data & people | `StatCard`, `DataTable`, `BarChart`, `ProfileCard` |
|
|
85
|
+
| Utilities | `Icon` (lucide-react), `CopyField`, `VisuallyHidden` |
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
import {
|
|
89
|
+
Button,
|
|
90
|
+
Footer,
|
|
91
|
+
Input,
|
|
92
|
+
NavBar,
|
|
93
|
+
LanguageSwitch,
|
|
94
|
+
SectionHeader,
|
|
95
|
+
SkipLink,
|
|
96
|
+
icons,
|
|
97
|
+
Icon,
|
|
98
|
+
} from "@sorayasm/vietri-ds";
|
|
99
|
+
|
|
100
|
+
<SkipLink href="#content" />
|
|
101
|
+
<NavBar
|
|
102
|
+
brand="Soraya Sacaan"
|
|
103
|
+
links={[{ label: "About", href: "#about" }]}
|
|
104
|
+
actions={<LanguageSwitch value={lang} onChange={setLang} />}
|
|
105
|
+
/>
|
|
106
|
+
<main id="content">
|
|
107
|
+
<SectionHeader title="Selected work" level={1} />
|
|
108
|
+
<Button startIcon={<Icon icon={icons.ArrowRight} />}>Explore</Button>
|
|
109
|
+
<Input label="Email" helperText="We only use it to reply." />
|
|
110
|
+
</main>
|
|
111
|
+
<Footer title="Soraya Sacaan" legal="© 2026" />
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Components are thin wrappers over MUI where possible. The brand look (radius, focus ring, outlined cards, gradients, input borders with 3:1 contrast) lives in `src/theme/components.ts`, so it is shared by all themes.
|
|
115
|
+
|
|
116
|
+
Every user-facing default text ("Menu", "Close", "Copy"…) is a prop, so the components work in both languages of the portfolio.
|
|
117
|
+
|
|
118
|
+
## Accessibility
|
|
119
|
+
|
|
120
|
+
Vietri DS targets **WCAG 2.2 AA**:
|
|
121
|
+
|
|
122
|
+
- Contrast is tested on every theme, including both ends of each gradient.
|
|
123
|
+
- All interactive components work with the keyboard; focus is always visible (white on dark surfaces).
|
|
124
|
+
- `Dialog` and `Drawer` trap focus, close with Escape and are announced with their title.
|
|
125
|
+
- The system "reduce motion" preference is respected.
|
|
126
|
+
- `src/a11y.test.tsx` runs axe-core on every component.
|
|
127
|
+
- The Storybook **Accessibility** panel checks each story while you work.
|
|
128
|
+
|
|
129
|
+
See *Foundations / Accessibility* in Storybook for the full checklist and what each app must do.
|
|
130
|
+
|
|
131
|
+
## Stack
|
|
132
|
+
|
|
133
|
+
React · TypeScript · Vite · MUI · Emotion · lucide-react · Storybook · Vitest · Testing Library · axe-core
|
|
134
|
+
|
|
135
|
+
## Getting started
|
|
136
|
+
|
|
137
|
+
Requires Node.js 20.19 or higher (Vite 7 and Storybook 10).
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
npm install
|
|
141
|
+
npm run storybook
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Scripts
|
|
145
|
+
|
|
146
|
+
| Command | Description |
|
|
147
|
+
| ------------------------- | ----------------------------------------- |
|
|
148
|
+
| `npm run dev` | Start the Vite dev server (demo app) |
|
|
149
|
+
| `npm run build` | Type-check and build the library |
|
|
150
|
+
| `npm run build:lib` | Build the library (ESM, CJS and types) |
|
|
151
|
+
| `npm run typecheck` | Run TypeScript checks |
|
|
152
|
+
| `npm test` | Run tests once |
|
|
153
|
+
| `npm run test:watch` | Run tests in watch mode |
|
|
154
|
+
| `npm run storybook` | Start Storybook on port 6006 |
|
|
155
|
+
| `npm run build-storybook` | Build the static Storybook |
|
|
156
|
+
|
|
157
|
+
## Using the library
|
|
158
|
+
|
|
159
|
+
**1. Install the library and its peer dependencies.** The host app provides the peers, so there is one copy of React, MUI and Emotion:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
npm install @sorayasm/vietri-ds
|
|
163
|
+
npm install react react-dom @mui/material@6 @emotion/react @emotion/styled lucide-react
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**2. Load the Inter font.** The library does not ship it. For example, in `index.html`:
|
|
167
|
+
|
|
168
|
+
```html
|
|
169
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
170
|
+
<link
|
|
171
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"
|
|
172
|
+
rel="stylesheet"
|
|
173
|
+
/>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**3. Wrap the app in one of the Vietri themes.** Components read `theme.vietri`, so they must be rendered inside a Vietri theme (`editorialTheme`, `streamingTheme`, `observatoryTheme`, or your own with `createVietriTheme`). A plain MUI theme is not enough.
|
|
177
|
+
|
|
178
|
+
```tsx
|
|
179
|
+
import { CssBaseline, ThemeProvider } from "@mui/material";
|
|
180
|
+
import { SkipLink, observatoryTheme } from "@sorayasm/vietri-ds";
|
|
181
|
+
|
|
182
|
+
export function App() {
|
|
183
|
+
return (
|
|
184
|
+
<ThemeProvider theme={observatoryTheme}>
|
|
185
|
+
<CssBaseline />
|
|
186
|
+
<SkipLink href="#content" />
|
|
187
|
+
<main id="content">…</main>
|
|
188
|
+
</ThemeProvider>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**4. Translate the texts.** Every user-facing default ("Menu", "Close", "Copy"…) is a prop, so an app in another language passes its own.
|
|
194
|
+
|
|
195
|
+
`react`, `react-dom`, `@mui/material` (6.x), `@emotion/react`, `@emotion/styled` and `lucide-react` are peer dependencies. The `theme.vietri` types are added to MUI automatically when `@sorayasm/vietri-ds` is imported.
|
|
196
|
+
|
|
197
|
+
## Project structure
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
vietri-ds/
|
|
201
|
+
├── .storybook/ # Storybook config (main.ts, preview.tsx)
|
|
202
|
+
├── src/
|
|
203
|
+
│ ├── components/ # One folder per component, with stories and tests
|
|
204
|
+
│ ├── docs/ # Storybook documentation pages
|
|
205
|
+
│ ├── test/ # Vitest setup, renderWithTheme and axe helpers
|
|
206
|
+
│ ├── theme/ # Tokens and the three themes
|
|
207
|
+
│ │ ├── tokens.ts # brand colors, gradients, typography, shadows, breakpoints
|
|
208
|
+
│ │ ├── categorical.ts # accessible categorical palette
|
|
209
|
+
│ │ ├── base.ts # options shared by all themes
|
|
210
|
+
│ │ ├── components.ts # MUI component overrides (brand look)
|
|
211
|
+
│ │ ├── augmentation.ts # typed theme.vietri
|
|
212
|
+
│ │ ├── editorial.ts
|
|
213
|
+
│ │ ├── streaming.ts
|
|
214
|
+
│ │ ├── observatory.ts
|
|
215
|
+
│ │ └── index.ts
|
|
216
|
+
│ ├── a11y.test.tsx # axe checks for every component
|
|
217
|
+
│ ├── index.ts # library entry (components + themes)
|
|
218
|
+
│ ├── main.tsx # demo app
|
|
219
|
+
│ └── styles.css
|
|
220
|
+
├── vite.config.ts # Vite + Vitest config
|
|
221
|
+
├── vite.lib.config.ts # library build
|
|
222
|
+
└── package.json
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Roadmap
|
|
226
|
+
|
|
227
|
+
**Setup**
|
|
228
|
+
|
|
229
|
+
- [x] Vite, TypeScript, MUI and Emotion
|
|
230
|
+
- [x] Storybook and Vitest configuration
|
|
231
|
+
- [x] Base theme and theme variants
|
|
232
|
+
|
|
233
|
+
**Foundations**
|
|
234
|
+
|
|
235
|
+
- [x] Tokens (colors, gradients, typography, shadows, breakpoints)
|
|
236
|
+
- [x] Typed theme extension (MUI module augmentation)
|
|
237
|
+
- [x] One palette per theme (typeface: Inter)
|
|
238
|
+
- [x] Accessible categorical palette
|
|
239
|
+
|
|
240
|
+
**Components**
|
|
241
|
+
|
|
242
|
+
- [x] Button, Typography, Card, Input
|
|
243
|
+
- [x] Navigation (NavBar, LanguageSwitch, Tabs, SkipLink)
|
|
244
|
+
- [x] Data components (StatCard, DataTable, BarChart)
|
|
245
|
+
- [x] Shared components (Icon, Chip, Footer, SectionHeader, Select, Dialog, Drawer, CopyField)
|
|
246
|
+
- [x] Observatory components (Hero, FeatureCard, Steps, Timeline, ProfileCard)
|
|
247
|
+
- [x] Streaming components (MediaCard, ContentRail, VideoEmbed, EpisodeList, PlaylistCard)
|
|
248
|
+
|
|
249
|
+
**Documentation and delivery**
|
|
250
|
+
|
|
251
|
+
- [x] Storybook documentation (Welcome, Colors, Typography, Accessibility, Usage)
|
|
252
|
+
- [x] Theme switcher in Storybook
|
|
253
|
+
- [x] Library build and exports
|
|
254
|
+
- [ ] Streaming application
|
|
255
|
+
- [ ] Observatory application
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),c=require("@mui/material/Box"),m=require("@mui/material/Stack"),p=require("@mui/material/Typography"),I=require("@mui/material/Button"),k=require("@mui/material/Card"),J=require("@mui/material/CardActionArea"),K=require("@mui/material/CardActions"),B=require("@mui/material/CardContent"),Z=require("@mui/material/CardMedia"),q=require("@mui/material/Chip"),v=require("react"),D=require("@mui/material/IconButton"),x=require("lucide-react"),ee=require("@mui/material/Table"),te=require("@mui/material/TableBody"),W=require("@mui/material/TableCell"),re=require("@mui/material/TableContainer"),ie=require("@mui/material/TableHead"),R=require("@mui/material/TableRow"),ne=require("@mui/material/TableSortLabel"),oe=require("@mui/material/DialogActions"),ae=require("@mui/material/DialogContent"),se=require("@mui/material/DialogContentText"),le=require("@mui/material/DialogTitle"),ce=require("@mui/material/Dialog"),L=require("@mui/material/Drawer"),C=require("@mui/material/Link"),O=require("@mui/material/Container"),de=require("@mui/material/Divider"),w=require("@mui/material/styles"),P=require("@mui/material/TextField"),ue=require("@mui/material/ToggleButton"),pe=require("@mui/material/ToggleButtonGroup"),he=require("@mui/material/AppBar"),xe=require("@mui/material/SvgIcon"),ge=require("@mui/material/Toolbar"),me=require("@mui/material/useMediaQuery"),fe=require("@mui/material/MenuItem"),be=require("@mui/material/Tab"),ve=require("@mui/material/Tabs"),Fe=require("@mui/material/ButtonBase");function ye(){return e.jsx(xe,{children:e.jsx("path",{d:"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"})})}function z({link:t,onClick:r}){return e.jsx(C,{href:t.href,underline:"none","aria-current":t.current?"page":void 0,onClick:r,sx:{color:t.current?"text.primary":"text.secondary",fontWeight:t.current?600:500,"&:hover":{color:"text.primary"}},children:t.label})}function je({brand:t,brandHref:r="/",links:i,actions:l,ariaLabel:o="Main",menuLabel:a="Menu",closeLabel:d="Close menu",maxWidth:h="lg"}){const s=w.useTheme(),n=me(s.breakpoints.up("md"),{noSsr:!0}),[u,g]=v.useState(!1),b=()=>g(!1);return e.jsxs(he,{component:"header",position:"sticky",color:"inherit",elevation:0,sx:{bgcolor:"background.default",color:"text.primary",borderBottom:1,borderColor:"divider"},children:[e.jsx(O,{maxWidth:h,children:e.jsxs(ge,{disableGutters:!0,sx:{justifyContent:"space-between",gap:3,minHeight:{xs:64,md:72}},children:[e.jsx(C,{href:r,underline:"none",color:"text.primary",sx:{fontWeight:600,letterSpacing:"-0.03em",fontSize:"1.125rem"},children:t}),n?e.jsxs(m,{direction:"row",alignItems:"center",spacing:4,children:[e.jsx(c,{component:"nav","aria-label":o,children:e.jsx(m,{component:"ul",direction:"row",spacing:4,sx:{listStyle:"none",m:0,p:0},children:i.map(f=>e.jsx("li",{children:e.jsx(z,{link:f})},f.href))})}),l]}):e.jsxs(m,{direction:"row",alignItems:"center",spacing:1,children:[l,e.jsx(D,{edge:"end",color:"inherit","aria-label":a,"aria-expanded":u,onClick:()=>g(!0),children:e.jsx(ye,{})})]})]})}),!n&&e.jsx(L,{anchor:"right",open:u,onClose:b,children:e.jsxs(c,{sx:{width:280,p:3},children:[e.jsx(m,{alignItems:"flex-end",sx:{mb:3},children:e.jsx(I,{variant:"text",color:"secondary",onClick:b,children:d})}),e.jsx(c,{component:"nav","aria-label":o,children:e.jsx(m,{component:"ul",spacing:3,sx:{listStyle:"none",m:0,p:0,fontSize:"1.25rem"},children:i.map(f=>e.jsx("li",{children:e.jsx(z,{link:f,onClick:b})},f.href))})})]})})]})}const Ce=[{value:"en",label:"EN"},{value:"es",label:"ES"}];function Se({value:t,onChange:r,options:i=Ce,ariaLabel:l="Language"}){return e.jsx(pe,{exclusive:!0,size:"small",value:t,"aria-label":l,onChange:(o,a)=>{a!==null&&r(a)},children:i.map(o=>e.jsx(ue,{value:o.value,children:o.label},o.value))})}function we({value:t,label:r,description:i}){return e.jsx(k,{children:e.jsxs(B,{children:[e.jsx(p,{variant:"h3",component:"p",children:t}),e.jsx(p,{variant:"body1",sx:{mt:1},children:r}),i&&e.jsx(p,{variant:"body2",color:"text.secondary",sx:{mt:1},children:i})]})})}function G(t,r){return t[r.key]}function $(t,r){if(r.sortValue)return r.sortValue(t);const i=G(t,r);return typeof i=="number"?i:String(i??"")}function ke(t,r){return typeof t=="number"&&typeof r=="number"?t-r:String(t).localeCompare(String(r),void 0,{numeric:!0})}function Be({columns:t,rows:r,getRowKey:i,caption:l,emptyMessage:o="No data"}){const[a,d]=v.useState(null),h=v.useMemo(()=>{if(!a)return r;const n=t.find(g=>g.key===a.key);if(!n)return r;const u=a.direction==="asc"?1:-1;return[...r].sort((g,b)=>u*ke($(g,n),$(b,n)))},[r,t,a]),s=n=>{d(u=>u?.key===n&&u.direction==="asc"?{key:n,direction:"desc"}:{key:n,direction:"asc"})};return e.jsx(re,{tabIndex:0,sx:{overflowX:"auto"},children:e.jsxs(ee,{children:[l&&e.jsx(p,{component:"caption",variant:"body2",color:"text.secondary",sx:{captionSide:"top",textAlign:"left",pb:2},children:l}),e.jsx(ie,{children:e.jsx(R,{children:t.map(n=>{const u=a?.key===n.key?a.direction:void 0;return e.jsx(W,{align:n.align,sortDirection:u??!1,children:n.sortable?e.jsx(ne,{active:u!==void 0,direction:u??"asc",onClick:()=>s(n.key),children:n.header}):n.header},n.key)})})}),e.jsx(te,{children:h.length===0?e.jsx(R,{children:e.jsx(W,{colSpan:t.length,align:"center",children:o})}):h.map(n=>e.jsx(R,{children:t.map((u,g)=>e.jsx(W,{align:u.align,component:g===0?"th":"td",scope:g===0?"row":void 0,children:u.render?u.render(n):String(G(n,u)??"")},u.key))},i(n)))})]})})}function De({data:t,title:r,max:i,formatValue:l=String}){const o=i??Math.max(0,...t.map(a=>a.value));return e.jsxs(c,{component:"figure",sx:{m:0},children:[r&&e.jsx(p,{component:"figcaption",variant:"overline",color:"text.secondary",sx:{display:"block",mb:2},children:r}),e.jsx(m,{component:"ul",spacing:1.5,sx:{listStyle:"none",m:0,p:0},children:t.map(a=>{const d=o>0?Math.min(100,Math.max(0,a.value/o*100)):0,h=l(a.value);return e.jsxs(c,{component:"li",sx:{display:"grid",gridTemplateColumns:"minmax(80px, 160px) 1fr auto",alignItems:"center",columnGap:2},children:[e.jsx(p,{variant:"body2","aria-hidden":"true",children:a.label}),e.jsx(c,{role:"meter","aria-label":a.label,"aria-valuemin":0,"aria-valuemax":o,"aria-valuenow":a.value,"aria-valuetext":h,sx:{height:12,borderRadius:1,bgcolor:"divider",overflow:"hidden"},children:e.jsx(c,{style:{width:`${d}%`},sx:{height:"100%",bgcolor:"primary.main"}})}),e.jsx(p,{variant:"body2","aria-hidden":"true",sx:{minWidth:40,textAlign:"right",fontWeight:600},children:h})]},a.label)})})]})}function j({icon:t,label:r,size:i=18,...l}){return r?e.jsx(t,{size:i,role:"img","aria-label":r,...l}):e.jsx(t,{size:i,"aria-hidden":"true",focusable:"false",...l})}const Ee=Object.freeze(Object.defineProperty({__proto__:null,ArrowRight:x.ArrowRight,Check:x.Check,ChevronDown:x.ChevronDown,ChevronLeft:x.ChevronLeft,ChevronRight:x.ChevronRight,Clock:x.Clock,Copy:x.Copy,Database:x.Database,ExternalLink:x.ExternalLink,Globe:x.Globe,Info:x.Info,LayoutGrid:x.LayoutGrid,MapPin:x.MapPin,Menu:x.Menu,Music:x.Music,Network:x.Network,Play:x.Play,Search:x.Search,Share2:x.Share2,ShieldCheck:x.ShieldCheck,Sparkles:x.Sparkles,TrendingUp:x.TrendingUp,Users:x.Users,X:x.X},Symbol.toStringTag,{value:"Module"}));function V({color:t,dot:r=!1,...i}){return e.jsx(q,{size:"small",...i,icon:r?e.jsx(c,{component:"span","aria-hidden":"true",sx:{width:8,height:8,borderRadius:"50%",bgcolor:t.fg}}):void 0,sx:{bgcolor:t.bg,color:t.fg,"&.MuiChip-clickable:hover":{bgcolor:t.bg,filter:"brightness(0.95)"},"& .MuiChip-icon":{color:t.fg,ml:1,mr:-.25}}})}function M(t){return e.jsx(c,{component:"span",sx:{border:0,clip:"rect(0 0 0 0)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",whiteSpace:"nowrap",width:"1px"},...t})}function Ae({title:t,description:r,lines:i=[],links:l=[],linksLabel:o="Footer links",action:a,legal:d,externalLabel:h="(opens in a new tab)"}){const{glow:s}=w.useTheme().vietri.color;return e.jsxs(c,{component:"footer",sx:n=>({position:"relative",overflow:"hidden",py:6,color:n.vietri.color.onSurface,background:n.vietri.gradient.surface,"& a:focus-visible, & button:focus-visible":{outline:"2px solid",outlineColor:n.vietri.color.onSurface,outlineOffset:3}}),children:[s&&e.jsxs(e.Fragment,{children:[e.jsx(c,{"aria-hidden":"true",sx:{position:"absolute",top:-96,right:-96,width:384,height:384,borderRadius:"50%",bgcolor:w.alpha(s[0],.22),filter:"blur(64px)",pointerEvents:"none"}}),e.jsx(c,{"aria-hidden":"true",sx:{position:"absolute",bottom:-96,left:-96,width:384,height:384,borderRadius:"50%",bgcolor:w.alpha(s[1],.22),filter:"blur(64px)",pointerEvents:"none"}})]}),e.jsxs(O,{maxWidth:"lg",sx:{position:"relative",zIndex:1},children:[e.jsxs(m,{direction:{xs:"column",sm:"row"},justifyContent:"space-between",alignItems:{xs:"flex-start",sm:"center"},spacing:4,children:[e.jsxs(m,{spacing:1,children:[e.jsx(p,{component:"p",variant:"h6",children:t}),r&&e.jsx(p,{variant:"body2",sx:n=>({maxWidth:560,color:n.vietri.color.onSurfaceSoft}),children:r}),i.map(n=>e.jsx(p,{variant:"body2",sx:u=>({color:u.vietri.color.onSurfaceSoft}),children:n},n))]}),e.jsxs(m,{spacing:2,alignItems:{xs:"flex-start",sm:"flex-end"},children:[l.length>0&&e.jsx(c,{component:"nav","aria-label":o,children:e.jsx(m,{component:"ul",direction:"row",spacing:3,useFlexGap:!0,flexWrap:"wrap",sx:{listStyle:"none",m:0,p:0},children:l.map(n=>e.jsx("li",{children:e.jsxs(C,{href:n.href,color:"inherit",underline:"always",target:n.external?"_blank":void 0,rel:n.external?"noopener noreferrer":void 0,sx:{display:"inline-flex",alignItems:"center",gap:.5},children:[n.label,n.external&&e.jsxs(e.Fragment,{children:[e.jsx(j,{icon:x.ExternalLink,size:14}),e.jsx(M,{children:h})]})]})},n.href))})}),a]})]}),d&&e.jsxs(e.Fragment,{children:[e.jsx(de,{sx:n=>({my:3,borderColor:w.alpha(n.vietri.color.onSurface,.25)})}),e.jsx(p,{variant:"body2",sx:n=>({color:n.vietri.color.onSurfaceSoft}),children:d})]})]})]})}function Ie({title:t,eyebrow:r,description:i,level:l=2,align:o="left"}){const a=`h${l}`;return e.jsxs(m,{spacing:1,sx:{textAlign:o,alignItems:o==="center"?"center":"flex-start"},children:[r&&e.jsx(p,{component:"p",variant:"overline",color:"primary.main",sx:{display:"inline-flex",alignItems:"center",gap:.75,lineHeight:1.5},children:r}),e.jsx(p,{component:a,variant:"h3",children:t}),i&&e.jsx(p,{variant:"body1",color:"text.secondary",sx:{maxWidth:680},children:i})]})}function Me({label:t,value:r,onChange:i,options:l,helperText:o,disabled:a,fullWidth:d,size:h,id:s}){const n=new Map(l.map(u=>[u.value,u]));return e.jsx(P,{select:!0,id:s,label:t,value:r,onChange:u=>i(u.target.value),helperText:o,disabled:a,fullWidth:d,size:h,slotProps:{select:{renderValue:u=>{const g=n.get(String(u));return g?e.jsxs(c,{component:"span",sx:{display:"inline-flex",alignItems:"center",gap:1},children:[g.adornment,g.label]}):""}}},children:l.map(u=>e.jsxs(fe,{value:u.value,sx:{gap:1},children:[u.adornment,u.label,u.count!==void 0&&e.jsx(p,{component:"span",variant:"caption",color:"text.secondary",sx:{ml:"auto",pl:2},children:u.count})]},u.value))})}function Te({open:t,onClose:r,title:i,description:l,children:o,actions:a,closeLabel:d="Close",maxWidth:h="sm"}){const s=v.useId(),n=v.useId();return e.jsxs(ce,{open:t,onClose:r,fullWidth:!0,maxWidth:h,"aria-labelledby":s,"aria-describedby":l?n:void 0,children:[e.jsx(le,{id:s,sx:{pr:7},children:i}),e.jsx(D,{"aria-label":d,onClick:r,sx:{position:"absolute",top:8,right:8},children:e.jsx(j,{icon:x.X})}),e.jsxs(ae,{children:[l&&e.jsx(se,{id:n,sx:{mb:o?2:0},children:l}),o]}),a&&e.jsx(oe,{sx:{px:3,pb:2},children:a})]})}function We({open:t,onClose:r,title:i,eyebrow:l,children:o,footer:a,anchor:d="right",width:h=420,closeLabel:s="Close"}){const n=v.useId();return e.jsx(L,{anchor:d,open:t,onClose:r,children:e.jsxs(c,{role:"dialog","aria-modal":"true","aria-labelledby":n,sx:{width:{xs:"100vw",sm:h},maxWidth:"100vw",height:"100%",display:"flex",flexDirection:"column"},children:[e.jsxs(m,{direction:"row",justifyContent:"space-between",alignItems:"center",sx:{p:3,pb:1},children:[e.jsx(p,{component:"p",variant:"overline",color:"primary.main",children:l}),e.jsx(D,{"aria-label":s,onClick:r,edge:"end",children:e.jsx(j,{icon:x.X})})]}),e.jsxs(c,{sx:{px:3,pb:2,flex:1,overflowY:"auto"},tabIndex:0,children:[e.jsx(p,{id:n,component:"h2",variant:"h4",sx:{mb:2},children:i}),o]}),a&&e.jsx(c,{sx:{p:3,borderTop:1,borderColor:"divider"},children:a})]})})}function Re({label:t,value:r,copyLabel:i="Copy",copiedLabel:l="Copied!",errorLabel:o="Could not copy",copiedDuration:a=2e3}){const[d,h]=v.useState("idle"),s=v.useRef(void 0);v.useEffect(()=>()=>clearTimeout(s.current),[]);async function n(){try{await navigator.clipboard.writeText(r),h("copied")}catch{h("error")}clearTimeout(s.current),s.current=setTimeout(()=>h("idle"),a)}const u=d==="copied"?l:d==="error"?o:"";return e.jsxs(m,{spacing:1.5,children:[e.jsx(p,{component:"p",variant:"overline",color:"text.secondary",children:t}),e.jsx(c,{role:"region","aria-label":t,tabIndex:0,sx:{overflowX:"auto",p:1.5,borderRadius:1,border:1,borderColor:"divider",bgcolor:"background.default",fontFamily:"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",fontSize:"0.8125rem",whiteSpace:"pre"},children:e.jsx("code",{children:r})}),e.jsx(I,{onClick:n,startIcon:e.jsx(j,{icon:d==="copied"?x.Check:x.Copy}),fullWidth:!0,children:d==="copied"?l:i}),e.jsx(M,{role:"status","aria-live":"polite",children:u})]})}function qe({href:t,children:r="Skip to content"}){return e.jsx(C,{href:t,sx:i=>({position:"fixed",top:i.spacing(1),left:i.spacing(1),zIndex:i.zIndex.tooltip+1,px:2,py:1,borderRadius:1,bgcolor:"background.paper",color:"text.primary",fontWeight:600,textDecoration:"none",border:`2px solid ${i.palette.primary.main}`,transform:"translateY(-300%)","&:focus":{transform:"translateY(0)"}}),children:r})}function Oe({title:t,eyebrow:r,description:i,actions:l,level:o=1,align:a="left"}){const d=`h${o}`,h=a==="center";return e.jsx(c,{component:"section",sx:s=>({py:{xs:6,md:10},color:s.vietri.color.onSurface,background:s.vietri.gradient.surface,"& a:focus-visible, & button:focus-visible":{outline:"2px solid",outlineColor:s.vietri.color.onSurface,outlineOffset:3},"& .MuiButton-outlined, & .MuiButton-text":{color:"inherit",borderColor:"currentColor"}}),children:e.jsx(O,{maxWidth:"lg",children:e.jsxs(m,{spacing:2,sx:{alignItems:h?"center":"flex-start",textAlign:a},children:[r&&e.jsx(p,{component:"p",variant:"overline",sx:s=>({color:s.vietri.color.onSurfaceSoft}),children:r}),e.jsx(p,{component:d,variant:"h2",sx:{maxWidth:900},children:t}),i&&e.jsx(p,{variant:"body1",sx:s=>({maxWidth:680,color:s.vietri.color.onSurfaceSoft}),children:i}),l&&e.jsx(m,{direction:"row",spacing:2,useFlexGap:!0,flexWrap:"wrap",sx:{pt:2,justifyContent:h?"center":"flex-start"},children:l})]})})})}function ze({icon:t,title:r,description:i,level:l=3,children:o}){const a=`h${l}`;return e.jsx(k,{sx:{height:"100%"},children:e.jsxs(B,{children:[e.jsx(c,{sx:d=>({display:"grid",placeItems:"center",width:44,height:44,mb:2,borderRadius:2,bgcolor:d.vietri.color.chip,color:d.palette.primary.main}),children:e.jsx(j,{icon:t,size:22})}),e.jsx(p,{component:a,variant:"h6",gutterBottom:!0,children:r}),i&&e.jsx(p,{variant:"body2",color:"text.secondary",children:i}),o&&e.jsx(c,{sx:{mt:2},children:o})]})})}function $e({steps:t,level:r=3,ariaLabel:i}){const l=`h${r}`;return e.jsx(c,{component:"ol",role:"list","aria-label":i,sx:{listStyle:"none",m:0,p:0,display:"grid",gap:3,gridTemplateColumns:{xs:"1fr",md:`repeat(${Math.max(t.length,1)}, minmax(0, 1fr))`}},children:t.map((o,a)=>e.jsx("li",{children:e.jsxs(m,{spacing:1,children:[e.jsx(c,{"aria-hidden":"true",sx:d=>({display:"grid",placeItems:"center",width:36,height:36,borderRadius:"50%",fontWeight:600,bgcolor:d.palette.primary.main,color:d.palette.primary.contrastText}),children:a+1}),e.jsx(p,{component:l,variant:"h6",children:o.title}),o.description&&e.jsx(p,{variant:"body2",color:"text.secondary",children:o.description})]})},o.title))})}function He({entries:t,level:r=3,ariaLabel:i}){const l=`h${r}`;return e.jsx(c,{component:"ol",role:"list","aria-label":i,sx:{listStyle:"none",m:0,p:0},children:t.map(o=>e.jsxs(c,{component:"li",id:o.id,sx:a=>({position:"relative",pl:4,pb:5,scrollMarginTop:a.spacing(10),"&::before":{content:'""',position:"absolute",left:7,top:14,bottom:0,width:2,bgcolor:a.palette.divider},"&:last-of-type":{pb:0},"&:last-of-type::before":{display:"none"}}),children:[e.jsx(c,{"aria-hidden":"true",sx:a=>({position:"absolute",left:0,top:6,width:16,height:16,borderRadius:"50%",bgcolor:a.palette.primary.main,border:`3px solid ${a.palette.background.default}`,boxSizing:"border-box"})}),e.jsx(p,{component:l,variant:"h5",children:o.label}),o.description&&e.jsx(p,{variant:"body2",color:"text.secondary",sx:{mt:.5},children:o.description}),o.content&&e.jsx(c,{sx:{mt:2},children:o.content})]},o.id))})}const H={position:"static",color:"inherit",font:"inherit",textAlign:"left",cursor:"pointer","&::after":{content:'""',position:"absolute",inset:0}};function Le({name:t,subtitle:r,bio:i,tags:l=[],href:o,onClick:a,level:d=3,bioLines:h=3}){const s=`h${d}`,n=!!(o||a),u=o?e.jsx(C,{href:o,underline:"none",sx:H,children:t}):a?e.jsx(C,{component:"button",type:"button",onClick:a,underline:"none",sx:H,children:t}):t;return e.jsx(k,{sx:g=>({position:"relative",height:"100%",...n&&{"&:hover":{borderColor:g.palette.primary.main}},"&:has(:focus-visible)":{outline:`2px solid ${g.palette.primary.main}`,outlineOffset:2},"& a:focus-visible, & button:focus-visible":{outline:"none"}}),children:e.jsxs(B,{children:[e.jsx(p,{component:s,variant:"h6",children:u}),r&&e.jsx(p,{variant:"body2",color:"text.secondary",children:r}),i&&e.jsx(p,{variant:"body2",sx:{mt:1,display:"-webkit-box",WebkitLineClamp:h,WebkitBoxOrient:"vertical",overflow:"hidden"},children:i}),l.length>0&&e.jsx(m,{direction:"row",spacing:1,useFlexGap:!0,flexWrap:"wrap",sx:{mt:2},children:l.map(g=>g.color?e.jsx(V,{label:g.label,color:g.color},g.label):e.jsx(q,{label:g.label,size:"small"},g.label))})]})})}const A={position:"static",color:"inherit",font:"inherit",textAlign:"left",cursor:"pointer","&::after":{content:'""',position:"absolute",inset:0}},Pe=t=>({"&:has(:focus-visible)":{outline:`2px solid ${t.palette.primary.main}`,outlineOffset:2},"& a:focus-visible, & button:focus-visible":{outline:"none"}});function Ge({title:t,subtitle:r,meta:i,imageUrl:l,duration:o,badge:a,href:d,onClick:h,level:s=3,playIcon:n=!0}){const u=`h${s}`,g=!!(d||h),b=d?e.jsx(C,{href:d,underline:"none",sx:A,children:t}):h?e.jsx(C,{component:"button",type:"button",onClick:h,underline:"none",sx:A,children:t}):t;return e.jsxs(k,{sx:f=>({position:"relative",height:"100%",overflow:"hidden",...g&&{"&:hover":{borderColor:f.palette.primary.main}},...Pe(f)}),children:[e.jsxs(c,{sx:f=>({position:"relative",aspectRatio:"16 / 9",bgcolor:f.vietri.color.chip}),children:[l&&e.jsx(c,{component:"img",src:l,alt:"",loading:"lazy",sx:{display:"block",width:"100%",height:"100%",objectFit:"cover"}}),n&&e.jsx(c,{"aria-hidden":"true",sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",display:"grid",placeItems:"center",width:48,height:48,borderRadius:"50%",bgcolor:"rgba(0, 0, 0, 0.8)",color:"#FFFFFF"},children:e.jsx(j,{icon:x.Play,size:22})}),a&&e.jsx(c,{sx:f=>({position:"absolute",top:8,left:8,px:1,py:.25,borderRadius:1,fontSize:"0.75rem",fontWeight:600,bgcolor:f.vietri.color.action[0],color:f.vietri.color.onAction}),children:a}),o&&e.jsx(c,{sx:{position:"absolute",right:8,bottom:8,px:1,py:.25,borderRadius:1,fontSize:"0.75rem",fontWeight:600,bgcolor:"rgba(0, 0, 0, 0.9)",color:"#FFFFFF"},children:o})]}),e.jsxs(B,{children:[i&&e.jsx(p,{component:"p",variant:"overline",color:"text.secondary",children:i}),e.jsx(p,{component:u,variant:"h6",children:b}),r&&e.jsx(p,{variant:"body2",color:"text.secondary",children:r})]})]})}function Ve({title:t,children:r,level:i=2,itemWidth:l=280,previousLabel:o="Scroll left",nextLabel:a="Scroll right",action:d}){const h=`h${i}`,s=v.useId(),n=v.useRef(null),u=v.Children.toArray(r);function g(b){const f=n.current;if(!f)return;const Q=typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;f.scrollBy?.({left:b*f.clientWidth*.8,behavior:Q?"auto":"smooth"})}return e.jsxs(c,{component:"section","aria-labelledby":s,sx:{mb:4},children:[e.jsxs(m,{direction:"row",justifyContent:"space-between",alignItems:"center",sx:{mb:2},children:[e.jsx(p,{id:s,component:h,variant:"h5",children:t}),e.jsxs(m,{direction:"row",spacing:1,alignItems:"center",children:[d,e.jsx(D,{"aria-label":o,onClick:()=>g(-1),children:e.jsx(j,{icon:x.ChevronLeft})}),e.jsx(D,{"aria-label":a,onClick:()=>g(1),children:e.jsx(j,{icon:x.ChevronRight})})]})]}),e.jsx(c,{ref:n,tabIndex:0,sx:b=>({overflowX:"auto",pb:1,scrollSnapType:"x proximity","&:focus-visible":{outline:`2px solid ${b.palette.primary.main}`,outlineOffset:2}}),children:e.jsx(c,{component:"ul",role:"list",sx:{listStyle:"none",m:0,p:0,display:"flex",gap:2},children:u.map((b,f)=>e.jsx(c,{component:"li",sx:{flex:`0 0 ${l}px`,scrollSnapAlign:"start"},children:b},f))})})]})}function Ne(t,r,i){const l=new URLSearchParams({rel:"0",modestbranding:"1"});return r&&l.set("start",String(Math.floor(r))),i&&l.set("autoplay","1"),`https://www.youtube-nocookie.com/embed/${encodeURIComponent(t)}?${l.toString()}`}function Ue({videoId:t,title:r,poster:i,start:l,lazy:o=!0,playLabel:a}){const[d,h]=v.useState(!o),s=v.useRef(!1),n=v.useRef(null);return v.useEffect(()=>{d&&s.current&&n.current?.focus()},[d]),e.jsx(c,{sx:{position:"relative",width:"100%",aspectRatio:"16 / 9",overflow:"hidden",borderRadius:2,bgcolor:"#000000"},children:d?e.jsx("iframe",{ref:n,src:Ne(t,l,s.current),title:r,allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0,referrerPolicy:"strict-origin-when-cross-origin",loading:"lazy",style:{position:"absolute",inset:0,width:"100%",height:"100%",border:0}}):e.jsxs(Fe,{"aria-label":a??`Play video: ${r}`,onClick:()=>{s.current=!0,h(!0)},sx:{position:"absolute",inset:0,width:"100%",height:"100%","&:focus-visible":{outline:"3px solid #FFFFFF",outlineOffset:-6}},children:[i&&e.jsx(c,{component:"img",src:i,alt:"",loading:"lazy",sx:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover"}}),e.jsx(c,{"aria-hidden":"true",sx:{position:"relative",display:"grid",placeItems:"center",width:72,height:72,borderRadius:"50%",bgcolor:"rgba(0, 0, 0, 0.8)",color:"#FFFFFF"},children:e.jsx(j,{icon:x.Play,size:32})})]})})}const Xe=t=>({"&:has(:focus-visible)":{outline:`2px solid ${t.palette.primary.main}`,outlineOffset:-2},"& a:focus-visible, & button:focus-visible":{outline:"none"}});function _e({episodes:t,currentId:r,onSelect:i,level:l=3,ariaLabel:o,episodeLabel:a=h=>`Episode ${h}`,currentLabel:d="Now playing"}){const h=`h${l}`;return e.jsx(c,{component:"ol",role:"list","aria-label":o,sx:{listStyle:"none",m:0,p:0},children:t.map(s=>{const n=s.id===r,u=!!(i||s.href),g=i?e.jsx(C,{component:"button",type:"button",onClick:()=>i(s.id),"aria-current":n?"true":void 0,underline:"none",sx:A,children:s.title}):s.href?e.jsx(C,{href:s.href,"aria-current":n?"true":void 0,underline:"none",sx:A,children:s.title}):s.title;return e.jsxs(c,{component:"li",sx:b=>({position:"relative",display:"flex",gap:2,p:2,borderBottom:1,borderColor:"divider",borderLeft:4,borderLeftColor:n?b.palette.primary.main:"transparent",...u&&{"&:hover":{bgcolor:b.palette.action.hover}},...Xe(b)}),children:[s.imageUrl&&e.jsx(c,{component:"img",src:s.imageUrl,alt:"",loading:"lazy",sx:{flex:"0 0 auto",width:{xs:112,sm:160},aspectRatio:"16 / 9",objectFit:"cover",borderRadius:1}}),e.jsxs(c,{sx:{minWidth:0},children:[e.jsxs(p,{component:"p",variant:"overline",color:"text.secondary",children:[a(s.number),n&&` · ${d}`]}),e.jsx(p,{component:h,variant:"h6",children:g}),s.meta&&e.jsx(p,{variant:"body2",color:"text.secondary",children:s.meta}),s.description&&e.jsx(p,{variant:"body2",sx:{mt:.5,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:s.description})]})]},s.id)})})}function Ye({title:t,description:r,imageUrl:i,platforms:l,level:o=3,platformsLabel:a="Listen on",externalLabel:d="(opens in a new tab)"}){const h=`h${o}`;return e.jsxs(k,{sx:{height:"100%"},children:[e.jsx(c,{sx:s=>({aspectRatio:"1 / 1",display:"grid",placeItems:"center",bgcolor:s.vietri.color.chip,color:s.palette.text.secondary}),children:i?e.jsx(c,{component:"img",src:i,alt:"",loading:"lazy",sx:{display:"block",width:"100%",height:"100%",objectFit:"cover"}}):e.jsx(j,{icon:x.Music,size:48})}),e.jsxs(B,{children:[e.jsx(p,{component:h,variant:"h6",gutterBottom:!0,children:t}),r&&e.jsx(p,{variant:"body2",color:"text.secondary",children:r}),l.length>0&&e.jsx(m,{component:"ul",role:"list","aria-label":a,direction:"row",spacing:1,useFlexGap:!0,flexWrap:"wrap",sx:{listStyle:"none",m:0,mt:2,p:0},children:l.map(s=>e.jsx("li",{children:e.jsxs(I,{variant:"outlined",size:"small",href:s.href,target:"_blank",rel:"noopener noreferrer",endIcon:e.jsx(j,{icon:x.ExternalLink,size:14}),children:[s.name,e.jsxs(M,{children:[" ","– ",t," ",d]})]})},s.name))})]})]})}function E(t,r,i=135){return`linear-gradient(${i}deg, ${t} 0%, ${r} 100%)`}function N(t){return{surface:E(...t.surface),action:E(...t.action),actionHover:E(...t.actionHover)}}const y={spacing:8,radius:{sm:4,md:8,lg:16},typography:{fontFamily:'"Inter", "Helvetica Neue", Arial, sans-serif',fontWeight:{regular:400,medium:500,semibold:600}},shadow:{sm:"0 1px 2px rgba(0, 0, 0, 0.08)",md:"0 4px 12px rgba(0, 0, 0, 0.12)",lg:"0 12px 32px rgba(0, 0, 0, 0.16)"},breakpoints:{xs:0,sm:600,md:900,lg:1200,xl:1536}},Qe={MuiCssBaseline:{styleOverrides:`
|
|
2
|
+
@media (prefers-reduced-motion: reduce) {
|
|
3
|
+
*, *::before, *::after {
|
|
4
|
+
animation-duration: 0.01ms !important;
|
|
5
|
+
animation-iteration-count: 1 !important;
|
|
6
|
+
transition-duration: 0.01ms !important;
|
|
7
|
+
scroll-behavior: auto !important;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
`},MuiButton:{defaultProps:{disableElevation:!0},styleOverrides:{root:({theme:t})=>({borderRadius:y.radius.md,"&:focus-visible":{outline:`2px solid ${t.palette.primary.main}`,outlineOffset:2}}),containedPrimary:({theme:t})=>({color:t.vietri.color.onAction,backgroundImage:t.vietri.gradient.action,"&:hover":{backgroundImage:t.vietri.gradient.actionHover},"&.Mui-disabled":{backgroundImage:"none",color:t.palette.action.disabled}})}},MuiLink:{styleOverrides:{root:({theme:t})=>({"&:focus-visible":{outline:`2px solid ${t.palette.primary.main}`,outlineOffset:3,borderRadius:y.radius.sm}})}},MuiChip:{styleOverrides:{root:({ownerState:t,theme:r})=>{const i=t.variant==="filled"&&t.color==="default";return{fontWeight:y.typography.fontWeight.semibold,fontSize:"0.75rem",...i&&{color:r.vietri.color.onChip,backgroundColor:r.vietri.color.chip,"&.MuiChip-clickable:hover":{backgroundColor:r.vietri.color.chipHover}}}}}},MuiCard:{defaultProps:{variant:"outlined"},styleOverrides:{root:{borderRadius:y.radius.lg,backgroundImage:"none"}}},MuiCardActionArea:{styleOverrides:{root:({theme:t})=>({"&:focus-visible":{outline:`2px solid ${t.palette.primary.main}`,outlineOffset:-2}})}},MuiDialog:{styleOverrides:{paper:{borderRadius:y.radius.lg,backgroundImage:"none"}}},MuiDrawer:{styleOverrides:{paper:{backgroundImage:"none"}}},MuiOutlinedInput:{styleOverrides:{root:({theme:t})=>({borderRadius:y.radius.md,"& .MuiOutlinedInput-notchedOutline":{borderColor:t.palette.text.secondary},"&:hover .MuiOutlinedInput-notchedOutline":{borderColor:t.palette.text.primary},"&.Mui-focused .MuiOutlinedInput-notchedOutline":{borderColor:t.palette.primary.main},"&.Mui-error .MuiOutlinedInput-notchedOutline":{borderColor:t.palette.error.main},"&.Mui-disabled .MuiOutlinedInput-notchedOutline":{borderColor:t.palette.divider}})}},MuiTableCell:{styleOverrides:{root:({theme:t})=>({borderBottomColor:t.palette.divider}),head:({theme:t})=>({fontWeight:y.typography.fontWeight.semibold,color:t.palette.text.primary,borderBottom:`2px solid ${t.palette.text.primary}`})}}},{typography:F,breakpoints:Je}=y;function Ke(t){return{color:t,shadow:y.shadow,gradient:N(t)}}const Ze={spacing:y.spacing,shape:{borderRadius:y.radius.md},breakpoints:{values:{...Je}},typography:{fontFamily:F.fontFamily,fontWeightRegular:F.fontWeight.regular,fontWeightMedium:F.fontWeight.medium,fontWeightBold:F.fontWeight.semibold,h1:{fontSize:"clamp(3rem, 8vw, 7rem)",fontWeight:F.fontWeight.semibold,letterSpacing:"-0.055em",lineHeight:.95},h2:{fontSize:"clamp(2rem, 5vw, 4rem)",fontWeight:F.fontWeight.semibold,letterSpacing:"-0.04em",lineHeight:1.05},h3:{fontSize:"clamp(1.5rem, 3vw, 2.25rem)",fontWeight:F.fontWeight.semibold,letterSpacing:"-0.03em",lineHeight:1.15},h4:{fontSize:"1.5rem",fontWeight:F.fontWeight.semibold,letterSpacing:"-0.02em",lineHeight:1.25},h5:{fontSize:"1.25rem",fontWeight:F.fontWeight.medium,lineHeight:1.3},h6:{fontSize:"1.0625rem",fontWeight:F.fontWeight.medium,lineHeight:1.4},body1:{fontSize:"1rem",lineHeight:1.6},body2:{fontSize:"0.875rem",lineHeight:1.55},button:{fontWeight:F.fontWeight.medium,textTransform:"none",letterSpacing:"-0.01em"},overline:{fontWeight:F.fontWeight.medium,letterSpacing:"0.12em"}},components:Qe};function T(t){return w.createTheme({...Ze,vietri:Ke(t),palette:{mode:t.mode,primary:{main:t.primary,contrastText:t.onPrimary},secondary:{main:t.secondary,contrastText:t.onSecondary},error:{main:t.status.error,contrastText:t.onStatus},warning:{main:t.status.warning,contrastText:t.onStatus},info:{main:t.status.info,contrastText:t.onStatus},success:{main:t.status.success,contrastText:t.onStatus},background:{default:t.bg,paper:t.paper},text:{primary:t.ink,secondary:t.inkSoft},divider:t.line}})}const S=t=>[t,t],et={error:"#B91C1C",warning:"#92400E",info:"#0369A1",success:"#166534"},U={mode:"light",bg:"#FFFFFF",paper:"#FFFFFF",ink:"#111111",inkSoft:"#555555",line:"#E4E4E4",primary:"#000000",onPrimary:"#FFFFFF",secondary:"#7A5718",onSecondary:"#FFFFFF",action:S("#DBAC5B"),actionHover:S("#FDD07A"),onAction:"#000000",surface:S("#000000"),onSurface:"#FFFFFF",onSurfaceSoft:"#D4D4D4",chip:"#F3EBDA",chipHover:"#E8DDC4",onChip:"#111111",glow:null,status:et,onStatus:"#FFFFFF",brand:{black:"#000000",gold:"#DBAC5B",white:"#FFFFFF",goldLight:"#FDD07A"},derived:{bronze:"#7A5718",ink:"#111111",inkSoft:"#555555"}},X={mode:"dark",bg:"#20123A",paper:"#2D1B50",ink:"#FFFFFF",inkSoft:"#D5CAEB",line:"rgba(255, 255, 255, 0.14)",primary:"#F35F1C",onPrimary:"#20123A",secondary:"#B99BFF",onSecondary:"#20123A",action:S("#F35F1C"),actionHover:S("#FF7B3F"),onAction:"#20123A",surface:S("#693BCC"),onSurface:"#FFFFFF",onSurfaceSoft:"#EDE6FB",chip:"#3C2866",chipHover:"#4A3478",onChip:"#FFFFFF",glow:null,status:{error:"#F87171",warning:"#FBBF24",info:"#7DD3FC",success:"#4ADE80"},onStatus:"#20123A",brand:{night:"#20123A",violet:"#693BCC",magenta:"#CB1F9C",orange:"#F35F1C"},derived:{lilac:"#B99BFF",nightRaised:"#2D1B50",orangeHover:"#FF7B3F"}},_={mode:"light",bg:"#F7F4FA",paper:"#FFFFFF",ink:"#2B1B3D",inkSoft:"#5D4F70",line:"#E3DCEB",primary:"#027381",onPrimary:"#FFFFFF",secondary:"#4A0875",onSecondary:"#FFFFFF",action:S("#027381"),actionHover:S("#015C68"),onAction:"#FFFFFF",surface:S("#4A0875"),onSurface:"#FFFFFF",onSurfaceSoft:"#E8DCF4",chip:"#EFE8F6",chipHover:"#E3D8EF",onChip:"#2B1B3D",glow:null,status:{error:"#C41E32",warning:"#92400E",info:"#0369A1",success:"#166534"},onStatus:"#FFFFFF",brand:{teal:"#027381",cyan:"#0EB9CB",amber:"#FFC23D",coral:"#FF7751",vermilion:"#F33829",crimson:"#C41E32",purple:"#4A0875"},derived:{page:"#F7F4FA",ink:"#2B1B3D",inkSoft:"#5D4F70",tealDark:"#015C68"}},tt=T(U),rt=T(X),it=T(_),Y=[{bg:"#E0F2FE",fg:"#0C4A6E",dot:"#0284C7"},{bg:"#EDE9FE",fg:"#4C1D95",dot:"#7C3AED"},{bg:"#FFE4E6",fg:"#881337",dot:"#E11D48"},{bg:"#FEF3C7",fg:"#78350F",dot:"#D97706"},{bg:"#D1FAE5",fg:"#064E3B",dot:"#059669"},{bg:"#FAE8FF",fg:"#701A75",dot:"#C026D3"},{bg:"#CCFBF1",fg:"#134E4A",dot:"#0D9488"},{bg:"#FFEDD5",fg:"#7C2D12",dot:"#EA580C"},{bg:"#E0E7FF",fg:"#312E81",dot:"#4F46E5"},{bg:"#ECFCCB",fg:"#365314",dot:"#65A30D"}];function nt(t,r=Y){const i=Array.from(new Set(t));return Object.fromEntries(i.map((l,o)=>[l,r[o%r.length]]))}const ot=[{bg:"#027381",fg:"#FFFFFF",dot:"#027381"},{bg:"#FF7751",fg:"#2B1B3D",dot:"#C2410C"},{bg:"#FFC23D",fg:"#2B1B3D",dot:"#A16207"},{bg:"#4A0875",fg:"#FFFFFF",dot:"#4A0875"},{bg:"#0EB9CB",fg:"#2B1B3D",dot:"#0E7490"},{bg:"#C41E32",fg:"#FFFFFF",dot:"#C41E32"},{bg:"#F33829",fg:"#000000",dot:"#F33829"}];exports.Typography=p;exports.Button=I;exports.Card=k;exports.CardActionArea=J;exports.CardActions=K;exports.CardContent=B;exports.CardMedia=Z;exports.Chip=q;exports.Input=P;exports.Tab=be;exports.Tabs=ve;exports.BarChart=De;exports.CategoryChip=V;exports.ContentRail=Ve;exports.CopyField=Re;exports.DataTable=Be;exports.Dialog=Te;exports.Drawer=We;exports.EpisodeList=_e;exports.FeatureCard=ze;exports.Footer=Ae;exports.Hero=Oe;exports.Icon=j;exports.LanguageSwitch=Se;exports.MediaCard=Ge;exports.NavBar=je;exports.PlaylistCard=Ye;exports.ProfileCard=Le;exports.SectionHeader=Ie;exports.Select=Me;exports.SkipLink=qe;exports.StatCard=we;exports.Steps=$e;exports.Timeline=He;exports.VideoEmbed=Ue;exports.VisuallyHidden=M;exports.categoryPalette=Y;exports.createCategoryColors=nt;exports.createGradients=N;exports.createVietriTheme=T;exports.editorialColors=U;exports.editorialTheme=tt;exports.icons=Ee;exports.linearGradient=E;exports.observatoryCategoryPalette=ot;exports.observatoryColors=_;exports.observatoryTheme=it;exports.streamingColors=X;exports.streamingTheme=rt;exports.tokens=y;
|
|
11
|
+
//# sourceMappingURL=index.cjs.map
|