@datatechsolutions/ui 3.3.0 → 3.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.
Files changed (212) hide show
  1. package/dist/astrlabe/index.js +113 -113
  2. package/dist/astrlabe/index.mjs +6 -6
  3. package/dist/astrlabe/workflow-canvas.js +6 -6
  4. package/dist/astrlabe/workflow-canvas.mjs +5 -5
  5. package/dist/brand/index.js +0 -14
  6. package/dist/brand/index.js.map +1 -1
  7. package/dist/brand/index.mjs +0 -14
  8. package/dist/brand/index.mjs.map +1 -1
  9. package/dist/{chunk-2WXRRQM3.mjs → chunk-2MJAHST4.mjs} +554 -516
  10. package/dist/chunk-2MJAHST4.mjs.map +1 -0
  11. package/dist/{chunk-FAGDZEKM.js → chunk-2OZZH2IO.js} +2 -2
  12. package/dist/chunk-2OZZH2IO.js.map +1 -0
  13. package/dist/{chunk-SYNVNTLJ.mjs → chunk-3AY5HIQ6.mjs} +2 -2
  14. package/dist/chunk-3AY5HIQ6.mjs.map +1 -0
  15. package/dist/{chunk-O6M3KDGT.mjs → chunk-3OLYSMI5.mjs} +41 -7
  16. package/dist/chunk-3OLYSMI5.mjs.map +1 -0
  17. package/dist/{chunk-GIQXB3BG.mjs → chunk-4PFU6A2B.mjs} +3 -3
  18. package/dist/{chunk-GIQXB3BG.mjs.map → chunk-4PFU6A2B.mjs.map} +1 -1
  19. package/dist/{chunk-3ZUMJTDT.mjs → chunk-5BEVTOZV.mjs} +4 -5
  20. package/dist/{chunk-3JJWPOK6.js.map → chunk-5BEVTOZV.mjs.map} +1 -1
  21. package/dist/{chunk-3JJWPOK6.js → chunk-5I7F7KZ6.js} +10 -11
  22. package/dist/chunk-5I7F7KZ6.js.map +1 -0
  23. package/dist/{chunk-BR2GAZKG.mjs → chunk-6V3DUBOZ.mjs} +7 -7
  24. package/dist/{chunk-BR2GAZKG.mjs.map → chunk-6V3DUBOZ.mjs.map} +1 -1
  25. package/dist/{chunk-5GDKCFM5.mjs → chunk-6W7VTZG6.mjs} +3 -3
  26. package/dist/{chunk-5GDKCFM5.mjs.map → chunk-6W7VTZG6.mjs.map} +1 -1
  27. package/dist/{chunk-IJAKZHXX.js → chunk-74MHWEDC.js} +684 -645
  28. package/dist/chunk-74MHWEDC.js.map +1 -0
  29. package/dist/{chunk-IRPS5UCS.mjs → chunk-7CEZB3ZD.mjs} +3 -3
  30. package/dist/{chunk-IRPS5UCS.mjs.map → chunk-7CEZB3ZD.mjs.map} +1 -1
  31. package/dist/{chunk-UDDZTTLO.mjs → chunk-7UHV6A4C.mjs} +6 -7
  32. package/dist/chunk-7UHV6A4C.mjs.map +1 -0
  33. package/dist/{chunk-ZM5MVWIT.js → chunk-A7FI4K7Z.js} +5 -6
  34. package/dist/chunk-A7FI4K7Z.js.map +1 -0
  35. package/dist/{chunk-MWPTSBAI.js → chunk-AVM53A3Y.js} +63 -29
  36. package/dist/chunk-AVM53A3Y.js.map +1 -0
  37. package/dist/{chunk-I2NZGVBG.js → chunk-AWDH6WNA.js} +1214 -5396
  38. package/dist/chunk-AWDH6WNA.js.map +1 -0
  39. package/dist/{chunk-ZJPNP2YW.mjs → chunk-BUDZNAKL.mjs} +2 -2
  40. package/dist/chunk-BUDZNAKL.mjs.map +1 -0
  41. package/dist/{chunk-OCELRSLO.js → chunk-BVXATTTA.js} +4 -4
  42. package/dist/{chunk-OCELRSLO.js.map → chunk-BVXATTTA.js.map} +1 -1
  43. package/dist/{chunk-W5OEBO6E.js → chunk-C4NRF2G2.js} +13 -14
  44. package/dist/chunk-C4NRF2G2.js.map +1 -0
  45. package/dist/{chunk-JSNRCYSO.js → chunk-CY2MBKVG.js} +4 -4
  46. package/dist/{chunk-JSNRCYSO.js.map → chunk-CY2MBKVG.js.map} +1 -1
  47. package/dist/{chunk-ZL6C2ZAF.js → chunk-FK3WDELF.js} +67 -67
  48. package/dist/{chunk-ZL6C2ZAF.js.map → chunk-FK3WDELF.js.map} +1 -1
  49. package/dist/{chunk-MVBIAXVN.mjs → chunk-IOEQ2GET.mjs} +14 -11
  50. package/dist/chunk-IOEQ2GET.mjs.map +1 -0
  51. package/dist/{chunk-AOUUZ52N.js → chunk-NCDBNGIB.js} +85 -86
  52. package/dist/chunk-NCDBNGIB.js.map +1 -0
  53. package/dist/{chunk-B67DP7MI.mjs → chunk-NJ5RVWLA.mjs} +4 -4
  54. package/dist/{chunk-B67DP7MI.mjs.map → chunk-NJ5RVWLA.mjs.map} +1 -1
  55. package/dist/{chunk-HDCUWUNH.js → chunk-NKXQYFS7.js} +28 -27
  56. package/dist/chunk-NKXQYFS7.js.map +1 -0
  57. package/dist/{chunk-JN6IL6OH.mjs → chunk-NOHHZ6FM.mjs} +1171 -5316
  58. package/dist/chunk-NOHHZ6FM.mjs.map +1 -0
  59. package/dist/{chunk-PCYL4MII.mjs → chunk-OASC7NYV.mjs} +156 -314
  60. package/dist/chunk-OASC7NYV.mjs.map +1 -0
  61. package/dist/{chunk-RXZNACMI.js → chunk-P43PX75J.js} +33 -33
  62. package/dist/{chunk-RXZNACMI.js.map → chunk-P43PX75J.js.map} +1 -1
  63. package/dist/{chunk-OL73LBX5.mjs → chunk-QLFSJ6HK.mjs} +3 -4
  64. package/dist/chunk-QLFSJ6HK.mjs.map +1 -0
  65. package/dist/{chunk-LEKZUS6N.mjs → chunk-QPSHM2JQ.mjs} +4 -5
  66. package/dist/chunk-QPSHM2JQ.mjs.map +1 -0
  67. package/dist/{chunk-NJFRJ6YD.js → chunk-QSMPKL27.js} +225 -384
  68. package/dist/chunk-QSMPKL27.js.map +1 -0
  69. package/dist/{chunk-ZV5EZXXO.mjs → chunk-RHRJXK5R.mjs} +3 -3
  70. package/dist/{chunk-ZV5EZXXO.mjs.map → chunk-RHRJXK5R.mjs.map} +1 -1
  71. package/dist/{chunk-F54Q2YJY.js → chunk-SY4MUT5V.js} +7 -7
  72. package/dist/{chunk-F54Q2YJY.js.map → chunk-SY4MUT5V.js.map} +1 -1
  73. package/dist/{chunk-5RM6NGZ6.mjs → chunk-UHMAKUON.mjs} +3 -3
  74. package/dist/{chunk-5RM6NGZ6.mjs.map → chunk-UHMAKUON.mjs.map} +1 -1
  75. package/dist/{chunk-TIJJHW2Z.js → chunk-V5VBYOF5.js} +36 -36
  76. package/dist/{chunk-TIJJHW2Z.js.map → chunk-V5VBYOF5.js.map} +1 -1
  77. package/dist/{chunk-KR2X2WHJ.js → chunk-VMGNQFRO.js} +53 -53
  78. package/dist/{chunk-KR2X2WHJ.js.map → chunk-VMGNQFRO.js.map} +1 -1
  79. package/dist/{chunk-HZ4LOVHM.js → chunk-VY52Y5GC.js} +2 -2
  80. package/dist/chunk-VY52Y5GC.js.map +1 -0
  81. package/dist/{chunk-TVMLV675.js → chunk-Z7VY5M4T.js} +98 -95
  82. package/dist/chunk-Z7VY5M4T.js.map +1 -0
  83. package/dist/{chunk-R4TQWXNG.mjs → chunk-ZM2Q2SMC.mjs} +6 -5
  84. package/dist/chunk-ZM2Q2SMC.mjs.map +1 -0
  85. package/dist/index.js +744 -904
  86. package/dist/index.mjs +4 -4
  87. package/dist/platform/admin/index.js +13 -13
  88. package/dist/platform/admin/index.mjs +7 -7
  89. package/dist/platform/agents-workspace.js +9 -9
  90. package/dist/platform/agents-workspace.mjs +8 -8
  91. package/dist/platform/app-shell.js +6 -6
  92. package/dist/platform/app-shell.mjs +5 -5
  93. package/dist/platform/auth/index.js +30 -30
  94. package/dist/platform/auth/index.mjs +7 -7
  95. package/dist/platform/billing/index.js +6 -6
  96. package/dist/platform/billing/index.mjs +5 -5
  97. package/dist/platform/impersonation/index.js +6 -6
  98. package/dist/platform/impersonation/index.mjs +5 -5
  99. package/dist/platform/index.js +102 -4812
  100. package/dist/platform/index.js.map +1 -1
  101. package/dist/platform/index.mjs +24 -4729
  102. package/dist/platform/index.mjs.map +1 -1
  103. package/dist/platform/pages/index.js +320 -204
  104. package/dist/platform/pages/index.js.map +1 -1
  105. package/dist/platform/pages/index.mjs +146 -30
  106. package/dist/platform/pages/index.mjs.map +1 -1
  107. package/dist/platform/rbac.js +2 -2
  108. package/dist/platform/rbac.mjs +1 -1
  109. package/dist/platform/settings/index.js +10 -10
  110. package/dist/platform/settings/index.mjs +9 -9
  111. package/dist/platform/utils/index.js +3 -3
  112. package/dist/platform/utils/index.js.map +1 -1
  113. package/dist/platform/utils/index.mjs +1 -1
  114. package/dist/platform/utils/index.mjs.map +1 -1
  115. package/dist/platform/workflow-api-client.js +62 -62
  116. package/dist/platform/workflow-api-client.mjs +2 -2
  117. package/dist/platform/workflow-canvas-shell.js +7 -7
  118. package/dist/platform/workflow-canvas-shell.mjs +6 -6
  119. package/package.json +15 -5
  120. package/src/styles/liquid-glass.css +283 -2
  121. package/dist/astrlabe/contracts.d.mts +0 -517
  122. package/dist/astrlabe/contracts.d.ts +0 -517
  123. package/dist/astrlabe/graph-node.d.mts +0 -28
  124. package/dist/astrlabe/graph-node.d.ts +0 -28
  125. package/dist/astrlabe/index.d.mts +0 -751
  126. package/dist/astrlabe/index.d.ts +0 -751
  127. package/dist/astrlabe/utils.d.mts +0 -60
  128. package/dist/astrlabe/utils.d.ts +0 -60
  129. package/dist/astrlabe/workflow-canvas.d.mts +0 -69
  130. package/dist/astrlabe/workflow-canvas.d.ts +0 -69
  131. package/dist/astrlabe/workflow-preview-canvas.d.mts +0 -10
  132. package/dist/astrlabe/workflow-preview-canvas.d.ts +0 -10
  133. package/dist/billing-panel-DsHhhJqG.d.mts +0 -18
  134. package/dist/billing-panel-DsHhhJqG.d.ts +0 -18
  135. package/dist/brand/index.d.mts +0 -85
  136. package/dist/brand/index.d.ts +0 -85
  137. package/dist/chunk-2WXRRQM3.mjs.map +0 -1
  138. package/dist/chunk-3ZUMJTDT.mjs.map +0 -1
  139. package/dist/chunk-AOUUZ52N.js.map +0 -1
  140. package/dist/chunk-FAGDZEKM.js.map +0 -1
  141. package/dist/chunk-HDCUWUNH.js.map +0 -1
  142. package/dist/chunk-HZ4LOVHM.js.map +0 -1
  143. package/dist/chunk-I2NZGVBG.js.map +0 -1
  144. package/dist/chunk-IJAKZHXX.js.map +0 -1
  145. package/dist/chunk-JN6IL6OH.mjs.map +0 -1
  146. package/dist/chunk-LEKZUS6N.mjs.map +0 -1
  147. package/dist/chunk-MVBIAXVN.mjs.map +0 -1
  148. package/dist/chunk-MWPTSBAI.js.map +0 -1
  149. package/dist/chunk-NJFRJ6YD.js.map +0 -1
  150. package/dist/chunk-O6M3KDGT.mjs.map +0 -1
  151. package/dist/chunk-OL73LBX5.mjs.map +0 -1
  152. package/dist/chunk-PCYL4MII.mjs.map +0 -1
  153. package/dist/chunk-R4TQWXNG.mjs.map +0 -1
  154. package/dist/chunk-SYNVNTLJ.mjs.map +0 -1
  155. package/dist/chunk-TVMLV675.js.map +0 -1
  156. package/dist/chunk-UDDZTTLO.mjs.map +0 -1
  157. package/dist/chunk-W5OEBO6E.js.map +0 -1
  158. package/dist/chunk-ZJPNP2YW.mjs.map +0 -1
  159. package/dist/chunk-ZM5MVWIT.js.map +0 -1
  160. package/dist/dynamic-island-confirm-BKsZkAEP.d.mts +0 -17
  161. package/dist/dynamic-island-confirm-BKsZkAEP.d.ts +0 -17
  162. package/dist/index-CoB18TbG.d.ts +0 -215
  163. package/dist/index-VI9gyJXl.d.mts +0 -215
  164. package/dist/index.d.mts +0 -5412
  165. package/dist/index.d.ts +0 -5412
  166. package/dist/layout-engine-YZcVr20M.d.mts +0 -19
  167. package/dist/layout-engine-YZcVr20M.d.ts +0 -19
  168. package/dist/lib/i18n-context.d.mts +0 -36
  169. package/dist/lib/i18n-context.d.ts +0 -36
  170. package/dist/lib/router-context.d.mts +0 -35
  171. package/dist/lib/router-context.d.ts +0 -35
  172. package/dist/navigation-BiWVffAN.d.mts +0 -49
  173. package/dist/navigation-BiWVffAN.d.ts +0 -49
  174. package/dist/platform/admin/index.d.mts +0 -17
  175. package/dist/platform/admin/index.d.ts +0 -17
  176. package/dist/platform/agents-workspace.d.mts +0 -19
  177. package/dist/platform/agents-workspace.d.ts +0 -19
  178. package/dist/platform/app-shell.d.mts +0 -58
  179. package/dist/platform/app-shell.d.ts +0 -58
  180. package/dist/platform/auth/index.d.mts +0 -73
  181. package/dist/platform/auth/index.d.ts +0 -73
  182. package/dist/platform/billing/index.d.mts +0 -29
  183. package/dist/platform/billing/index.d.ts +0 -29
  184. package/dist/platform/impersonation/index.d.mts +0 -19
  185. package/dist/platform/impersonation/index.d.ts +0 -19
  186. package/dist/platform/index.d.mts +0 -224
  187. package/dist/platform/index.d.ts +0 -224
  188. package/dist/platform/pages/index.d.mts +0 -432
  189. package/dist/platform/pages/index.d.ts +0 -432
  190. package/dist/platform/rbac.d.mts +0 -41
  191. package/dist/platform/rbac.d.ts +0 -41
  192. package/dist/platform/settings/index.d.mts +0 -31
  193. package/dist/platform/settings/index.d.ts +0 -31
  194. package/dist/platform/telemetry/index.d.mts +0 -51
  195. package/dist/platform/telemetry/index.d.ts +0 -51
  196. package/dist/platform/utils/index.d.mts +0 -32
  197. package/dist/platform/utils/index.d.ts +0 -32
  198. package/dist/platform/windsock-admin-client.d.mts +0 -57
  199. package/dist/platform/windsock-admin-client.d.ts +0 -57
  200. package/dist/platform/workflow-api-client.d.mts +0 -6
  201. package/dist/platform/workflow-api-client.d.ts +0 -6
  202. package/dist/platform/workflow-canvas-shell.d.mts +0 -18
  203. package/dist/platform/workflow-canvas-shell.d.ts +0 -18
  204. package/dist/rule-form-BYJzyork.d.mts +0 -128
  205. package/dist/rule-form-BYJzyork.d.ts +0 -128
  206. package/dist/workflow-api-client-BKD8OfP_.d.ts +0 -468
  207. package/dist/workflow-api-client-DoYj7nHz.d.mts +0 -468
  208. package/dist/workflow-store-o17I6L6A.d.ts +0 -79
  209. package/dist/workflow-store-ppVHdMZi.d.mts +0 -79
  210. package/src/brand/logos/kori-icon.svg +0 -45
  211. package/src/brand/logos/kori-logo-dark.svg +0 -40
  212. package/src/brand/logos/kori-logo.svg +0 -43
@@ -3,6 +3,110 @@
3
3
  Translucent surfaces with backdrop-blur and inner highlights.
4
4
  ───────────────────────────────────────────────────── */
5
5
 
6
+ /* ── Design tokens ─────────────────────────────────────
7
+ Versioned tokens — radius, elevation, motion.
8
+ These are the only knobs that should appear in component
9
+ styles. If you find yourself reaching for a hard-coded
10
+ shadow / radius / duration, promote it here first.
11
+ See DESIGN_SYSTEM.md → "Tokens" for usage guidance.
12
+ ───────────────────────────────────────────────────── */
13
+
14
+ :root {
15
+ /* Radius scale — applied via `rounded-[var(--radius-md)]` or via
16
+ the `.r-{step}` utilities below. */
17
+ --radius-sm: 0.5rem; /* 8px — chips, tight controls */
18
+ --radius-md: 0.75rem; /* 12px — inputs, small cards */
19
+ --radius-lg: 1rem; /* 16px — buttons, list items */
20
+ --radius-xl: 1.25rem; /* 20px — cards, panels */
21
+ --radius-2xl: 1.5rem; /* 24px — modals, hero surfaces */
22
+ --radius-pill: 9999px; /* full round */
23
+
24
+ /* Elevation scale — semantic box-shadow tokens. The names map to
25
+ the surface's *role*, not a numeric depth, so consumers don't
26
+ have to remember whether a modal is z-3 or z-4. */
27
+ --elevation-flat:
28
+ 0 1px 2px 0 rgba(15, 23, 42, 0.04);
29
+ --elevation-raised:
30
+ 0 4px 12px -2px rgba(15, 23, 42, 0.08),
31
+ 0 2px 4px -2px rgba(15, 23, 42, 0.04);
32
+ --elevation-floating:
33
+ 0 12px 24px -8px rgba(15, 23, 42, 0.12),
34
+ 0 4px 8px -4px rgba(15, 23, 42, 0.06);
35
+ --elevation-modal:
36
+ 0 40px 100px -30px rgba(0, 0, 0, 0.45),
37
+ 0 16px 40px -12px rgba(0, 0, 0, 0.18);
38
+ --elevation-orbital:
39
+ 0 60px 160px -40px rgba(99, 102, 241, 0.35),
40
+ 0 20px 60px -20px rgba(168, 85, 247, 0.22);
41
+
42
+ /* Motion: duration scale (matches Tailwind `duration-*` arbitrary
43
+ values). Animations: any consumer should pick a duration token
44
+ instead of inventing a number.
45
+
46
+ - xs (90ms) — micro feedback (toggle thumb, hover tint)
47
+ - sm (150ms) — button press, popover open
48
+ - md (240ms) — card hover, drawer slide
49
+ - lg (360ms) — page transitions, modal enter */
50
+ --duration-xs: 90ms;
51
+ --duration-sm: 150ms;
52
+ --duration-md: 240ms;
53
+ --duration-lg: 360ms;
54
+
55
+ /* Motion: easing curves. `standard` is the default product curve;
56
+ `emphasized` is for entering elements; `decelerate` for arrivals;
57
+ `accelerate` for departures. */
58
+ --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
59
+ --ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
60
+ --ease-decelerate: cubic-bezier(0, 0, 0.2, 1);
61
+ --ease-accelerate: cubic-bezier(0.4, 0, 1, 1);
62
+ --ease-ios: cubic-bezier(0.25, 0.46, 0.45, 0.94);
63
+ }
64
+
65
+ /* Dark mode keeps the same radius/duration tokens; only elevation
66
+ bumps darker so glass surfaces still feel lifted on dark grounds. */
67
+ :is(.dark) {
68
+ --elevation-flat:
69
+ 0 1px 2px 0 rgba(0, 0, 0, 0.4);
70
+ --elevation-raised:
71
+ 0 4px 12px -2px rgba(0, 0, 0, 0.5),
72
+ 0 2px 4px -2px rgba(0, 0, 0, 0.3);
73
+ --elevation-floating:
74
+ 0 12px 24px -8px rgba(0, 0, 0, 0.6),
75
+ 0 4px 8px -4px rgba(0, 0, 0, 0.4);
76
+ --elevation-modal:
77
+ 0 40px 100px -30px rgba(0, 0, 0, 0.7),
78
+ 0 16px 40px -12px rgba(0, 0, 0, 0.5);
79
+ }
80
+
81
+ /* Honor `prefers-reduced-motion` at the token layer — any consumer
82
+ reading `var(--duration-md)` automatically gets 0ms when the user
83
+ opts out. WCAG 2.3.3. */
84
+ @media (prefers-reduced-motion: reduce) {
85
+ :root {
86
+ --duration-xs: 0ms;
87
+ --duration-sm: 0ms;
88
+ --duration-md: 0ms;
89
+ --duration-lg: 0ms;
90
+ }
91
+ }
92
+
93
+ /* ── Token utility classes ─────────────────────────────
94
+ Tiny wrappers so consumers can write `.r-md` instead of
95
+ `[border-radius:var(--radius-md)]`. */
96
+
97
+ .r-sm { border-radius: var(--radius-sm); }
98
+ .r-md { border-radius: var(--radius-md); }
99
+ .r-lg { border-radius: var(--radius-lg); }
100
+ .r-xl { border-radius: var(--radius-xl); }
101
+ .r-2xl { border-radius: var(--radius-2xl); }
102
+ .r-pill { border-radius: var(--radius-pill); }
103
+
104
+ .elevation-flat { box-shadow: var(--elevation-flat); }
105
+ .elevation-raised { box-shadow: var(--elevation-raised); }
106
+ .elevation-floating { box-shadow: var(--elevation-floating); }
107
+ .elevation-modal { box-shadow: var(--elevation-modal); }
108
+ .elevation-orbital { box-shadow: var(--elevation-orbital); }
109
+
6
110
  /* ── Surfaces ──────────────────────────────────────── */
7
111
 
8
112
  .liquid-surface {
@@ -354,6 +458,169 @@
354
458
  color: white;
355
459
  }
356
460
 
461
+ /* ── Button — gradient (primary CTA, indigo→purple) ─
462
+ Same crystal-illuminated mechanic as the ios-glass-* variants:
463
+ neutral glass at rest, fills with translucent indigo→purple
464
+ gradient on hover + inner highlight + tinted drop shadow. The
465
+ gradient is ONLY visible on hover — at rest the button looks
466
+ identical to ios-glass-blue's neutral state. */
467
+
468
+ .liquid-button-gradient {
469
+ /* Rest: same neutral glass as .liquid-button (so all CTAs read as
470
+ the same family at rest — gradient is the hover signal). */
471
+ background: rgb(255 255 255 / 0.35);
472
+ border: 1px solid rgb(255 255 255 / 0.5);
473
+ color: rgb(15 23 42); /* slate-900 — visible on glass at rest */
474
+ box-shadow:
475
+ 0 8px 32px -8px rgb(0 0 0 / 0.12),
476
+ inset 0 1px 2px 0 rgb(255 255 255 / 0.25);
477
+ backdrop-filter: blur(12px);
478
+ -webkit-backdrop-filter: blur(12px);
479
+ transition: background 0.3s ease, box-shadow 0.3s ease, color 0.3s ease, border-color 0.3s ease;
480
+ }
481
+
482
+ .liquid-button-gradient:hover {
483
+ /* Hover: gradient fills + inner highlight + violet/indigo glow */
484
+ background: linear-gradient(
485
+ 135deg,
486
+ rgba(99, 102, 241, 0.85) 0%, /* indigo-500 */
487
+ rgba(139, 92, 246, 0.85) 50%, /* violet-500 */
488
+ rgba(168, 85, 247, 0.85) 100% /* purple-500 */
489
+ );
490
+ border-color: rgba(255, 255, 255, 0.45);
491
+ color: #ffffff;
492
+ box-shadow:
493
+ inset 0 1px 2px rgba(255, 255, 255, 0.6),
494
+ inset 0 -1px 1px rgba(0, 0, 0, 0.12),
495
+ 0 12px 32px -8px rgba(99, 102, 241, 0.55),
496
+ 0 0 24px -4px rgba(168, 85, 247, 0.35);
497
+ backdrop-filter: blur(12px) saturate(1.6);
498
+ -webkit-backdrop-filter: blur(12px) saturate(1.6);
499
+ }
500
+
501
+ .dark .liquid-button-gradient {
502
+ background: linear-gradient(
503
+ 140deg,
504
+ rgba(30, 41, 59, 0.5) 0%,
505
+ rgba(15, 23, 42, 0.4) 45%,
506
+ rgba(15, 23, 42, 0.3) 100%
507
+ );
508
+ border-color: rgba(255, 255, 255, 0.18);
509
+ color: #ffffff;
510
+ box-shadow:
511
+ inset 0 1px 0 rgba(255, 255, 255, 0.18),
512
+ 0 10px 22px -16px rgba(0, 0, 0, 0.75);
513
+ }
514
+
515
+ /* ── Avatar — crystal disc ───────────────────────────
516
+ Reusable shell that turns any avatar (image OR initials) into a
517
+ translucent crystal puck. Same family as .liquid-button-gradient
518
+ at rest — inner highlight on the top edge, tinted drop shadow,
519
+ saturate boost. Interactive avatars (AvatarButton) get a brighter
520
+ hover illuminate, matching the crystal-iluminado pattern. */
521
+
522
+ .liquid-avatar {
523
+ position: relative;
524
+ overflow: hidden;
525
+ /* Slightly saturated so initials/photo colors look vivid through
526
+ the glass, not muted. */
527
+ filter: saturate(1.1);
528
+ /* OUTER shadow only — the inner highlight lives in `::after` so it
529
+ renders ABOVE the image content (an inset shadow would be hidden
530
+ by an opaque <img>). */
531
+ box-shadow:
532
+ 0 4px 14px -3px rgba(15, 23, 42, 0.22),
533
+ 0 1px 3px rgba(15, 23, 42, 0.08);
534
+ }
535
+
536
+ /* Specular highlight — soft white sheen across the top-left AND a
537
+ crisp 1px inner-edge highlight, both rendered on top of the
538
+ avatar content (image or initials) so the crystal effect survives
539
+ even when a photo fills the disc. */
540
+ .liquid-avatar::after {
541
+ content: '';
542
+ position: absolute;
543
+ inset: 0;
544
+ border-radius: inherit;
545
+ pointer-events: none;
546
+ z-index: 1;
547
+ background: radial-gradient(
548
+ 120% 80% at 30% 0%,
549
+ rgba(255, 255, 255, 0.45) 0%,
550
+ rgba(255, 255, 255, 0.12) 30%,
551
+ transparent 60%
552
+ );
553
+ /* Inner edge highlight — drawn via inset box-shadow on the pseudo
554
+ element so it sits over the image content. */
555
+ box-shadow:
556
+ inset 0 1.5px 2px rgba(255, 255, 255, 0.7),
557
+ inset 0 -1px 1.5px rgba(0, 0, 0, 0.08);
558
+ mix-blend-mode: screen;
559
+ transition: opacity 0.25s ease, box-shadow 0.25s ease;
560
+ }
561
+
562
+ .dark .liquid-avatar {
563
+ box-shadow:
564
+ 0 6px 18px -4px rgba(0, 0, 0, 0.55),
565
+ 0 1px 3px rgba(0, 0, 0, 0.3);
566
+ }
567
+
568
+ .dark .liquid-avatar::after {
569
+ background: radial-gradient(
570
+ 120% 80% at 30% 0%,
571
+ rgba(255, 255, 255, 0.25) 0%,
572
+ rgba(255, 255, 255, 0.06) 30%,
573
+ transparent 60%
574
+ );
575
+ box-shadow:
576
+ inset 0 1.5px 2px rgba(255, 255, 255, 0.28),
577
+ inset 0 -1px 1.5px rgba(0, 0, 0, 0.4);
578
+ }
579
+
580
+ /* Interactive variant — hover illuminates the sheen + adds a soft
581
+ indigo glow, same crystal-iluminado mechanic as the buttons. */
582
+ .liquid-avatar-interactive {
583
+ transition: transform 0.2s ease, box-shadow 0.3s ease;
584
+ cursor: pointer;
585
+ }
586
+
587
+ .liquid-avatar-interactive:hover {
588
+ transform: translateY(-1px);
589
+ /* `--avatar-glow` defaults to indigo; tone-styled avatars override
590
+ it inline so each avatar's hover glow matches its own tint. */
591
+ box-shadow:
592
+ inset 0 2px 3px rgba(255, 255, 255, 0.7),
593
+ inset 0 -1px 1.5px rgba(0, 0, 0, 0.06),
594
+ 0 8px 22px -4px var(--avatar-glow, rgba(99, 102, 241, 0.35)),
595
+ 0 2px 6px rgba(15, 23, 42, 0.12);
596
+ }
597
+
598
+ .liquid-avatar-interactive:hover::after {
599
+ opacity: 1.4;
600
+ }
601
+
602
+ .dark .liquid-avatar-interactive:hover {
603
+ box-shadow:
604
+ inset 0 2px 3px rgba(255, 255, 255, 0.32),
605
+ inset 0 -1px 1.5px rgba(0, 0, 0, 0.4),
606
+ 0 10px 26px -6px rgba(129, 132, 251, 0.45),
607
+ 0 2px 6px rgba(0, 0, 0, 0.4);
608
+ }
609
+
610
+ .dark .liquid-button-gradient:hover {
611
+ background: linear-gradient(
612
+ 135deg,
613
+ rgba(129, 132, 251, 0.85) 0%,
614
+ rgba(167, 132, 246, 0.85) 50%,
615
+ rgba(196, 125, 247, 0.85) 100%
616
+ );
617
+ border-color: rgba(255, 255, 255, 0.35);
618
+ box-shadow:
619
+ inset 0 1px 2px rgba(255, 255, 255, 0.35),
620
+ 0 14px 36px -10px rgba(129, 132, 251, 0.65),
621
+ 0 0 28px -4px rgba(196, 125, 247, 0.45);
622
+ }
623
+
357
624
  /* ── Filter pills — colored glassmorphism ──────────── */
358
625
 
359
626
  .liquid-pill {
@@ -519,10 +786,24 @@
519
786
  .liquid-pill:hover .liquid-pill-dismiss { opacity: 0.8; }
520
787
 
521
788
  /* ── Focus ring utilities ────────────────────────────
522
- Replace verbose inline focus ring Tailwind classes with a single class.
523
- Uses CSS outline (non-conflicting with box-shadow) for focus indicators.
789
+ Canonical focus indicator for the design system.
790
+
791
+ Use `.focus-ring` on any interactive element — it ships the
792
+ indigo 2px outline at /70 opacity with a 1px offset, matching
793
+ the WCAG 1.4.11 (≥ 3:1 non-text contrast) + 2.4.7 (visible
794
+ focus) floor documented in DESIGN_SYSTEM.md.
795
+
796
+ The legacy `.focus-ring-{color}` classes remain for cases where
797
+ a component owns its own accent color (e.g. emerald confirm
798
+ buttons), but new code should default to `.focus-ring`.
524
799
  ───────────────────────────────────────────────────── */
525
800
 
801
+ .focus-ring:focus { outline: none; }
802
+ .focus-ring:focus-visible {
803
+ outline: 2px solid color-mix(in oklab, var(--color-indigo-500) 70%, transparent);
804
+ outline-offset: 1px;
805
+ }
806
+
526
807
  .focus-ring-blue:focus { outline: none; }
527
808
  .focus-ring-blue:focus-visible {
528
809
  outline: 2px solid var(--color-blue-500);