@coras-io/embed 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @coras-io/embed
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6220f11: Add `logoHref` to the managed navbar so the brand logo can link to the distributor's own website instead of the embed's landing page
8
+
9
+ ## 0.4.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 233f091: Add `navbarBackgroundImage` and `footerBackgroundImage` so a brand can paint a linear or radial gradient over the navbar and footer, with an optional dark counterpart under `dark`; the solid background colours stay the fallback for the mobile menu, borders, contrast checks and email
14
+ - 233f091: Ship the `brand.json` contract: the file is grouped by surface (`navbar.background`), cites a published JSON Schema, and is read by every consumer in that shape or as flat keys. Rename `mainButton*` to `primaryButton*`, `bodyIcon` to `icon` and `buttonHoverLight` / `buttonHoverDark` to `buttonHoverOnLightFill` / `buttonHoverOnDarkFill`, with their CSS variables (`--coras-brand-primary-button*`, `--coras-brand-icon`, `--coras-color-primary-button*`). Logos are fields, shadows are validated by grammar, `publishBrand` fills in derived values, and `toDesignTokens` exports a brand as W3C Design Tokens
15
+
16
+ ### Patch Changes
17
+
18
+ - e8377e1: Show ampersands and angle brackets in translated text instead of raw HTML entities
19
+ - 030f19d: Show the details page error modal when an attraction request fails, instead of crashing while rendering an empty attraction
20
+ - Updated dependencies [233f091]
21
+ - Updated dependencies [233f091]
22
+ - @coras-io/brand-tokens@0.4.0
23
+
3
24
  ## 0.3.0
4
25
 
5
26
  ### Minor Changes
@@ -27,7 +27,7 @@ export default css `
27
27
  );
28
28
  --filter-chip-selected-background-color: var(--coras-color-primary);
29
29
  --filter-chip-selected-hover-background-color: var(
30
- --coras-color-main-button-hover
30
+ --coras-color-primary-button-hover
31
31
  );
32
32
  --filter-chip-selected-color: var(--coras-palette-white);
33
33
  --filter-chip-disabled-color: var(--coras-color-text-disabled);
@@ -129,7 +129,7 @@ export default css `
129
129
  }
130
130
 
131
131
  .resend-link:hover {
132
- color: var(--coras-color-main-button-hover, #0040cc);
132
+ color: var(--coras-color-primary-button-hover, #0040cc);
133
133
  }
134
134
 
135
135
  .resend-link:disabled {
@@ -4,5 +4,7 @@ import "../../components/footer-menu/footer-menu-item/footer-menu-item.js";
4
4
  export declare class CorasFooter extends LitElement {
5
5
  static styles: CSSResultGroup;
6
6
  private _pageDispatch;
7
+ private readonly colorScheme;
8
+ willUpdate(): void;
7
9
  render(): import("lit").TemplateResult<1>;
8
10
  }
@@ -10,9 +10,17 @@ import { consume } from "@lit/context";
10
10
  import "../../components/footer-menu/footer-menu.js";
11
11
  import "../../components/footer-menu/footer-menu-item/footer-menu-item.js";
12
12
  import styles from "./footer.styles.js";
13
+ import { ColorSchemeController } from "../../core/color-scheme.js";
13
14
  import { pageDispatchContext, } from "../../contexts/events.context.js";
14
15
  let CorasFooter = class CorasFooter extends LitElement {
16
+ constructor() {
17
+ super(...arguments);
18
+ this.colorScheme = new ColorSchemeController(this);
19
+ }
15
20
  static { this.styles = styles; }
21
+ willUpdate() {
22
+ this.dataset.colorScheme = this.colorScheme.scheme;
23
+ }
16
24
  render() {
17
25
  return html `
18
26
  <div class="container">
@@ -5,17 +5,25 @@ export default css `
5
5
 
6
6
  :host {
7
7
  --footer-background: var(--coras-footer-background-color);
8
+ --footer-background-image: var(--coras-footer-background-image);
9
+ --footer-background-image-dark: var(--coras-footer-background-image-dark);
8
10
  --footer-text-color: var(--coras-footer-text-color);
9
11
  --footer-border-top: var(--coras-footer-border-top);
10
12
  --footer-padding-bottom: var(--coras-footer-padding-bottom);
11
13
 
12
14
  background-color: var(--footer-background);
15
+ background-image: var(--footer-background-image);
13
16
  border-top: var(--footer-border-top);
14
17
 
15
18
  width: 100%;
16
19
  pointer-events: none;
17
20
  }
18
21
 
22
+ /* light-dark() takes colours only, so the dark gradient is picked by scheme. */
23
+ :host([data-color-scheme="dark"]) {
24
+ background-image: var(--footer-background-image-dark);
25
+ }
26
+
19
27
  .container {
20
28
  container-type: inline-size;
21
29
  max-width: var(--coras-footer-max-width);
@@ -32,6 +32,7 @@ export declare class CorasNavBar extends CorasNavBar_base implements SearchMixin
32
32
  logo?: string;
33
33
  logoDark?: string;
34
34
  navbarLogo?: string;
35
+ logoHref?: string;
35
36
  private readonly colorScheme;
36
37
  locale: SupportedLocales;
37
38
  locales: SupportedLocales[];
@@ -99,8 +100,10 @@ export declare class CorasNavBar extends CorasNavBar_base implements SearchMixin
99
100
  private renderMobileMenuDrawer;
100
101
  private handleLogoClick;
101
102
  private renderBrand;
103
+ private renderBrandHome;
102
104
  private renderSearchOnlyHeader;
103
105
  private renderFullHeader;
106
+ willUpdate(): void;
104
107
  render(): import("lit").TemplateResult<1>;
105
108
  }
106
109
  export {};
@@ -10,6 +10,7 @@ import { ColorSchemeController } from "../../core/color-scheme.js";
10
10
  import { when } from "lit/directives/when.js";
11
11
  import { localized, msg } from "@lit/localize";
12
12
  import { consume, ContextConsumer } from "@lit/context";
13
+ import { safeUrl } from "@coras-io/brand-tokens";
13
14
  import "../../components/button/button.js";
14
15
  import "../../components/icon/icon.js";
15
16
  import "../../components/input-field/input-field.js";
@@ -620,21 +621,40 @@ let CorasNavBar = class CorasNavBar extends SearchMixin(SignalWatcher(LitElement
620
621
  ? this.logoDark
621
622
  : this.logo);
622
623
  return html `
623
- <slot name="brand">
624
- ${logo
625
- ? html `<button
626
- class="brand-button"
627
- part="brand-button"
628
- type="button"
629
- aria-label=${msg("Go to the home page")}
630
- @click=${this.handleLogoClick}
631
- >
632
- <img class="brand-logo" part="brand-logo" src=${logo} alt="" />
633
- </button>`
634
- : nothing}
635
- </slot>
624
+ <slot name="brand"> ${logo ? this.renderBrandHome(logo) : nothing} </slot>
636
625
  `;
637
626
  }
627
+ // A distributor with its own website links the logo straight there, the way its
628
+ // main site does, and a real anchor keeps that a link (middle-click, new tab,
629
+ // status bar). Without one there is no URL to link to, so the logo stays a
630
+ // button dispatching the `landing` navigation for the host to route.
631
+ renderBrandHome(logo) {
632
+ const image = html `<img
633
+ class="brand-logo"
634
+ part="brand-logo"
635
+ src=${logo}
636
+ alt=""
637
+ />`;
638
+ // The URL comes from host config, so it is gated here rather than trusted.
639
+ const href = safeUrl(this.logoHref);
640
+ return href
641
+ ? html `<a
642
+ class="brand-button"
643
+ part="brand-button"
644
+ href=${href}
645
+ aria-label=${msg("Go to the home page")}
646
+ >${image}</a
647
+ >`
648
+ : html `<button
649
+ class="brand-button"
650
+ part="brand-button"
651
+ type="button"
652
+ aria-label=${msg("Go to the home page")}
653
+ @click=${this.handleLogoClick}
654
+ >
655
+ ${image}
656
+ </button>`;
657
+ }
638
658
  renderSearchOnlyHeader() {
639
659
  return html `
640
660
  <header class="search-only">
@@ -671,6 +691,9 @@ let CorasNavBar = class CorasNavBar extends SearchMixin(SignalWatcher(LitElement
671
691
  </header>
672
692
  `;
673
693
  }
694
+ willUpdate() {
695
+ this.dataset.colorScheme = this.colorScheme.scheme;
696
+ }
674
697
  render() {
675
698
  return html `
676
699
  ${this.searchOnly
@@ -708,6 +731,9 @@ __decorate([
708
731
  __decorate([
709
732
  property({ type: String, attribute: "navbar-logo" })
710
733
  ], CorasNavBar.prototype, "navbarLogo", void 0);
734
+ __decorate([
735
+ property({ type: String, attribute: "logo-href" })
736
+ ], CorasNavBar.prototype, "logoHref", void 0);
711
737
  __decorate([
712
738
  consume({ context: localeContext, subscribe: true })
713
739
  ], CorasNavBar.prototype, "locale", void 0);
@@ -5,6 +5,8 @@ export default css `
5
5
 
6
6
  :host {
7
7
  --navbar-background: var(--coras-navbar-background);
8
+ --navbar-background-image: var(--coras-navbar-background-image);
9
+ --navbar-background-image-dark: var(--coras-navbar-background-image-dark);
8
10
  --navbar-text-color: var(--coras-navbar-text-color);
9
11
  --navbar-border-bottom: var(--coras-navbar-border-bottom);
10
12
  --navbar-shadow: var(--coras-navbar-shadow);
@@ -39,7 +41,13 @@ export default css `
39
41
  display: block;
40
42
  width: 100%;
41
43
 
42
- background: var(--navbar-background);
44
+ background-color: var(--navbar-background);
45
+ background-image: var(--navbar-background-image);
46
+ }
47
+
48
+ /* light-dark() takes colours only, so the dark gradient is picked by scheme. */
49
+ :host([data-color-scheme="dark"]) {
50
+ background-image: var(--navbar-background-image-dark);
43
51
  }
44
52
 
45
53
  coras-icon[icon="shopping-basket"],
@@ -154,6 +162,7 @@ export default css `
154
162
  background: none;
155
163
  color: inherit;
156
164
  font: inherit;
165
+ text-decoration: none;
157
166
  cursor: pointer;
158
167
  }
159
168
 
@@ -193,7 +193,7 @@ export const templates = {
193
193
  'sb05eb16313ad5810': `Fehler!`,
194
194
  'sb074169ce94feeb0': `Unzureichendes FIDA-Gleichgewicht`,
195
195
  'sb182f52b56175d8c': `Keine Länder gefunden`,
196
- 'sb26e53053d747113': `Tickets &amp; Touren`,
196
+ 'sb26e53053d747113': `Tickets & Touren`,
197
197
  'sb3d4f79d9d8b71e5': `Einreichen`,
198
198
  'sb3dbeaf294fd9bdd': `Bezahlter Betrag`,
199
199
  'sb46123a97302f3ae': `Gesamt in FIDA`,
@@ -27,7 +27,7 @@ export const templates = {
27
27
  's06963fd6fbd255b6': `Next Month`,
28
28
  's06e48df1da26857e': `Firstname + Surname`,
29
29
  's072873fcb8392b95': `For illustrative purposes only`,
30
- 's07c32b16a0cc7f41': `I confirm I have read and accept FIDA's Terms &amp; Conditions`,
30
+ 's07c32b16a0cc7f41': `I confirm I have read and accept FIDA's Terms & Conditions`,
31
31
  's0832cb53a9099084': `Browse events`,
32
32
  's088e2b07b5393093': `ea`,
33
33
  's0a88a6ae24e8ac10': `Please enter your email address`,
@@ -193,7 +193,7 @@ export const templates = {
193
193
  'sb05eb16313ad5810': `Error!`,
194
194
  'sb074169ce94feeb0': `Insufficient FIDA balance`,
195
195
  'sb182f52b56175d8c': `No countries found`,
196
- 'sb26e53053d747113': `Tickets &amp; Tours`,
196
+ 'sb26e53053d747113': `Tickets & Tours`,
197
197
  'sb3d4f79d9d8b71e5': `Submit`,
198
198
  'sb3dbeaf294fd9bdd': `Amount Paid`,
199
199
  'sb46123a97302f3ae': `Total in FIDA`,
@@ -203,7 +203,7 @@ export const templates = {
203
203
  'sb5fd6f925a5bd3ea': `ticket for`,
204
204
  'sb61dfe1d5012cc35': `What is your question about`,
205
205
  'sb75ee24776b3d425': `Ticket`,
206
- 'sb7600e1426fb67c7': `I confirm I have read and accept Coras's Terms &amp; Conditions`,
206
+ 'sb7600e1426fb67c7': `I confirm I have read and accept Coras's Terms & Conditions`,
207
207
  'sb84d72388b33a3a4': `Your basket`,
208
208
  'sb85774dc5d18ff0f': `Confirm`,
209
209
  'sb9bd4f5a3810b77e': `Something went wrong`,
@@ -248,7 +248,7 @@ export const templates = {
248
248
  'se046d97f0d9dd903': `Type name or select`,
249
249
  'se256f991824c9ae0': `Flag icon`,
250
250
  'se2b298fd65f45cc7': `Your card’s expiration date is incomplete.`,
251
- 'se374a10ee87f7f8c': `Terms &amp; Conditions`,
251
+ 'se374a10ee87f7f8c': `Terms & Conditions`,
252
252
  'se3d2b191408a6254': `By confirming, the FIDA tokens will be transferred from your wallet to complete this payment.`,
253
253
  'se46604e4550a957d': `Go to the home page`,
254
254
  'se4bfd14e0c3355ac': `Total in`,
@@ -27,7 +27,7 @@ export const templates = {
27
27
  's06963fd6fbd255b6': `Next Month`,
28
28
  's06e48df1da26857e': `Firstname + Surname`,
29
29
  's072873fcb8392b95': `For illustrative purposes only`,
30
- 's07c32b16a0cc7f41': `I confirm I have read and accept FIDA's Terms &amp; Conditions`,
30
+ 's07c32b16a0cc7f41': `I confirm I have read and accept FIDA's Terms & Conditions`,
31
31
  's0832cb53a9099084': `Browse events`,
32
32
  's088e2b07b5393093': `ea`,
33
33
  's0a88a6ae24e8ac10': `Please enter your email address`,
@@ -193,7 +193,7 @@ export const templates = {
193
193
  'sb05eb16313ad5810': `Error!`,
194
194
  'sb074169ce94feeb0': `Insufficient FIDA balance`,
195
195
  'sb182f52b56175d8c': `No countries found`,
196
- 'sb26e53053d747113': `Tickets &amp; Tours`,
196
+ 'sb26e53053d747113': `Tickets & Tours`,
197
197
  'sb3d4f79d9d8b71e5': `Submit`,
198
198
  'sb3dbeaf294fd9bdd': `Amount Paid`,
199
199
  'sb46123a97302f3ae': `Total in FIDA`,
@@ -203,7 +203,7 @@ export const templates = {
203
203
  'sb5fd6f925a5bd3ea': `ticket for`,
204
204
  'sb61dfe1d5012cc35': `What is your question about`,
205
205
  'sb75ee24776b3d425': `Ticket`,
206
- 'sb7600e1426fb67c7': `I confirm I have read and accept Coras's Terms &amp; Conditions`,
206
+ 'sb7600e1426fb67c7': `I confirm I have read and accept Coras's Terms & Conditions`,
207
207
  'sb84d72388b33a3a4': `Your basket`,
208
208
  'sb85774dc5d18ff0f': `Confirm`,
209
209
  'sb9bd4f5a3810b77e': `Something went wrong`,
@@ -248,7 +248,7 @@ export const templates = {
248
248
  'se046d97f0d9dd903': `Type name or select`,
249
249
  'se256f991824c9ae0': `Flag icon`,
250
250
  'se2b298fd65f45cc7': `Your card’s expiration date is incomplete.`,
251
- 'se374a10ee87f7f8c': `Terms &amp; Conditions`,
251
+ 'se374a10ee87f7f8c': `Terms & Conditions`,
252
252
  'se3d2b191408a6254': `By confirming, the FIDA tokens will be transferred from your wallet to complete this payment.`,
253
253
  'se46604e4550a957d': `Go to the home page`,
254
254
  'se4bfd14e0c3355ac': `Total in`,
@@ -27,7 +27,7 @@ export const templates = {
27
27
  's06963fd6fbd255b6': `Bulan Depan`,
28
28
  's06e48df1da26857e': `Nama pertama + Nama keluarga`,
29
29
  's072873fcb8392b95': `Untuk tujuan ilustrasi sahaja`,
30
- 's07c32b16a0cc7f41': `Saya mengesahkan bahawa saya telah membaca dan menerima Terma &amp; Syarat FIDA`,
30
+ 's07c32b16a0cc7f41': `Saya mengesahkan bahawa saya telah membaca dan menerima Terma & Syarat FIDA`,
31
31
  's0832cb53a9099084': `Layari acara`,
32
32
  's088e2b07b5393093': `ea`,
33
33
  's0a88a6ae24e8ac10': `Sila masukkan alamat e-mel anda`,
@@ -193,7 +193,7 @@ export const templates = {
193
193
  'sb05eb16313ad5810': `Ralat!`,
194
194
  'sb074169ce94feeb0': `Baki FIDA yang tidak mencukupi`,
195
195
  'sb182f52b56175d8c': `Tiada negara ditemui`,
196
- 'sb26e53053d747113': `Tiket &amp; Lawatan`,
196
+ 'sb26e53053d747113': `Tiket & Lawatan`,
197
197
  'sb3d4f79d9d8b71e5': `Hantar`,
198
198
  'sb3dbeaf294fd9bdd': `Jumlah Dibayar`,
199
199
  'sb46123a97302f3ae': `Jumlah dalam FIDA`,
@@ -203,7 +203,7 @@ export const templates = {
203
203
  'sb5fd6f925a5bd3ea': `tiket untuk`,
204
204
  'sb61dfe1d5012cc35': `Apakah soalan anda`,
205
205
  'sb75ee24776b3d425': `tiket`,
206
- 'sb7600e1426fb67c7': `Saya mengesahkan saya telah membaca dan menerima Terma &amp; Syarat Coras`,
206
+ 'sb7600e1426fb67c7': `Saya mengesahkan saya telah membaca dan menerima Terma & Syarat Coras`,
207
207
  'sb84d72388b33a3a4': `bakul awak`,
208
208
  'sb85774dc5d18ff0f': `Sahkan`,
209
209
  'sb9bd4f5a3810b77e': `Sesuatu telah berlaku`,
@@ -248,7 +248,7 @@ export const templates = {
248
248
  'se046d97f0d9dd903': `Taip nama atau pilih`,
249
249
  'se256f991824c9ae0': `Ikon bendera`,
250
250
  'se2b298fd65f45cc7': `Tarikh tamat tempoh kad anda tidak lengkap.`,
251
- 'se374a10ee87f7f8c': `Terma &amp; Syarat`,
251
+ 'se374a10ee87f7f8c': `Terma & Syarat`,
252
252
  'se3d2b191408a6254': `Dengan pengesahan, token FIDA akan dipindahkan dari dompet anda untuk menyelesaikan pembayaran ini.`,
253
253
  'se46604e4550a957d': `Pergi ke halaman utama`,
254
254
  'se4bfd14e0c3355ac': `Jumlah dalam`,
package/dist/sdk/mount.js CHANGED
@@ -5,7 +5,7 @@ import { attachCallbackBridge, } from "./element-adapter.js";
5
5
  import { createChrome } from "./chrome.js";
6
6
  import { applyConfig, applyParams, captureConfigDefaults, captureParamDefaults, defaultPageRegistry, } from "./page-registry.js";
7
7
  import { applyColorScheme, applyTheme, clearTheme } from "./theme.js";
8
- import { safeUrl } from "@coras-io/brand-tokens";
8
+ import { safeUrl, migrateBrandConfig, } from "@coras-io/brand-tokens";
9
9
  import { ensureTokensInjected } from "../styles/tokens.js";
10
10
  import { redactValue, toPublicErrorDetail } from "./redaction.js";
11
11
  import { assertValidPage, CorasValidationError, validateConfig, validateMountOptions, validatePageParams, } from "./validation.js";
@@ -66,6 +66,10 @@ export function createMountWith(registry) {
66
66
  : (container.ownerDocument ?? document));
67
67
  let currentPage = validated.page;
68
68
  let currentConfig = validated.config;
69
+ const themeLogos = () => {
70
+ const t = migrateBrandConfig(currentConfig.theme ?? {});
71
+ return { logo: t.logo, logoDark: t.logoDark, navbarLogo: t.navbarLogo };
72
+ };
69
73
  let currentParams = validated.params;
70
74
  let currentChrome = options.chrome;
71
75
  if (themeHasNoColours(currentConfig.theme))
@@ -139,9 +143,10 @@ export function createMountWith(registry) {
139
143
  for (const element of chromeElements) {
140
144
  if (element.tagName === "CORAS-NAVBAR") {
141
145
  const nav = element;
142
- nav.logo = safeUrl(currentConfig.theme?.logo);
143
- nav.logoDark = safeUrl(currentConfig.theme?.logoDark);
144
- nav.navbarLogo = safeUrl(currentConfig.theme?.navbarLogo);
146
+ const logos = themeLogos();
147
+ nav.logo = safeUrl(logos.logo);
148
+ nav.logoDark = safeUrl(logos.logoDark);
149
+ nav.navbarLogo = safeUrl(logos.navbarLogo);
145
150
  }
146
151
  }
147
152
  }
@@ -163,11 +168,7 @@ export function createMountWith(registry) {
163
168
  // Chrome is rebuilt per page rather than moved: the navbar/footer consume
164
169
  // the page's context (locale, dispatch, current page…) and re-parenting a
165
170
  // context consumer across providers leaves those bindings stale.
166
- const chrome = await createChrome(currentChrome, {
167
- logo: currentConfig.theme?.logo,
168
- logoDark: currentConfig.theme?.logoDark,
169
- navbarLogo: currentConfig.theme?.navbarLogo,
170
- });
171
+ const chrome = await createChrome(currentChrome, themeLogos());
171
172
  if (destroyed || generationToken !== generation)
172
173
  return;
173
174
  for (const chromeElement of chrome) {
@@ -341,11 +342,7 @@ export function createMountWith(registry) {
341
342
  if (chromeChanged) {
342
343
  removeChrome();
343
344
  const chromeToken = ++chromeGeneration;
344
- void createChrome(currentChrome, {
345
- logo: currentConfig.theme?.logo,
346
- logoDark: currentConfig.theme?.logoDark,
347
- navbarLogo: currentConfig.theme?.navbarLogo,
348
- })
345
+ void createChrome(currentChrome, themeLogos())
349
346
  .then((chrome) => {
350
347
  // A newer chrome update or a page render has superseded this one;
351
348
  // discard the stale chrome instead of appending it.
@@ -1,5 +1,5 @@
1
1
  import type { CorasColorScheme, CorasTheme } from "./types.js";
2
- export declare const THEME_CSS_VARS: Record<"primary" | "secondary" | "pageBackground" | "text" | "textMuted" | "link" | "bodyIcon" | "focusRing" | "scrim" | "cardBackground" | "cardBorder" | "fieldBackground" | "fieldBorder" | "menuBackground" | "menuBorder" | "divider" | "cardShadow" | "softShadow" | "mainButton" | "mainButtonText" | "mainButtonHover" | "mainButtonPressed" | "secondaryButton" | "secondaryButtonText" | "secondaryButtonHover" | "secondaryButtonPressed" | "textButton" | "mainButtonBorder" | "secondaryButtonBorder" | "disabled" | "buttonShadow" | "buttonHoverLight" | "buttonHoverDark" | "radius" | "buttonRadius" | "chipRadius" | "fieldRadius" | "searchRadius" | "font" | "headingFont" | "headingScale" | "logoHeight" | "navbarBackground" | "navbarText" | "navbarIcon" | "navbarBorder" | "navbarShadow" | "footerBackground" | "footerText" | "footerLink" | "footerBorder" | "footerPaddingBottom" | "error" | "errorBackground" | "success" | "successBackground" | "warning" | "warningBackground" | "info" | "infoBackground" | "primaryTint" | "secondaryTint" | "neutral50" | "neutral100" | "neutral200" | "neutral300" | "neutral400" | "neutral500" | "neutral600" | "neutral700" | "neutral800" | "neutral900", string>;
2
+ export declare const THEME_CSS_VARS: Record<"primary" | "secondary" | "pageBackground" | "text" | "textMuted" | "link" | "icon" | "focusRing" | "scrim" | "cardBackground" | "cardBorder" | "fieldBackground" | "fieldBorder" | "menuBackground" | "menuBorder" | "divider" | "cardShadow" | "softShadow" | "primaryButton" | "primaryButtonText" | "primaryButtonHover" | "primaryButtonPressed" | "secondaryButton" | "secondaryButtonText" | "secondaryButtonHover" | "secondaryButtonPressed" | "textButton" | "primaryButtonBorder" | "secondaryButtonBorder" | "disabled" | "buttonShadow" | "buttonHoverOnLightFill" | "buttonHoverOnDarkFill" | "radius" | "buttonRadius" | "chipRadius" | "fieldRadius" | "searchRadius" | "font" | "headingFont" | "headingScale" | "logoHeight" | "navbarBackground" | "navbarBackgroundImage" | "navbarText" | "navbarIcon" | "navbarBorder" | "navbarShadow" | "footerBackground" | "footerBackgroundImage" | "footerText" | "footerLink" | "footerBorder" | "footerPaddingBottom" | "error" | "errorBackground" | "success" | "successBackground" | "warning" | "warningBackground" | "info" | "infoBackground" | "primaryTint" | "secondaryTint" | "neutral50" | "neutral100" | "neutral200" | "neutral300" | "neutral400" | "neutral500" | "neutral600" | "neutral700" | "neutral800" | "neutral900", string>;
3
3
  export declare function applyColorScheme(element: HTMLElement, scheme: CorasColorScheme | undefined): void;
4
- export declare function applyTheme(element: HTMLElement, theme: CorasTheme | undefined): void;
4
+ export declare function applyTheme(element: HTMLElement, input: CorasTheme | undefined): void;
5
5
  export declare function clearTheme(element: HTMLElement): void;
package/dist/sdk/theme.js CHANGED
@@ -1,20 +1,20 @@
1
- import { BRAND_CSS_VARS, brandVarValue, fontFacesToCSS, } from "@coras-io/brand-tokens";
1
+ import { BRAND_CSS_VARS, BRAND_DARK_CSS_VARS, brandVarEntries, brandVarValue, fontFacesToCSS, migrateBrandConfig, } from "@coras-io/brand-tokens";
2
2
  export const THEME_CSS_VARS = BRAND_CSS_VARS;
3
3
  const THEME_KEYS = Object.keys(THEME_CSS_VARS);
4
4
  export function applyColorScheme(element, scheme) {
5
5
  element.style.colorScheme =
6
6
  scheme === "dark" ? "dark" : scheme === "inherit" ? "inherit" : "light";
7
7
  }
8
- export function applyTheme(element, theme) {
9
- if (!theme)
8
+ export function applyTheme(element, input) {
9
+ if (!input)
10
10
  return;
11
+ const theme = migrateBrandConfig(input);
11
12
  const dark = (theme.dark ?? {});
12
13
  for (const key of THEME_KEYS) {
13
14
  if (theme[key] == null && dark[key] == null)
14
15
  continue;
15
- const value = brandVarValue(key, theme[key], dark[key]);
16
- if (value)
17
- element.style.setProperty(THEME_CSS_VARS[key], value);
16
+ for (const [name, value] of brandVarEntries(key, theme[key], dark[key]))
17
+ element.style.setProperty(name, value);
18
18
  }
19
19
  if (theme.pageBackground != null || dark.pageBackground != null) {
20
20
  const pageBg = brandVarValue("pageBackground", theme.pageBackground, dark.pageBackground);
@@ -33,6 +33,9 @@ export function clearTheme(element) {
33
33
  for (const key of THEME_KEYS) {
34
34
  element.style.removeProperty(THEME_CSS_VARS[key]);
35
35
  }
36
+ for (const name of Object.values(BRAND_DARK_CSS_VARS)) {
37
+ element.style.removeProperty(name);
38
+ }
36
39
  element.style.removeProperty("--coras-page-background");
37
40
  element
38
41
  .querySelectorAll(":scope > [data-coras-fontfaces]")
@@ -1,4 +1,4 @@
1
- import type { BrandConfig } from "@coras-io/brand-tokens";
1
+ import type { BrandConfig, BrandJson } from "@coras-io/brand-tokens";
2
2
  import type { SupportedCurrencies } from "../core/types/core/currency.js";
3
3
  import type { SupportedLocales } from "../core/types/core/locale.js";
4
4
  /**
@@ -57,12 +57,10 @@ export type CorasPageParamsByPage = {
57
57
  /** Params for a specific page, or the union when the page is not narrowed. */
58
58
  export type CorasPageParams<P extends CorasPageName = CorasPageName> = CorasPageParamsByPage[P];
59
59
  /**
60
- * The SDK `theme` option is the shared `BrandConfig` contract: un-prefixed
61
- * semantic keys (`primary`, `secondary`, ) plus chrome, `logo`, and
62
- * `fontFaces`. Defined once in `@coras-io/brand-tokens` and reused by the
63
- * microsites, emails, and the Studio.
60
+ * The SDK `theme` option is the shared brand contract from `@coras-io/brand-tokens`:
61
+ * a `brand.json` as written (grouped by surface) or the engine's flat keys.
64
62
  */
65
- export type CorasTheme = BrandConfig;
63
+ export type CorasTheme = BrandConfig | BrandJson;
66
64
  /**
67
65
  * Which colour scheme the mount renders. `theme` carries the light values and
68
66
  * its `dark` block the dark overrides; this picks which side the `light-dark()`
@@ -89,7 +87,7 @@ export type CorasConfig = {
89
87
  colorScheme?: CorasColorScheme;
90
88
  };
91
89
  /**
92
- * Feature toggles for the SDK-created Coras navbar. Each `show*` key maps 1:1 to
90
+ * Host-set options for the SDK-created Coras navbar. Each `show*` key maps 1:1 to
93
91
  * a navbar control; an omitted key keeps the navbar's default (everything
94
92
  * shown). Used with `{ use: "managed", props: { … } }`.
95
93
  */
@@ -104,6 +102,13 @@ export type CorasNavbarProps = {
104
102
  showCurrencySelector?: boolean;
105
103
  showBasket?: boolean;
106
104
  showSearch?: boolean;
105
+ /**
106
+ * Where the brand logo links, for a distributor whose booking site sits beside
107
+ * a main website. Set it and the logo becomes a plain link there; leave it
108
+ * unset and the logo stays a button that emits a `landing` navigation for the
109
+ * host to route. Only `https:` and same-origin URLs are honoured.
110
+ */
111
+ logoHref?: string;
107
112
  };
108
113
  /**
109
114
  * Host content-injection points on the Coras navbar. Names describe the region
@@ -183,10 +183,8 @@ function validateAssetsUrl(value) {
183
183
  // them silently, which a strict host wants flagged, not swallowed).
184
184
  const THEME_KEYS = [
185
185
  ...FIELDS.map((field) => field.key),
186
- "logo",
187
- "logoDark",
188
- "navbarLogo",
189
- "footerLogo",
186
+ ...FIELDS.map((field) => field.path.split(".")[0]),
187
+ "$schema",
190
188
  "fontFaces",
191
189
  "dark",
192
190
  "schemaVersion",
@@ -8,7 +8,7 @@
8
8
  * light-DOM container is enough for every nested Web Component to read them.
9
9
  * `mount()` adopts this sheet into the container's document exactly once.
10
10
  */
11
- export declare const CORAS_TOKENS_TEXT = "/* GENERATED by scripts/generate-tokens.mjs - do not edit by hand. */\n/* CSS-first four-tier token system (plan F-004, P-051..P-055). */\n\n@layer coras.palette, coras.brand, coras.semantic, coras.components;\n\n@property --coras-brand-primary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-page-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-body-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-focus-ring {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-card-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #fcfcff;\n}\n@property --coras-brand-field-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-menu-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-main-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-text-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-button-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-chip-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-navbar-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-navbar-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-border {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-footer-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #e6e6e6;\n}\n@property --coras-brand-footer-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-footer-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-error {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #c9224a;\n}\n@property --coras-brand-success {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #00ad8f;\n}\n@property --coras-brand-warning {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ed8f1c;\n}\n@property --coras-brand-info {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #670c93;\n}\n\n@layer coras.palette {\n :where([data-coras-root], .coras-theme) {\n --coras-palette-primary-50: #fcfcff;\n --coras-palette-primary-100: #fbfbff;\n --coras-palette-primary-200: #eef0ff;\n --coras-palette-primary-300: #dde1ff;\n --coras-palette-primary-400: #5468ff;\n --coras-palette-primary-500: #4657d4;\n --coras-palette-primary-700: #323e99;\n --coras-palette-secondary-50: #e8e8ec;\n --coras-palette-secondary-100: #d0d2da;\n --coras-palette-secondary-200: #b9bbc7;\n --coras-palette-secondary-300: #a2a4b4;\n --coras-palette-secondary-400: #1c2355;\n --coras-palette-secondary-500: #161c44;\n --coras-palette-secondary-700: #121636;\n --coras-palette-neutral-50: #f5f5f5;\n --coras-palette-neutral-100: #eeeeee;\n --coras-palette-neutral-200: #e6e6e6;\n --coras-palette-neutral-300: #dddddd;\n --coras-palette-neutral-400: #cccccc;\n --coras-palette-neutral-500: #aaaaaa;\n --coras-palette-neutral-600: #888888;\n --coras-palette-neutral-700: #666666;\n --coras-palette-neutral-800: #444444;\n --coras-palette-neutral-900: #292929;\n --coras-palette-error-50: #fae9ed;\n --coras-palette-error-500: #c9224a;\n --coras-palette-error-700: #a11b3b;\n --coras-palette-error-900: #79142c;\n --coras-palette-info-50: #f0e7f4;\n --coras-palette-info-500: #670c93;\n --coras-palette-info-700: #520a76;\n --coras-palette-info-900: #3e0758;\n --coras-palette-success-50: #e6f7f4;\n --coras-palette-success-500: #00ad8f;\n --coras-palette-success-700: #008a72;\n --coras-palette-success-900: #006856;\n --coras-palette-warning-50: #fdf4e8;\n --coras-palette-warning-500: #ed8f1c;\n --coras-palette-warning-700: #be7216;\n --coras-palette-warning-900: #8e5611;\n --coras-palette-pink-500: #ff2d55;\n --coras-palette-black: #000000;\n --coras-palette-white: #ffffff;\n }\n}\n\n@layer coras.brand {\n :where([data-coras-root], .coras-theme) {\n color-scheme: light;\n --coras-brand-primary: var(--coras-palette-primary-500);\n --coras-brand-secondary: var(--coras-palette-secondary-500);\n --coras-brand-page-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-text: light-dark(var(--coras-palette-secondary-500), #ffffff);\n --coras-brand-text-muted: light-dark(var(--coras-palette-neutral-600), #cccccc);\n --coras-brand-link: var(--coras-brand-text-button);\n --coras-brand-body-icon: var(--coras-brand-text);\n --coras-brand-focus-ring: var(--coras-brand-primary);\n --coras-brand-scrim: var(--coras-palette-black);\n --coras-brand-card-background: light-dark(var(--coras-palette-primary-50), #191c22);\n --coras-brand-card-border: light-dark(var(--coras-palette-neutral-200), #444444);\n --coras-brand-field-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-field-border: light-dark(var(--coras-palette-neutral-400), #aaaaaa);\n --coras-brand-menu-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-menu-border: var(--coras-brand-card-border);\n --coras-brand-divider: light-dark(var(--coras-palette-neutral-200), #292929);\n --coras-brand-card-shadow: 0px 24px 24px rgba(0, 0, 0, 0.04);\n --coras-brand-soft-shadow: 0px 4px 4px rgba(0, 0, 0, 0.04);\n --coras-brand-main-button: var(--coras-brand-primary);\n --coras-brand-main-button-text: #ffffff;\n --coras-brand-main-button-hover: light-dark(#3f4ebf, #5968d8);\n --coras-brand-main-button-pressed: light-dark(#3947ae, #6775dc);\n --coras-brand-secondary-button: var(--coras-brand-secondary);\n --coras-brand-secondary-button-text: #ffffff;\n --coras-brand-secondary-button-hover: light-dark(#14193d, #2d3357);\n --coras-brand-secondary-button-pressed: light-dark(#121738, #404566);\n --coras-brand-text-button: light-dark(var(--coras-brand-primary), #6279f9);\n --coras-brand-main-button-border: transparent;\n --coras-brand-secondary-button-border: transparent;\n --coras-brand-disabled: light-dark(var(--coras-palette-neutral-500), #cccccc);\n --coras-brand-button-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n --coras-brand-button-hover-light: 20%;\n --coras-brand-button-hover-dark: 20%;\n --coras-brand-radius: 1.5rem;\n --coras-brand-button-radius: var(--coras-brand-radius);\n --coras-brand-chip-radius: var(--coras-brand-radius);\n --coras-brand-field-radius: 0.5rem;\n --coras-brand-search-radius: 100px;\n --coras-brand-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --coras-brand-heading-font: var(--coras-brand-font);\n --coras-brand-heading-scale: 1;\n --coras-brand-logo-height: 2rem;\n --coras-brand-navbar-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-navbar-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-navbar-icon: var(--coras-brand-navbar-text);\n --coras-brand-navbar-border: var(--coras-brand-navbar-background);\n --coras-brand-navbar-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.04);\n --coras-brand-footer-background: light-dark(var(--coras-palette-neutral-200), #191c22);\n --coras-brand-footer-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-footer-link: var(--coras-brand-footer-text);\n --coras-brand-footer-border: var(--coras-brand-footer-background);\n --coras-brand-footer-padding-bottom: 2rem;\n --coras-brand-error: light-dark(var(--coras-palette-error-500), #f5748a);\n --coras-brand-error-background: light-dark(var(--coras-palette-error-50), #442e36);\n --coras-brand-success: light-dark(var(--coras-palette-success-500), #34d8b4);\n --coras-brand-success-background: light-dark(var(--coras-palette-success-50), #26403f);\n --coras-brand-warning: light-dark(var(--coras-palette-warning-500), #f4a93c);\n --coras-brand-warning-background: light-dark(var(--coras-palette-warning-50), #43382e);\n --coras-brand-info: light-dark(var(--coras-palette-info-500), #ba86e1);\n --coras-brand-info-background: light-dark(var(--coras-palette-info-50), #373045);\n --coras-brand-primary-tint: light-dark(var(--coras-palette-primary-50), #141823);\n --coras-brand-secondary-tint: light-dark(var(--coras-palette-secondary-50), #10131a);\n --coras-brand-neutral-50: var(--coras-palette-neutral-50);\n --coras-brand-neutral-100: var(--coras-palette-neutral-100);\n --coras-brand-neutral-200: var(--coras-palette-neutral-200);\n --coras-brand-neutral-300: var(--coras-palette-neutral-300);\n --coras-brand-neutral-400: var(--coras-palette-neutral-400);\n --coras-brand-neutral-500: var(--coras-palette-neutral-500);\n --coras-brand-neutral-600: var(--coras-palette-neutral-600);\n --coras-brand-neutral-700: var(--coras-palette-neutral-700);\n --coras-brand-neutral-800: var(--coras-palette-neutral-800);\n --coras-brand-neutral-900: var(--coras-palette-neutral-900);\n }\n}\n\n@layer coras.semantic {\n :where([data-coras-root], .coras-theme) {\n --coras-color-primary: var(--coras-brand-primary);\n --coras-color-primary-tint: var(--coras-brand-primary-tint);\n --coras-color-secondary: var(--coras-brand-secondary);\n --coras-color-secondary-tint: var(--coras-brand-secondary-tint);\n --coras-color-error: var(--coras-brand-error);\n --coras-color-error-background: var(--coras-brand-error-background);\n --coras-color-success: var(--coras-brand-success);\n --coras-color-success-background: var(--coras-brand-success-background);\n --coras-color-warning: var(--coras-brand-warning);\n --coras-color-warning-background: var(--coras-brand-warning-background);\n --coras-color-info: var(--coras-brand-info);\n --coras-color-info-background: var(--coras-brand-info-background);\n --coras-color-neutral-50: light-dark(var(--coras-brand-neutral-50), var(--coras-brand-neutral-900));\n --coras-color-neutral-100: light-dark(var(--coras-brand-neutral-100), var(--coras-brand-neutral-800));\n --coras-color-neutral-200: light-dark(var(--coras-brand-neutral-200), var(--coras-brand-neutral-700));\n --coras-color-neutral-300: light-dark(var(--coras-brand-neutral-300), var(--coras-brand-neutral-600));\n --coras-color-neutral-400: light-dark(var(--coras-brand-neutral-400), var(--coras-brand-neutral-500));\n --coras-color-neutral-500: light-dark(var(--coras-brand-neutral-500), var(--coras-brand-neutral-400));\n --coras-color-neutral-600: light-dark(var(--coras-brand-neutral-600), var(--coras-brand-neutral-300));\n --coras-color-neutral-700: light-dark(var(--coras-brand-neutral-700), var(--coras-brand-neutral-200));\n --coras-color-neutral-800: light-dark(var(--coras-brand-neutral-800), var(--coras-brand-neutral-100));\n --coras-color-neutral-900: light-dark(var(--coras-brand-neutral-900), var(--coras-brand-neutral-50));\n --coras-color-background: var(--coras-brand-page-background);\n --coras-color-card: var(--coras-brand-card-background);\n --coras-color-card-sunken: light-dark(var(--coras-brand-neutral-50), #0b0d10);\n --coras-color-card-hover: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-card-active: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-active));\n --coras-color-card-muted: light-dark(color-mix(in srgb, var(--coras-brand-neutral-200) 35%, var(--coras-palette-white)), color-mix(in srgb, var(--coras-palette-white) 5%, transparent));\n --coras-color-field: var(--coras-brand-field-background);\n --coras-color-field-hover: color-mix(in srgb, var(--coras-color-field), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-menu: var(--coras-brand-menu-background);\n --coras-color-menu-border: var(--coras-brand-menu-border);\n --coras-color-menu-hover: color-mix(in srgb, var(--coras-color-menu), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-text: var(--coras-brand-text);\n --coras-color-text-primary: var(--coras-brand-text);\n --coras-color-text-muted: var(--coras-brand-text-muted);\n --coras-color-text-disabled: var(--coras-brand-disabled);\n --coras-state-overlay: light-dark(#000, #fff);\n --coras-state-hover: 10%;\n --coras-state-active: 18%;\n --coras-color-main-button: var(--coras-brand-main-button);\n --coras-color-main-button-hover: var(--coras-brand-main-button-hover);\n --coras-color-main-button-pressed: var(--coras-brand-main-button-pressed);\n --coras-color-main-button-text: var(--coras-brand-main-button-text);\n --coras-color-main-button-border: var(--coras-brand-main-button-border);\n --coras-color-secondary-button: var(--coras-brand-secondary-button);\n --coras-color-secondary-button-border: var(--coras-brand-secondary-button-border);\n --coras-color-secondary-button-hover: var(--coras-brand-secondary-button-hover);\n --coras-color-secondary-button-pressed: var(--coras-brand-secondary-button-pressed);\n --coras-color-secondary-button-text: var(--coras-brand-secondary-button-text);\n --coras-color-text-button: var(--coras-brand-text-button);\n --coras-color-link: var(--coras-brand-link);\n --coras-color-icon: var(--coras-brand-body-icon);\n --coras-color-card-border: var(--coras-brand-card-border);\n --coras-color-divider: var(--coras-brand-divider);\n --coras-color-field-border: var(--coras-brand-field-border);\n --coras-color-footer-border: var(--coras-brand-footer-border);\n --coras-color-focus-ring: var(--coras-brand-focus-ring);\n --coras-color-scrim: var(--coras-brand-scrim);\n --coras-font-family-sans: var(--coras-brand-font);\n --coras-font-family-heading: var(--coras-brand-heading-font);\n --coras-font-size-xxs: 0.625rem;\n --coras-font-size-xs: 0.75rem;\n --coras-font-size-sm: 0.875rem;\n --coras-font-size-base: 1rem;\n --coras-font-size-lg: 1.125rem;\n --coras-font-size-xl: 1.25rem;\n --coras-font-size-2xl: 1.5rem;\n --coras-font-size-3xl: 2.25rem;\n --coras-font-size-4xl: 3rem;\n --coras-font-size-5xl: 3.5rem;\n --coras-font-size-title: calc(var(--coras-font-size-3xl) * var(--coras-brand-heading-scale));\n --coras-font-size-heading: calc(var(--coras-font-size-2xl) * var(--coras-brand-heading-scale));\n --coras-font-weight-light: 300;\n --coras-font-weight-normal: 400;\n --coras-font-weight-medium: 500;\n --coras-font-weight-semibold: 600;\n --coras-font-weight-bold: 700;\n --coras-radius-none: 0;\n --coras-radius-xs: calc(var(--coras-brand-radius) / 6);\n --coras-radius-sm: calc(var(--coras-brand-radius) / 3);\n --coras-radius-md: calc(var(--coras-brand-radius) * 2 / 3);\n --coras-radius-lg: var(--coras-brand-radius);\n --coras-radius-xl: calc(var(--coras-brand-radius) * 7 / 6);\n --coras-radius-2xl: calc(var(--coras-brand-radius) * 4 / 3);\n --coras-radius-full: 9999px;\n --coras-radius-control: 0.25rem;\n --coras-radius-field: var(--coras-brand-field-radius);\n --coras-radius-button: var(--coras-brand-button-radius);\n --coras-radius-chip: var(--coras-brand-chip-radius);\n --coras-radius-search: var(--coras-brand-search-radius);\n --coras-shadow-sm: var(--coras-brand-soft-shadow);\n --coras-shadow-md: var(--coras-brand-button-shadow);\n --coras-shadow-lg: var(--coras-brand-card-shadow);\n --coras-shadow-top: 1px -4px 8px 4px rgba(0, 0, 0, 0.03);\n --coras-shadow-strong: 0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px rgba(0, 0, 0, 0.3);\n --coras-page-max-width: 950px;\n --coras-container-max-width: 1368px;\n --coras-footer-max-width: 1073px;\n --coras-z-index-overlay: 1000;\n --coras-navbar-padding: 1rem;\n --coras-content-padding: 0 1rem;\n --coras-footer-padding: 4rem 2rem;\n }\n}\n\n@layer coras.components {\n :where([data-coras-root], .coras-theme) {\n --coras-base-text-color: var(--coras-color-text);\n --coras-navbar-background: var(--coras-brand-navbar-background);\n --coras-navbar-text-color: var(--coras-brand-navbar-text);\n --coras-navbar-border-bottom: 1px solid var(--coras-brand-navbar-border);\n --coras-navbar-shadow: var(--coras-brand-navbar-shadow);\n --coras-navbar-icon-color: var(--coras-brand-navbar-icon);\n --coras-navbar-logo-height: var(--coras-brand-logo-height);\n --coras-footer-background-color: var(--coras-brand-footer-background);\n --coras-footer-text-color: var(--coras-brand-footer-text);\n --coras-footer-link-color: var(--coras-brand-footer-link);\n --coras-footer-border-top: 1px solid var(--coras-color-footer-border);\n --coras-footer-padding-bottom: var(--coras-brand-footer-padding-bottom);\n --coras-button-primary-background: var(--coras-color-main-button);\n --coras-button-primary-text-color: var(--coras-color-main-button-text);\n --coras-button-primary-background-hover: var(--coras-color-main-button-hover);\n --coras-button-primary-background-active: var(--coras-color-main-button-pressed);\n --coras-button-primary-border-color: var(--coras-color-main-button-border);\n --coras-button-secondary-border-color: var(--coras-color-secondary-button-border);\n --coras-input-field-background-color: var(--coras-color-field);\n --coras-basket-accent-color: var(--coras-brand-secondary);\n }\n}\n\n@layer coras.components {\n :where([data-coras-root]) {\n container: coras-page / inline-size;\n max-width: 100%;\n background-color: var(--coras-page-background, transparent);\n color: var(--coras-base-text-color);\n }\n :where([data-coras-root]) > *:where(:not(style)) {\n display: block;\n fill: var(--coras-color-icon);\n }\n}\n";
11
+ export declare const CORAS_TOKENS_TEXT = "/* GENERATED by scripts/generate-tokens.mjs - do not edit by hand. */\n/* CSS-first four-tier token system (plan F-004, P-051..P-055). */\n\n@layer coras.palette, coras.brand, coras.semantic, coras.components;\n\n@property --coras-brand-primary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-page-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-focus-ring {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-card-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #fcfcff;\n}\n@property --coras-brand-field-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-menu-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-primary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-text-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-button-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-chip-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-navbar-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-navbar-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-border {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-footer-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #e6e6e6;\n}\n@property --coras-brand-footer-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-footer-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-error {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #c9224a;\n}\n@property --coras-brand-success {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #00ad8f;\n}\n@property --coras-brand-warning {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ed8f1c;\n}\n@property --coras-brand-info {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #670c93;\n}\n\n@layer coras.palette {\n :where([data-coras-root], .coras-theme) {\n --coras-palette-primary-50: #fcfcff;\n --coras-palette-primary-100: #fbfbff;\n --coras-palette-primary-200: #eef0ff;\n --coras-palette-primary-300: #dde1ff;\n --coras-palette-primary-400: #5468ff;\n --coras-palette-primary-500: #4657d4;\n --coras-palette-primary-700: #323e99;\n --coras-palette-secondary-50: #e8e8ec;\n --coras-palette-secondary-100: #d0d2da;\n --coras-palette-secondary-200: #b9bbc7;\n --coras-palette-secondary-300: #a2a4b4;\n --coras-palette-secondary-400: #1c2355;\n --coras-palette-secondary-500: #161c44;\n --coras-palette-secondary-700: #121636;\n --coras-palette-neutral-50: #f5f5f5;\n --coras-palette-neutral-100: #eeeeee;\n --coras-palette-neutral-200: #e6e6e6;\n --coras-palette-neutral-300: #dddddd;\n --coras-palette-neutral-400: #cccccc;\n --coras-palette-neutral-500: #aaaaaa;\n --coras-palette-neutral-600: #888888;\n --coras-palette-neutral-700: #666666;\n --coras-palette-neutral-800: #444444;\n --coras-palette-neutral-900: #292929;\n --coras-palette-error-50: #fae9ed;\n --coras-palette-error-500: #c9224a;\n --coras-palette-error-700: #a11b3b;\n --coras-palette-error-900: #79142c;\n --coras-palette-info-50: #f0e7f4;\n --coras-palette-info-500: #670c93;\n --coras-palette-info-700: #520a76;\n --coras-palette-info-900: #3e0758;\n --coras-palette-success-50: #e6f7f4;\n --coras-palette-success-500: #00ad8f;\n --coras-palette-success-700: #008a72;\n --coras-palette-success-900: #006856;\n --coras-palette-warning-50: #fdf4e8;\n --coras-palette-warning-500: #ed8f1c;\n --coras-palette-warning-700: #be7216;\n --coras-palette-warning-900: #8e5611;\n --coras-palette-pink-500: #ff2d55;\n --coras-palette-black: #000000;\n --coras-palette-white: #ffffff;\n }\n}\n\n@layer coras.brand {\n :where([data-coras-root], .coras-theme) {\n color-scheme: light;\n --coras-brand-primary: var(--coras-palette-primary-500);\n --coras-brand-secondary: var(--coras-palette-secondary-500);\n --coras-brand-page-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-text: light-dark(var(--coras-palette-secondary-500), #ffffff);\n --coras-brand-text-muted: light-dark(var(--coras-palette-neutral-600), #cccccc);\n --coras-brand-link: var(--coras-brand-text-button);\n --coras-brand-icon: var(--coras-brand-text);\n --coras-brand-focus-ring: var(--coras-brand-primary);\n --coras-brand-scrim: var(--coras-palette-black);\n --coras-brand-card-background: light-dark(var(--coras-palette-primary-50), #191c22);\n --coras-brand-card-border: light-dark(var(--coras-palette-neutral-200), #444444);\n --coras-brand-field-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-field-border: light-dark(var(--coras-palette-neutral-400), #aaaaaa);\n --coras-brand-menu-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-menu-border: var(--coras-brand-card-border);\n --coras-brand-divider: light-dark(var(--coras-palette-neutral-200), #292929);\n --coras-brand-card-shadow: 0px 24px 24px rgba(0, 0, 0, 0.04);\n --coras-brand-soft-shadow: 0px 4px 4px rgba(0, 0, 0, 0.04);\n --coras-brand-primary-button: var(--coras-brand-primary);\n --coras-brand-primary-button-text: #ffffff;\n --coras-brand-primary-button-hover: light-dark(#3f4ebf, #5968d8);\n --coras-brand-primary-button-pressed: light-dark(#3947ae, #6775dc);\n --coras-brand-secondary-button: var(--coras-brand-secondary);\n --coras-brand-secondary-button-text: #ffffff;\n --coras-brand-secondary-button-hover: light-dark(#14193d, #2d3357);\n --coras-brand-secondary-button-pressed: light-dark(#121738, #404566);\n --coras-brand-text-button: light-dark(var(--coras-brand-primary), #6279f9);\n --coras-brand-primary-button-border: transparent;\n --coras-brand-secondary-button-border: transparent;\n --coras-brand-disabled: light-dark(var(--coras-palette-neutral-500), #cccccc);\n --coras-brand-button-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n --coras-brand-button-hover-on-light-fill: 20%;\n --coras-brand-button-hover-on-dark-fill: 20%;\n --coras-brand-radius: 1.5rem;\n --coras-brand-button-radius: var(--coras-brand-radius);\n --coras-brand-chip-radius: var(--coras-brand-radius);\n --coras-brand-field-radius: 0.5rem;\n --coras-brand-search-radius: 100px;\n --coras-brand-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --coras-brand-heading-font: var(--coras-brand-font);\n --coras-brand-heading-scale: 1;\n --coras-brand-logo-height: 2rem;\n --coras-brand-navbar-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-navbar-background-image: none;\n --coras-brand-navbar-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-navbar-icon: var(--coras-brand-navbar-text);\n --coras-brand-navbar-border: var(--coras-brand-navbar-background);\n --coras-brand-navbar-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.04);\n --coras-brand-footer-background: light-dark(var(--coras-palette-neutral-200), #191c22);\n --coras-brand-footer-background-image: none;\n --coras-brand-footer-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-footer-link: var(--coras-brand-footer-text);\n --coras-brand-footer-border: var(--coras-brand-footer-background);\n --coras-brand-footer-padding-bottom: 2rem;\n --coras-brand-error: light-dark(var(--coras-palette-error-500), #f5748a);\n --coras-brand-error-background: light-dark(var(--coras-palette-error-50), #442e36);\n --coras-brand-success: light-dark(var(--coras-palette-success-500), #34d8b4);\n --coras-brand-success-background: light-dark(var(--coras-palette-success-50), #26403f);\n --coras-brand-warning: light-dark(var(--coras-palette-warning-500), #f4a93c);\n --coras-brand-warning-background: light-dark(var(--coras-palette-warning-50), #43382e);\n --coras-brand-info: light-dark(var(--coras-palette-info-500), #ba86e1);\n --coras-brand-info-background: light-dark(var(--coras-palette-info-50), #373045);\n --coras-brand-primary-tint: light-dark(var(--coras-palette-primary-50), #141823);\n --coras-brand-secondary-tint: light-dark(var(--coras-palette-secondary-50), #10131a);\n --coras-brand-neutral-50: var(--coras-palette-neutral-50);\n --coras-brand-neutral-100: var(--coras-palette-neutral-100);\n --coras-brand-neutral-200: var(--coras-palette-neutral-200);\n --coras-brand-neutral-300: var(--coras-palette-neutral-300);\n --coras-brand-neutral-400: var(--coras-palette-neutral-400);\n --coras-brand-neutral-500: var(--coras-palette-neutral-500);\n --coras-brand-neutral-600: var(--coras-palette-neutral-600);\n --coras-brand-neutral-700: var(--coras-palette-neutral-700);\n --coras-brand-neutral-800: var(--coras-palette-neutral-800);\n --coras-brand-neutral-900: var(--coras-palette-neutral-900);\n }\n}\n\n@layer coras.semantic {\n :where([data-coras-root], .coras-theme) {\n --coras-color-primary: var(--coras-brand-primary);\n --coras-color-primary-tint: var(--coras-brand-primary-tint);\n --coras-color-secondary: var(--coras-brand-secondary);\n --coras-color-secondary-tint: var(--coras-brand-secondary-tint);\n --coras-color-error: var(--coras-brand-error);\n --coras-color-error-background: var(--coras-brand-error-background);\n --coras-color-success: var(--coras-brand-success);\n --coras-color-success-background: var(--coras-brand-success-background);\n --coras-color-warning: var(--coras-brand-warning);\n --coras-color-warning-background: var(--coras-brand-warning-background);\n --coras-color-info: var(--coras-brand-info);\n --coras-color-info-background: var(--coras-brand-info-background);\n --coras-color-neutral-50: light-dark(var(--coras-brand-neutral-50), var(--coras-brand-neutral-900));\n --coras-color-neutral-100: light-dark(var(--coras-brand-neutral-100), var(--coras-brand-neutral-800));\n --coras-color-neutral-200: light-dark(var(--coras-brand-neutral-200), var(--coras-brand-neutral-700));\n --coras-color-neutral-300: light-dark(var(--coras-brand-neutral-300), var(--coras-brand-neutral-600));\n --coras-color-neutral-400: light-dark(var(--coras-brand-neutral-400), var(--coras-brand-neutral-500));\n --coras-color-neutral-500: light-dark(var(--coras-brand-neutral-500), var(--coras-brand-neutral-400));\n --coras-color-neutral-600: light-dark(var(--coras-brand-neutral-600), var(--coras-brand-neutral-300));\n --coras-color-neutral-700: light-dark(var(--coras-brand-neutral-700), var(--coras-brand-neutral-200));\n --coras-color-neutral-800: light-dark(var(--coras-brand-neutral-800), var(--coras-brand-neutral-100));\n --coras-color-neutral-900: light-dark(var(--coras-brand-neutral-900), var(--coras-brand-neutral-50));\n --coras-color-background: var(--coras-brand-page-background);\n --coras-color-card: var(--coras-brand-card-background);\n --coras-color-card-sunken: light-dark(var(--coras-brand-neutral-50), #0b0d10);\n --coras-color-card-hover: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-card-active: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-active));\n --coras-color-card-muted: light-dark(color-mix(in srgb, var(--coras-brand-neutral-200) 35%, var(--coras-palette-white)), color-mix(in srgb, var(--coras-palette-white) 5%, transparent));\n --coras-color-field: var(--coras-brand-field-background);\n --coras-color-field-hover: color-mix(in srgb, var(--coras-color-field), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-menu: var(--coras-brand-menu-background);\n --coras-color-menu-border: var(--coras-brand-menu-border);\n --coras-color-menu-hover: color-mix(in srgb, var(--coras-color-menu), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-text: var(--coras-brand-text);\n --coras-color-text-primary: var(--coras-brand-text);\n --coras-color-text-muted: var(--coras-brand-text-muted);\n --coras-color-text-disabled: var(--coras-brand-disabled);\n --coras-state-overlay: light-dark(#000, #fff);\n --coras-state-hover: 10%;\n --coras-state-active: 18%;\n --coras-color-primary-button: var(--coras-brand-primary-button);\n --coras-color-primary-button-hover: var(--coras-brand-primary-button-hover);\n --coras-color-primary-button-pressed: var(--coras-brand-primary-button-pressed);\n --coras-color-primary-button-text: var(--coras-brand-primary-button-text);\n --coras-color-primary-button-border: var(--coras-brand-primary-button-border);\n --coras-color-secondary-button: var(--coras-brand-secondary-button);\n --coras-color-secondary-button-border: var(--coras-brand-secondary-button-border);\n --coras-color-secondary-button-hover: var(--coras-brand-secondary-button-hover);\n --coras-color-secondary-button-pressed: var(--coras-brand-secondary-button-pressed);\n --coras-color-secondary-button-text: var(--coras-brand-secondary-button-text);\n --coras-color-text-button: var(--coras-brand-text-button);\n --coras-color-link: var(--coras-brand-link);\n --coras-color-icon: var(--coras-brand-icon);\n --coras-color-card-border: var(--coras-brand-card-border);\n --coras-color-divider: var(--coras-brand-divider);\n --coras-color-field-border: var(--coras-brand-field-border);\n --coras-color-footer-border: var(--coras-brand-footer-border);\n --coras-color-focus-ring: var(--coras-brand-focus-ring);\n --coras-color-scrim: var(--coras-brand-scrim);\n --coras-font-family-sans: var(--coras-brand-font);\n --coras-font-family-heading: var(--coras-brand-heading-font);\n --coras-font-size-xxs: 0.625rem;\n --coras-font-size-xs: 0.75rem;\n --coras-font-size-sm: 0.875rem;\n --coras-font-size-base: 1rem;\n --coras-font-size-lg: 1.125rem;\n --coras-font-size-xl: 1.25rem;\n --coras-font-size-2xl: 1.5rem;\n --coras-font-size-3xl: 2.25rem;\n --coras-font-size-4xl: 3rem;\n --coras-font-size-5xl: 3.5rem;\n --coras-font-size-title: calc(var(--coras-font-size-3xl) * var(--coras-brand-heading-scale));\n --coras-font-size-heading: calc(var(--coras-font-size-2xl) * var(--coras-brand-heading-scale));\n --coras-font-weight-light: 300;\n --coras-font-weight-normal: 400;\n --coras-font-weight-medium: 500;\n --coras-font-weight-semibold: 600;\n --coras-font-weight-bold: 700;\n --coras-radius-none: 0;\n --coras-radius-xs: calc(var(--coras-brand-radius) / 6);\n --coras-radius-sm: calc(var(--coras-brand-radius) / 3);\n --coras-radius-md: calc(var(--coras-brand-radius) * 2 / 3);\n --coras-radius-lg: var(--coras-brand-radius);\n --coras-radius-xl: calc(var(--coras-brand-radius) * 7 / 6);\n --coras-radius-2xl: calc(var(--coras-brand-radius) * 4 / 3);\n --coras-radius-full: 9999px;\n --coras-radius-control: 0.25rem;\n --coras-radius-field: var(--coras-brand-field-radius);\n --coras-radius-button: var(--coras-brand-button-radius);\n --coras-radius-chip: var(--coras-brand-chip-radius);\n --coras-radius-search: var(--coras-brand-search-radius);\n --coras-shadow-sm: var(--coras-brand-soft-shadow);\n --coras-shadow-md: var(--coras-brand-button-shadow);\n --coras-shadow-lg: var(--coras-brand-card-shadow);\n --coras-shadow-top: 1px -4px 8px 4px rgba(0, 0, 0, 0.03);\n --coras-shadow-strong: 0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px rgba(0, 0, 0, 0.3);\n --coras-page-max-width: 950px;\n --coras-container-max-width: 1368px;\n --coras-footer-max-width: 1073px;\n --coras-z-index-overlay: 1000;\n --coras-navbar-padding: 1rem;\n --coras-content-padding: 0 1rem;\n --coras-footer-padding: 4rem 2rem;\n }\n}\n\n@layer coras.components {\n :where([data-coras-root], .coras-theme) {\n --coras-base-text-color: var(--coras-color-text);\n --coras-navbar-background: var(--coras-brand-navbar-background);\n --coras-navbar-background-image: var(--coras-brand-navbar-background-image);\n --coras-navbar-background-image-dark: var(--coras-brand-navbar-background-image-dark, var(--coras-brand-navbar-background-image));\n --coras-navbar-text-color: var(--coras-brand-navbar-text);\n --coras-navbar-border-bottom: 1px solid var(--coras-brand-navbar-border);\n --coras-navbar-shadow: var(--coras-brand-navbar-shadow);\n --coras-navbar-icon-color: var(--coras-brand-navbar-icon);\n --coras-navbar-logo-height: var(--coras-brand-logo-height);\n --coras-footer-background-color: var(--coras-brand-footer-background);\n --coras-footer-background-image: var(--coras-brand-footer-background-image);\n --coras-footer-background-image-dark: var(--coras-brand-footer-background-image-dark, var(--coras-brand-footer-background-image));\n --coras-footer-text-color: var(--coras-brand-footer-text);\n --coras-footer-link-color: var(--coras-brand-footer-link);\n --coras-footer-border-top: 1px solid var(--coras-color-footer-border);\n --coras-footer-padding-bottom: var(--coras-brand-footer-padding-bottom);\n --coras-button-primary-background: var(--coras-color-primary-button);\n --coras-button-primary-text-color: var(--coras-color-primary-button-text);\n --coras-button-primary-background-hover: var(--coras-color-primary-button-hover);\n --coras-button-primary-background-active: var(--coras-color-primary-button-pressed);\n --coras-button-primary-border-color: var(--coras-color-primary-button-border);\n --coras-button-secondary-border-color: var(--coras-color-secondary-button-border);\n --coras-input-field-background-color: var(--coras-color-field);\n --coras-basket-accent-color: var(--coras-brand-secondary);\n }\n}\n\n@layer coras.components {\n :where([data-coras-root]) {\n container: coras-page / inline-size;\n max-width: 100%;\n background-color: var(--coras-page-background, transparent);\n color: var(--coras-base-text-color);\n }\n :where([data-coras-root]) > *:where(:not(style)) {\n display: block;\n fill: var(--coras-color-icon);\n }\n}\n";
12
12
  /**
13
13
  * Ensure the token stylesheet is present in `root` (a `Document` or
14
14
  * `ShadowRoot`). Idempotent: adopting the same root twice is a no-op, and the
@@ -1 +1 @@
1
- export declare const CORAS_TOKENS_CSS = "/* GENERATED by scripts/generate-tokens.mjs - do not edit by hand. */\n/* CSS-first four-tier token system (plan F-004, P-051..P-055). */\n\n@layer coras.palette, coras.brand, coras.semantic, coras.components;\n\n@property --coras-brand-primary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-page-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-body-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-focus-ring {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-card-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #fcfcff;\n}\n@property --coras-brand-field-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-menu-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-main-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-text-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-button-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-chip-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-navbar-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-navbar-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-border {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-footer-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #e6e6e6;\n}\n@property --coras-brand-footer-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-footer-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-error {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #c9224a;\n}\n@property --coras-brand-success {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #00ad8f;\n}\n@property --coras-brand-warning {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ed8f1c;\n}\n@property --coras-brand-info {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #670c93;\n}\n\n@layer coras.palette {\n :where([data-coras-root], .coras-theme) {\n --coras-palette-primary-50: #fcfcff;\n --coras-palette-primary-100: #fbfbff;\n --coras-palette-primary-200: #eef0ff;\n --coras-palette-primary-300: #dde1ff;\n --coras-palette-primary-400: #5468ff;\n --coras-palette-primary-500: #4657d4;\n --coras-palette-primary-700: #323e99;\n --coras-palette-secondary-50: #e8e8ec;\n --coras-palette-secondary-100: #d0d2da;\n --coras-palette-secondary-200: #b9bbc7;\n --coras-palette-secondary-300: #a2a4b4;\n --coras-palette-secondary-400: #1c2355;\n --coras-palette-secondary-500: #161c44;\n --coras-palette-secondary-700: #121636;\n --coras-palette-neutral-50: #f5f5f5;\n --coras-palette-neutral-100: #eeeeee;\n --coras-palette-neutral-200: #e6e6e6;\n --coras-palette-neutral-300: #dddddd;\n --coras-palette-neutral-400: #cccccc;\n --coras-palette-neutral-500: #aaaaaa;\n --coras-palette-neutral-600: #888888;\n --coras-palette-neutral-700: #666666;\n --coras-palette-neutral-800: #444444;\n --coras-palette-neutral-900: #292929;\n --coras-palette-error-50: #fae9ed;\n --coras-palette-error-500: #c9224a;\n --coras-palette-error-700: #a11b3b;\n --coras-palette-error-900: #79142c;\n --coras-palette-info-50: #f0e7f4;\n --coras-palette-info-500: #670c93;\n --coras-palette-info-700: #520a76;\n --coras-palette-info-900: #3e0758;\n --coras-palette-success-50: #e6f7f4;\n --coras-palette-success-500: #00ad8f;\n --coras-palette-success-700: #008a72;\n --coras-palette-success-900: #006856;\n --coras-palette-warning-50: #fdf4e8;\n --coras-palette-warning-500: #ed8f1c;\n --coras-palette-warning-700: #be7216;\n --coras-palette-warning-900: #8e5611;\n --coras-palette-pink-500: #ff2d55;\n --coras-palette-black: #000000;\n --coras-palette-white: #ffffff;\n }\n}\n\n@layer coras.brand {\n :where([data-coras-root], .coras-theme) {\n color-scheme: light;\n --coras-brand-primary: var(--coras-palette-primary-500);\n --coras-brand-secondary: var(--coras-palette-secondary-500);\n --coras-brand-page-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-text: light-dark(var(--coras-palette-secondary-500), #ffffff);\n --coras-brand-text-muted: light-dark(var(--coras-palette-neutral-600), #cccccc);\n --coras-brand-link: var(--coras-brand-text-button);\n --coras-brand-body-icon: var(--coras-brand-text);\n --coras-brand-focus-ring: var(--coras-brand-primary);\n --coras-brand-scrim: var(--coras-palette-black);\n --coras-brand-card-background: light-dark(var(--coras-palette-primary-50), #191c22);\n --coras-brand-card-border: light-dark(var(--coras-palette-neutral-200), #444444);\n --coras-brand-field-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-field-border: light-dark(var(--coras-palette-neutral-400), #aaaaaa);\n --coras-brand-menu-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-menu-border: var(--coras-brand-card-border);\n --coras-brand-divider: light-dark(var(--coras-palette-neutral-200), #292929);\n --coras-brand-card-shadow: 0px 24px 24px rgba(0, 0, 0, 0.04);\n --coras-brand-soft-shadow: 0px 4px 4px rgba(0, 0, 0, 0.04);\n --coras-brand-main-button: var(--coras-brand-primary);\n --coras-brand-main-button-text: #ffffff;\n --coras-brand-main-button-hover: light-dark(#3f4ebf, #5968d8);\n --coras-brand-main-button-pressed: light-dark(#3947ae, #6775dc);\n --coras-brand-secondary-button: var(--coras-brand-secondary);\n --coras-brand-secondary-button-text: #ffffff;\n --coras-brand-secondary-button-hover: light-dark(#14193d, #2d3357);\n --coras-brand-secondary-button-pressed: light-dark(#121738, #404566);\n --coras-brand-text-button: light-dark(var(--coras-brand-primary), #6279f9);\n --coras-brand-main-button-border: transparent;\n --coras-brand-secondary-button-border: transparent;\n --coras-brand-disabled: light-dark(var(--coras-palette-neutral-500), #cccccc);\n --coras-brand-button-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n --coras-brand-button-hover-light: 20%;\n --coras-brand-button-hover-dark: 20%;\n --coras-brand-radius: 1.5rem;\n --coras-brand-button-radius: var(--coras-brand-radius);\n --coras-brand-chip-radius: var(--coras-brand-radius);\n --coras-brand-field-radius: 0.5rem;\n --coras-brand-search-radius: 100px;\n --coras-brand-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --coras-brand-heading-font: var(--coras-brand-font);\n --coras-brand-heading-scale: 1;\n --coras-brand-logo-height: 2rem;\n --coras-brand-navbar-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-navbar-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-navbar-icon: var(--coras-brand-navbar-text);\n --coras-brand-navbar-border: var(--coras-brand-navbar-background);\n --coras-brand-navbar-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.04);\n --coras-brand-footer-background: light-dark(var(--coras-palette-neutral-200), #191c22);\n --coras-brand-footer-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-footer-link: var(--coras-brand-footer-text);\n --coras-brand-footer-border: var(--coras-brand-footer-background);\n --coras-brand-footer-padding-bottom: 2rem;\n --coras-brand-error: light-dark(var(--coras-palette-error-500), #f5748a);\n --coras-brand-error-background: light-dark(var(--coras-palette-error-50), #442e36);\n --coras-brand-success: light-dark(var(--coras-palette-success-500), #34d8b4);\n --coras-brand-success-background: light-dark(var(--coras-palette-success-50), #26403f);\n --coras-brand-warning: light-dark(var(--coras-palette-warning-500), #f4a93c);\n --coras-brand-warning-background: light-dark(var(--coras-palette-warning-50), #43382e);\n --coras-brand-info: light-dark(var(--coras-palette-info-500), #ba86e1);\n --coras-brand-info-background: light-dark(var(--coras-palette-info-50), #373045);\n --coras-brand-primary-tint: light-dark(var(--coras-palette-primary-50), #141823);\n --coras-brand-secondary-tint: light-dark(var(--coras-palette-secondary-50), #10131a);\n --coras-brand-neutral-50: var(--coras-palette-neutral-50);\n --coras-brand-neutral-100: var(--coras-palette-neutral-100);\n --coras-brand-neutral-200: var(--coras-palette-neutral-200);\n --coras-brand-neutral-300: var(--coras-palette-neutral-300);\n --coras-brand-neutral-400: var(--coras-palette-neutral-400);\n --coras-brand-neutral-500: var(--coras-palette-neutral-500);\n --coras-brand-neutral-600: var(--coras-palette-neutral-600);\n --coras-brand-neutral-700: var(--coras-palette-neutral-700);\n --coras-brand-neutral-800: var(--coras-palette-neutral-800);\n --coras-brand-neutral-900: var(--coras-palette-neutral-900);\n }\n}\n\n@layer coras.semantic {\n :where([data-coras-root], .coras-theme) {\n --coras-color-primary: var(--coras-brand-primary);\n --coras-color-primary-tint: var(--coras-brand-primary-tint);\n --coras-color-secondary: var(--coras-brand-secondary);\n --coras-color-secondary-tint: var(--coras-brand-secondary-tint);\n --coras-color-error: var(--coras-brand-error);\n --coras-color-error-background: var(--coras-brand-error-background);\n --coras-color-success: var(--coras-brand-success);\n --coras-color-success-background: var(--coras-brand-success-background);\n --coras-color-warning: var(--coras-brand-warning);\n --coras-color-warning-background: var(--coras-brand-warning-background);\n --coras-color-info: var(--coras-brand-info);\n --coras-color-info-background: var(--coras-brand-info-background);\n --coras-color-neutral-50: light-dark(var(--coras-brand-neutral-50), var(--coras-brand-neutral-900));\n --coras-color-neutral-100: light-dark(var(--coras-brand-neutral-100), var(--coras-brand-neutral-800));\n --coras-color-neutral-200: light-dark(var(--coras-brand-neutral-200), var(--coras-brand-neutral-700));\n --coras-color-neutral-300: light-dark(var(--coras-brand-neutral-300), var(--coras-brand-neutral-600));\n --coras-color-neutral-400: light-dark(var(--coras-brand-neutral-400), var(--coras-brand-neutral-500));\n --coras-color-neutral-500: light-dark(var(--coras-brand-neutral-500), var(--coras-brand-neutral-400));\n --coras-color-neutral-600: light-dark(var(--coras-brand-neutral-600), var(--coras-brand-neutral-300));\n --coras-color-neutral-700: light-dark(var(--coras-brand-neutral-700), var(--coras-brand-neutral-200));\n --coras-color-neutral-800: light-dark(var(--coras-brand-neutral-800), var(--coras-brand-neutral-100));\n --coras-color-neutral-900: light-dark(var(--coras-brand-neutral-900), var(--coras-brand-neutral-50));\n --coras-color-background: var(--coras-brand-page-background);\n --coras-color-card: var(--coras-brand-card-background);\n --coras-color-card-sunken: light-dark(var(--coras-brand-neutral-50), #0b0d10);\n --coras-color-card-hover: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-card-active: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-active));\n --coras-color-card-muted: light-dark(color-mix(in srgb, var(--coras-brand-neutral-200) 35%, var(--coras-palette-white)), color-mix(in srgb, var(--coras-palette-white) 5%, transparent));\n --coras-color-field: var(--coras-brand-field-background);\n --coras-color-field-hover: color-mix(in srgb, var(--coras-color-field), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-menu: var(--coras-brand-menu-background);\n --coras-color-menu-border: var(--coras-brand-menu-border);\n --coras-color-menu-hover: color-mix(in srgb, var(--coras-color-menu), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-text: var(--coras-brand-text);\n --coras-color-text-primary: var(--coras-brand-text);\n --coras-color-text-muted: var(--coras-brand-text-muted);\n --coras-color-text-disabled: var(--coras-brand-disabled);\n --coras-state-overlay: light-dark(#000, #fff);\n --coras-state-hover: 10%;\n --coras-state-active: 18%;\n --coras-color-main-button: var(--coras-brand-main-button);\n --coras-color-main-button-hover: var(--coras-brand-main-button-hover);\n --coras-color-main-button-pressed: var(--coras-brand-main-button-pressed);\n --coras-color-main-button-text: var(--coras-brand-main-button-text);\n --coras-color-main-button-border: var(--coras-brand-main-button-border);\n --coras-color-secondary-button: var(--coras-brand-secondary-button);\n --coras-color-secondary-button-border: var(--coras-brand-secondary-button-border);\n --coras-color-secondary-button-hover: var(--coras-brand-secondary-button-hover);\n --coras-color-secondary-button-pressed: var(--coras-brand-secondary-button-pressed);\n --coras-color-secondary-button-text: var(--coras-brand-secondary-button-text);\n --coras-color-text-button: var(--coras-brand-text-button);\n --coras-color-link: var(--coras-brand-link);\n --coras-color-icon: var(--coras-brand-body-icon);\n --coras-color-card-border: var(--coras-brand-card-border);\n --coras-color-divider: var(--coras-brand-divider);\n --coras-color-field-border: var(--coras-brand-field-border);\n --coras-color-footer-border: var(--coras-brand-footer-border);\n --coras-color-focus-ring: var(--coras-brand-focus-ring);\n --coras-color-scrim: var(--coras-brand-scrim);\n --coras-font-family-sans: var(--coras-brand-font);\n --coras-font-family-heading: var(--coras-brand-heading-font);\n --coras-font-size-xxs: 0.625rem;\n --coras-font-size-xs: 0.75rem;\n --coras-font-size-sm: 0.875rem;\n --coras-font-size-base: 1rem;\n --coras-font-size-lg: 1.125rem;\n --coras-font-size-xl: 1.25rem;\n --coras-font-size-2xl: 1.5rem;\n --coras-font-size-3xl: 2.25rem;\n --coras-font-size-4xl: 3rem;\n --coras-font-size-5xl: 3.5rem;\n --coras-font-size-title: calc(var(--coras-font-size-3xl) * var(--coras-brand-heading-scale));\n --coras-font-size-heading: calc(var(--coras-font-size-2xl) * var(--coras-brand-heading-scale));\n --coras-font-weight-light: 300;\n --coras-font-weight-normal: 400;\n --coras-font-weight-medium: 500;\n --coras-font-weight-semibold: 600;\n --coras-font-weight-bold: 700;\n --coras-radius-none: 0;\n --coras-radius-xs: calc(var(--coras-brand-radius) / 6);\n --coras-radius-sm: calc(var(--coras-brand-radius) / 3);\n --coras-radius-md: calc(var(--coras-brand-radius) * 2 / 3);\n --coras-radius-lg: var(--coras-brand-radius);\n --coras-radius-xl: calc(var(--coras-brand-radius) * 7 / 6);\n --coras-radius-2xl: calc(var(--coras-brand-radius) * 4 / 3);\n --coras-radius-full: 9999px;\n --coras-radius-control: 0.25rem;\n --coras-radius-field: var(--coras-brand-field-radius);\n --coras-radius-button: var(--coras-brand-button-radius);\n --coras-radius-chip: var(--coras-brand-chip-radius);\n --coras-radius-search: var(--coras-brand-search-radius);\n --coras-shadow-sm: var(--coras-brand-soft-shadow);\n --coras-shadow-md: var(--coras-brand-button-shadow);\n --coras-shadow-lg: var(--coras-brand-card-shadow);\n --coras-shadow-top: 1px -4px 8px 4px rgba(0, 0, 0, 0.03);\n --coras-shadow-strong: 0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px rgba(0, 0, 0, 0.3);\n --coras-page-max-width: 950px;\n --coras-container-max-width: 1368px;\n --coras-footer-max-width: 1073px;\n --coras-z-index-overlay: 1000;\n --coras-navbar-padding: 1rem;\n --coras-content-padding: 0 1rem;\n --coras-footer-padding: 4rem 2rem;\n }\n}\n\n@layer coras.components {\n :where([data-coras-root], .coras-theme) {\n --coras-base-text-color: var(--coras-color-text);\n --coras-navbar-background: var(--coras-brand-navbar-background);\n --coras-navbar-text-color: var(--coras-brand-navbar-text);\n --coras-navbar-border-bottom: 1px solid var(--coras-brand-navbar-border);\n --coras-navbar-shadow: var(--coras-brand-navbar-shadow);\n --coras-navbar-icon-color: var(--coras-brand-navbar-icon);\n --coras-navbar-logo-height: var(--coras-brand-logo-height);\n --coras-footer-background-color: var(--coras-brand-footer-background);\n --coras-footer-text-color: var(--coras-brand-footer-text);\n --coras-footer-link-color: var(--coras-brand-footer-link);\n --coras-footer-border-top: 1px solid var(--coras-color-footer-border);\n --coras-footer-padding-bottom: var(--coras-brand-footer-padding-bottom);\n --coras-button-primary-background: var(--coras-color-main-button);\n --coras-button-primary-text-color: var(--coras-color-main-button-text);\n --coras-button-primary-background-hover: var(--coras-color-main-button-hover);\n --coras-button-primary-background-active: var(--coras-color-main-button-pressed);\n --coras-button-primary-border-color: var(--coras-color-main-button-border);\n --coras-button-secondary-border-color: var(--coras-color-secondary-button-border);\n --coras-input-field-background-color: var(--coras-color-field);\n --coras-basket-accent-color: var(--coras-brand-secondary);\n }\n}\n\n@layer coras.components {\n :where([data-coras-root]) {\n container: coras-page / inline-size;\n max-width: 100%;\n background-color: var(--coras-page-background, transparent);\n color: var(--coras-base-text-color);\n }\n :where([data-coras-root]) > *:where(:not(style)) {\n display: block;\n fill: var(--coras-color-icon);\n }\n}\n";
1
+ export declare const CORAS_TOKENS_CSS = "/* GENERATED by scripts/generate-tokens.mjs - do not edit by hand. */\n/* CSS-first four-tier token system (plan F-004, P-051..P-055). */\n\n@layer coras.palette, coras.brand, coras.semantic, coras.components;\n\n@property --coras-brand-primary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-page-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-focus-ring {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-card-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #fcfcff;\n}\n@property --coras-brand-field-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-menu-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-primary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-text-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-button-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-chip-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-navbar-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-navbar-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-border {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-footer-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #e6e6e6;\n}\n@property --coras-brand-footer-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-footer-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-error {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #c9224a;\n}\n@property --coras-brand-success {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #00ad8f;\n}\n@property --coras-brand-warning {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ed8f1c;\n}\n@property --coras-brand-info {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #670c93;\n}\n\n@layer coras.palette {\n :where([data-coras-root], .coras-theme) {\n --coras-palette-primary-50: #fcfcff;\n --coras-palette-primary-100: #fbfbff;\n --coras-palette-primary-200: #eef0ff;\n --coras-palette-primary-300: #dde1ff;\n --coras-palette-primary-400: #5468ff;\n --coras-palette-primary-500: #4657d4;\n --coras-palette-primary-700: #323e99;\n --coras-palette-secondary-50: #e8e8ec;\n --coras-palette-secondary-100: #d0d2da;\n --coras-palette-secondary-200: #b9bbc7;\n --coras-palette-secondary-300: #a2a4b4;\n --coras-palette-secondary-400: #1c2355;\n --coras-palette-secondary-500: #161c44;\n --coras-palette-secondary-700: #121636;\n --coras-palette-neutral-50: #f5f5f5;\n --coras-palette-neutral-100: #eeeeee;\n --coras-palette-neutral-200: #e6e6e6;\n --coras-palette-neutral-300: #dddddd;\n --coras-palette-neutral-400: #cccccc;\n --coras-palette-neutral-500: #aaaaaa;\n --coras-palette-neutral-600: #888888;\n --coras-palette-neutral-700: #666666;\n --coras-palette-neutral-800: #444444;\n --coras-palette-neutral-900: #292929;\n --coras-palette-error-50: #fae9ed;\n --coras-palette-error-500: #c9224a;\n --coras-palette-error-700: #a11b3b;\n --coras-palette-error-900: #79142c;\n --coras-palette-info-50: #f0e7f4;\n --coras-palette-info-500: #670c93;\n --coras-palette-info-700: #520a76;\n --coras-palette-info-900: #3e0758;\n --coras-palette-success-50: #e6f7f4;\n --coras-palette-success-500: #00ad8f;\n --coras-palette-success-700: #008a72;\n --coras-palette-success-900: #006856;\n --coras-palette-warning-50: #fdf4e8;\n --coras-palette-warning-500: #ed8f1c;\n --coras-palette-warning-700: #be7216;\n --coras-palette-warning-900: #8e5611;\n --coras-palette-pink-500: #ff2d55;\n --coras-palette-black: #000000;\n --coras-palette-white: #ffffff;\n }\n}\n\n@layer coras.brand {\n :where([data-coras-root], .coras-theme) {\n color-scheme: light;\n --coras-brand-primary: var(--coras-palette-primary-500);\n --coras-brand-secondary: var(--coras-palette-secondary-500);\n --coras-brand-page-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-text: light-dark(var(--coras-palette-secondary-500), #ffffff);\n --coras-brand-text-muted: light-dark(var(--coras-palette-neutral-600), #cccccc);\n --coras-brand-link: var(--coras-brand-text-button);\n --coras-brand-icon: var(--coras-brand-text);\n --coras-brand-focus-ring: var(--coras-brand-primary);\n --coras-brand-scrim: var(--coras-palette-black);\n --coras-brand-card-background: light-dark(var(--coras-palette-primary-50), #191c22);\n --coras-brand-card-border: light-dark(var(--coras-palette-neutral-200), #444444);\n --coras-brand-field-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-field-border: light-dark(var(--coras-palette-neutral-400), #aaaaaa);\n --coras-brand-menu-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-menu-border: var(--coras-brand-card-border);\n --coras-brand-divider: light-dark(var(--coras-palette-neutral-200), #292929);\n --coras-brand-card-shadow: 0px 24px 24px rgba(0, 0, 0, 0.04);\n --coras-brand-soft-shadow: 0px 4px 4px rgba(0, 0, 0, 0.04);\n --coras-brand-primary-button: var(--coras-brand-primary);\n --coras-brand-primary-button-text: #ffffff;\n --coras-brand-primary-button-hover: light-dark(#3f4ebf, #5968d8);\n --coras-brand-primary-button-pressed: light-dark(#3947ae, #6775dc);\n --coras-brand-secondary-button: var(--coras-brand-secondary);\n --coras-brand-secondary-button-text: #ffffff;\n --coras-brand-secondary-button-hover: light-dark(#14193d, #2d3357);\n --coras-brand-secondary-button-pressed: light-dark(#121738, #404566);\n --coras-brand-text-button: light-dark(var(--coras-brand-primary), #6279f9);\n --coras-brand-primary-button-border: transparent;\n --coras-brand-secondary-button-border: transparent;\n --coras-brand-disabled: light-dark(var(--coras-palette-neutral-500), #cccccc);\n --coras-brand-button-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n --coras-brand-button-hover-on-light-fill: 20%;\n --coras-brand-button-hover-on-dark-fill: 20%;\n --coras-brand-radius: 1.5rem;\n --coras-brand-button-radius: var(--coras-brand-radius);\n --coras-brand-chip-radius: var(--coras-brand-radius);\n --coras-brand-field-radius: 0.5rem;\n --coras-brand-search-radius: 100px;\n --coras-brand-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --coras-brand-heading-font: var(--coras-brand-font);\n --coras-brand-heading-scale: 1;\n --coras-brand-logo-height: 2rem;\n --coras-brand-navbar-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-navbar-background-image: none;\n --coras-brand-navbar-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-navbar-icon: var(--coras-brand-navbar-text);\n --coras-brand-navbar-border: var(--coras-brand-navbar-background);\n --coras-brand-navbar-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.04);\n --coras-brand-footer-background: light-dark(var(--coras-palette-neutral-200), #191c22);\n --coras-brand-footer-background-image: none;\n --coras-brand-footer-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-footer-link: var(--coras-brand-footer-text);\n --coras-brand-footer-border: var(--coras-brand-footer-background);\n --coras-brand-footer-padding-bottom: 2rem;\n --coras-brand-error: light-dark(var(--coras-palette-error-500), #f5748a);\n --coras-brand-error-background: light-dark(var(--coras-palette-error-50), #442e36);\n --coras-brand-success: light-dark(var(--coras-palette-success-500), #34d8b4);\n --coras-brand-success-background: light-dark(var(--coras-palette-success-50), #26403f);\n --coras-brand-warning: light-dark(var(--coras-palette-warning-500), #f4a93c);\n --coras-brand-warning-background: light-dark(var(--coras-palette-warning-50), #43382e);\n --coras-brand-info: light-dark(var(--coras-palette-info-500), #ba86e1);\n --coras-brand-info-background: light-dark(var(--coras-palette-info-50), #373045);\n --coras-brand-primary-tint: light-dark(var(--coras-palette-primary-50), #141823);\n --coras-brand-secondary-tint: light-dark(var(--coras-palette-secondary-50), #10131a);\n --coras-brand-neutral-50: var(--coras-palette-neutral-50);\n --coras-brand-neutral-100: var(--coras-palette-neutral-100);\n --coras-brand-neutral-200: var(--coras-palette-neutral-200);\n --coras-brand-neutral-300: var(--coras-palette-neutral-300);\n --coras-brand-neutral-400: var(--coras-palette-neutral-400);\n --coras-brand-neutral-500: var(--coras-palette-neutral-500);\n --coras-brand-neutral-600: var(--coras-palette-neutral-600);\n --coras-brand-neutral-700: var(--coras-palette-neutral-700);\n --coras-brand-neutral-800: var(--coras-palette-neutral-800);\n --coras-brand-neutral-900: var(--coras-palette-neutral-900);\n }\n}\n\n@layer coras.semantic {\n :where([data-coras-root], .coras-theme) {\n --coras-color-primary: var(--coras-brand-primary);\n --coras-color-primary-tint: var(--coras-brand-primary-tint);\n --coras-color-secondary: var(--coras-brand-secondary);\n --coras-color-secondary-tint: var(--coras-brand-secondary-tint);\n --coras-color-error: var(--coras-brand-error);\n --coras-color-error-background: var(--coras-brand-error-background);\n --coras-color-success: var(--coras-brand-success);\n --coras-color-success-background: var(--coras-brand-success-background);\n --coras-color-warning: var(--coras-brand-warning);\n --coras-color-warning-background: var(--coras-brand-warning-background);\n --coras-color-info: var(--coras-brand-info);\n --coras-color-info-background: var(--coras-brand-info-background);\n --coras-color-neutral-50: light-dark(var(--coras-brand-neutral-50), var(--coras-brand-neutral-900));\n --coras-color-neutral-100: light-dark(var(--coras-brand-neutral-100), var(--coras-brand-neutral-800));\n --coras-color-neutral-200: light-dark(var(--coras-brand-neutral-200), var(--coras-brand-neutral-700));\n --coras-color-neutral-300: light-dark(var(--coras-brand-neutral-300), var(--coras-brand-neutral-600));\n --coras-color-neutral-400: light-dark(var(--coras-brand-neutral-400), var(--coras-brand-neutral-500));\n --coras-color-neutral-500: light-dark(var(--coras-brand-neutral-500), var(--coras-brand-neutral-400));\n --coras-color-neutral-600: light-dark(var(--coras-brand-neutral-600), var(--coras-brand-neutral-300));\n --coras-color-neutral-700: light-dark(var(--coras-brand-neutral-700), var(--coras-brand-neutral-200));\n --coras-color-neutral-800: light-dark(var(--coras-brand-neutral-800), var(--coras-brand-neutral-100));\n --coras-color-neutral-900: light-dark(var(--coras-brand-neutral-900), var(--coras-brand-neutral-50));\n --coras-color-background: var(--coras-brand-page-background);\n --coras-color-card: var(--coras-brand-card-background);\n --coras-color-card-sunken: light-dark(var(--coras-brand-neutral-50), #0b0d10);\n --coras-color-card-hover: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-card-active: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-active));\n --coras-color-card-muted: light-dark(color-mix(in srgb, var(--coras-brand-neutral-200) 35%, var(--coras-palette-white)), color-mix(in srgb, var(--coras-palette-white) 5%, transparent));\n --coras-color-field: var(--coras-brand-field-background);\n --coras-color-field-hover: color-mix(in srgb, var(--coras-color-field), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-menu: var(--coras-brand-menu-background);\n --coras-color-menu-border: var(--coras-brand-menu-border);\n --coras-color-menu-hover: color-mix(in srgb, var(--coras-color-menu), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-text: var(--coras-brand-text);\n --coras-color-text-primary: var(--coras-brand-text);\n --coras-color-text-muted: var(--coras-brand-text-muted);\n --coras-color-text-disabled: var(--coras-brand-disabled);\n --coras-state-overlay: light-dark(#000, #fff);\n --coras-state-hover: 10%;\n --coras-state-active: 18%;\n --coras-color-primary-button: var(--coras-brand-primary-button);\n --coras-color-primary-button-hover: var(--coras-brand-primary-button-hover);\n --coras-color-primary-button-pressed: var(--coras-brand-primary-button-pressed);\n --coras-color-primary-button-text: var(--coras-brand-primary-button-text);\n --coras-color-primary-button-border: var(--coras-brand-primary-button-border);\n --coras-color-secondary-button: var(--coras-brand-secondary-button);\n --coras-color-secondary-button-border: var(--coras-brand-secondary-button-border);\n --coras-color-secondary-button-hover: var(--coras-brand-secondary-button-hover);\n --coras-color-secondary-button-pressed: var(--coras-brand-secondary-button-pressed);\n --coras-color-secondary-button-text: var(--coras-brand-secondary-button-text);\n --coras-color-text-button: var(--coras-brand-text-button);\n --coras-color-link: var(--coras-brand-link);\n --coras-color-icon: var(--coras-brand-icon);\n --coras-color-card-border: var(--coras-brand-card-border);\n --coras-color-divider: var(--coras-brand-divider);\n --coras-color-field-border: var(--coras-brand-field-border);\n --coras-color-footer-border: var(--coras-brand-footer-border);\n --coras-color-focus-ring: var(--coras-brand-focus-ring);\n --coras-color-scrim: var(--coras-brand-scrim);\n --coras-font-family-sans: var(--coras-brand-font);\n --coras-font-family-heading: var(--coras-brand-heading-font);\n --coras-font-size-xxs: 0.625rem;\n --coras-font-size-xs: 0.75rem;\n --coras-font-size-sm: 0.875rem;\n --coras-font-size-base: 1rem;\n --coras-font-size-lg: 1.125rem;\n --coras-font-size-xl: 1.25rem;\n --coras-font-size-2xl: 1.5rem;\n --coras-font-size-3xl: 2.25rem;\n --coras-font-size-4xl: 3rem;\n --coras-font-size-5xl: 3.5rem;\n --coras-font-size-title: calc(var(--coras-font-size-3xl) * var(--coras-brand-heading-scale));\n --coras-font-size-heading: calc(var(--coras-font-size-2xl) * var(--coras-brand-heading-scale));\n --coras-font-weight-light: 300;\n --coras-font-weight-normal: 400;\n --coras-font-weight-medium: 500;\n --coras-font-weight-semibold: 600;\n --coras-font-weight-bold: 700;\n --coras-radius-none: 0;\n --coras-radius-xs: calc(var(--coras-brand-radius) / 6);\n --coras-radius-sm: calc(var(--coras-brand-radius) / 3);\n --coras-radius-md: calc(var(--coras-brand-radius) * 2 / 3);\n --coras-radius-lg: var(--coras-brand-radius);\n --coras-radius-xl: calc(var(--coras-brand-radius) * 7 / 6);\n --coras-radius-2xl: calc(var(--coras-brand-radius) * 4 / 3);\n --coras-radius-full: 9999px;\n --coras-radius-control: 0.25rem;\n --coras-radius-field: var(--coras-brand-field-radius);\n --coras-radius-button: var(--coras-brand-button-radius);\n --coras-radius-chip: var(--coras-brand-chip-radius);\n --coras-radius-search: var(--coras-brand-search-radius);\n --coras-shadow-sm: var(--coras-brand-soft-shadow);\n --coras-shadow-md: var(--coras-brand-button-shadow);\n --coras-shadow-lg: var(--coras-brand-card-shadow);\n --coras-shadow-top: 1px -4px 8px 4px rgba(0, 0, 0, 0.03);\n --coras-shadow-strong: 0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px rgba(0, 0, 0, 0.3);\n --coras-page-max-width: 950px;\n --coras-container-max-width: 1368px;\n --coras-footer-max-width: 1073px;\n --coras-z-index-overlay: 1000;\n --coras-navbar-padding: 1rem;\n --coras-content-padding: 0 1rem;\n --coras-footer-padding: 4rem 2rem;\n }\n}\n\n@layer coras.components {\n :where([data-coras-root], .coras-theme) {\n --coras-base-text-color: var(--coras-color-text);\n --coras-navbar-background: var(--coras-brand-navbar-background);\n --coras-navbar-background-image: var(--coras-brand-navbar-background-image);\n --coras-navbar-background-image-dark: var(--coras-brand-navbar-background-image-dark, var(--coras-brand-navbar-background-image));\n --coras-navbar-text-color: var(--coras-brand-navbar-text);\n --coras-navbar-border-bottom: 1px solid var(--coras-brand-navbar-border);\n --coras-navbar-shadow: var(--coras-brand-navbar-shadow);\n --coras-navbar-icon-color: var(--coras-brand-navbar-icon);\n --coras-navbar-logo-height: var(--coras-brand-logo-height);\n --coras-footer-background-color: var(--coras-brand-footer-background);\n --coras-footer-background-image: var(--coras-brand-footer-background-image);\n --coras-footer-background-image-dark: var(--coras-brand-footer-background-image-dark, var(--coras-brand-footer-background-image));\n --coras-footer-text-color: var(--coras-brand-footer-text);\n --coras-footer-link-color: var(--coras-brand-footer-link);\n --coras-footer-border-top: 1px solid var(--coras-color-footer-border);\n --coras-footer-padding-bottom: var(--coras-brand-footer-padding-bottom);\n --coras-button-primary-background: var(--coras-color-primary-button);\n --coras-button-primary-text-color: var(--coras-color-primary-button-text);\n --coras-button-primary-background-hover: var(--coras-color-primary-button-hover);\n --coras-button-primary-background-active: var(--coras-color-primary-button-pressed);\n --coras-button-primary-border-color: var(--coras-color-primary-button-border);\n --coras-button-secondary-border-color: var(--coras-color-secondary-button-border);\n --coras-input-field-background-color: var(--coras-color-field);\n --coras-basket-accent-color: var(--coras-brand-secondary);\n }\n}\n\n@layer coras.components {\n :where([data-coras-root]) {\n container: coras-page / inline-size;\n max-width: 100%;\n background-color: var(--coras-page-background, transparent);\n color: var(--coras-base-text-color);\n }\n :where([data-coras-root]) > *:where(:not(style)) {\n display: block;\n fill: var(--coras-color-icon);\n }\n}\n";
@@ -1,4 +1,4 @@
1
1
  /* GENERATED by scripts/generate-tokens.mjs - do not edit by hand. */
2
2
  /* eslint-disable */
3
3
  // CSS-first token system as a string for runtime adoption (see tokens.ts).
4
- export const CORAS_TOKENS_CSS = "/* GENERATED by scripts/generate-tokens.mjs - do not edit by hand. */\n/* CSS-first four-tier token system (plan F-004, P-051..P-055). */\n\n@layer coras.palette, coras.brand, coras.semantic, coras.components;\n\n@property --coras-brand-primary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-page-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-body-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-focus-ring {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-card-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #fcfcff;\n}\n@property --coras-brand-field-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-menu-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-main-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-text-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-button-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-chip-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-navbar-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-navbar-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-border {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-footer-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #e6e6e6;\n}\n@property --coras-brand-footer-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-footer-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-error {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #c9224a;\n}\n@property --coras-brand-success {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #00ad8f;\n}\n@property --coras-brand-warning {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ed8f1c;\n}\n@property --coras-brand-info {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #670c93;\n}\n\n@layer coras.palette {\n :where([data-coras-root], .coras-theme) {\n --coras-palette-primary-50: #fcfcff;\n --coras-palette-primary-100: #fbfbff;\n --coras-palette-primary-200: #eef0ff;\n --coras-palette-primary-300: #dde1ff;\n --coras-palette-primary-400: #5468ff;\n --coras-palette-primary-500: #4657d4;\n --coras-palette-primary-700: #323e99;\n --coras-palette-secondary-50: #e8e8ec;\n --coras-palette-secondary-100: #d0d2da;\n --coras-palette-secondary-200: #b9bbc7;\n --coras-palette-secondary-300: #a2a4b4;\n --coras-palette-secondary-400: #1c2355;\n --coras-palette-secondary-500: #161c44;\n --coras-palette-secondary-700: #121636;\n --coras-palette-neutral-50: #f5f5f5;\n --coras-palette-neutral-100: #eeeeee;\n --coras-palette-neutral-200: #e6e6e6;\n --coras-palette-neutral-300: #dddddd;\n --coras-palette-neutral-400: #cccccc;\n --coras-palette-neutral-500: #aaaaaa;\n --coras-palette-neutral-600: #888888;\n --coras-palette-neutral-700: #666666;\n --coras-palette-neutral-800: #444444;\n --coras-palette-neutral-900: #292929;\n --coras-palette-error-50: #fae9ed;\n --coras-palette-error-500: #c9224a;\n --coras-palette-error-700: #a11b3b;\n --coras-palette-error-900: #79142c;\n --coras-palette-info-50: #f0e7f4;\n --coras-palette-info-500: #670c93;\n --coras-palette-info-700: #520a76;\n --coras-palette-info-900: #3e0758;\n --coras-palette-success-50: #e6f7f4;\n --coras-palette-success-500: #00ad8f;\n --coras-palette-success-700: #008a72;\n --coras-palette-success-900: #006856;\n --coras-palette-warning-50: #fdf4e8;\n --coras-palette-warning-500: #ed8f1c;\n --coras-palette-warning-700: #be7216;\n --coras-palette-warning-900: #8e5611;\n --coras-palette-pink-500: #ff2d55;\n --coras-palette-black: #000000;\n --coras-palette-white: #ffffff;\n }\n}\n\n@layer coras.brand {\n :where([data-coras-root], .coras-theme) {\n color-scheme: light;\n --coras-brand-primary: var(--coras-palette-primary-500);\n --coras-brand-secondary: var(--coras-palette-secondary-500);\n --coras-brand-page-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-text: light-dark(var(--coras-palette-secondary-500), #ffffff);\n --coras-brand-text-muted: light-dark(var(--coras-palette-neutral-600), #cccccc);\n --coras-brand-link: var(--coras-brand-text-button);\n --coras-brand-body-icon: var(--coras-brand-text);\n --coras-brand-focus-ring: var(--coras-brand-primary);\n --coras-brand-scrim: var(--coras-palette-black);\n --coras-brand-card-background: light-dark(var(--coras-palette-primary-50), #191c22);\n --coras-brand-card-border: light-dark(var(--coras-palette-neutral-200), #444444);\n --coras-brand-field-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-field-border: light-dark(var(--coras-palette-neutral-400), #aaaaaa);\n --coras-brand-menu-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-menu-border: var(--coras-brand-card-border);\n --coras-brand-divider: light-dark(var(--coras-palette-neutral-200), #292929);\n --coras-brand-card-shadow: 0px 24px 24px rgba(0, 0, 0, 0.04);\n --coras-brand-soft-shadow: 0px 4px 4px rgba(0, 0, 0, 0.04);\n --coras-brand-main-button: var(--coras-brand-primary);\n --coras-brand-main-button-text: #ffffff;\n --coras-brand-main-button-hover: light-dark(#3f4ebf, #5968d8);\n --coras-brand-main-button-pressed: light-dark(#3947ae, #6775dc);\n --coras-brand-secondary-button: var(--coras-brand-secondary);\n --coras-brand-secondary-button-text: #ffffff;\n --coras-brand-secondary-button-hover: light-dark(#14193d, #2d3357);\n --coras-brand-secondary-button-pressed: light-dark(#121738, #404566);\n --coras-brand-text-button: light-dark(var(--coras-brand-primary), #6279f9);\n --coras-brand-main-button-border: transparent;\n --coras-brand-secondary-button-border: transparent;\n --coras-brand-disabled: light-dark(var(--coras-palette-neutral-500), #cccccc);\n --coras-brand-button-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n --coras-brand-button-hover-light: 20%;\n --coras-brand-button-hover-dark: 20%;\n --coras-brand-radius: 1.5rem;\n --coras-brand-button-radius: var(--coras-brand-radius);\n --coras-brand-chip-radius: var(--coras-brand-radius);\n --coras-brand-field-radius: 0.5rem;\n --coras-brand-search-radius: 100px;\n --coras-brand-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --coras-brand-heading-font: var(--coras-brand-font);\n --coras-brand-heading-scale: 1;\n --coras-brand-logo-height: 2rem;\n --coras-brand-navbar-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-navbar-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-navbar-icon: var(--coras-brand-navbar-text);\n --coras-brand-navbar-border: var(--coras-brand-navbar-background);\n --coras-brand-navbar-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.04);\n --coras-brand-footer-background: light-dark(var(--coras-palette-neutral-200), #191c22);\n --coras-brand-footer-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-footer-link: var(--coras-brand-footer-text);\n --coras-brand-footer-border: var(--coras-brand-footer-background);\n --coras-brand-footer-padding-bottom: 2rem;\n --coras-brand-error: light-dark(var(--coras-palette-error-500), #f5748a);\n --coras-brand-error-background: light-dark(var(--coras-palette-error-50), #442e36);\n --coras-brand-success: light-dark(var(--coras-palette-success-500), #34d8b4);\n --coras-brand-success-background: light-dark(var(--coras-palette-success-50), #26403f);\n --coras-brand-warning: light-dark(var(--coras-palette-warning-500), #f4a93c);\n --coras-brand-warning-background: light-dark(var(--coras-palette-warning-50), #43382e);\n --coras-brand-info: light-dark(var(--coras-palette-info-500), #ba86e1);\n --coras-brand-info-background: light-dark(var(--coras-palette-info-50), #373045);\n --coras-brand-primary-tint: light-dark(var(--coras-palette-primary-50), #141823);\n --coras-brand-secondary-tint: light-dark(var(--coras-palette-secondary-50), #10131a);\n --coras-brand-neutral-50: var(--coras-palette-neutral-50);\n --coras-brand-neutral-100: var(--coras-palette-neutral-100);\n --coras-brand-neutral-200: var(--coras-palette-neutral-200);\n --coras-brand-neutral-300: var(--coras-palette-neutral-300);\n --coras-brand-neutral-400: var(--coras-palette-neutral-400);\n --coras-brand-neutral-500: var(--coras-palette-neutral-500);\n --coras-brand-neutral-600: var(--coras-palette-neutral-600);\n --coras-brand-neutral-700: var(--coras-palette-neutral-700);\n --coras-brand-neutral-800: var(--coras-palette-neutral-800);\n --coras-brand-neutral-900: var(--coras-palette-neutral-900);\n }\n}\n\n@layer coras.semantic {\n :where([data-coras-root], .coras-theme) {\n --coras-color-primary: var(--coras-brand-primary);\n --coras-color-primary-tint: var(--coras-brand-primary-tint);\n --coras-color-secondary: var(--coras-brand-secondary);\n --coras-color-secondary-tint: var(--coras-brand-secondary-tint);\n --coras-color-error: var(--coras-brand-error);\n --coras-color-error-background: var(--coras-brand-error-background);\n --coras-color-success: var(--coras-brand-success);\n --coras-color-success-background: var(--coras-brand-success-background);\n --coras-color-warning: var(--coras-brand-warning);\n --coras-color-warning-background: var(--coras-brand-warning-background);\n --coras-color-info: var(--coras-brand-info);\n --coras-color-info-background: var(--coras-brand-info-background);\n --coras-color-neutral-50: light-dark(var(--coras-brand-neutral-50), var(--coras-brand-neutral-900));\n --coras-color-neutral-100: light-dark(var(--coras-brand-neutral-100), var(--coras-brand-neutral-800));\n --coras-color-neutral-200: light-dark(var(--coras-brand-neutral-200), var(--coras-brand-neutral-700));\n --coras-color-neutral-300: light-dark(var(--coras-brand-neutral-300), var(--coras-brand-neutral-600));\n --coras-color-neutral-400: light-dark(var(--coras-brand-neutral-400), var(--coras-brand-neutral-500));\n --coras-color-neutral-500: light-dark(var(--coras-brand-neutral-500), var(--coras-brand-neutral-400));\n --coras-color-neutral-600: light-dark(var(--coras-brand-neutral-600), var(--coras-brand-neutral-300));\n --coras-color-neutral-700: light-dark(var(--coras-brand-neutral-700), var(--coras-brand-neutral-200));\n --coras-color-neutral-800: light-dark(var(--coras-brand-neutral-800), var(--coras-brand-neutral-100));\n --coras-color-neutral-900: light-dark(var(--coras-brand-neutral-900), var(--coras-brand-neutral-50));\n --coras-color-background: var(--coras-brand-page-background);\n --coras-color-card: var(--coras-brand-card-background);\n --coras-color-card-sunken: light-dark(var(--coras-brand-neutral-50), #0b0d10);\n --coras-color-card-hover: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-card-active: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-active));\n --coras-color-card-muted: light-dark(color-mix(in srgb, var(--coras-brand-neutral-200) 35%, var(--coras-palette-white)), color-mix(in srgb, var(--coras-palette-white) 5%, transparent));\n --coras-color-field: var(--coras-brand-field-background);\n --coras-color-field-hover: color-mix(in srgb, var(--coras-color-field), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-menu: var(--coras-brand-menu-background);\n --coras-color-menu-border: var(--coras-brand-menu-border);\n --coras-color-menu-hover: color-mix(in srgb, var(--coras-color-menu), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-text: var(--coras-brand-text);\n --coras-color-text-primary: var(--coras-brand-text);\n --coras-color-text-muted: var(--coras-brand-text-muted);\n --coras-color-text-disabled: var(--coras-brand-disabled);\n --coras-state-overlay: light-dark(#000, #fff);\n --coras-state-hover: 10%;\n --coras-state-active: 18%;\n --coras-color-main-button: var(--coras-brand-main-button);\n --coras-color-main-button-hover: var(--coras-brand-main-button-hover);\n --coras-color-main-button-pressed: var(--coras-brand-main-button-pressed);\n --coras-color-main-button-text: var(--coras-brand-main-button-text);\n --coras-color-main-button-border: var(--coras-brand-main-button-border);\n --coras-color-secondary-button: var(--coras-brand-secondary-button);\n --coras-color-secondary-button-border: var(--coras-brand-secondary-button-border);\n --coras-color-secondary-button-hover: var(--coras-brand-secondary-button-hover);\n --coras-color-secondary-button-pressed: var(--coras-brand-secondary-button-pressed);\n --coras-color-secondary-button-text: var(--coras-brand-secondary-button-text);\n --coras-color-text-button: var(--coras-brand-text-button);\n --coras-color-link: var(--coras-brand-link);\n --coras-color-icon: var(--coras-brand-body-icon);\n --coras-color-card-border: var(--coras-brand-card-border);\n --coras-color-divider: var(--coras-brand-divider);\n --coras-color-field-border: var(--coras-brand-field-border);\n --coras-color-footer-border: var(--coras-brand-footer-border);\n --coras-color-focus-ring: var(--coras-brand-focus-ring);\n --coras-color-scrim: var(--coras-brand-scrim);\n --coras-font-family-sans: var(--coras-brand-font);\n --coras-font-family-heading: var(--coras-brand-heading-font);\n --coras-font-size-xxs: 0.625rem;\n --coras-font-size-xs: 0.75rem;\n --coras-font-size-sm: 0.875rem;\n --coras-font-size-base: 1rem;\n --coras-font-size-lg: 1.125rem;\n --coras-font-size-xl: 1.25rem;\n --coras-font-size-2xl: 1.5rem;\n --coras-font-size-3xl: 2.25rem;\n --coras-font-size-4xl: 3rem;\n --coras-font-size-5xl: 3.5rem;\n --coras-font-size-title: calc(var(--coras-font-size-3xl) * var(--coras-brand-heading-scale));\n --coras-font-size-heading: calc(var(--coras-font-size-2xl) * var(--coras-brand-heading-scale));\n --coras-font-weight-light: 300;\n --coras-font-weight-normal: 400;\n --coras-font-weight-medium: 500;\n --coras-font-weight-semibold: 600;\n --coras-font-weight-bold: 700;\n --coras-radius-none: 0;\n --coras-radius-xs: calc(var(--coras-brand-radius) / 6);\n --coras-radius-sm: calc(var(--coras-brand-radius) / 3);\n --coras-radius-md: calc(var(--coras-brand-radius) * 2 / 3);\n --coras-radius-lg: var(--coras-brand-radius);\n --coras-radius-xl: calc(var(--coras-brand-radius) * 7 / 6);\n --coras-radius-2xl: calc(var(--coras-brand-radius) * 4 / 3);\n --coras-radius-full: 9999px;\n --coras-radius-control: 0.25rem;\n --coras-radius-field: var(--coras-brand-field-radius);\n --coras-radius-button: var(--coras-brand-button-radius);\n --coras-radius-chip: var(--coras-brand-chip-radius);\n --coras-radius-search: var(--coras-brand-search-radius);\n --coras-shadow-sm: var(--coras-brand-soft-shadow);\n --coras-shadow-md: var(--coras-brand-button-shadow);\n --coras-shadow-lg: var(--coras-brand-card-shadow);\n --coras-shadow-top: 1px -4px 8px 4px rgba(0, 0, 0, 0.03);\n --coras-shadow-strong: 0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px rgba(0, 0, 0, 0.3);\n --coras-page-max-width: 950px;\n --coras-container-max-width: 1368px;\n --coras-footer-max-width: 1073px;\n --coras-z-index-overlay: 1000;\n --coras-navbar-padding: 1rem;\n --coras-content-padding: 0 1rem;\n --coras-footer-padding: 4rem 2rem;\n }\n}\n\n@layer coras.components {\n :where([data-coras-root], .coras-theme) {\n --coras-base-text-color: var(--coras-color-text);\n --coras-navbar-background: var(--coras-brand-navbar-background);\n --coras-navbar-text-color: var(--coras-brand-navbar-text);\n --coras-navbar-border-bottom: 1px solid var(--coras-brand-navbar-border);\n --coras-navbar-shadow: var(--coras-brand-navbar-shadow);\n --coras-navbar-icon-color: var(--coras-brand-navbar-icon);\n --coras-navbar-logo-height: var(--coras-brand-logo-height);\n --coras-footer-background-color: var(--coras-brand-footer-background);\n --coras-footer-text-color: var(--coras-brand-footer-text);\n --coras-footer-link-color: var(--coras-brand-footer-link);\n --coras-footer-border-top: 1px solid var(--coras-color-footer-border);\n --coras-footer-padding-bottom: var(--coras-brand-footer-padding-bottom);\n --coras-button-primary-background: var(--coras-color-main-button);\n --coras-button-primary-text-color: var(--coras-color-main-button-text);\n --coras-button-primary-background-hover: var(--coras-color-main-button-hover);\n --coras-button-primary-background-active: var(--coras-color-main-button-pressed);\n --coras-button-primary-border-color: var(--coras-color-main-button-border);\n --coras-button-secondary-border-color: var(--coras-color-secondary-button-border);\n --coras-input-field-background-color: var(--coras-color-field);\n --coras-basket-accent-color: var(--coras-brand-secondary);\n }\n}\n\n@layer coras.components {\n :where([data-coras-root]) {\n container: coras-page / inline-size;\n max-width: 100%;\n background-color: var(--coras-page-background, transparent);\n color: var(--coras-base-text-color);\n }\n :where([data-coras-root]) > *:where(:not(style)) {\n display: block;\n fill: var(--coras-color-icon);\n }\n}\n";
4
+ export const CORAS_TOKENS_CSS = "/* GENERATED by scripts/generate-tokens.mjs - do not edit by hand. */\n/* CSS-first four-tier token system (plan F-004, P-051..P-055). */\n\n@layer coras.palette, coras.brand, coras.semantic, coras.components;\n\n@property --coras-brand-primary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-page-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-focus-ring {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-card-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #fcfcff;\n}\n@property --coras-brand-field-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-menu-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-primary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-secondary-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #161c44;\n}\n@property --coras-brand-text-button {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #4657d4;\n}\n@property --coras-brand-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-button-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-chip-radius {\n syntax: \"<length>\";\n inherits: true;\n initial-value: 24px;\n}\n@property --coras-brand-navbar-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-navbar-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-icon {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-navbar-border {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ffffff;\n}\n@property --coras-brand-footer-background {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #e6e6e6;\n}\n@property --coras-brand-footer-text {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-footer-link {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #000000;\n}\n@property --coras-brand-error {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #c9224a;\n}\n@property --coras-brand-success {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #00ad8f;\n}\n@property --coras-brand-warning {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #ed8f1c;\n}\n@property --coras-brand-info {\n syntax: \"<color>\";\n inherits: true;\n initial-value: #670c93;\n}\n\n@layer coras.palette {\n :where([data-coras-root], .coras-theme) {\n --coras-palette-primary-50: #fcfcff;\n --coras-palette-primary-100: #fbfbff;\n --coras-palette-primary-200: #eef0ff;\n --coras-palette-primary-300: #dde1ff;\n --coras-palette-primary-400: #5468ff;\n --coras-palette-primary-500: #4657d4;\n --coras-palette-primary-700: #323e99;\n --coras-palette-secondary-50: #e8e8ec;\n --coras-palette-secondary-100: #d0d2da;\n --coras-palette-secondary-200: #b9bbc7;\n --coras-palette-secondary-300: #a2a4b4;\n --coras-palette-secondary-400: #1c2355;\n --coras-palette-secondary-500: #161c44;\n --coras-palette-secondary-700: #121636;\n --coras-palette-neutral-50: #f5f5f5;\n --coras-palette-neutral-100: #eeeeee;\n --coras-palette-neutral-200: #e6e6e6;\n --coras-palette-neutral-300: #dddddd;\n --coras-palette-neutral-400: #cccccc;\n --coras-palette-neutral-500: #aaaaaa;\n --coras-palette-neutral-600: #888888;\n --coras-palette-neutral-700: #666666;\n --coras-palette-neutral-800: #444444;\n --coras-palette-neutral-900: #292929;\n --coras-palette-error-50: #fae9ed;\n --coras-palette-error-500: #c9224a;\n --coras-palette-error-700: #a11b3b;\n --coras-palette-error-900: #79142c;\n --coras-palette-info-50: #f0e7f4;\n --coras-palette-info-500: #670c93;\n --coras-palette-info-700: #520a76;\n --coras-palette-info-900: #3e0758;\n --coras-palette-success-50: #e6f7f4;\n --coras-palette-success-500: #00ad8f;\n --coras-palette-success-700: #008a72;\n --coras-palette-success-900: #006856;\n --coras-palette-warning-50: #fdf4e8;\n --coras-palette-warning-500: #ed8f1c;\n --coras-palette-warning-700: #be7216;\n --coras-palette-warning-900: #8e5611;\n --coras-palette-pink-500: #ff2d55;\n --coras-palette-black: #000000;\n --coras-palette-white: #ffffff;\n }\n}\n\n@layer coras.brand {\n :where([data-coras-root], .coras-theme) {\n color-scheme: light;\n --coras-brand-primary: var(--coras-palette-primary-500);\n --coras-brand-secondary: var(--coras-palette-secondary-500);\n --coras-brand-page-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-text: light-dark(var(--coras-palette-secondary-500), #ffffff);\n --coras-brand-text-muted: light-dark(var(--coras-palette-neutral-600), #cccccc);\n --coras-brand-link: var(--coras-brand-text-button);\n --coras-brand-icon: var(--coras-brand-text);\n --coras-brand-focus-ring: var(--coras-brand-primary);\n --coras-brand-scrim: var(--coras-palette-black);\n --coras-brand-card-background: light-dark(var(--coras-palette-primary-50), #191c22);\n --coras-brand-card-border: light-dark(var(--coras-palette-neutral-200), #444444);\n --coras-brand-field-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-field-border: light-dark(var(--coras-palette-neutral-400), #aaaaaa);\n --coras-brand-menu-background: light-dark(var(--coras-brand-page-background), #101216);\n --coras-brand-menu-border: var(--coras-brand-card-border);\n --coras-brand-divider: light-dark(var(--coras-palette-neutral-200), #292929);\n --coras-brand-card-shadow: 0px 24px 24px rgba(0, 0, 0, 0.04);\n --coras-brand-soft-shadow: 0px 4px 4px rgba(0, 0, 0, 0.04);\n --coras-brand-primary-button: var(--coras-brand-primary);\n --coras-brand-primary-button-text: #ffffff;\n --coras-brand-primary-button-hover: light-dark(#3f4ebf, #5968d8);\n --coras-brand-primary-button-pressed: light-dark(#3947ae, #6775dc);\n --coras-brand-secondary-button: var(--coras-brand-secondary);\n --coras-brand-secondary-button-text: #ffffff;\n --coras-brand-secondary-button-hover: light-dark(#14193d, #2d3357);\n --coras-brand-secondary-button-pressed: light-dark(#121738, #404566);\n --coras-brand-text-button: light-dark(var(--coras-brand-primary), #6279f9);\n --coras-brand-primary-button-border: transparent;\n --coras-brand-secondary-button-border: transparent;\n --coras-brand-disabled: light-dark(var(--coras-palette-neutral-500), #cccccc);\n --coras-brand-button-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n --coras-brand-button-hover-on-light-fill: 20%;\n --coras-brand-button-hover-on-dark-fill: 20%;\n --coras-brand-radius: 1.5rem;\n --coras-brand-button-radius: var(--coras-brand-radius);\n --coras-brand-chip-radius: var(--coras-brand-radius);\n --coras-brand-field-radius: 0.5rem;\n --coras-brand-search-radius: 100px;\n --coras-brand-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --coras-brand-heading-font: var(--coras-brand-font);\n --coras-brand-heading-scale: 1;\n --coras-brand-logo-height: 2rem;\n --coras-brand-navbar-background: light-dark(var(--coras-palette-white), #101216);\n --coras-brand-navbar-background-image: none;\n --coras-brand-navbar-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-navbar-icon: var(--coras-brand-navbar-text);\n --coras-brand-navbar-border: var(--coras-brand-navbar-background);\n --coras-brand-navbar-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.04);\n --coras-brand-footer-background: light-dark(var(--coras-palette-neutral-200), #191c22);\n --coras-brand-footer-background-image: none;\n --coras-brand-footer-text: light-dark(var(--coras-palette-black), #ffffff);\n --coras-brand-footer-link: var(--coras-brand-footer-text);\n --coras-brand-footer-border: var(--coras-brand-footer-background);\n --coras-brand-footer-padding-bottom: 2rem;\n --coras-brand-error: light-dark(var(--coras-palette-error-500), #f5748a);\n --coras-brand-error-background: light-dark(var(--coras-palette-error-50), #442e36);\n --coras-brand-success: light-dark(var(--coras-palette-success-500), #34d8b4);\n --coras-brand-success-background: light-dark(var(--coras-palette-success-50), #26403f);\n --coras-brand-warning: light-dark(var(--coras-palette-warning-500), #f4a93c);\n --coras-brand-warning-background: light-dark(var(--coras-palette-warning-50), #43382e);\n --coras-brand-info: light-dark(var(--coras-palette-info-500), #ba86e1);\n --coras-brand-info-background: light-dark(var(--coras-palette-info-50), #373045);\n --coras-brand-primary-tint: light-dark(var(--coras-palette-primary-50), #141823);\n --coras-brand-secondary-tint: light-dark(var(--coras-palette-secondary-50), #10131a);\n --coras-brand-neutral-50: var(--coras-palette-neutral-50);\n --coras-brand-neutral-100: var(--coras-palette-neutral-100);\n --coras-brand-neutral-200: var(--coras-palette-neutral-200);\n --coras-brand-neutral-300: var(--coras-palette-neutral-300);\n --coras-brand-neutral-400: var(--coras-palette-neutral-400);\n --coras-brand-neutral-500: var(--coras-palette-neutral-500);\n --coras-brand-neutral-600: var(--coras-palette-neutral-600);\n --coras-brand-neutral-700: var(--coras-palette-neutral-700);\n --coras-brand-neutral-800: var(--coras-palette-neutral-800);\n --coras-brand-neutral-900: var(--coras-palette-neutral-900);\n }\n}\n\n@layer coras.semantic {\n :where([data-coras-root], .coras-theme) {\n --coras-color-primary: var(--coras-brand-primary);\n --coras-color-primary-tint: var(--coras-brand-primary-tint);\n --coras-color-secondary: var(--coras-brand-secondary);\n --coras-color-secondary-tint: var(--coras-brand-secondary-tint);\n --coras-color-error: var(--coras-brand-error);\n --coras-color-error-background: var(--coras-brand-error-background);\n --coras-color-success: var(--coras-brand-success);\n --coras-color-success-background: var(--coras-brand-success-background);\n --coras-color-warning: var(--coras-brand-warning);\n --coras-color-warning-background: var(--coras-brand-warning-background);\n --coras-color-info: var(--coras-brand-info);\n --coras-color-info-background: var(--coras-brand-info-background);\n --coras-color-neutral-50: light-dark(var(--coras-brand-neutral-50), var(--coras-brand-neutral-900));\n --coras-color-neutral-100: light-dark(var(--coras-brand-neutral-100), var(--coras-brand-neutral-800));\n --coras-color-neutral-200: light-dark(var(--coras-brand-neutral-200), var(--coras-brand-neutral-700));\n --coras-color-neutral-300: light-dark(var(--coras-brand-neutral-300), var(--coras-brand-neutral-600));\n --coras-color-neutral-400: light-dark(var(--coras-brand-neutral-400), var(--coras-brand-neutral-500));\n --coras-color-neutral-500: light-dark(var(--coras-brand-neutral-500), var(--coras-brand-neutral-400));\n --coras-color-neutral-600: light-dark(var(--coras-brand-neutral-600), var(--coras-brand-neutral-300));\n --coras-color-neutral-700: light-dark(var(--coras-brand-neutral-700), var(--coras-brand-neutral-200));\n --coras-color-neutral-800: light-dark(var(--coras-brand-neutral-800), var(--coras-brand-neutral-100));\n --coras-color-neutral-900: light-dark(var(--coras-brand-neutral-900), var(--coras-brand-neutral-50));\n --coras-color-background: var(--coras-brand-page-background);\n --coras-color-card: var(--coras-brand-card-background);\n --coras-color-card-sunken: light-dark(var(--coras-brand-neutral-50), #0b0d10);\n --coras-color-card-hover: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-card-active: color-mix(in srgb, var(--coras-color-card), var(--coras-state-overlay) var(--coras-state-active));\n --coras-color-card-muted: light-dark(color-mix(in srgb, var(--coras-brand-neutral-200) 35%, var(--coras-palette-white)), color-mix(in srgb, var(--coras-palette-white) 5%, transparent));\n --coras-color-field: var(--coras-brand-field-background);\n --coras-color-field-hover: color-mix(in srgb, var(--coras-color-field), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-menu: var(--coras-brand-menu-background);\n --coras-color-menu-border: var(--coras-brand-menu-border);\n --coras-color-menu-hover: color-mix(in srgb, var(--coras-color-menu), var(--coras-state-overlay) var(--coras-state-hover));\n --coras-color-text: var(--coras-brand-text);\n --coras-color-text-primary: var(--coras-brand-text);\n --coras-color-text-muted: var(--coras-brand-text-muted);\n --coras-color-text-disabled: var(--coras-brand-disabled);\n --coras-state-overlay: light-dark(#000, #fff);\n --coras-state-hover: 10%;\n --coras-state-active: 18%;\n --coras-color-primary-button: var(--coras-brand-primary-button);\n --coras-color-primary-button-hover: var(--coras-brand-primary-button-hover);\n --coras-color-primary-button-pressed: var(--coras-brand-primary-button-pressed);\n --coras-color-primary-button-text: var(--coras-brand-primary-button-text);\n --coras-color-primary-button-border: var(--coras-brand-primary-button-border);\n --coras-color-secondary-button: var(--coras-brand-secondary-button);\n --coras-color-secondary-button-border: var(--coras-brand-secondary-button-border);\n --coras-color-secondary-button-hover: var(--coras-brand-secondary-button-hover);\n --coras-color-secondary-button-pressed: var(--coras-brand-secondary-button-pressed);\n --coras-color-secondary-button-text: var(--coras-brand-secondary-button-text);\n --coras-color-text-button: var(--coras-brand-text-button);\n --coras-color-link: var(--coras-brand-link);\n --coras-color-icon: var(--coras-brand-icon);\n --coras-color-card-border: var(--coras-brand-card-border);\n --coras-color-divider: var(--coras-brand-divider);\n --coras-color-field-border: var(--coras-brand-field-border);\n --coras-color-footer-border: var(--coras-brand-footer-border);\n --coras-color-focus-ring: var(--coras-brand-focus-ring);\n --coras-color-scrim: var(--coras-brand-scrim);\n --coras-font-family-sans: var(--coras-brand-font);\n --coras-font-family-heading: var(--coras-brand-heading-font);\n --coras-font-size-xxs: 0.625rem;\n --coras-font-size-xs: 0.75rem;\n --coras-font-size-sm: 0.875rem;\n --coras-font-size-base: 1rem;\n --coras-font-size-lg: 1.125rem;\n --coras-font-size-xl: 1.25rem;\n --coras-font-size-2xl: 1.5rem;\n --coras-font-size-3xl: 2.25rem;\n --coras-font-size-4xl: 3rem;\n --coras-font-size-5xl: 3.5rem;\n --coras-font-size-title: calc(var(--coras-font-size-3xl) * var(--coras-brand-heading-scale));\n --coras-font-size-heading: calc(var(--coras-font-size-2xl) * var(--coras-brand-heading-scale));\n --coras-font-weight-light: 300;\n --coras-font-weight-normal: 400;\n --coras-font-weight-medium: 500;\n --coras-font-weight-semibold: 600;\n --coras-font-weight-bold: 700;\n --coras-radius-none: 0;\n --coras-radius-xs: calc(var(--coras-brand-radius) / 6);\n --coras-radius-sm: calc(var(--coras-brand-radius) / 3);\n --coras-radius-md: calc(var(--coras-brand-radius) * 2 / 3);\n --coras-radius-lg: var(--coras-brand-radius);\n --coras-radius-xl: calc(var(--coras-brand-radius) * 7 / 6);\n --coras-radius-2xl: calc(var(--coras-brand-radius) * 4 / 3);\n --coras-radius-full: 9999px;\n --coras-radius-control: 0.25rem;\n --coras-radius-field: var(--coras-brand-field-radius);\n --coras-radius-button: var(--coras-brand-button-radius);\n --coras-radius-chip: var(--coras-brand-chip-radius);\n --coras-radius-search: var(--coras-brand-search-radius);\n --coras-shadow-sm: var(--coras-brand-soft-shadow);\n --coras-shadow-md: var(--coras-brand-button-shadow);\n --coras-shadow-lg: var(--coras-brand-card-shadow);\n --coras-shadow-top: 1px -4px 8px 4px rgba(0, 0, 0, 0.03);\n --coras-shadow-strong: 0px 6px 10px 4px rgba(0, 0, 0, 0.15), 0px 2px 3px rgba(0, 0, 0, 0.3);\n --coras-page-max-width: 950px;\n --coras-container-max-width: 1368px;\n --coras-footer-max-width: 1073px;\n --coras-z-index-overlay: 1000;\n --coras-navbar-padding: 1rem;\n --coras-content-padding: 0 1rem;\n --coras-footer-padding: 4rem 2rem;\n }\n}\n\n@layer coras.components {\n :where([data-coras-root], .coras-theme) {\n --coras-base-text-color: var(--coras-color-text);\n --coras-navbar-background: var(--coras-brand-navbar-background);\n --coras-navbar-background-image: var(--coras-brand-navbar-background-image);\n --coras-navbar-background-image-dark: var(--coras-brand-navbar-background-image-dark, var(--coras-brand-navbar-background-image));\n --coras-navbar-text-color: var(--coras-brand-navbar-text);\n --coras-navbar-border-bottom: 1px solid var(--coras-brand-navbar-border);\n --coras-navbar-shadow: var(--coras-brand-navbar-shadow);\n --coras-navbar-icon-color: var(--coras-brand-navbar-icon);\n --coras-navbar-logo-height: var(--coras-brand-logo-height);\n --coras-footer-background-color: var(--coras-brand-footer-background);\n --coras-footer-background-image: var(--coras-brand-footer-background-image);\n --coras-footer-background-image-dark: var(--coras-brand-footer-background-image-dark, var(--coras-brand-footer-background-image));\n --coras-footer-text-color: var(--coras-brand-footer-text);\n --coras-footer-link-color: var(--coras-brand-footer-link);\n --coras-footer-border-top: 1px solid var(--coras-color-footer-border);\n --coras-footer-padding-bottom: var(--coras-brand-footer-padding-bottom);\n --coras-button-primary-background: var(--coras-color-primary-button);\n --coras-button-primary-text-color: var(--coras-color-primary-button-text);\n --coras-button-primary-background-hover: var(--coras-color-primary-button-hover);\n --coras-button-primary-background-active: var(--coras-color-primary-button-pressed);\n --coras-button-primary-border-color: var(--coras-color-primary-button-border);\n --coras-button-secondary-border-color: var(--coras-color-secondary-button-border);\n --coras-input-field-background-color: var(--coras-color-field);\n --coras-basket-accent-color: var(--coras-brand-secondary);\n }\n}\n\n@layer coras.components {\n :where([data-coras-root]) {\n container: coras-page / inline-size;\n max-width: 100%;\n background-color: var(--coras-page-background, transparent);\n color: var(--coras-base-text-color);\n }\n :where([data-coras-root]) > *:where(:not(style)) {\n display: block;\n fill: var(--coras-color-icon);\n }\n}\n";
@@ -1,4 +1,4 @@
1
- export type TokenControlType = "color" | "length" | "font" | "shadow" | "scale";
1
+ export type TokenControlType = "color" | "length" | "font" | "shadow" | "scale" | "gradient";
2
2
  export type TokenControl = {
3
3
  /** Matches the corresponding `CorasTheme` key. */
4
4
  key: string;
@@ -55,8 +55,8 @@ export const TOKEN_CONTROLS = [
55
55
  "description": "This follows the Text Button Colour, which itself defaults to the Primary Brand Colour. Adjust here if desired."
56
56
  },
57
57
  {
58
- "key": "bodyIcon",
59
- "cssVar": "--coras-brand-body-icon",
58
+ "key": "icon",
59
+ "cssVar": "--coras-brand-icon",
60
60
  "type": "color",
61
61
  "group": "Key colours",
62
62
  "label": "Icon Colour (In Page)",
@@ -145,8 +145,8 @@ export const TOKEN_CONTROLS = [
145
145
  "description": "The subtle shadow on smaller raised elements"
146
146
  },
147
147
  {
148
- "key": "mainButton",
149
- "cssVar": "--coras-brand-main-button",
148
+ "key": "primaryButton",
149
+ "cssVar": "--coras-brand-primary-button",
150
150
  "type": "color",
151
151
  "group": "Buttons",
152
152
  "label": "Primary Button Fill Colour",
@@ -154,8 +154,8 @@ export const TOKEN_CONTROLS = [
154
154
  "description": "This defaults to the Primary Brand Colour but can be adjusted here if required"
155
155
  },
156
156
  {
157
- "key": "mainButtonText",
158
- "cssVar": "--coras-brand-main-button-text",
157
+ "key": "primaryButtonText",
158
+ "cssVar": "--coras-brand-primary-button-text",
159
159
  "type": "color",
160
160
  "group": "Buttons",
161
161
  "label": "Primary Button Text Colour",
@@ -190,8 +190,8 @@ export const TOKEN_CONTROLS = [
190
190
  "description": "This defaults to the Primary Brand Colour. It can be adjusted here if required."
191
191
  },
192
192
  {
193
- "key": "mainButtonBorder",
194
- "cssVar": "--coras-brand-main-button-border",
193
+ "key": "primaryButtonBorder",
194
+ "cssVar": "--coras-brand-primary-button-border",
195
195
  "type": "color",
196
196
  "group": "Buttons",
197
197
  "label": "Primary Button Border",
@@ -226,8 +226,8 @@ export const TOKEN_CONTROLS = [
226
226
  "description": "Default values applied. Set values to 0 if not required"
227
227
  },
228
228
  {
229
- "key": "buttonHoverLight",
230
- "cssVar": "--coras-brand-button-hover-light",
229
+ "key": "buttonHoverOnLightFill",
230
+ "cssVar": "--coras-brand-button-hover-on-light-fill",
231
231
  "type": "length",
232
232
  "group": "Buttons",
233
233
  "label": "On Hover - Light / Bright Fill Button",
@@ -235,8 +235,8 @@ export const TOKEN_CONTROLS = [
235
235
  "description": "Strength of the black overlay applied on hover when the button fill is light. Default values applied. Adjust if desired."
236
236
  },
237
237
  {
238
- "key": "buttonHoverDark",
239
- "cssVar": "--coras-brand-button-hover-dark",
238
+ "key": "buttonHoverOnDarkFill",
239
+ "cssVar": "--coras-brand-button-hover-on-dark-fill",
240
240
  "type": "length",
241
241
  "group": "Buttons",
242
242
  "label": "On Hover - Dark Fill Button",
@@ -333,6 +333,15 @@ export const TOKEN_CONTROLS = [
333
333
  "default": "#ffffff",
334
334
  "description": "Navbar background (independent of the page background)"
335
335
  },
336
+ {
337
+ "key": "navbarBackgroundImage",
338
+ "cssVar": "--coras-brand-navbar-background-image",
339
+ "type": "gradient",
340
+ "group": "Navigation bar",
341
+ "label": "Background Gradient",
342
+ "default": "none",
343
+ "description": "Optional gradient painted over the Background Colour on the web. The mobile menu, the border and emails keep the solid colour"
344
+ },
336
345
  {
337
346
  "key": "navbarText",
338
347
  "cssVar": "--coras-brand-navbar-text",
@@ -378,6 +387,15 @@ export const TOKEN_CONTROLS = [
378
387
  "default": "#e6e6e6",
379
388
  "description": "Footer background, on the web and in emails"
380
389
  },
390
+ {
391
+ "key": "footerBackgroundImage",
392
+ "cssVar": "--coras-brand-footer-background-image",
393
+ "type": "gradient",
394
+ "group": "Footer",
395
+ "label": "Background Gradient",
396
+ "default": "none",
397
+ "description": "Optional gradient painted over the Background Colour on the web. The border and emails keep the solid colour"
398
+ },
381
399
  {
382
400
  "key": "footerText",
383
401
  "cssVar": "--coras-brand-footer-text",
@@ -145,8 +145,12 @@ let CorasDetailsPage = class CorasDetailsPage extends ErrorModalMixin(PointsMixi
145
145
  size: 0,
146
146
  },
147
147
  }));
148
+ // A failed or empty response has no attraction to render. Returning an
149
+ // empty object here would complete the task, so every render branch below
150
+ // would dereference `attraction` on it and throw. Fail the task instead so
151
+ // the error modal is shown.
148
152
  if (!result.data) {
149
- return {};
153
+ throw new Error("Attraction data not available");
150
154
  }
151
155
  this.verifyDate(result.data.first_instance_date, result.data.last_instance_date, result.data.attraction.timezone);
152
156
  this.isSingleDayAvailability = isSingleDayAvailability(result.data.attraction.sale_periods ?? null);
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  "engines": {
21
21
  "node": ">=22"
22
22
  },
23
- "version": "0.3.0",
23
+ "version": "0.5.0",
24
24
  "private": false,
25
25
  "homepage": "https://embed.coras.io",
26
26
  "bugs": {
@@ -104,7 +104,7 @@
104
104
  "typescript-eslint": "8.67.0",
105
105
  "vite": "8.2.2",
106
106
  "vitest": "4.1.11",
107
- "@coras-io/static": "0.0.3"
107
+ "@coras-io/static": "0.0.4"
108
108
  },
109
109
  "dependencies": {
110
110
  "@coinbase/cdp-core": "0.0.122",
@@ -122,7 +122,7 @@
122
122
  "lit": "^3.3.3",
123
123
  "openapi-fetch": "0.17.0",
124
124
  "viem": "2.55.19",
125
- "@coras-io/brand-tokens": "^0.3.0"
125
+ "@coras-io/brand-tokens": "^0.4.0"
126
126
  },
127
127
  "scripts": {
128
128
  "lint": "eslint \"src/**/*.ts*\"",
@@ -143,7 +143,7 @@
143
143
  "check:styles": "node scripts/check-styles.mjs",
144
144
  "measure:bundle": "node scripts/measure-bundle.mjs",
145
145
  "localize:extract": "lit-localize extract",
146
- "localize:build": "lit-localize build",
146
+ "localize:build": "lit-localize build && node scripts/decode-locale-entities.mjs",
147
147
  "storybook": "storybook dev --no-open -p 8082",
148
148
  "storybook:build": "storybook build --output-dir dist-storybook",
149
149
  "storybook:test": "vitest run --config vitest.storybook.config.ts",