@sorayasm/vietri-ds 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +21 -0
  3. package/README.md +254 -2
  4. package/dist/index.cjs +11 -0
  5. package/dist/index.cjs.map +1 -0
  6. package/dist/index.js +2010 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/types/components/BarChart/BarChart.d.ts +15 -0
  9. package/dist/types/components/BarChart/BarChart.d.ts.map +1 -0
  10. package/dist/types/components/BarChart/index.d.ts +3 -0
  11. package/dist/types/components/BarChart/index.d.ts.map +1 -0
  12. package/dist/types/components/Button/Button.d.ts +3 -0
  13. package/dist/types/components/Button/Button.d.ts.map +1 -0
  14. package/dist/types/components/Button/index.d.ts +3 -0
  15. package/dist/types/components/Button/index.d.ts.map +1 -0
  16. package/dist/types/components/Card/Card.d.ts +7 -0
  17. package/dist/types/components/Card/Card.d.ts.map +1 -0
  18. package/dist/types/components/Card/index.d.ts +3 -0
  19. package/dist/types/components/Card/index.d.ts.map +1 -0
  20. package/dist/types/components/Chip/Chip.d.ts +17 -0
  21. package/dist/types/components/Chip/Chip.d.ts.map +1 -0
  22. package/dist/types/components/Chip/index.d.ts +3 -0
  23. package/dist/types/components/Chip/index.d.ts.map +1 -0
  24. package/dist/types/components/ContentRail/ContentRail.d.ts +24 -0
  25. package/dist/types/components/ContentRail/ContentRail.d.ts.map +1 -0
  26. package/dist/types/components/ContentRail/index.d.ts +3 -0
  27. package/dist/types/components/ContentRail/index.d.ts.map +1 -0
  28. package/dist/types/components/CopyField/CopyField.d.ts +16 -0
  29. package/dist/types/components/CopyField/CopyField.d.ts.map +1 -0
  30. package/dist/types/components/CopyField/index.d.ts +3 -0
  31. package/dist/types/components/CopyField/index.d.ts.map +1 -0
  32. package/dist/types/components/DataTable/DataTable.d.ts +23 -0
  33. package/dist/types/components/DataTable/DataTable.d.ts.map +1 -0
  34. package/dist/types/components/DataTable/index.d.ts +3 -0
  35. package/dist/types/components/DataTable/index.d.ts.map +1 -0
  36. package/dist/types/components/Dialog/Dialog.d.ts +20 -0
  37. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -0
  38. package/dist/types/components/Dialog/index.d.ts +3 -0
  39. package/dist/types/components/Dialog/index.d.ts.map +1 -0
  40. package/dist/types/components/Drawer/Drawer.d.ts +21 -0
  41. package/dist/types/components/Drawer/Drawer.d.ts.map +1 -0
  42. package/dist/types/components/Drawer/index.d.ts +3 -0
  43. package/dist/types/components/Drawer/index.d.ts.map +1 -0
  44. package/dist/types/components/EpisodeList/EpisodeList.d.ts +37 -0
  45. package/dist/types/components/EpisodeList/EpisodeList.d.ts.map +1 -0
  46. package/dist/types/components/EpisodeList/index.d.ts +3 -0
  47. package/dist/types/components/EpisodeList/index.d.ts.map +1 -0
  48. package/dist/types/components/FeatureCard/FeatureCard.d.ts +17 -0
  49. package/dist/types/components/FeatureCard/FeatureCard.d.ts.map +1 -0
  50. package/dist/types/components/FeatureCard/index.d.ts +3 -0
  51. package/dist/types/components/FeatureCard/index.d.ts.map +1 -0
  52. package/dist/types/components/Footer/Footer.d.ts +24 -0
  53. package/dist/types/components/Footer/Footer.d.ts.map +1 -0
  54. package/dist/types/components/Footer/index.d.ts +3 -0
  55. package/dist/types/components/Footer/index.d.ts.map +1 -0
  56. package/dist/types/components/Hero/Hero.d.ts +21 -0
  57. package/dist/types/components/Hero/Hero.d.ts.map +1 -0
  58. package/dist/types/components/Hero/index.d.ts +3 -0
  59. package/dist/types/components/Hero/index.d.ts.map +1 -0
  60. package/dist/types/components/Icon/Icon.d.ts +11 -0
  61. package/dist/types/components/Icon/Icon.d.ts.map +1 -0
  62. package/dist/types/components/Icon/icons.d.ts +6 -0
  63. package/dist/types/components/Icon/icons.d.ts.map +1 -0
  64. package/dist/types/components/Icon/index.d.ts +3 -0
  65. package/dist/types/components/Icon/index.d.ts.map +1 -0
  66. package/dist/types/components/Input/Input.d.ts +3 -0
  67. package/dist/types/components/Input/Input.d.ts.map +1 -0
  68. package/dist/types/components/Input/index.d.ts +3 -0
  69. package/dist/types/components/Input/index.d.ts.map +1 -0
  70. package/dist/types/components/LanguageSwitch/LanguageSwitch.d.ts +13 -0
  71. package/dist/types/components/LanguageSwitch/LanguageSwitch.d.ts.map +1 -0
  72. package/dist/types/components/LanguageSwitch/index.d.ts +3 -0
  73. package/dist/types/components/LanguageSwitch/index.d.ts.map +1 -0
  74. package/dist/types/components/MediaCard/MediaCard.d.ts +31 -0
  75. package/dist/types/components/MediaCard/MediaCard.d.ts.map +1 -0
  76. package/dist/types/components/MediaCard/index.d.ts +3 -0
  77. package/dist/types/components/MediaCard/index.d.ts.map +1 -0
  78. package/dist/types/components/NavBar/NavBar.d.ts +23 -0
  79. package/dist/types/components/NavBar/NavBar.d.ts.map +1 -0
  80. package/dist/types/components/NavBar/index.d.ts +3 -0
  81. package/dist/types/components/NavBar/index.d.ts.map +1 -0
  82. package/dist/types/components/PlaylistCard/PlaylistCard.d.ts +27 -0
  83. package/dist/types/components/PlaylistCard/PlaylistCard.d.ts.map +1 -0
  84. package/dist/types/components/PlaylistCard/index.d.ts +3 -0
  85. package/dist/types/components/PlaylistCard/index.d.ts.map +1 -0
  86. package/dist/types/components/ProfileCard/ProfileCard.d.ts +29 -0
  87. package/dist/types/components/ProfileCard/ProfileCard.d.ts.map +1 -0
  88. package/dist/types/components/ProfileCard/index.d.ts +3 -0
  89. package/dist/types/components/ProfileCard/index.d.ts.map +1 -0
  90. package/dist/types/components/SectionHeader/SectionHeader.d.ts +17 -0
  91. package/dist/types/components/SectionHeader/SectionHeader.d.ts.map +1 -0
  92. package/dist/types/components/SectionHeader/index.d.ts +3 -0
  93. package/dist/types/components/SectionHeader/index.d.ts.map +1 -0
  94. package/dist/types/components/Select/Select.d.ts +23 -0
  95. package/dist/types/components/Select/Select.d.ts.map +1 -0
  96. package/dist/types/components/Select/index.d.ts +3 -0
  97. package/dist/types/components/Select/index.d.ts.map +1 -0
  98. package/dist/types/components/SkipLink/SkipLink.d.ts +12 -0
  99. package/dist/types/components/SkipLink/SkipLink.d.ts.map +1 -0
  100. package/dist/types/components/SkipLink/index.d.ts +3 -0
  101. package/dist/types/components/SkipLink/index.d.ts.map +1 -0
  102. package/dist/types/components/StatCard/StatCard.d.ts +11 -0
  103. package/dist/types/components/StatCard/StatCard.d.ts.map +1 -0
  104. package/dist/types/components/StatCard/index.d.ts +3 -0
  105. package/dist/types/components/StatCard/index.d.ts.map +1 -0
  106. package/dist/types/components/Steps/Steps.d.ts +20 -0
  107. package/dist/types/components/Steps/Steps.d.ts.map +1 -0
  108. package/dist/types/components/Steps/index.d.ts +3 -0
  109. package/dist/types/components/Steps/index.d.ts.map +1 -0
  110. package/dist/types/components/Tabs/Tabs.d.ts +5 -0
  111. package/dist/types/components/Tabs/Tabs.d.ts.map +1 -0
  112. package/dist/types/components/Tabs/index.d.ts +3 -0
  113. package/dist/types/components/Tabs/index.d.ts.map +1 -0
  114. package/dist/types/components/Timeline/Timeline.d.ts +24 -0
  115. package/dist/types/components/Timeline/Timeline.d.ts.map +1 -0
  116. package/dist/types/components/Timeline/index.d.ts +3 -0
  117. package/dist/types/components/Timeline/index.d.ts.map +1 -0
  118. package/dist/types/components/Typography/Typography.d.ts +3 -0
  119. package/dist/types/components/Typography/Typography.d.ts.map +1 -0
  120. package/dist/types/components/Typography/index.d.ts +3 -0
  121. package/dist/types/components/Typography/index.d.ts.map +1 -0
  122. package/dist/types/components/VideoEmbed/VideoEmbed.d.ts +25 -0
  123. package/dist/types/components/VideoEmbed/VideoEmbed.d.ts.map +1 -0
  124. package/dist/types/components/VideoEmbed/index.d.ts +3 -0
  125. package/dist/types/components/VideoEmbed/index.d.ts.map +1 -0
  126. package/dist/types/components/VisuallyHidden/VisuallyHidden.d.ts +7 -0
  127. package/dist/types/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  128. package/dist/types/components/VisuallyHidden/index.d.ts +2 -0
  129. package/dist/types/components/VisuallyHidden/index.d.ts.map +1 -0
  130. package/dist/types/components/index.d.ts +61 -0
  131. package/dist/types/components/index.d.ts.map +1 -0
  132. package/dist/types/components/internal/stretched.d.ts +18 -0
  133. package/dist/types/components/internal/stretched.d.ts.map +1 -0
  134. package/dist/types/index.d.ts +3 -0
  135. package/dist/types/index.d.ts.map +1 -0
  136. package/dist/types/theme/augmentation.d.ts +18 -0
  137. package/dist/types/theme/augmentation.d.ts.map +1 -0
  138. package/dist/types/theme/base.d.ts +17 -0
  139. package/dist/types/theme/base.d.ts.map +1 -0
  140. package/dist/types/theme/categorical.d.ts +35 -0
  141. package/dist/types/theme/categorical.d.ts.map +1 -0
  142. package/dist/types/theme/categorical.test.d.ts +2 -0
  143. package/dist/types/theme/categorical.test.d.ts.map +1 -0
  144. package/dist/types/theme/components.d.ts +8 -0
  145. package/dist/types/theme/components.d.ts.map +1 -0
  146. package/dist/types/theme/editorial.d.ts +2 -0
  147. package/dist/types/theme/editorial.d.ts.map +1 -0
  148. package/dist/types/theme/gradients.test.d.ts +2 -0
  149. package/dist/types/theme/gradients.test.d.ts.map +1 -0
  150. package/dist/types/theme/index.d.ts +13 -0
  151. package/dist/types/theme/index.d.ts.map +1 -0
  152. package/dist/types/theme/observatory.d.ts +2 -0
  153. package/dist/types/theme/observatory.d.ts.map +1 -0
  154. package/dist/types/theme/palettes.d.ts +74 -0
  155. package/dist/types/theme/palettes.d.ts.map +1 -0
  156. package/dist/types/theme/status.test.d.ts +2 -0
  157. package/dist/types/theme/status.test.d.ts.map +1 -0
  158. package/dist/types/theme/streaming.d.ts +2 -0
  159. package/dist/types/theme/streaming.d.ts.map +1 -0
  160. package/dist/types/theme/themes.test.d.ts +2 -0
  161. package/dist/types/theme/themes.test.d.ts.map +1 -0
  162. package/dist/types/theme/tokens.d.ts +49 -0
  163. package/dist/types/theme/tokens.d.ts.map +1 -0
  164. package/package.json +88 -4
package/CHANGELOG.md ADDED
@@ -0,0 +1,44 @@
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.0
8
+
9
+ ### Added
10
+
11
+ - Shared components: `Icon`, `Chip`, `CategoryChip`, `Footer`, `SectionHeader`,
12
+ `Select`, `Dialog`, `Drawer`, `CopyField`, `SkipLink`, `VisuallyHidden`.
13
+ - Observatory components: `Hero`, `FeatureCard`, `Steps`, `Timeline`,
14
+ `ProfileCard`.
15
+ - Streaming components: `MediaCard`, `ContentRail`, `VideoEmbed`,
16
+ `EpisodeList`, `PlaylistCard`.
17
+ - A palette per theme (`editorialColors`, `streamingColors`,
18
+ `observatoryColors`), typed as `ThemeColors` and available as
19
+ `theme.vietri.color`.
20
+ - `createVietriTheme(colors)` to build a theme from a palette.
21
+ - Two category palettes: the default soft tints and
22
+ `observatoryCategoryPalette`.
23
+ - Automated accessibility checks (axe-core) for every component, contrast
24
+ tests for every theme, and an Accessibility panel in Storybook.
25
+
26
+ ### Changed
27
+
28
+ - Themes are flat: no theme uses gradients or decorative lights.
29
+ - Default text colors for success, warning, info and error meet WCAG AA in
30
+ every theme.
31
+ - Default chips are opaque, so they stay legible on any surface.
32
+ - `@mui/material` peer dependency is limited to 6.x until 7.x is verified.
33
+ - The package is now published as `@sorayasm/vietri-ds` under the MIT license.
34
+
35
+ ### Breaking
36
+
37
+ - The global color exports `brand`, `derived` and `gradientStops` were removed.
38
+ Each theme now has its own palette in `palettes.ts`.
39
+
40
+ ## 0.1.0
41
+
42
+ - Tokens, three themes, and the first components: `Button`, `Typography`,
43
+ `Card`, `Input`, `NavBar`, `LanguageSwitch`, `Tabs`, `StatCard`, `DataTable`
44
+ 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
- # Temporary Holding Version
1
+ # Vietri DS
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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"),b=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"),H=require("@mui/material/Drawer"),C=require("@mui/material/Link"),L=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 O({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"}){const h=w.useTheme(),s=me(h.breakpoints.up("md"),{noSsr:!0}),[n,u]=b.useState(!1),g=()=>u(!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.jsxs(ge,{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}),s?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(O,{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":n,onClick:()=>u(!0),children:e.jsx(ye,{})})]})]}),!s&&e.jsx(H,{anchor:"right",open:n,onClose:g,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:g,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(O,{link:f,onClick:g})},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 z(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]=b.useState(null),h=b.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,f)=>u*ke(z(g,n),z(f,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(L,{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=b.useId(),n=b.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=b.useId();return e.jsx(H,{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]=b.useState("idle"),s=b.useRef(void 0);b.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(L,{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 $={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:$,children:t}):a?e.jsx(C,{component:"button",type:"button",onClick:a,underline:"none",sx:$,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),f=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:v=>({position:"relative",height:"100%",overflow:"hidden",...g&&{"&:hover":{borderColor:v.palette.primary.main}},...Pe(v)}),children:[e.jsxs(c,{sx:v=>({position:"relative",aspectRatio:"16 / 9",bgcolor:v.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:v=>({position:"absolute",top:8,left:8,px:1,py:.25,borderRadius:1,fontSize:"0.75rem",fontWeight:600,bgcolor:v.vietri.color.action[0],color:v.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:f}),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=b.useId(),n=b.useRef(null),u=b.Children.toArray(r);function g(f){const v=n.current;if(!v)return;const Q=typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;v.scrollBy?.({left:f*v.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:f=>({overflowX:"auto",pb:1,scrollSnapType:"x proximity","&:focus-visible":{outline:`2px solid ${f.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((f,v)=>e.jsx(c,{component:"li",sx:{flex:`0 0 ${l}px`,scrollSnapAlign:"start"},children:f},v))})})]})}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]=b.useState(!o),s=b.useRef(!1),n=b.useRef(null);return b.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:f=>({position:"relative",display:"flex",gap:2,p:2,borderBottom:1,borderColor:"divider",borderLeft:4,borderLeftColor:n?f.palette.primary.main:"transparent",...u&&{"&:hover":{bgcolor:f.palette.action.hover}},...Xe(f)}),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