@rafael_dias/akoma 0.4.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { cIcons } from '../../node_modules/@sysvale/cuida-icons/dist/index.js';
1
2
  import { ComponentOptionsMixin } from 'vue';
2
3
  import { ComponentProvideOptions } from 'vue';
3
4
  import { DefineComponent } from 'vue';
@@ -13,6 +14,20 @@ type: "button" | "submit" | "reset";
13
14
  block: boolean;
14
15
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLButtonElement>;
15
16
 
17
+ declare const __VLS_component_10: DefineComponent<__VLS_Props_17, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
18
+ "update:modelValue": (value: string) => any;
19
+ }, string, PublicProps, Readonly<__VLS_Props_17> & Readonly<{
20
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
21
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
22
+ trackRef: HTMLDivElement;
23
+ }, HTMLElement>;
24
+
25
+ declare const __VLS_component_11: DefineComponent<__VLS_Props_18, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_18> & Readonly<{}>, {
26
+ disabled: boolean;
27
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {
28
+ itemRef: HTMLButtonElement;
29
+ }, HTMLButtonElement>;
30
+
16
31
  declare const __VLS_component_2: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {
17
32
  variant: BadgeVariant;
18
33
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
@@ -33,18 +48,18 @@ padding: "none" | "sm" | "md" | "lg";
33
48
 
34
49
  declare const __VLS_component_5: DefineComponent<__VLS_Props_7, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_7> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
35
50
 
36
- declare const __VLS_component_6: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLElement>;
51
+ declare const __VLS_component_6: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLElement>;
37
52
 
38
53
  declare const __VLS_component_7: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, HTMLUListElement>;
39
54
 
40
- declare const __VLS_component_8: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {
55
+ declare const __VLS_component_8: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {
41
56
  disabled: boolean;
42
57
  interactive: boolean;
43
58
  padding: ListRowPadding;
44
59
  divider: boolean;
45
60
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
46
61
 
47
- declare const __VLS_component_9: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {
62
+ declare const __VLS_component_9: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {
48
63
  variant: IconButtonVariant;
49
64
  size: IconButtonSize;
50
65
  disabled: boolean;
@@ -62,6 +77,13 @@ declare type __VLS_Props = {
62
77
  };
63
78
 
64
79
  declare type __VLS_Props_10 = {
80
+ name: CuidaIconName;
81
+ size?: number | string;
82
+ /** Accessible label — omit when decorative inside labelled controls */
83
+ label?: string;
84
+ };
85
+
86
+ declare type __VLS_Props_11 = {
65
87
  /** Horizontal spacing around the line */
66
88
  spacing?: DividerSpacing;
67
89
  /** Optional centered label */
@@ -69,7 +91,7 @@ declare type __VLS_Props_10 = {
69
91
  vertical?: boolean;
70
92
  };
71
93
 
72
- declare type __VLS_Props_11 = {
94
+ declare type __VLS_Props_12 = {
73
95
  /** Current value */
74
96
  value?: number;
75
97
  max?: number;
@@ -80,33 +102,46 @@ declare type __VLS_Props_11 = {
80
102
  showValue?: boolean;
81
103
  };
82
104
 
83
- declare type __VLS_Props_12 = {
105
+ declare type __VLS_Props_13 = {
84
106
  title?: string;
85
107
  };
86
108
 
87
- declare type __VLS_Props_13 = {
109
+ declare type __VLS_Props_14 = {
88
110
  interactive?: boolean;
89
111
  disabled?: boolean;
90
112
  padding?: ListRowPadding;
91
113
  divider?: boolean;
92
114
  };
93
115
 
94
- declare type __VLS_Props_14 = {
116
+ declare type __VLS_Props_15 = {
95
117
  variant?: IconButtonVariant;
96
118
  size?: IconButtonSize;
97
119
  disabled?: boolean;
98
120
  loading?: boolean;
99
121
  type?: 'button' | 'submit' | 'reset';
100
122
  label: string;
123
+ /** Cuida Icons name — preferred over the default slot */
124
+ icon?: CuidaIconName;
101
125
  };
102
126
 
103
- declare type __VLS_Props_15 = {
127
+ declare type __VLS_Props_16 = {
104
128
  modelValue?: boolean;
105
129
  label?: string;
106
130
  description?: string;
107
131
  disabled?: boolean;
108
132
  };
109
133
 
134
+ declare type __VLS_Props_17 = {
135
+ modelValue: string;
136
+ };
137
+
138
+ declare type __VLS_Props_18 = {
139
+ value: string;
140
+ label: string;
141
+ icon?: CuidaIconName;
142
+ disabled?: boolean;
143
+ };
144
+
110
145
  declare type __VLS_Props_2 = {
111
146
  variant?: BadgeVariant;
112
147
  label?: string;
@@ -179,6 +214,30 @@ declare function __VLS_template(): {
179
214
  rootEl: HTMLButtonElement;
180
215
  };
181
216
 
217
+ declare function __VLS_template_10(): {
218
+ attrs: Partial<{}>;
219
+ slots: {
220
+ default?(_: {}): any;
221
+ };
222
+ refs: {
223
+ trackRef: HTMLDivElement;
224
+ };
225
+ rootEl: HTMLElement;
226
+ };
227
+
228
+ declare function __VLS_template_11(): {
229
+ attrs: Partial<{}>;
230
+ slots: Readonly<{
231
+ icon?: () => unknown;
232
+ }> & {
233
+ icon?: () => unknown;
234
+ };
235
+ refs: {
236
+ itemRef: HTMLButtonElement;
237
+ };
238
+ rootEl: HTMLButtonElement;
239
+ };
240
+
182
241
  declare function __VLS_template_2(): {
183
242
  attrs: Partial<{}>;
184
243
  slots: Readonly<{
@@ -283,6 +342,10 @@ declare function __VLS_template_9(): {
283
342
 
284
343
  declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
285
344
 
345
+ declare type __VLS_TemplateResult_10 = ReturnType<typeof __VLS_template_10>;
346
+
347
+ declare type __VLS_TemplateResult_11 = ReturnType<typeof __VLS_template_11>;
348
+
286
349
  declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
287
350
 
288
351
  declare type __VLS_TemplateResult_3 = ReturnType<typeof __VLS_template_3>;
@@ -305,6 +368,18 @@ declare type __VLS_WithTemplateSlots<T, S> = T & {
305
368
  };
306
369
  };
307
370
 
371
+ declare type __VLS_WithTemplateSlots_10<T, S> = T & {
372
+ new (): {
373
+ $slots: S;
374
+ };
375
+ };
376
+
377
+ declare type __VLS_WithTemplateSlots_11<T, S> = T & {
378
+ new (): {
379
+ $slots: S;
380
+ };
381
+ };
382
+
308
383
  declare type __VLS_WithTemplateSlots_2<T, S> = T & {
309
384
  new (): {
310
385
  $slots: S;
@@ -353,6 +428,75 @@ declare type __VLS_WithTemplateSlots_9<T, S> = T & {
353
428
  };
354
429
  };
355
430
 
431
+ export declare type AccentPalette = keyof typeof accentPalettes;
432
+
433
+ export declare const accentPaletteIds: AccentPalette[];
434
+
435
+ /**
436
+ * Named accent palettes for Akoma.
437
+ * Set on `<html data-accent="teal">` or override CSS variables in your app.
438
+ *
439
+ * Each palette has three chromatic shades: light · base · dark.
440
+ */
441
+ export declare const accentPalettes: {
442
+ readonly violet: {
443
+ readonly label: "Violet";
444
+ readonly description: "Mineral violet — default for App mood.";
445
+ readonly sample: "#6658b8";
446
+ readonly light: "#8578c9";
447
+ readonly dark: "#4f4299";
448
+ };
449
+ readonly evergreen: {
450
+ readonly label: "Evergreen";
451
+ readonly description: "Confident green — default for Site mood.";
452
+ readonly sample: "#2e684f";
453
+ readonly light: "#3f8566";
454
+ readonly dark: "#1f4a37";
455
+ };
456
+ readonly teal: {
457
+ readonly label: "Teal";
458
+ readonly description: "Calm mineral teal for productivity and wellness apps.";
459
+ readonly sample: "#3a7d85";
460
+ readonly light: "#4f96a0";
461
+ readonly dark: "#2a5f66";
462
+ };
463
+ readonly ocean: {
464
+ readonly label: "Ocean";
465
+ readonly description: "Trustworthy blue for data-heavy products.";
466
+ readonly sample: "#3d6a94";
467
+ readonly light: "#5584ad";
468
+ readonly dark: "#2d5174";
469
+ };
470
+ readonly amber: {
471
+ readonly label: "Amber";
472
+ readonly description: "Warm gold for optimistic, human interfaces.";
473
+ readonly sample: "#9a702d";
474
+ readonly light: "#b8893f";
475
+ readonly dark: "#7a5720";
476
+ };
477
+ readonly rose: {
478
+ readonly label: "Rose";
479
+ readonly description: "Dusty rose for lifestyle and creative tools.";
480
+ readonly sample: "#a8586a";
481
+ readonly light: "#c07082";
482
+ readonly dark: "#8a4556";
483
+ };
484
+ readonly coral: {
485
+ readonly label: "Coral";
486
+ readonly description: "Terracotta warmth without feeling playful.";
487
+ readonly sample: "#b5644a";
488
+ readonly light: "#cd7d62";
489
+ readonly dark: "#944f39";
490
+ };
491
+ readonly slate: {
492
+ readonly label: "Slate";
493
+ readonly description: "Blue-gray for neutral B2B surfaces.";
494
+ readonly sample: "#4a5d73";
495
+ readonly light: "#627890";
496
+ readonly dark: "#384858";
497
+ };
498
+ };
499
+
356
500
  export declare const AkAmbientBg: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {
357
501
  contained: boolean;
358
502
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
@@ -365,13 +509,17 @@ export declare const AkCard: __VLS_WithTemplateSlots_4<typeof __VLS_component_4,
365
509
 
366
510
  export declare const AkChip: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
367
511
 
368
- export declare const AkDivider: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {
512
+ export declare const AkDivider: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {
369
513
  spacing: DividerSpacing;
370
514
  vertical: boolean;
371
515
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
372
516
 
373
517
  export declare const AkEmptyState: __VLS_WithTemplateSlots_5<typeof __VLS_component_5, __VLS_TemplateResult_5["slots"]>;
374
518
 
519
+ export declare const AkIcon: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {
520
+ size: number | string;
521
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
522
+
375
523
  export declare const AkIconButton: __VLS_WithTemplateSlots_9<typeof __VLS_component_9, __VLS_TemplateResult_9["slots"]>;
376
524
 
377
525
  export declare const AkInput: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
@@ -397,7 +545,7 @@ export declare type AkomaOptions = {
397
545
  prefix?: string;
398
546
  };
399
547
 
400
- export declare const AkProgress: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {
548
+ export declare const AkProgress: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {
401
549
  size: ProgressSize;
402
550
  value: number;
403
551
  max: number;
@@ -412,15 +560,19 @@ height: string;
412
560
  radius: "sm" | "md" | "lg" | "full" | string;
413
561
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
414
562
 
415
- export declare const AkSwitch: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
563
+ export declare const AkSwitch: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
416
564
  "update:modelValue": (value: boolean) => any;
417
- }, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{
565
+ }, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{
418
566
  "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
419
567
  }>, {
420
568
  disabled: boolean;
421
569
  modelValue: boolean;
422
570
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
423
571
 
572
+ export declare const AkTabBar: __VLS_WithTemplateSlots_10<typeof __VLS_component_10, __VLS_TemplateResult_10["slots"]>;
573
+
574
+ export declare const AkTabBarItem: __VLS_WithTemplateSlots_11<typeof __VLS_component_11, __VLS_TemplateResult_11["slots"]>;
575
+
424
576
  export declare const AkTextarea: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
425
577
  "update:modelValue": (value: string) => any;
426
578
  }, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{
@@ -432,14 +584,25 @@ required: boolean;
432
584
  rows: number;
433
585
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
434
586
 
587
+ /** App mood default when no data-accent is set */
588
+ export declare const appDefaultAccent: AccentPalette;
589
+
590
+ export declare function applyAccentPalette(root: HTMLElement, palette: AccentPalette | 'auto'): void;
591
+
435
592
  export declare type BadgeVariant = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';
436
593
 
437
594
  export declare type ButtonSize = 'sm' | 'md' | 'lg';
438
595
 
439
596
  export declare type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';
440
597
 
598
+ export declare const cuidaIconMap: Map<string, string>;
599
+
600
+ export declare type CuidaIconName = cIcons;
601
+
441
602
  export declare type DividerSpacing = 'sm' | 'md' | 'lg';
442
603
 
604
+ export declare function getCuidaIconMarkup(name: CuidaIconName): string;
605
+
443
606
  export declare type IconButtonSize = 'sm' | 'md' | 'lg';
444
607
 
445
608
  export declare type IconButtonVariant = 'ghost' | 'secondary' | 'danger';
@@ -450,4 +613,9 @@ export declare type ListRowPadding = 'sm' | 'md';
450
613
 
451
614
  export declare type ProgressSize = 'sm' | 'md';
452
615
 
616
+ export declare function resolveAccentPalette(mood: 'app' | 'site', explicit?: AccentPalette | null): AccentPalette;
617
+
618
+ /** Site mood default when no data-accent is set */
619
+ export declare const siteDefaultAccent: AccentPalette;
620
+
453
621
  export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rafael_dias/akoma",
3
- "version": "0.4.0",
3
+ "version": "0.8.1",
4
4
  "description": "A human Vue 3 design system with expressive App and trustworthy Site moods.",
5
5
  "type": "module",
6
6
  "author": "Rafael",
@@ -29,6 +29,7 @@
29
29
  "./tokens.css": "./src/styles/tokens.css",
30
30
  "./base.css": "./src/styles/base.css",
31
31
  "./motion.css": "./src/styles/motion.css",
32
+ "./accent-palettes.css": "./src/styles/accent-palettes.css",
32
33
  "./content/*": "./content/*"
33
34
  },
34
35
  "files": [
@@ -48,12 +49,14 @@
48
49
  "typecheck": "vue-tsc -p tsconfig.app.json --noEmit"
49
50
  },
50
51
  "peerDependencies": {
51
- "vue": "^3.5.0"
52
+ "vue": "^3.5.0",
53
+ "@sysvale/cuida-icons": "^1.18.0"
52
54
  },
53
55
  "dependencies": {
54
56
  "vue": "^3.5.0"
55
57
  },
56
58
  "devDependencies": {
59
+ "@sysvale/cuida-icons": "^1.18.0",
57
60
  "@types/node": "^24.13.2",
58
61
  "@vitejs/plugin-vue": "^6.0.7",
59
62
  "@vue/tsconfig": "^0.9.1",
@@ -0,0 +1,239 @@
1
+ /* Akoma — accent palettes
2
+ *
3
+ * Mood (App / Site) controls shape and surfaces.
4
+ * Accent controls brand color independently.
5
+ *
6
+ * Each palette exposes three chromatic shades:
7
+ * --accent-light · lighter step
8
+ * --accent · base (current brand color)
9
+ * --accent-dark · darker step
10
+ *
11
+ * <html data-mood="app" data-accent="teal">
12
+ *
13
+ * Without data-accent:
14
+ * App → violet
15
+ * Site → evergreen
16
+ */
17
+
18
+ :root,
19
+ [data-mood='app']:not([data-accent]) {
20
+ --accent-light: #8578c9;
21
+ --accent: #6658b8;
22
+ --accent-dark: #4f4299;
23
+ --accent-hover: var(--accent-dark);
24
+ --accent-soft: #ece9f8;
25
+ --accent-contrast: #ffffff;
26
+ --bg-tinted: #f1eefb;
27
+ --orb-1: rgba(102, 88, 184, 0.13);
28
+ }
29
+
30
+ [data-mood='site']:not([data-accent]) {
31
+ --accent-light: #3f8566;
32
+ --accent: #2e684f;
33
+ --accent-dark: #1f4a37;
34
+ --accent-hover: var(--accent-dark);
35
+ --accent-soft: #e2eee7;
36
+ --accent-contrast: #ffffff;
37
+ --bg-tinted: #f4f5f4;
38
+ --orb-1: rgba(46, 104, 79, 0.06);
39
+ }
40
+
41
+ [data-accent='violet'] {
42
+ --accent-light: #8578c9;
43
+ --accent: #6658b8;
44
+ --accent-dark: #4f4299;
45
+ --accent-hover: var(--accent-dark);
46
+ --accent-soft: #ece9f8;
47
+ --accent-contrast: #ffffff;
48
+ --bg-tinted: #f1eefb;
49
+ --orb-1: rgba(102, 88, 184, 0.13);
50
+ }
51
+
52
+ [data-accent='evergreen'] {
53
+ --accent-light: #3f8566;
54
+ --accent: #2e684f;
55
+ --accent-dark: #1f4a37;
56
+ --accent-hover: var(--accent-dark);
57
+ --accent-soft: #e2eee7;
58
+ --accent-contrast: #ffffff;
59
+ --bg-tinted: #f2f5f3;
60
+ --orb-1: rgba(46, 104, 79, 0.07);
61
+ }
62
+
63
+ [data-accent='teal'] {
64
+ --accent-light: #4f96a0;
65
+ --accent: #3a7d85;
66
+ --accent-dark: #2a5f66;
67
+ --accent-hover: var(--accent-dark);
68
+ --accent-soft: #e3eff0;
69
+ --accent-contrast: #ffffff;
70
+ --bg-tinted: #e8f2f3;
71
+ --orb-1: rgba(58, 125, 133, 0.12);
72
+ }
73
+
74
+ [data-accent='ocean'] {
75
+ --accent-light: #5584ad;
76
+ --accent: #3d6a94;
77
+ --accent-dark: #2d5174;
78
+ --accent-hover: var(--accent-dark);
79
+ --accent-soft: #e5eef5;
80
+ --accent-contrast: #ffffff;
81
+ --bg-tinted: #e8f0f7;
82
+ --orb-1: rgba(61, 106, 148, 0.11);
83
+ }
84
+
85
+ [data-accent='amber'] {
86
+ --accent-light: #b8893f;
87
+ --accent: #9a702d;
88
+ --accent-dark: #7a5720;
89
+ --accent-hover: var(--accent-dark);
90
+ --accent-soft: #f5ecd4;
91
+ --accent-contrast: #ffffff;
92
+ --bg-tinted: #f8f2e4;
93
+ --orb-1: rgba(154, 112, 45, 0.1);
94
+ }
95
+
96
+ [data-accent='rose'] {
97
+ --accent-light: #c07082;
98
+ --accent: #a8586a;
99
+ --accent-dark: #8a4556;
100
+ --accent-hover: var(--accent-dark);
101
+ --accent-soft: #fae9ed;
102
+ --accent-contrast: #ffffff;
103
+ --bg-tinted: #f9eef1;
104
+ --orb-1: rgba(168, 88, 106, 0.11);
105
+ }
106
+
107
+ [data-accent='coral'] {
108
+ --accent-light: #cd7d62;
109
+ --accent: #b5644a;
110
+ --accent-dark: #944f39;
111
+ --accent-hover: var(--accent-dark);
112
+ --accent-soft: #faece8;
113
+ --accent-contrast: #ffffff;
114
+ --bg-tinted: #f9f0eb;
115
+ --orb-1: rgba(181, 100, 74, 0.11);
116
+ }
117
+
118
+ [data-accent='slate'] {
119
+ --accent-light: #627890;
120
+ --accent: #4a5d73;
121
+ --accent-dark: #384858;
122
+ --accent-hover: var(--accent-dark);
123
+ --accent-soft: #e8ecf1;
124
+ --accent-contrast: #ffffff;
125
+ --bg-tinted: #eef1f5;
126
+ --orb-1: rgba(74, 93, 115, 0.1);
127
+ }
128
+
129
+ /* Dark — mood defaults */
130
+ [data-theme='dark']:not([data-accent]),
131
+ [data-theme='dark'][data-mood='app']:not([data-accent]) {
132
+ --accent-light: #bbb2f0;
133
+ --accent: #a99ee8;
134
+ --accent-dark: #8a7dd4;
135
+ --accent-hover: var(--accent-light);
136
+ --accent-soft: #39354f;
137
+ --accent-contrast: #211d38;
138
+ --bg-tinted: #312e40;
139
+ --orb-1: rgba(169, 158, 232, 0.11);
140
+ }
141
+
142
+ [data-theme='dark'][data-mood='site']:not([data-accent]) {
143
+ --accent-light: #96c6ae;
144
+ --accent: #82b99d;
145
+ --accent-dark: #68a084;
146
+ --accent-hover: var(--accent-light);
147
+ --accent-soft: #294438;
148
+ --accent-contrast: #13241c;
149
+ --bg-tinted: #252928;
150
+ --orb-1: rgba(130, 185, 157, 0.06);
151
+ }
152
+
153
+ [data-theme='dark'][data-accent='violet'] {
154
+ --accent-light: #bbb2f0;
155
+ --accent: #a99ee8;
156
+ --accent-dark: #8a7dd4;
157
+ --accent-hover: var(--accent-light);
158
+ --accent-soft: #39354f;
159
+ --accent-contrast: #211d38;
160
+ --bg-tinted: #312e40;
161
+ --orb-1: rgba(169, 158, 232, 0.11);
162
+ }
163
+
164
+ [data-theme='dark'][data-accent='evergreen'] {
165
+ --accent-light: #96c6ae;
166
+ --accent: #82b99d;
167
+ --accent-dark: #68a084;
168
+ --accent-hover: var(--accent-light);
169
+ --accent-soft: #294438;
170
+ --accent-contrast: #13241c;
171
+ --bg-tinted: #27312c;
172
+ --orb-1: rgba(130, 185, 157, 0.07);
173
+ }
174
+
175
+ [data-theme='dark'][data-accent='teal'] {
176
+ --accent-light: #95c7cd;
177
+ --accent: #7eb8bf;
178
+ --accent-dark: #629ca3;
179
+ --accent-hover: var(--accent-light);
180
+ --accent-soft: #294548;
181
+ --accent-contrast: #142528;
182
+ --bg-tinted: #243638;
183
+ --orb-1: rgba(126, 184, 191, 0.1);
184
+ }
185
+
186
+ [data-theme='dark'][data-accent='ocean'] {
187
+ --accent-light: #9fc3e2;
188
+ --accent: #8ab4d9;
189
+ --accent-dark: #6e9bc2;
190
+ --accent-hover: var(--accent-light);
191
+ --accent-soft: #2a3a4a;
192
+ --accent-contrast: #152130;
193
+ --bg-tinted: #253545;
194
+ --orb-1: rgba(138, 180, 217, 0.1);
195
+ }
196
+
197
+ [data-theme='dark'][data-accent='amber'] {
198
+ --accent-light: #debb78;
199
+ --accent: #d4ad61;
200
+ --accent-dark: #b89448;
201
+ --accent-hover: var(--accent-light);
202
+ --accent-soft: #413823;
203
+ --accent-contrast: #2a2212;
204
+ --bg-tinted: #3a3220;
205
+ --orb-1: rgba(212, 173, 97, 0.09);
206
+ }
207
+
208
+ [data-theme='dark'][data-accent='rose'] {
209
+ --accent-light: #e79fad;
210
+ --accent: #df8a9a;
211
+ --accent-dark: #c96f81;
212
+ --accent-hover: var(--accent-light);
213
+ --accent-soft: #472f35;
214
+ --accent-contrast: #2a171c;
215
+ --bg-tinted: #3a2830;
216
+ --orb-1: rgba(223, 138, 154, 0.1);
217
+ }
218
+
219
+ [data-theme='dark'][data-accent='coral'] {
220
+ --accent-light: #e8ad99;
221
+ --accent: #e09a82;
222
+ --accent-dark: #c97f66;
223
+ --accent-hover: var(--accent-light);
224
+ --accent-soft: #4a322c;
225
+ --accent-contrast: #2a1a15;
226
+ --bg-tinted: #3d2e28;
227
+ --orb-1: rgba(224, 154, 130, 0.1);
228
+ }
229
+
230
+ [data-theme='dark'][data-accent='slate'] {
231
+ --accent-light: #aebed1;
232
+ --accent: #9aadc4;
233
+ --accent-dark: #7f93ad;
234
+ --accent-hover: var(--accent-light);
235
+ --accent-soft: #2f3844;
236
+ --accent-contrast: #171e28;
237
+ --bg-tinted: #2a323c;
238
+ --orb-1: rgba(154, 173, 196, 0.1);
239
+ }
@@ -1,3 +1,4 @@
1
1
  @import './tokens.css';
2
+ @import './accent-palettes.css';
2
3
  @import './base.css';
3
4
  @import './motion.css';
@@ -16,6 +16,14 @@
16
16
  animation: ambient-drift 18s ease-in-out infinite;
17
17
  }
18
18
 
19
+ [data-mood='site'] .ambient__orb {
20
+ opacity: 0.2;
21
+ }
22
+
23
+ [data-mood='site'][data-theme='dark'] .ambient__orb {
24
+ opacity: 0.14;
25
+ }
26
+
19
27
  .ambient__orb--1 {
20
28
  width: 280px;
21
29
  height: 280px;