@rafael_dias/akoma 0.3.0 → 0.7.6

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,6 +48,25 @@ 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
 
51
+ declare const __VLS_component_6: DefineComponent<__VLS_Props_13, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_13> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLElement>;
52
+
53
+ declare const __VLS_component_7: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, HTMLUListElement>;
54
+
55
+ declare const __VLS_component_8: DefineComponent<__VLS_Props_14, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_14> & Readonly<{}>, {
56
+ disabled: boolean;
57
+ interactive: boolean;
58
+ padding: ListRowPadding;
59
+ divider: boolean;
60
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
61
+
62
+ declare const __VLS_component_9: DefineComponent<__VLS_Props_15, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_15> & Readonly<{}>, {
63
+ variant: IconButtonVariant;
64
+ size: IconButtonSize;
65
+ disabled: boolean;
66
+ loading: boolean;
67
+ type: "button" | "submit" | "reset";
68
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLButtonElement>;
69
+
36
70
  declare type __VLS_Props = {
37
71
  variant?: ButtonVariant;
38
72
  size?: ButtonSize;
@@ -42,6 +76,72 @@ declare type __VLS_Props = {
42
76
  block?: boolean;
43
77
  };
44
78
 
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 = {
87
+ /** Horizontal spacing around the line */
88
+ spacing?: DividerSpacing;
89
+ /** Optional centered label */
90
+ label?: string;
91
+ vertical?: boolean;
92
+ };
93
+
94
+ declare type __VLS_Props_12 = {
95
+ /** Current value */
96
+ value?: number;
97
+ max?: number;
98
+ size?: ProgressSize;
99
+ /** CSS color for the fill (defaults to accent) */
100
+ color?: string;
101
+ label?: string;
102
+ showValue?: boolean;
103
+ };
104
+
105
+ declare type __VLS_Props_13 = {
106
+ title?: string;
107
+ };
108
+
109
+ declare type __VLS_Props_14 = {
110
+ interactive?: boolean;
111
+ disabled?: boolean;
112
+ padding?: ListRowPadding;
113
+ divider?: boolean;
114
+ };
115
+
116
+ declare type __VLS_Props_15 = {
117
+ variant?: IconButtonVariant;
118
+ size?: IconButtonSize;
119
+ disabled?: boolean;
120
+ loading?: boolean;
121
+ type?: 'button' | 'submit' | 'reset';
122
+ label: string;
123
+ /** Cuida Icons name — preferred over the default slot */
124
+ icon?: CuidaIconName;
125
+ };
126
+
127
+ declare type __VLS_Props_16 = {
128
+ modelValue?: boolean;
129
+ label?: string;
130
+ description?: string;
131
+ disabled?: boolean;
132
+ };
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
+
45
145
  declare type __VLS_Props_2 = {
46
146
  variant?: BadgeVariant;
47
147
  label?: string;
@@ -114,6 +214,30 @@ declare function __VLS_template(): {
114
214
  rootEl: HTMLButtonElement;
115
215
  };
116
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
+
117
241
  declare function __VLS_template_2(): {
118
242
  attrs: Partial<{}>;
119
243
  slots: Readonly<{
@@ -166,8 +290,62 @@ declare function __VLS_template_5(): {
166
290
  rootEl: HTMLDivElement;
167
291
  };
168
292
 
293
+ declare function __VLS_template_6(): {
294
+ attrs: Partial<{}>;
295
+ slots: Readonly<{
296
+ default?: () => unknown;
297
+ action?: () => unknown;
298
+ }> & {
299
+ default?: () => unknown;
300
+ action?: () => unknown;
301
+ };
302
+ refs: {};
303
+ rootEl: HTMLElement;
304
+ };
305
+
306
+ declare function __VLS_template_7(): {
307
+ attrs: Partial<{}>;
308
+ slots: {
309
+ default?(_: {}): any;
310
+ };
311
+ refs: {};
312
+ rootEl: HTMLUListElement;
313
+ };
314
+
315
+ declare function __VLS_template_8(): {
316
+ attrs: Partial<{}>;
317
+ slots: Readonly<{
318
+ leading?: () => unknown;
319
+ default?: () => unknown;
320
+ subtitle?: () => unknown;
321
+ trailing?: () => unknown;
322
+ }> & {
323
+ leading?: () => unknown;
324
+ default?: () => unknown;
325
+ subtitle?: () => unknown;
326
+ trailing?: () => unknown;
327
+ };
328
+ refs: {};
329
+ rootEl: any;
330
+ };
331
+
332
+ declare function __VLS_template_9(): {
333
+ attrs: Partial<{}>;
334
+ slots: Readonly<{
335
+ default?: () => unknown;
336
+ }> & {
337
+ default?: () => unknown;
338
+ };
339
+ refs: {};
340
+ rootEl: HTMLButtonElement;
341
+ };
342
+
169
343
  declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
170
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
+
171
349
  declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
172
350
 
173
351
  declare type __VLS_TemplateResult_3 = ReturnType<typeof __VLS_template_3>;
@@ -176,12 +354,32 @@ declare type __VLS_TemplateResult_4 = ReturnType<typeof __VLS_template_4>;
176
354
 
177
355
  declare type __VLS_TemplateResult_5 = ReturnType<typeof __VLS_template_5>;
178
356
 
357
+ declare type __VLS_TemplateResult_6 = ReturnType<typeof __VLS_template_6>;
358
+
359
+ declare type __VLS_TemplateResult_7 = ReturnType<typeof __VLS_template_7>;
360
+
361
+ declare type __VLS_TemplateResult_8 = ReturnType<typeof __VLS_template_8>;
362
+
363
+ declare type __VLS_TemplateResult_9 = ReturnType<typeof __VLS_template_9>;
364
+
179
365
  declare type __VLS_WithTemplateSlots<T, S> = T & {
180
366
  new (): {
181
367
  $slots: S;
182
368
  };
183
369
  };
184
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
+
185
383
  declare type __VLS_WithTemplateSlots_2<T, S> = T & {
186
384
  new (): {
187
385
  $slots: S;
@@ -206,6 +404,81 @@ declare type __VLS_WithTemplateSlots_5<T, S> = T & {
206
404
  };
207
405
  };
208
406
 
407
+ declare type __VLS_WithTemplateSlots_6<T, S> = T & {
408
+ new (): {
409
+ $slots: S;
410
+ };
411
+ };
412
+
413
+ declare type __VLS_WithTemplateSlots_7<T, S> = T & {
414
+ new (): {
415
+ $slots: S;
416
+ };
417
+ };
418
+
419
+ declare type __VLS_WithTemplateSlots_8<T, S> = T & {
420
+ new (): {
421
+ $slots: S;
422
+ };
423
+ };
424
+
425
+ declare type __VLS_WithTemplateSlots_9<T, S> = T & {
426
+ new (): {
427
+ $slots: S;
428
+ };
429
+ };
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
+ export declare const accentPalettes: {
440
+ readonly violet: {
441
+ readonly label: "Violet";
442
+ readonly description: "Mineral violet — default for App mood.";
443
+ readonly sample: "#6658b8";
444
+ };
445
+ readonly evergreen: {
446
+ readonly label: "Evergreen";
447
+ readonly description: "Confident green — default for Site mood.";
448
+ readonly sample: "#2e684f";
449
+ };
450
+ readonly teal: {
451
+ readonly label: "Teal";
452
+ readonly description: "Calm mineral teal for productivity and wellness apps.";
453
+ readonly sample: "#3a7d85";
454
+ };
455
+ readonly ocean: {
456
+ readonly label: "Ocean";
457
+ readonly description: "Trustworthy blue for data-heavy products.";
458
+ readonly sample: "#3d6a94";
459
+ };
460
+ readonly amber: {
461
+ readonly label: "Amber";
462
+ readonly description: "Warm gold for optimistic, human interfaces.";
463
+ readonly sample: "#9a702d";
464
+ };
465
+ readonly rose: {
466
+ readonly label: "Rose";
467
+ readonly description: "Dusty rose for lifestyle and creative tools.";
468
+ readonly sample: "#a8586a";
469
+ };
470
+ readonly coral: {
471
+ readonly label: "Coral";
472
+ readonly description: "Terracotta warmth without feeling playful.";
473
+ readonly sample: "#b5644a";
474
+ };
475
+ readonly slate: {
476
+ readonly label: "Slate";
477
+ readonly description: "Blue-gray for neutral B2B surfaces.";
478
+ readonly sample: "#4a5d73";
479
+ };
480
+ };
481
+
209
482
  export declare const AkAmbientBg: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {
210
483
  contained: boolean;
211
484
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
@@ -218,8 +491,19 @@ export declare const AkCard: __VLS_WithTemplateSlots_4<typeof __VLS_component_4,
218
491
 
219
492
  export declare const AkChip: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
220
493
 
494
+ export declare const AkDivider: DefineComponent<__VLS_Props_11, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_11> & Readonly<{}>, {
495
+ spacing: DividerSpacing;
496
+ vertical: boolean;
497
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
498
+
221
499
  export declare const AkEmptyState: __VLS_WithTemplateSlots_5<typeof __VLS_component_5, __VLS_TemplateResult_5["slots"]>;
222
500
 
501
+ export declare const AkIcon: DefineComponent<__VLS_Props_10, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_10> & Readonly<{}>, {
502
+ size: number | string;
503
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLSpanElement>;
504
+
505
+ export declare const AkIconButton: __VLS_WithTemplateSlots_9<typeof __VLS_component_9, __VLS_TemplateResult_9["slots"]>;
506
+
223
507
  export declare const AkInput: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
224
508
  "update:modelValue": (value: string) => any;
225
509
  }, string, PublicProps, Readonly<__VLS_Props_5> & Readonly<{
@@ -232,6 +516,10 @@ modelValue: string | number;
232
516
  required: boolean;
233
517
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
234
518
 
519
+ export declare const AkList: __VLS_WithTemplateSlots_7<typeof __VLS_component_7, __VLS_TemplateResult_7["slots"]>;
520
+
521
+ export declare const AkListRow: __VLS_WithTemplateSlots_8<typeof __VLS_component_8, __VLS_TemplateResult_8["slots"]>;
522
+
235
523
  export declare const Akoma: Plugin_2;
236
524
 
237
525
  export declare type AkomaOptions = {
@@ -239,12 +527,34 @@ export declare type AkomaOptions = {
239
527
  prefix?: string;
240
528
  };
241
529
 
530
+ export declare const AkProgress: DefineComponent<__VLS_Props_12, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_12> & Readonly<{}>, {
531
+ size: ProgressSize;
532
+ value: number;
533
+ max: number;
534
+ showValue: boolean;
535
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
536
+
537
+ export declare const AkSectionHeader: __VLS_WithTemplateSlots_6<typeof __VLS_component_6, __VLS_TemplateResult_6["slots"]>;
538
+
242
539
  export declare const AkShimmer: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{}>, {
243
540
  width: string;
244
541
  height: string;
245
542
  radius: "sm" | "md" | "lg" | "full" | string;
246
543
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
247
544
 
545
+ export declare const AkSwitch: DefineComponent<__VLS_Props_16, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
546
+ "update:modelValue": (value: boolean) => any;
547
+ }, string, PublicProps, Readonly<__VLS_Props_16> & Readonly<{
548
+ "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
549
+ }>, {
550
+ disabled: boolean;
551
+ modelValue: boolean;
552
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
553
+
554
+ export declare const AkTabBar: __VLS_WithTemplateSlots_10<typeof __VLS_component_10, __VLS_TemplateResult_10["slots"]>;
555
+
556
+ export declare const AkTabBarItem: __VLS_WithTemplateSlots_11<typeof __VLS_component_11, __VLS_TemplateResult_11["slots"]>;
557
+
248
558
  export declare const AkTextarea: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
249
559
  "update:modelValue": (value: string) => any;
250
560
  }, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{
@@ -256,12 +566,38 @@ required: boolean;
256
566
  rows: number;
257
567
  }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLLabelElement>;
258
568
 
569
+ /** App mood default when no data-accent is set */
570
+ export declare const appDefaultAccent: AccentPalette;
571
+
572
+ export declare function applyAccentPalette(root: HTMLElement, palette: AccentPalette | 'auto'): void;
573
+
259
574
  export declare type BadgeVariant = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';
260
575
 
261
576
  export declare type ButtonSize = 'sm' | 'md' | 'lg';
262
577
 
263
578
  export declare type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';
264
579
 
580
+ export declare const cuidaIconMap: Map<string, string>;
581
+
582
+ export declare type CuidaIconName = cIcons;
583
+
584
+ export declare type DividerSpacing = 'sm' | 'md' | 'lg';
585
+
586
+ export declare function getCuidaIconMarkup(name: CuidaIconName): string;
587
+
588
+ export declare type IconButtonSize = 'sm' | 'md' | 'lg';
589
+
590
+ export declare type IconButtonVariant = 'ghost' | 'secondary' | 'danger';
591
+
265
592
  export declare type InputSize = 'sm' | 'md' | 'lg';
266
593
 
594
+ export declare type ListRowPadding = 'sm' | 'md';
595
+
596
+ export declare type ProgressSize = 'sm' | 'md';
597
+
598
+ export declare function resolveAccentPalette(mood: 'app' | 'site', explicit?: AccentPalette | null): AccentPalette;
599
+
600
+ /** Site mood default when no data-accent is set */
601
+ export declare const siteDefaultAccent: AccentPalette;
602
+
267
603
  export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rafael_dias/akoma",
3
- "version": "0.3.0",
3
+ "version": "0.7.6",
4
4
  "description": "A human Vue 3 design system with expressive App and trustworthy Site moods.",
5
5
  "type": "module",
6
6
  "author": "Rafael",
@@ -28,11 +28,14 @@
28
28
  "./style.css": "./dist/akoma.css",
29
29
  "./tokens.css": "./src/styles/tokens.css",
30
30
  "./base.css": "./src/styles/base.css",
31
- "./motion.css": "./src/styles/motion.css"
31
+ "./motion.css": "./src/styles/motion.css",
32
+ "./accent-palettes.css": "./src/styles/accent-palettes.css",
33
+ "./content/*": "./content/*"
32
34
  },
33
35
  "files": [
34
36
  "dist",
35
- "src/styles"
37
+ "src/styles",
38
+ "content"
36
39
  ],
37
40
  "publishConfig": {
38
41
  "access": "public",
@@ -41,20 +44,23 @@
41
44
  "scripts": {
42
45
  "dev": "vite",
43
46
  "build": "vue-tsc -p tsconfig.lib.json --declaration --emitDeclarationOnly && vite build --config vite.lib.config.ts",
44
- "build:docs": "vite build",
47
+ "build:docs": "vite build && node scripts/prepare-docs-dist.mjs",
45
48
  "preview": "vite preview",
46
49
  "typecheck": "vue-tsc -p tsconfig.app.json --noEmit"
47
50
  },
48
51
  "peerDependencies": {
49
- "vue": "^3.5.0"
52
+ "vue": "^3.5.0",
53
+ "@sysvale/cuida-icons": "^1.18.0"
50
54
  },
51
55
  "dependencies": {
52
- "vue": "^3.5.39"
56
+ "vue": "^3.5.0"
53
57
  },
54
58
  "devDependencies": {
59
+ "@sysvale/cuida-icons": "^1.18.0",
55
60
  "@types/node": "^24.13.2",
56
61
  "@vitejs/plugin-vue": "^6.0.7",
57
62
  "@vue/tsconfig": "^0.9.1",
63
+ "marked": "^18.0.6",
58
64
  "typescript": "~6.0.2",
59
65
  "vite": "^8.1.1",
60
66
  "vite-plugin-dts": "^4.5.4",
@@ -0,0 +1,194 @@
1
+ /* Akoma — accent palettes
2
+ *
3
+ * Mood (App / Site) controls shape and surfaces.
4
+ * Accent controls brand color independently.
5
+ *
6
+ * <html data-mood="app" data-accent="teal">
7
+ *
8
+ * Without data-accent:
9
+ * App → violet
10
+ * Site → evergreen
11
+ */
12
+
13
+ :root,
14
+ [data-mood='app']:not([data-accent]) {
15
+ --accent: #6658b8;
16
+ --accent-hover: #5548a3;
17
+ --accent-soft: #ece9f8;
18
+ --accent-contrast: #ffffff;
19
+ --bg-tinted: #f1eefb;
20
+ --orb-1: rgba(102, 88, 184, 0.13);
21
+ }
22
+
23
+ [data-mood='site']:not([data-accent]) {
24
+ --accent: #2e684f;
25
+ --accent-hover: #245640;
26
+ --accent-soft: #e2eee7;
27
+ --accent-contrast: #ffffff;
28
+ --bg-tinted: #f4f5f4;
29
+ --orb-1: rgba(46, 104, 79, 0.06);
30
+ }
31
+
32
+ [data-accent='violet'] {
33
+ --accent: #6658b8;
34
+ --accent-hover: #5548a3;
35
+ --accent-soft: #ece9f8;
36
+ --accent-contrast: #ffffff;
37
+ --bg-tinted: #f1eefb;
38
+ --orb-1: rgba(102, 88, 184, 0.13);
39
+ }
40
+
41
+ [data-accent='evergreen'] {
42
+ --accent: #2e684f;
43
+ --accent-hover: #245640;
44
+ --accent-soft: #e2eee7;
45
+ --accent-contrast: #ffffff;
46
+ --bg-tinted: #f2f5f3;
47
+ --orb-1: rgba(46, 104, 79, 0.07);
48
+ }
49
+
50
+ [data-accent='teal'] {
51
+ --accent: #3a7d85;
52
+ --accent-hover: #2f686f;
53
+ --accent-soft: #e3eff0;
54
+ --accent-contrast: #ffffff;
55
+ --bg-tinted: #e8f2f3;
56
+ --orb-1: rgba(58, 125, 133, 0.12);
57
+ }
58
+
59
+ [data-accent='ocean'] {
60
+ --accent: #3d6a94;
61
+ --accent-hover: #32577a;
62
+ --accent-soft: #e5eef5;
63
+ --accent-contrast: #ffffff;
64
+ --bg-tinted: #e8f0f7;
65
+ --orb-1: rgba(61, 106, 148, 0.11);
66
+ }
67
+
68
+ [data-accent='amber'] {
69
+ --accent: #9a702d;
70
+ --accent-hover: #7f5c24;
71
+ --accent-soft: #f5ecd4;
72
+ --accent-contrast: #ffffff;
73
+ --bg-tinted: #f8f2e4;
74
+ --orb-1: rgba(154, 112, 45, 0.1);
75
+ }
76
+
77
+ [data-accent='rose'] {
78
+ --accent: #a8586a;
79
+ --accent-hover: #8f4a59;
80
+ --accent-soft: #fae9ed;
81
+ --accent-contrast: #ffffff;
82
+ --bg-tinted: #f9eef1;
83
+ --orb-1: rgba(168, 88, 106, 0.11);
84
+ }
85
+
86
+ [data-accent='coral'] {
87
+ --accent: #b5644a;
88
+ --accent-hover: #9a543e;
89
+ --accent-soft: #faece8;
90
+ --accent-contrast: #ffffff;
91
+ --bg-tinted: #f9f0eb;
92
+ --orb-1: rgba(181, 100, 74, 0.11);
93
+ }
94
+
95
+ [data-accent='slate'] {
96
+ --accent: #4a5d73;
97
+ --accent-hover: #3c4d60;
98
+ --accent-soft: #e8ecf1;
99
+ --accent-contrast: #ffffff;
100
+ --bg-tinted: #eef1f5;
101
+ --orb-1: rgba(74, 93, 115, 0.1);
102
+ }
103
+
104
+ /* Dark — mood defaults */
105
+ [data-theme='dark']:not([data-accent]),
106
+ [data-theme='dark'][data-mood='app']:not([data-accent]) {
107
+ --accent: #a99ee8;
108
+ --accent-hover: #bbb2f0;
109
+ --accent-soft: #39354f;
110
+ --accent-contrast: #211d38;
111
+ --bg-tinted: #312e40;
112
+ --orb-1: rgba(169, 158, 232, 0.11);
113
+ }
114
+
115
+ [data-theme='dark'][data-mood='site']:not([data-accent]) {
116
+ --accent: #82b99d;
117
+ --accent-hover: #96c6ae;
118
+ --accent-soft: #294438;
119
+ --accent-contrast: #13241c;
120
+ --bg-tinted: #252928;
121
+ --orb-1: rgba(130, 185, 157, 0.06);
122
+ }
123
+
124
+ [data-theme='dark'][data-accent='violet'] {
125
+ --accent: #a99ee8;
126
+ --accent-hover: #bbb2f0;
127
+ --accent-soft: #39354f;
128
+ --accent-contrast: #211d38;
129
+ --bg-tinted: #312e40;
130
+ --orb-1: rgba(169, 158, 232, 0.11);
131
+ }
132
+
133
+ [data-theme='dark'][data-accent='evergreen'] {
134
+ --accent: #82b99d;
135
+ --accent-hover: #96c6ae;
136
+ --accent-soft: #294438;
137
+ --accent-contrast: #13241c;
138
+ --bg-tinted: #27312c;
139
+ --orb-1: rgba(130, 185, 157, 0.07);
140
+ }
141
+
142
+ [data-theme='dark'][data-accent='teal'] {
143
+ --accent: #7eb8bf;
144
+ --accent-hover: #95c7cd;
145
+ --accent-soft: #294548;
146
+ --accent-contrast: #142528;
147
+ --bg-tinted: #243638;
148
+ --orb-1: rgba(126, 184, 191, 0.1);
149
+ }
150
+
151
+ [data-theme='dark'][data-accent='ocean'] {
152
+ --accent: #8ab4d9;
153
+ --accent-hover: #9fc3e2;
154
+ --accent-soft: #2a3a4a;
155
+ --accent-contrast: #152130;
156
+ --bg-tinted: #253545;
157
+ --orb-1: rgba(138, 180, 217, 0.1);
158
+ }
159
+
160
+ [data-theme='dark'][data-accent='amber'] {
161
+ --accent: #d4ad61;
162
+ --accent-hover: #debb78;
163
+ --accent-soft: #413823;
164
+ --accent-contrast: #2a2212;
165
+ --bg-tinted: #3a3220;
166
+ --orb-1: rgba(212, 173, 97, 0.09);
167
+ }
168
+
169
+ [data-theme='dark'][data-accent='rose'] {
170
+ --accent: #df8a9a;
171
+ --accent-hover: #e79fad;
172
+ --accent-soft: #472f35;
173
+ --accent-contrast: #2a171c;
174
+ --bg-tinted: #3a2830;
175
+ --orb-1: rgba(223, 138, 154, 0.1);
176
+ }
177
+
178
+ [data-theme='dark'][data-accent='coral'] {
179
+ --accent: #e09a82;
180
+ --accent-hover: #e8ad99;
181
+ --accent-soft: #4a322c;
182
+ --accent-contrast: #2a1a15;
183
+ --bg-tinted: #3d2e28;
184
+ --orb-1: rgba(224, 154, 130, 0.1);
185
+ }
186
+
187
+ [data-theme='dark'][data-accent='slate'] {
188
+ --accent: #9aadc4;
189
+ --accent-hover: #aebed1;
190
+ --accent-soft: #2f3844;
191
+ --accent-contrast: #171e28;
192
+ --bg-tinted: #2a323c;
193
+ --orb-1: rgba(154, 173, 196, 0.1);
194
+ }
@@ -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;