@quilltap/theme-storybook 1.0.62 → 1.0.64

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
@@ -2,6 +2,15 @@
2
2
 
3
3
  All notable changes to `@quilltap/theme-storybook` will be documented in this file.
4
4
 
5
+ ## [1.0.63] - 2026-08-25
6
+
7
+ ### Added
8
+ - The rest of the `qt-*` utility families the app actually ships, so a theme can be previewed against what it will really meet: the missing opacity steps for `qt-bg-muted` (20–80), `qt-bg-card` (50–90), `qt-bg-primary`, `qt-bg-destructive`, `qt-bg-success`, `qt-bg-warning`, `qt-bg-info` and `qt-bg-secondary`; `qt-border-default`, `qt-border-primary`, `qt-border-destructive`, `qt-border-warning` and `qt-border-success` at their used opacities; `qt-text-secondary/50–80` and the status colours at `/80`; and the surface colours `qt-bg-default`, `qt-bg-input`, `qt-bg-secondary`, `qt-border-accent`, `qt-border-primary-foreground`.
9
+ - 34 state forms of those utilities — `hover:`, `focus:`, `disabled:`, `placeholder:`, `file:` and one named `group-hover/thumb:`. In the app every one of these is hand-written and escaped, because Tailwind generates no variants for a class declared inside `@layer utilities`; they are mirrored here so a theme author previewing hover states sees what the app actually ships rather than a resting state that never moves.
10
+
11
+ ### Notes
12
+ - The typography-sizing classes (`qt-text-small`, `qt-text-xs`, `qt-text-label`, `qt-text-label-xs`, `qt-text-large`, `qt-text-lead`, `qt-text-section`) live in the app's `@layer components` sheet and have never been mirrored here. Still outstanding; the color-carrying `qt-text-*` utilities are complete.
13
+
5
14
  ## [1.0.62] - 2026-08-25
6
15
 
7
16
  ### Added
package/dist/index.css CHANGED
@@ -423,6 +423,8 @@ body {
423
423
  --qt-queue-badge-group-radius: var(--radius-md);
424
424
  --qt-queue-badge-memory-bg: hsl(225 55% 48%);
425
425
  --qt-queue-badge-memory-fg: hsl(0 0% 100%);
426
+ --qt-queue-badge-embedding-bg: hsl(270 50% 48%);
427
+ --qt-queue-badge-embedding-fg: hsl(0 0% 100%);
426
428
  --qt-queue-badge-summary-bg: hsl(152 55% 38%);
427
429
  --qt-queue-badge-summary-fg: hsl(0 0% 100%);
428
430
  --qt-queue-badge-danger-bg: hsl(0 60% 48%);
@@ -1957,6 +1959,141 @@ body {
1957
1959
  .qt-text-on-destructive {
1958
1960
  color: var(--color-destructive-foreground);
1959
1961
  }
1962
+ .qt-bg-card\/50 {
1963
+ background-color: color-mix(in srgb, var(--color-card) 50%, transparent);
1964
+ }
1965
+ .qt-bg-card\/60 {
1966
+ background-color: color-mix(in srgb, var(--color-card) 60%, transparent);
1967
+ }
1968
+ .qt-bg-card\/80 {
1969
+ background-color: color-mix(in srgb, var(--color-card) 80%, transparent);
1970
+ }
1971
+ .qt-bg-card\/90 {
1972
+ background-color: color-mix(in srgb, var(--color-card) 90%, transparent);
1973
+ }
1974
+ .qt-bg-default {
1975
+ background-color: var(--color-background);
1976
+ }
1977
+ .qt-bg-destructive\/15 {
1978
+ background-color: color-mix(in srgb, var(--color-destructive) 15%, transparent);
1979
+ }
1980
+ .qt-bg-destructive\/80 {
1981
+ background-color: color-mix(in srgb, var(--color-destructive) 80%, transparent);
1982
+ }
1983
+ .qt-bg-info\/15 {
1984
+ background-color: color-mix(in srgb, var(--color-info) 15%, transparent);
1985
+ }
1986
+ .qt-bg-input {
1987
+ background-color: var(--color-input);
1988
+ }
1989
+ .qt-bg-muted-foreground\/20 {
1990
+ background-color: color-mix(in srgb, var(--color-muted-foreground) 20%, transparent);
1991
+ }
1992
+ .qt-bg-muted\/20 {
1993
+ background-color: color-mix(in srgb, var(--color-muted) 20%, transparent);
1994
+ }
1995
+ .qt-bg-muted\/30 {
1996
+ background-color: color-mix(in srgb, var(--color-muted) 30%, transparent);
1997
+ }
1998
+ .qt-bg-muted\/40 {
1999
+ background-color: color-mix(in srgb, var(--color-muted) 40%, transparent);
2000
+ }
2001
+ .qt-bg-muted\/50 {
2002
+ background-color: color-mix(in srgb, var(--color-muted) 50%, transparent);
2003
+ }
2004
+ .qt-bg-muted\/60 {
2005
+ background-color: color-mix(in srgb, var(--color-muted) 60%, transparent);
2006
+ }
2007
+ .qt-bg-muted\/70 {
2008
+ background-color: color-mix(in srgb, var(--color-muted) 70%, transparent);
2009
+ }
2010
+ .qt-bg-muted\/80 {
2011
+ background-color: color-mix(in srgb, var(--color-muted) 80%, transparent);
2012
+ }
2013
+ .qt-bg-primary\/15 {
2014
+ background-color: color-mix(in srgb, var(--color-primary) 15%, transparent);
2015
+ }
2016
+ .qt-bg-primary\/30 {
2017
+ background-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
2018
+ }
2019
+ .qt-bg-secondary\/50 {
2020
+ background-color: color-mix(in srgb, var(--color-secondary) 50%, transparent);
2021
+ }
2022
+ .qt-bg-success\/15 {
2023
+ background-color: color-mix(in srgb, var(--color-success) 15%, transparent);
2024
+ }
2025
+ .qt-bg-warning\/15 {
2026
+ background-color: color-mix(in srgb, var(--color-warning) 15%, transparent);
2027
+ }
2028
+ .qt-border-accent {
2029
+ border-color: var(--color-accent);
2030
+ }
2031
+ .qt-border-default\/50 {
2032
+ border-color: color-mix(in srgb, var(--color-border) 50%, transparent);
2033
+ }
2034
+ .qt-border-default\/60 {
2035
+ border-color: color-mix(in srgb, var(--color-border) 60%, transparent);
2036
+ }
2037
+ .qt-border-default\/70 {
2038
+ border-color: color-mix(in srgb, var(--color-border) 70%, transparent);
2039
+ }
2040
+ .qt-border-destructive\/20 {
2041
+ border-color: color-mix(in srgb, var(--color-destructive) 20%, transparent);
2042
+ }
2043
+ .qt-border-destructive\/40 {
2044
+ border-color: color-mix(in srgb, var(--color-destructive) 40%, transparent);
2045
+ }
2046
+ .qt-border-destructive\/50 {
2047
+ border-color: color-mix(in srgb, var(--color-destructive) 50%, transparent);
2048
+ }
2049
+ .qt-border-primary-foreground {
2050
+ border-color: var(--color-primary-foreground);
2051
+ }
2052
+ .qt-border-primary\/20 {
2053
+ border-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
2054
+ }
2055
+ .qt-border-primary\/30 {
2056
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
2057
+ }
2058
+ .qt-border-primary\/40 {
2059
+ border-color: color-mix(in srgb, var(--color-primary) 40%, transparent);
2060
+ }
2061
+ .qt-border-primary\/50 {
2062
+ border-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
2063
+ }
2064
+ .qt-border-primary\/60 {
2065
+ border-color: color-mix(in srgb, var(--color-primary) 60%, transparent);
2066
+ }
2067
+ .qt-border-success\/50 {
2068
+ border-color: color-mix(in srgb, var(--color-success) 50%, transparent);
2069
+ }
2070
+ .qt-border-warning\/50 {
2071
+ border-color: color-mix(in srgb, var(--color-warning) 50%, transparent);
2072
+ }
2073
+ .qt-text-destructive\/80 {
2074
+ color: color-mix(in srgb, var(--color-destructive) 80%, transparent);
2075
+ }
2076
+ .qt-text-info\/80 {
2077
+ color: color-mix(in srgb, var(--color-info) 80%, transparent);
2078
+ }
2079
+ .qt-text-secondary\/50 {
2080
+ color: color-mix(in srgb, var(--color-muted-foreground) 50%, transparent);
2081
+ }
2082
+ .qt-text-secondary\/60 {
2083
+ color: color-mix(in srgb, var(--color-muted-foreground) 60%, transparent);
2084
+ }
2085
+ .qt-text-secondary\/70 {
2086
+ color: color-mix(in srgb, var(--color-muted-foreground) 70%, transparent);
2087
+ }
2088
+ .qt-text-secondary\/80 {
2089
+ color: color-mix(in srgb, var(--color-muted-foreground) 80%, transparent);
2090
+ }
2091
+ .qt-text-success\/80 {
2092
+ color: color-mix(in srgb, var(--color-success) 80%, transparent);
2093
+ }
2094
+ .qt-text-warning\/80 {
2095
+ color: color-mix(in srgb, var(--color-warning) 80%, transparent);
2096
+ }
1960
2097
  .qt-hover-accent {
1961
2098
  transition: background-color 0.15s ease, color 0.15s ease;
1962
2099
  }
@@ -2099,6 +2236,111 @@ body {
2099
2236
  .hover\:qt-text-on-destructive:hover {
2100
2237
  color: var(--color-destructive-foreground);
2101
2238
  }
2239
+ .hover\:qt-bg-surface-hover:hover {
2240
+ background-color: var(--color-muted);
2241
+ }
2242
+ .hover\:qt-bg-muted:hover {
2243
+ background-color: var(--color-muted);
2244
+ }
2245
+ .hover\:qt-bg-muted\/30:hover {
2246
+ background-color: color-mix(in srgb, var(--color-muted) 30%, transparent);
2247
+ }
2248
+ .hover\:qt-bg-muted\/40:hover {
2249
+ background-color: color-mix(in srgb, var(--color-muted) 40%, transparent);
2250
+ }
2251
+ .hover\:qt-bg-muted\/50:hover {
2252
+ background-color: color-mix(in srgb, var(--color-muted) 50%, transparent);
2253
+ }
2254
+ .hover\:qt-bg-muted\/80:hover {
2255
+ background-color: color-mix(in srgb, var(--color-muted) 80%, transparent);
2256
+ }
2257
+ .hover\:qt-bg-primary\/5:hover {
2258
+ background-color: color-mix(in srgb, var(--color-primary) 5%, transparent);
2259
+ }
2260
+ .hover\:qt-bg-primary\/15:hover {
2261
+ background-color: color-mix(in srgb, var(--color-primary) 15%, transparent);
2262
+ }
2263
+ .hover\:qt-bg-primary\/20:hover {
2264
+ background-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
2265
+ }
2266
+ .hover\:qt-bg-primary\/90:hover {
2267
+ background-color: color-mix(in srgb, var(--color-primary) 90%, transparent);
2268
+ }
2269
+ .hover\:qt-bg-destructive:hover {
2270
+ background-color: var(--color-destructive);
2271
+ }
2272
+ .hover\:qt-bg-destructive\/20:hover {
2273
+ background-color: color-mix(in srgb, var(--color-destructive) 20%, transparent);
2274
+ }
2275
+ .hover\:qt-bg-destructive\/90:hover {
2276
+ background-color: color-mix(in srgb, var(--color-destructive) 90%, transparent);
2277
+ }
2278
+ .hover\:qt-bg-success\/20:hover {
2279
+ background-color: color-mix(in srgb, var(--color-success) 20%, transparent);
2280
+ }
2281
+ .hover\:qt-bg-success\/90:hover {
2282
+ background-color: color-mix(in srgb, var(--color-success) 90%, transparent);
2283
+ }
2284
+ .hover\:qt-bg-warning\/20:hover {
2285
+ background-color: color-mix(in srgb, var(--color-warning) 20%, transparent);
2286
+ }
2287
+ .hover\:qt-bg-info\/20:hover {
2288
+ background-color: color-mix(in srgb, var(--color-info) 20%, transparent);
2289
+ }
2290
+ .hover\:qt-text-destructive:hover {
2291
+ color: var(--color-destructive);
2292
+ }
2293
+ .hover\:qt-text-destructive\/80:hover {
2294
+ color: color-mix(in srgb, var(--color-destructive) 80%, transparent);
2295
+ }
2296
+ .hover\:qt-text-warning\/80:hover {
2297
+ color: color-mix(in srgb, var(--color-warning) 80%, transparent);
2298
+ }
2299
+ .hover\:qt-text-info\/80:hover {
2300
+ color: color-mix(in srgb, var(--color-info) 80%, transparent);
2301
+ }
2302
+ .hover\:qt-text-primary:hover {
2303
+ color: var(--qt-text-primary-fg, var(--color-foreground));
2304
+ }
2305
+ .hover\:qt-border-primary:hover {
2306
+ border-color: var(--color-primary);
2307
+ }
2308
+ .hover\:qt-border-primary\/50:hover {
2309
+ border-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
2310
+ }
2311
+ .hover\:qt-border-primary\/60:hover {
2312
+ border-color: color-mix(in srgb, var(--color-primary) 60%, transparent);
2313
+ }
2314
+ .hover\:qt-border-accent:hover {
2315
+ border-color: var(--color-accent);
2316
+ }
2317
+ .focus\:qt-border-primary:focus {
2318
+ border-color: var(--color-primary);
2319
+ }
2320
+ .disabled\:qt-bg-muted:disabled {
2321
+ background-color: var(--color-muted);
2322
+ }
2323
+ .disabled\:qt-text-secondary:disabled {
2324
+ color: var(--color-muted-foreground);
2325
+ }
2326
+ .placeholder\:qt-text-secondary::-moz-placeholder {
2327
+ color: var(--color-muted-foreground);
2328
+ }
2329
+ .placeholder\:qt-text-secondary::placeholder {
2330
+ color: var(--color-muted-foreground);
2331
+ }
2332
+ .file\:qt-bg-primary\/20::file-selector-button {
2333
+ background-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
2334
+ }
2335
+ .hover\:file\:qt-bg-primary\/30:hover::file-selector-button {
2336
+ background-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
2337
+ }
2338
+ .hover\:qt-shadow-md:hover {
2339
+ box-shadow: var(--qt-card-shadow-hover, 0 4px 12px hsl(225 18% 10% / 0.1), 0 2px 4px hsl(225 18% 10% / 0.05));
2340
+ }
2341
+ .group\/thumb:hover .group-hover\/thumb\:qt-bg-overlay-light {
2342
+ background-color: var(--qt-overlay-light-bg, rgb(0 0 0 / 0.2));
2343
+ }
2102
2344
  .qt-bg-overlay {
2103
2345
  background-color: var(--qt-overlay-bg, rgb(0 0 0 / 0.85));
2104
2346
  }
@@ -2570,6 +2812,11 @@ body {
2570
2812
  }
2571
2813
  }
2572
2814
  .dark {
2815
+ --qt-queue-badge-memory-bg: hsl(225 55% 55%);
2816
+ --qt-queue-badge-embedding-bg: hsl(270 50% 55%);
2817
+ --qt-queue-badge-summary-bg: hsl(152 50% 42%);
2818
+ --qt-queue-badge-danger-bg: hsl(0 60% 52%);
2819
+ --qt-queue-badge-story-bg: hsl(225 12% 44%);
2573
2820
  --qt-chat-whisper-bg: color-mix(in srgb, var(--qt-chat-assistant-bg) 60%, #6b5b95 40%);
2574
2821
  --qt-chat-whisper-border: #6b5b95;
2575
2822
  --qt-chat-whisper-label-fg: #b5a9d1;
@@ -2871,6 +3118,65 @@ body {
2871
3118
  background-color: var(--qt-terminal-closed-badge-bg);
2872
3119
  color: var(--qt-terminal-closed-badge-fg);
2873
3120
  }
3121
+ .qt-queue-badge-group {
3122
+ display: inline-flex;
3123
+ align-items: center;
3124
+ overflow: hidden;
3125
+ flex-shrink: 0;
3126
+ gap: var(--qt-queue-badge-group-gap);
3127
+ border-radius: var(--qt-queue-badge-group-radius);
3128
+ }
3129
+ .qt-queue-badge,
3130
+ .qt-queue-badge-memory,
3131
+ .qt-queue-badge-embedding,
3132
+ .qt-queue-badge-summary,
3133
+ .qt-queue-badge-danger,
3134
+ .qt-queue-badge-story {
3135
+ display: inline-flex;
3136
+ align-items: center;
3137
+ gap: 0.25rem;
3138
+ flex-shrink: 0;
3139
+ line-height: 1;
3140
+ white-space: nowrap;
3141
+ padding: var(--qt-queue-badge-padding-y) var(--qt-queue-badge-padding-x);
3142
+ font-size: var(--qt-queue-badge-font-size);
3143
+ font-weight: var(--qt-queue-badge-font-weight);
3144
+ transition: opacity 200ms ease;
3145
+ }
3146
+ .qt-queue-badge-idle {
3147
+ opacity: var(--qt-queue-badge-idle-opacity);
3148
+ }
3149
+ .qt-queue-badge-pulse {
3150
+ animation: qt-queue-badge-blip 600ms ease-in-out 2;
3151
+ }
3152
+ @keyframes qt-queue-badge-blip {
3153
+ 0%, 100% {
3154
+ opacity: var(--qt-queue-badge-idle-opacity);
3155
+ }
3156
+ 50% {
3157
+ opacity: 1;
3158
+ }
3159
+ }
3160
+ .qt-queue-badge-memory {
3161
+ background: var(--qt-queue-badge-memory-bg);
3162
+ color: var(--qt-queue-badge-memory-fg);
3163
+ }
3164
+ .qt-queue-badge-embedding {
3165
+ background: var(--qt-queue-badge-embedding-bg);
3166
+ color: var(--qt-queue-badge-embedding-fg);
3167
+ }
3168
+ .qt-queue-badge-summary {
3169
+ background: var(--qt-queue-badge-summary-bg);
3170
+ color: var(--qt-queue-badge-summary-fg);
3171
+ }
3172
+ .qt-queue-badge-danger {
3173
+ background: var(--qt-queue-badge-danger-bg);
3174
+ color: var(--qt-queue-badge-danger-fg);
3175
+ }
3176
+ .qt-queue-badge-story {
3177
+ background: var(--qt-queue-badge-story-bg);
3178
+ color: var(--qt-queue-badge-story-fg);
3179
+ }
2874
3180
  .qt-roleplay-1,
2875
3181
  .qt-roleplay-2,
2876
3182
  .qt-roleplay-3,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quilltap/theme-storybook",
3
- "version": "1.0.62",
3
+ "version": "1.0.64",
4
4
  "description": "Storybook preset and stories for developing Quilltap theme plugins",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -328,6 +328,8 @@
328
328
  --qt-queue-badge-group-radius: var(--radius-md);
329
329
  --qt-queue-badge-memory-bg: hsl(225 55% 48%);
330
330
  --qt-queue-badge-memory-fg: hsl(0 0% 100%);
331
+ --qt-queue-badge-embedding-bg: hsl(270 50% 48%);
332
+ --qt-queue-badge-embedding-fg: hsl(0 0% 100%);
331
333
  --qt-queue-badge-summary-bg: hsl(152 55% 38%);
332
334
  --qt-queue-badge-summary-fg: hsl(0 0% 100%);
333
335
  --qt-queue-badge-danger-bg: hsl(0 60% 48%);
@@ -2380,6 +2382,190 @@
2380
2382
  color: var(--color-destructive-foreground);
2381
2383
  }
2382
2384
 
2385
+ /* The remaining opacity steps and surface colours of the utility families. A
2386
+ theme that overrides --color-muted or --color-border gets all of these for
2387
+ free; they exist so that the app never has to reach for a raw Tailwind
2388
+ colour on a themed surface. */
2389
+ .qt-bg-card\/50 {
2390
+ background-color: color-mix(in srgb, var(--color-card) 50%, transparent);
2391
+ }
2392
+
2393
+ .qt-bg-card\/60 {
2394
+ background-color: color-mix(in srgb, var(--color-card) 60%, transparent);
2395
+ }
2396
+
2397
+ .qt-bg-card\/80 {
2398
+ background-color: color-mix(in srgb, var(--color-card) 80%, transparent);
2399
+ }
2400
+
2401
+ .qt-bg-card\/90 {
2402
+ background-color: color-mix(in srgb, var(--color-card) 90%, transparent);
2403
+ }
2404
+
2405
+ .qt-bg-default {
2406
+ background-color: var(--color-background);
2407
+ }
2408
+
2409
+ .qt-bg-destructive\/15 {
2410
+ background-color: color-mix(in srgb, var(--color-destructive) 15%, transparent);
2411
+ }
2412
+
2413
+ .qt-bg-destructive\/80 {
2414
+ background-color: color-mix(in srgb, var(--color-destructive) 80%, transparent);
2415
+ }
2416
+
2417
+ .qt-bg-info\/15 {
2418
+ background-color: color-mix(in srgb, var(--color-info) 15%, transparent);
2419
+ }
2420
+
2421
+ .qt-bg-input {
2422
+ background-color: var(--color-input);
2423
+ }
2424
+
2425
+ .qt-bg-muted-foreground\/20 {
2426
+ background-color: color-mix(in srgb, var(--color-muted-foreground) 20%, transparent);
2427
+ }
2428
+
2429
+ .qt-bg-muted\/20 {
2430
+ background-color: color-mix(in srgb, var(--color-muted) 20%, transparent);
2431
+ }
2432
+
2433
+ .qt-bg-muted\/30 {
2434
+ background-color: color-mix(in srgb, var(--color-muted) 30%, transparent);
2435
+ }
2436
+
2437
+ .qt-bg-muted\/40 {
2438
+ background-color: color-mix(in srgb, var(--color-muted) 40%, transparent);
2439
+ }
2440
+
2441
+ .qt-bg-muted\/50 {
2442
+ background-color: color-mix(in srgb, var(--color-muted) 50%, transparent);
2443
+ }
2444
+
2445
+ .qt-bg-muted\/60 {
2446
+ background-color: color-mix(in srgb, var(--color-muted) 60%, transparent);
2447
+ }
2448
+
2449
+ .qt-bg-muted\/70 {
2450
+ background-color: color-mix(in srgb, var(--color-muted) 70%, transparent);
2451
+ }
2452
+
2453
+ .qt-bg-muted\/80 {
2454
+ background-color: color-mix(in srgb, var(--color-muted) 80%, transparent);
2455
+ }
2456
+
2457
+ .qt-bg-primary\/15 {
2458
+ background-color: color-mix(in srgb, var(--color-primary) 15%, transparent);
2459
+ }
2460
+
2461
+ .qt-bg-primary\/30 {
2462
+ background-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
2463
+ }
2464
+
2465
+ .qt-bg-secondary\/50 {
2466
+ background-color: color-mix(in srgb, var(--color-secondary) 50%, transparent);
2467
+ }
2468
+
2469
+ .qt-bg-success\/15 {
2470
+ background-color: color-mix(in srgb, var(--color-success) 15%, transparent);
2471
+ }
2472
+
2473
+ .qt-bg-warning\/15 {
2474
+ background-color: color-mix(in srgb, var(--color-warning) 15%, transparent);
2475
+ }
2476
+
2477
+ .qt-border-accent {
2478
+ border-color: var(--color-accent);
2479
+ }
2480
+
2481
+ .qt-border-default\/50 {
2482
+ border-color: color-mix(in srgb, var(--color-border) 50%, transparent);
2483
+ }
2484
+
2485
+ .qt-border-default\/60 {
2486
+ border-color: color-mix(in srgb, var(--color-border) 60%, transparent);
2487
+ }
2488
+
2489
+ .qt-border-default\/70 {
2490
+ border-color: color-mix(in srgb, var(--color-border) 70%, transparent);
2491
+ }
2492
+
2493
+ .qt-border-destructive\/20 {
2494
+ border-color: color-mix(in srgb, var(--color-destructive) 20%, transparent);
2495
+ }
2496
+
2497
+ .qt-border-destructive\/40 {
2498
+ border-color: color-mix(in srgb, var(--color-destructive) 40%, transparent);
2499
+ }
2500
+
2501
+ .qt-border-destructive\/50 {
2502
+ border-color: color-mix(in srgb, var(--color-destructive) 50%, transparent);
2503
+ }
2504
+
2505
+ .qt-border-primary-foreground {
2506
+ border-color: var(--color-primary-foreground);
2507
+ }
2508
+
2509
+ .qt-border-primary\/20 {
2510
+ border-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
2511
+ }
2512
+
2513
+ .qt-border-primary\/30 {
2514
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
2515
+ }
2516
+
2517
+ .qt-border-primary\/40 {
2518
+ border-color: color-mix(in srgb, var(--color-primary) 40%, transparent);
2519
+ }
2520
+
2521
+ .qt-border-primary\/50 {
2522
+ border-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
2523
+ }
2524
+
2525
+ .qt-border-primary\/60 {
2526
+ border-color: color-mix(in srgb, var(--color-primary) 60%, transparent);
2527
+ }
2528
+
2529
+ .qt-border-success\/50 {
2530
+ border-color: color-mix(in srgb, var(--color-success) 50%, transparent);
2531
+ }
2532
+
2533
+ .qt-border-warning\/50 {
2534
+ border-color: color-mix(in srgb, var(--color-warning) 50%, transparent);
2535
+ }
2536
+
2537
+ .qt-text-destructive\/80 {
2538
+ color: color-mix(in srgb, var(--color-destructive) 80%, transparent);
2539
+ }
2540
+
2541
+ .qt-text-info\/80 {
2542
+ color: color-mix(in srgb, var(--color-info) 80%, transparent);
2543
+ }
2544
+
2545
+ .qt-text-secondary\/50 {
2546
+ color: color-mix(in srgb, var(--color-muted-foreground) 50%, transparent);
2547
+ }
2548
+
2549
+ .qt-text-secondary\/60 {
2550
+ color: color-mix(in srgb, var(--color-muted-foreground) 60%, transparent);
2551
+ }
2552
+
2553
+ .qt-text-secondary\/70 {
2554
+ color: color-mix(in srgb, var(--color-muted-foreground) 70%, transparent);
2555
+ }
2556
+
2557
+ .qt-text-secondary\/80 {
2558
+ color: color-mix(in srgb, var(--color-muted-foreground) 80%, transparent);
2559
+ }
2560
+
2561
+ .qt-text-success\/80 {
2562
+ color: color-mix(in srgb, var(--color-success) 80%, transparent);
2563
+ }
2564
+
2565
+ .qt-text-warning\/80 {
2566
+ color: color-mix(in srgb, var(--color-warning) 80%, transparent);
2567
+ }
2568
+
2383
2569
  /* Hoverable accent surface — list rows, menu items, and option cards that
2384
2570
  should highlight on hover. On hover it paints the accent background AND
2385
2571
  forces the accent foreground onto the row and every descendant, so the whole
@@ -2591,6 +2777,147 @@
2591
2777
  color: var(--color-destructive-foreground);
2592
2778
  }
2593
2779
 
2780
+ /* State forms of the utilities above. Tailwind generates variants only for
2781
+ utilities it knows about, and a class declared in @layer utilities is
2782
+ invisible to it — so in the app every one of these is hand-written, escaped,
2783
+ with its own pseudo-selector, and an unwritten one is inert. Mirrored here so
2784
+ a theme author previewing hover states sees what the app actually ships. */
2785
+ .hover\:qt-bg-surface-hover:hover {
2786
+ background-color: var(--color-muted);
2787
+ }
2788
+
2789
+ .hover\:qt-bg-muted:hover {
2790
+ background-color: var(--color-muted);
2791
+ }
2792
+
2793
+ .hover\:qt-bg-muted\/30:hover {
2794
+ background-color: color-mix(in srgb, var(--color-muted) 30%, transparent);
2795
+ }
2796
+
2797
+ .hover\:qt-bg-muted\/40:hover {
2798
+ background-color: color-mix(in srgb, var(--color-muted) 40%, transparent);
2799
+ }
2800
+
2801
+ .hover\:qt-bg-muted\/50:hover {
2802
+ background-color: color-mix(in srgb, var(--color-muted) 50%, transparent);
2803
+ }
2804
+
2805
+ .hover\:qt-bg-muted\/80:hover {
2806
+ background-color: color-mix(in srgb, var(--color-muted) 80%, transparent);
2807
+ }
2808
+
2809
+ .hover\:qt-bg-primary\/5:hover {
2810
+ background-color: color-mix(in srgb, var(--color-primary) 5%, transparent);
2811
+ }
2812
+
2813
+ .hover\:qt-bg-primary\/15:hover {
2814
+ background-color: color-mix(in srgb, var(--color-primary) 15%, transparent);
2815
+ }
2816
+
2817
+ .hover\:qt-bg-primary\/20:hover {
2818
+ background-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
2819
+ }
2820
+
2821
+ .hover\:qt-bg-primary\/90:hover {
2822
+ background-color: color-mix(in srgb, var(--color-primary) 90%, transparent);
2823
+ }
2824
+
2825
+ .hover\:qt-bg-destructive:hover {
2826
+ background-color: var(--color-destructive);
2827
+ }
2828
+
2829
+ .hover\:qt-bg-destructive\/20:hover {
2830
+ background-color: color-mix(in srgb, var(--color-destructive) 20%, transparent);
2831
+ }
2832
+
2833
+ .hover\:qt-bg-destructive\/90:hover {
2834
+ background-color: color-mix(in srgb, var(--color-destructive) 90%, transparent);
2835
+ }
2836
+
2837
+ .hover\:qt-bg-success\/20:hover {
2838
+ background-color: color-mix(in srgb, var(--color-success) 20%, transparent);
2839
+ }
2840
+
2841
+ .hover\:qt-bg-success\/90:hover {
2842
+ background-color: color-mix(in srgb, var(--color-success) 90%, transparent);
2843
+ }
2844
+
2845
+ .hover\:qt-bg-warning\/20:hover {
2846
+ background-color: color-mix(in srgb, var(--color-warning) 20%, transparent);
2847
+ }
2848
+
2849
+ .hover\:qt-bg-info\/20:hover {
2850
+ background-color: color-mix(in srgb, var(--color-info) 20%, transparent);
2851
+ }
2852
+
2853
+ .hover\:qt-text-destructive:hover {
2854
+ color: var(--color-destructive);
2855
+ }
2856
+
2857
+ .hover\:qt-text-destructive\/80:hover {
2858
+ color: color-mix(in srgb, var(--color-destructive) 80%, transparent);
2859
+ }
2860
+
2861
+ .hover\:qt-text-warning\/80:hover {
2862
+ color: color-mix(in srgb, var(--color-warning) 80%, transparent);
2863
+ }
2864
+
2865
+ .hover\:qt-text-info\/80:hover {
2866
+ color: color-mix(in srgb, var(--color-info) 80%, transparent);
2867
+ }
2868
+
2869
+ .hover\:qt-text-primary:hover {
2870
+ color: var(--qt-text-primary-fg, var(--color-foreground));
2871
+ }
2872
+
2873
+ .hover\:qt-border-primary:hover {
2874
+ border-color: var(--color-primary);
2875
+ }
2876
+
2877
+ .hover\:qt-border-primary\/50:hover {
2878
+ border-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
2879
+ }
2880
+
2881
+ .hover\:qt-border-primary\/60:hover {
2882
+ border-color: color-mix(in srgb, var(--color-primary) 60%, transparent);
2883
+ }
2884
+
2885
+ .hover\:qt-border-accent:hover {
2886
+ border-color: var(--color-accent);
2887
+ }
2888
+
2889
+ .focus\:qt-border-primary:focus {
2890
+ border-color: var(--color-primary);
2891
+ }
2892
+
2893
+ .disabled\:qt-bg-muted:disabled {
2894
+ background-color: var(--color-muted);
2895
+ }
2896
+
2897
+ .disabled\:qt-text-secondary:disabled {
2898
+ color: var(--color-muted-foreground);
2899
+ }
2900
+
2901
+ .placeholder\:qt-text-secondary::placeholder {
2902
+ color: var(--color-muted-foreground);
2903
+ }
2904
+
2905
+ .file\:qt-bg-primary\/20::file-selector-button {
2906
+ background-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
2907
+ }
2908
+
2909
+ .hover\:file\:qt-bg-primary\/30:hover::file-selector-button {
2910
+ background-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
2911
+ }
2912
+
2913
+ .hover\:qt-shadow-md:hover {
2914
+ box-shadow: var(--qt-card-shadow-hover, 0 4px 12px hsl(225 18% 10% / 0.1), 0 2px 4px hsl(225 18% 10% / 0.05));
2915
+ }
2916
+
2917
+ .group\/thumb:hover .group-hover\/thumb\:qt-bg-overlay-light {
2918
+ background-color: var(--qt-overlay-light-bg, rgb(0 0 0 / 0.2));
2919
+ }
2920
+
2594
2921
  /* ==========================================================================
2595
2922
  OVERLAY UTILITIES
2596
2923
  For image modals, lightboxes, and overlay UI elements.
@@ -3203,6 +3530,13 @@
3203
3530
  Adjusted colors for dark backgrounds with better contrast
3204
3531
  ========================================================================== */
3205
3532
  .dark {
3533
+ /* Queue status badges — dark mode */
3534
+ --qt-queue-badge-memory-bg: hsl(225 55% 55%);
3535
+ --qt-queue-badge-embedding-bg: hsl(270 50% 55%);
3536
+ --qt-queue-badge-summary-bg: hsl(152 50% 42%);
3537
+ --qt-queue-badge-danger-bg: hsl(0 60% 52%);
3538
+ --qt-queue-badge-story-bg: hsl(225 12% 44%);
3539
+
3206
3540
  /* Chat: Whisper messages — dark mode */
3207
3541
  --qt-chat-whisper-bg: color-mix(in srgb, var(--qt-chat-assistant-bg) 60%, #6b5b95 40%);
3208
3542
  --qt-chat-whisper-border: #6b5b95;
@@ -3612,6 +3946,80 @@
3612
3946
  color: var(--qt-terminal-closed-badge-fg);
3613
3947
  }
3614
3948
 
3949
+ /* ==========================================================================
3950
+ QUEUE STATUS BADGE GROUP
3951
+ The compact chip group in the page toolbar reporting in-flight background
3952
+ activity per kind (memory, embedding, summarization, the Concierge, images).
3953
+ ========================================================================== */
3954
+ .qt-queue-badge-group {
3955
+ display: inline-flex;
3956
+ align-items: center;
3957
+ overflow: hidden;
3958
+ flex-shrink: 0;
3959
+ gap: var(--qt-queue-badge-group-gap);
3960
+ border-radius: var(--qt-queue-badge-group-radius);
3961
+ }
3962
+
3963
+ .qt-queue-badge,
3964
+ .qt-queue-badge-memory,
3965
+ .qt-queue-badge-embedding,
3966
+ .qt-queue-badge-summary,
3967
+ .qt-queue-badge-danger,
3968
+ .qt-queue-badge-story {
3969
+ display: inline-flex;
3970
+ align-items: center;
3971
+ gap: 0.25rem;
3972
+ flex-shrink: 0;
3973
+ line-height: 1;
3974
+ white-space: nowrap;
3975
+ padding: var(--qt-queue-badge-padding-y) var(--qt-queue-badge-padding-x);
3976
+ font-size: var(--qt-queue-badge-font-size);
3977
+ font-weight: var(--qt-queue-badge-font-weight);
3978
+ transition: opacity 200ms ease;
3979
+ }
3980
+
3981
+ /* Idle state (count is 0). */
3982
+ .qt-queue-badge-idle {
3983
+ opacity: var(--qt-queue-badge-idle-opacity);
3984
+ }
3985
+
3986
+ /* Blip — work that started and finished between two polls of the activity
3987
+ snapshot never shows up as a count, so the badge pulses to mark that it
3988
+ happened. */
3989
+ .qt-queue-badge-pulse {
3990
+ animation: qt-queue-badge-blip 600ms ease-in-out 2;
3991
+ }
3992
+
3993
+ @keyframes qt-queue-badge-blip {
3994
+ 0%, 100% { opacity: var(--qt-queue-badge-idle-opacity); }
3995
+ 50% { opacity: 1; }
3996
+ }
3997
+
3998
+ .qt-queue-badge-memory {
3999
+ background: var(--qt-queue-badge-memory-bg);
4000
+ color: var(--qt-queue-badge-memory-fg);
4001
+ }
4002
+
4003
+ .qt-queue-badge-embedding {
4004
+ background: var(--qt-queue-badge-embedding-bg);
4005
+ color: var(--qt-queue-badge-embedding-fg);
4006
+ }
4007
+
4008
+ .qt-queue-badge-summary {
4009
+ background: var(--qt-queue-badge-summary-bg);
4010
+ color: var(--qt-queue-badge-summary-fg);
4011
+ }
4012
+
4013
+ .qt-queue-badge-danger {
4014
+ background: var(--qt-queue-badge-danger-bg);
4015
+ color: var(--qt-queue-badge-danger-fg);
4016
+ }
4017
+
4018
+ .qt-queue-badge-story {
4019
+ background: var(--qt-queue-badge-story-bg);
4020
+ color: var(--qt-queue-badge-story-fg);
4021
+ }
4022
+
3615
4023
  /* ==========================================================================
3616
4024
  ROLEPLAY-TEMPLATE STYLES
3617
4025
  The chips + add-on flourishes a roleplay-template delimiter can opt into. In