@joewinke/jatui 0.2.4 → 0.2.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.
Files changed (30) hide show
  1. package/CLAUDE.md +19 -2
  2. package/dist/components/AnnotationPanel.svelte +64 -57
  3. package/dist/components/AnnotationPanel.svelte.d.ts +2 -0
  4. package/dist/components/BurndownChart.svelte +3 -3
  5. package/dist/components/CommandPalette.svelte +22 -22
  6. package/dist/components/CopyButton.svelte +0 -5
  7. package/dist/components/ImageLightbox.svelte +5 -0
  8. package/dist/components/ImageLightbox.svelte.d.ts +2 -0
  9. package/dist/components/MediaWorkbench.svelte +1 -1
  10. package/dist/components/PinInput.svelte +1 -1
  11. package/dist/components/SearchDropdown.svelte +3 -3
  12. package/dist/components/Skeleton.svelte +9 -9
  13. package/dist/components/Tabs.svelte +3 -3
  14. package/dist/components/TextInput.svelte +2 -2
  15. package/dist/components/messaging/MessageInput.svelte +3 -3
  16. package/dist/components/messaging/QuotedMessageDisplay.svelte +2 -2
  17. package/dist/components/progress/ProgressBar.svelte +10 -10
  18. package/dist/components/progress/ProgressRing.svelte +10 -10
  19. package/dist/components/progress/Steps.svelte +21 -21
  20. package/dist/components/table/DataTable.svelte +10 -10
  21. package/dist/dnd/types.d.ts +0 -9
  22. package/dist/showcase/AnimatedBeam.svelte +8 -3
  23. package/dist/showcase/AuroraDrift.svelte +3 -3
  24. package/dist/showcase/BentoCard.svelte +3 -3
  25. package/dist/showcase/BorderBeam.svelte +2 -2
  26. package/dist/showcase/CursorSpotlight.svelte +1 -1
  27. package/dist/showcase/DeviceMock.svelte +25 -25
  28. package/dist/showcase/Dock.svelte +7 -7
  29. package/dist/showcase/Terminal.svelte +7 -7
  30. package/package.json +2 -2
package/CLAUDE.md CHANGED
@@ -106,9 +106,9 @@ Then import:
106
106
  |-----------|---------|-----------|
107
107
  | `MarkupEditor` | Fullscreen canvas markup tool — draw arrows, boxes, ellipses, revision clouds, freehand, text over an image | `imageUrl`, `initialShapes?: MarkupShape[]`, `onsave: (shapes) => void`, `oncancel: () => void` |
108
108
  | `MarkupOverlay` | Read-only canvas layer that renders saved `MarkupShape[]` over an image | `shapes: MarkupShape[]`, `imageUrl` |
109
- | `ImageLightbox` | Inline image viewer with fullscreen modal, zoom controls, optional markup + annotation overlays | `imageUrl`, `filename?`, `markupShapes?`, `annotations?`, `activeAnnotationId?`, `annotationMode?`, `onAnnotationClick?`, `onImageClick?`, `onClose?` |
109
+ | `ImageLightbox` | Inline image viewer with fullscreen modal, zoom controls, optional markup + annotation overlays | `imageUrl`, `filename?`, `markupShapes?`, `annotations?`, `activeAnnotationId?`, `annotationMode?`, `showResolved?` (forwarded to the internal `AnnotationLayer`; default false), `onAnnotationClick?`, `onImageClick?`, `onClose?` |
110
110
  | `AnnotationLayer` | Absolute-positioned pin overlay — renders threaded annotation pins at `x_percent`/`y_percent` coordinates | `annotations: Annotation[]`, `activeAnnotationId?`, `annotationMode?`, `showResolved?`, `onAnnotationClick?`, `onImageClick?` |
111
- | `AnnotationPanel` | Sidebar thread list for annotations — reply, resolve, edit, delete. Uses callback props for async ops. | `annotations`, `profiles`, `activeAnnotationId?`, `currentUserId`, `callbacks: AnnotationCallbacks`, `onAnnotationSelect?`, `onAnnotationsChanged?` |
111
+ | `AnnotationPanel` | Sidebar thread list for annotations — reply, resolve, edit, delete. Uses callback props for async ops. | `annotations`, `profiles`, `activeAnnotationId?`, `currentUserId`, `callbacks: AnnotationCallbacks`, `readOnly?` (hides reply/resolve/edit/delete affordances; thread list stays readable), `onAnnotationSelect?`, `onAnnotationsChanged?` |
112
112
 
113
113
  **Types & utilities:**
114
114
  ```typescript
@@ -239,6 +239,23 @@ If the project uses JST (Joe's Software Template), browse component demos at `/c
239
239
  - Check the component source in `src/lib/components/` for full prop types
240
240
  - Prefer jatui components over building custom ones when there's a match
241
241
 
242
+ ## Releasing — never run `npm publish`
243
+
244
+ **To cut a release: bump `version` in `package.json`, commit, push to master. That's the whole job.**
245
+
246
+ `.github/workflows/publish.yml` publishes to npm on any push to master that touches
247
+ `package.json`, authenticating via npm Trusted Publishing (OIDC) — no token, and every
248
+ release carries a provenance attestation. The workflow is idempotent: if the version is
249
+ already on the registry it exits green without republishing, so re-running it is safe.
250
+
251
+ Publishing from a dev box instead does two bad things: the release is attributed to a
252
+ person rather than the attested `GitHub Actions` identity (**provenance is lost**), and it
253
+ races the workflow — that is exactly how 0.2.5 shipped by hand at 16:16:21Z and left CI red
254
+ with an `E403: cannot publish over the previously published version`.
255
+
256
+ `prepublishOnly` now runs `scripts/guard-ci-publish.mjs`, which hard-fails any publish
257
+ outside CI. If you hit that error, you are doing it wrong — bump the version and push.
258
+
242
259
  # Layering Policy (DaisyUI is an implementation detail)
243
260
 
244
261
  Three rules keep DaisyUI swappable instead of load-bearing:
@@ -7,6 +7,8 @@
7
7
  activeAnnotationId?: string | null
8
8
  currentUserId: string
9
9
  callbacks: AnnotationCallbacks
10
+ /** Hides reply/resolve/edit/delete affordances — thread list stays readable */
11
+ readOnly?: boolean
10
12
  onAnnotationSelect?: (annotation: Annotation | null) => void
11
13
  onAnnotationsChanged?: () => void
12
14
  }
@@ -17,6 +19,7 @@
17
19
  activeAnnotationId = null,
18
20
  currentUserId,
19
21
  callbacks,
22
+ readOnly = false,
20
23
  onAnnotationSelect,
21
24
  onAnnotationsChanged,
22
25
  }: Props = $props()
@@ -202,37 +205,39 @@
202
205
  {#if isActive}
203
206
  <div class="px-3 pb-3 space-y-2">
204
207
  <!-- Actions for root -->
205
- <div class="flex items-center gap-1 ml-8">
206
- <button
207
- class="btn btn-ghost btn-xs gap-1 {thread.root.resolved ? 'text-warning' : 'text-success'}"
208
- onclick={() => toggleResolve(thread.root)}
209
- >
210
- {#if thread.root.resolved}
211
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
212
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
213
- </svg>
214
- Reopen
215
- {:else}
216
- <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
217
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
218
- </svg>
219
- Resolve
220
- {/if}
221
- </button>
222
- {#if thread.root.user_id === currentUserId}
223
- <button
224
- class="btn btn-ghost btn-xs text-base-content/50"
225
- onclick={() => startEdit(thread.root)}
226
- >Edit</button>
208
+ {#if !readOnly}
209
+ <div class="flex items-center gap-1 ml-8">
227
210
  <button
228
- class="btn btn-ghost btn-xs text-error/70"
229
- onclick={() => deleteAnnotation(thread.root.id)}
230
- >Delete</button>
231
- {/if}
232
- </div>
211
+ class="btn btn-ghost btn-xs gap-1 {thread.root.resolved ? 'text-warning' : 'text-success'}"
212
+ onclick={() => toggleResolve(thread.root)}
213
+ >
214
+ {#if thread.root.resolved}
215
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
216
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
217
+ </svg>
218
+ Reopen
219
+ {:else}
220
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
221
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
222
+ </svg>
223
+ Resolve
224
+ {/if}
225
+ </button>
226
+ {#if thread.root.user_id === currentUserId}
227
+ <button
228
+ class="btn btn-ghost btn-xs text-base-content/50"
229
+ onclick={() => startEdit(thread.root)}
230
+ >Edit</button>
231
+ <button
232
+ class="btn btn-ghost btn-xs text-error/70"
233
+ onclick={() => deleteAnnotation(thread.root.id)}
234
+ >Delete</button>
235
+ {/if}
236
+ </div>
237
+ {/if}
233
238
 
234
239
  <!-- Edit form for root -->
235
- {#if editingId === thread.root.id}
240
+ {#if !readOnly && editingId === thread.root.id}
236
241
  <div class="ml-8 space-y-1.5">
237
242
  <textarea
238
243
  class="textarea textarea-bordered textarea-sm w-full"
@@ -257,7 +262,7 @@
257
262
  <span class="text-xs font-medium">{getAuthorName(reply.user_id)}</span>
258
263
  <span class="text-[10px] text-base-content/40">{formatTime(reply.created_at)}</span>
259
264
  </div>
260
- {#if editingId === reply.id}
265
+ {#if !readOnly && editingId === reply.id}
261
266
  <div class="mt-1 space-y-1.5">
262
267
  <textarea
263
268
  class="textarea textarea-bordered textarea-xs w-full"
@@ -271,7 +276,7 @@
271
276
  </div>
272
277
  {:else}
273
278
  <p class="text-sm text-base-content/80 mt-0.5">{reply.content}</p>
274
- {#if reply.user_id === currentUserId}
279
+ {#if !readOnly && reply.user_id === currentUserId}
275
280
  <div class="flex gap-1 mt-1">
276
281
  <button class="btn btn-ghost btn-xs text-base-content/40 h-5 min-h-0" onclick={() => startEdit(reply)}>Edit</button>
277
282
  <button class="btn btn-ghost btn-xs text-error/50 h-5 min-h-0" onclick={() => deleteAnnotation(reply.id)}>Delete</button>
@@ -283,33 +288,35 @@
283
288
  {/each}
284
289
 
285
290
  <!-- Reply input -->
286
- <div class="ml-8 flex gap-2">
287
- <textarea
288
- class="textarea textarea-bordered textarea-sm flex-1 min-h-[36px]"
289
- rows="1"
290
- placeholder="Reply..."
291
- bind:value={replyContent}
292
- onkeydown={(e) => {
293
- if (e.key === "Enter" && !e.shiftKey) {
294
- e.preventDefault()
295
- submitReply(thread.root.id)
296
- }
297
- }}
298
- ></textarea>
299
- <button
300
- class="btn btn-sm btn-primary self-end"
301
- disabled={!replyContent.trim() || isSubmitting}
302
- onclick={() => submitReply(thread.root.id)}
303
- >
304
- {#if isSubmitting}
305
- <span class="loading loading-spinner loading-xs"></span>
306
- {:else}
307
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
308
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8" />
309
- </svg>
310
- {/if}
311
- </button>
312
- </div>
291
+ {#if !readOnly}
292
+ <div class="ml-8 flex gap-2">
293
+ <textarea
294
+ class="textarea textarea-bordered textarea-sm flex-1 min-h-[36px]"
295
+ rows="1"
296
+ placeholder="Reply..."
297
+ bind:value={replyContent}
298
+ onkeydown={(e) => {
299
+ if (e.key === "Enter" && !e.shiftKey) {
300
+ e.preventDefault()
301
+ submitReply(thread.root.id)
302
+ }
303
+ }}
304
+ ></textarea>
305
+ <button
306
+ class="btn btn-sm btn-primary self-end"
307
+ disabled={!replyContent.trim() || isSubmitting}
308
+ onclick={() => submitReply(thread.root.id)}
309
+ >
310
+ {#if isSubmitting}
311
+ <span class="loading loading-spinner loading-xs"></span>
312
+ {:else}
313
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
314
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8" />
315
+ </svg>
316
+ {/if}
317
+ </button>
318
+ </div>
319
+ {/if}
313
320
  </div>
314
321
  {/if}
315
322
  </div>
@@ -5,6 +5,8 @@ interface Props {
5
5
  activeAnnotationId?: string | null;
6
6
  currentUserId: string;
7
7
  callbacks: AnnotationCallbacks;
8
+ /** Hides reply/resolve/edit/delete affordances — thread list stays readable */
9
+ readOnly?: boolean;
8
10
  onAnnotationSelect?: (annotation: Annotation | null) => void;
9
11
  onAnnotationsChanged?: () => void;
10
12
  }
@@ -544,7 +544,7 @@
544
544
  cy={zcY}
545
545
  r="5"
546
546
  style="fill:var(--color-warning)"
547
- stroke="var(--fallback-b2,oklch(var(--b2)/1))"
547
+ stroke="var(--color-base-200)"
548
548
  stroke-width="2"
549
549
  />
550
550
  <line
@@ -587,7 +587,7 @@
587
587
  cy={py}
588
588
  r="7"
589
589
  style="fill:var(--color-success)"
590
- stroke="var(--fallback-b2,oklch(var(--b2)/1))"
590
+ stroke="var(--color-base-200)"
591
591
  stroke-width="2"
592
592
  />
593
593
  <text
@@ -685,7 +685,7 @@
685
685
  cy={yMain(pt.y)}
686
686
  r="4"
687
687
  fill={line.color}
688
- stroke="var(--fallback-b2,oklch(var(--b2)/1))"
688
+ stroke="var(--color-base-200)"
689
689
  stroke-width="1.5"
690
690
  />
691
691
  {/if}
@@ -276,8 +276,8 @@
276
276
  .cp-panel {
277
277
  width: 100%;
278
278
  max-width: 560px;
279
- background: oklch(var(--b1));
280
- border: var(--jatui-border-w) solid oklch(var(--b3));
279
+ background: var(--color-base-100);
280
+ border: var(--jatui-border-w) solid var(--color-base-300);
281
281
  border-radius: var(--jatui-radius-box);
282
282
  overflow: hidden;
283
283
  display: flex;
@@ -291,7 +291,7 @@
291
291
  align-items: center;
292
292
  gap: 0.5rem;
293
293
  padding: 0.625rem 0.875rem;
294
- border-bottom: var(--jatui-border-w) solid oklch(var(--b2));
294
+ border-bottom: var(--jatui-border-w) solid var(--color-base-200);
295
295
  flex-shrink: 0;
296
296
  }
297
297
 
@@ -299,7 +299,7 @@
299
299
  width: 1rem;
300
300
  height: 1rem;
301
301
  flex-shrink: 0;
302
- color: oklch(var(--bc) / 0.4);
302
+ color: color-mix(in oklch, var(--color-base-content) 40%, transparent);
303
303
  }
304
304
 
305
305
  .cp-search-input {
@@ -308,13 +308,13 @@
308
308
  border: none;
309
309
  outline: none;
310
310
  font-size: 0.9375rem;
311
- color: oklch(var(--bc));
311
+ color: var(--color-base-content);
312
312
  line-height: 1.5;
313
313
  min-width: 0;
314
314
  }
315
315
 
316
316
  .cp-search-input::placeholder {
317
- color: oklch(var(--bc) / 0.35);
317
+ color: color-mix(in oklch, var(--color-base-content) 35%, transparent);
318
318
  }
319
319
 
320
320
  .cp-search-clear {
@@ -326,20 +326,20 @@
326
326
  border: none;
327
327
  background: none;
328
328
  cursor: pointer;
329
- color: oklch(var(--bc) / 0.45);
329
+ color: color-mix(in oklch, var(--color-base-content) 45%, transparent);
330
330
  transition: color var(--motion-instant) var(--motion-glide),
331
331
  background var(--motion-instant) var(--motion-glide);
332
332
  }
333
333
 
334
334
  .cp-search-clear:hover {
335
- color: oklch(var(--bc));
336
- background: oklch(var(--b2));
335
+ color: var(--color-base-content);
336
+ background: var(--color-base-200);
337
337
  }
338
338
 
339
339
  .cp-hint-kbd {
340
340
  font-size: 0.5625rem;
341
341
  font-family: ui-monospace, 'SF Mono', Menlo, monospace;
342
- color: oklch(var(--bc) / 0.3);
342
+ color: color-mix(in oklch, var(--color-base-content) 30%, transparent);
343
343
  background: none;
344
344
  border: none;
345
345
  padding: 0;
@@ -361,7 +361,7 @@
361
361
  font-weight: 700;
362
362
  text-transform: uppercase;
363
363
  letter-spacing: 0.07em;
364
- color: oklch(var(--bc) / 0.35);
364
+ color: color-mix(in oklch, var(--color-base-content) 35%, transparent);
365
365
  }
366
366
 
367
367
  .cp-item {
@@ -379,14 +379,14 @@
379
379
  background: transparent;
380
380
  cursor: pointer;
381
381
  text-align: left;
382
- color: oklch(var(--bc) / 0.85);
382
+ color: color-mix(in oklch, var(--color-base-content) 85%, transparent);
383
383
  transition: background var(--motion-instant) var(--motion-glide),
384
384
  color var(--motion-instant) var(--motion-glide);
385
385
  }
386
386
 
387
387
  .cp-item-highlighted .cp-item-btn {
388
- background: oklch(var(--b2));
389
- color: oklch(var(--bc));
388
+ background: var(--color-base-200);
389
+ color: var(--color-base-content);
390
390
  }
391
391
 
392
392
  .cp-item-icon {
@@ -427,15 +427,15 @@
427
427
  font-size: 0.5625rem;
428
428
  font-family: ui-monospace, 'SF Mono', Menlo, monospace;
429
429
  font-weight: 600;
430
- color: oklch(var(--bc) / 0.55);
431
- background: oklch(var(--b2));
432
- border: var(--jatui-border-w) solid oklch(var(--b3));
430
+ color: color-mix(in oklch, var(--color-base-content) 55%, transparent);
431
+ background: var(--color-base-200);
432
+ border: var(--jatui-border-w) solid var(--color-base-300);
433
433
  line-height: 1.4;
434
434
  }
435
435
 
436
436
  .cp-item-highlighted .cp-kbd {
437
- color: oklch(var(--bc) / 0.7);
438
- background: oklch(var(--b3));
437
+ color: color-mix(in oklch, var(--color-base-content) 70%, transparent);
438
+ background: var(--color-base-300);
439
439
  }
440
440
 
441
441
  /* Empty state */
@@ -443,7 +443,7 @@
443
443
  padding: 1.5rem 0.875rem;
444
444
  text-align: center;
445
445
  font-size: 0.8125rem;
446
- color: oklch(var(--bc) / 0.4);
446
+ color: color-mix(in oklch, var(--color-base-content) 40%, transparent);
447
447
  font-family: ui-monospace, 'SF Mono', Menlo, monospace;
448
448
  }
449
449
 
@@ -453,7 +453,7 @@
453
453
  gap: 1rem;
454
454
  align-items: center;
455
455
  padding: 0.5rem 0.875rem;
456
- border-top: var(--jatui-border-w) solid oklch(var(--b2));
456
+ border-top: var(--jatui-border-w) solid var(--color-base-200);
457
457
  flex-shrink: 0;
458
458
  }
459
459
 
@@ -463,7 +463,7 @@
463
463
  gap: 0.25rem;
464
464
  font-size: 0.5625rem;
465
465
  font-family: ui-monospace, 'SF Mono', Menlo, monospace;
466
- color: oklch(var(--bc) / 0.35);
466
+ color: color-mix(in oklch, var(--color-base-content) 35%, transparent);
467
467
  }
468
468
 
469
469
  @media (prefers-reduced-motion: reduce) {
@@ -123,11 +123,6 @@
123
123
  .ic-check {
124
124
  opacity: 0;
125
125
  transform: scale(0.5);
126
- color: oklch(var(--su, 0.72 0.19 150));
127
- }
128
-
129
- /* Use DaisyUI success color if --su is not available */
130
- .ic-check {
131
126
  color: var(--color-success, #4cd08a);
132
127
  }
133
128
 
@@ -17,6 +17,8 @@
17
17
  activeAnnotationId?: string | null
18
18
  /** Whether annotation placement mode is active */
19
19
  annotationMode?: boolean
20
+ /** Whether resolved annotation pins are shown on the image (default false, matching AnnotationLayer) */
21
+ showResolved?: boolean
20
22
  /** Called when a pin is clicked */
21
23
  onAnnotationClick?: (annotation: Annotation) => void
22
24
  /** Called when the image is clicked in annotation mode */
@@ -32,6 +34,7 @@
32
34
  annotations = [],
33
35
  activeAnnotationId = null,
34
36
  annotationMode = false,
37
+ showResolved = false,
35
38
  onAnnotationClick,
36
39
  onImageClick,
37
40
  onClose,
@@ -168,6 +171,7 @@
168
171
  {annotations}
169
172
  {activeAnnotationId}
170
173
  {annotationMode}
174
+ {showResolved}
171
175
  {onAnnotationClick}
172
176
  {onImageClick}
173
177
  />
@@ -265,6 +269,7 @@
265
269
  {annotations}
266
270
  {activeAnnotationId}
267
271
  annotationMode={false}
272
+ {showResolved}
268
273
  {onAnnotationClick}
269
274
  />
270
275
  {/if}
@@ -13,6 +13,8 @@ interface Props {
13
13
  activeAnnotationId?: string | null;
14
14
  /** Whether annotation placement mode is active */
15
15
  annotationMode?: boolean;
16
+ /** Whether resolved annotation pins are shown on the image (default false, matching AnnotationLayer) */
17
+ showResolved?: boolean;
16
18
  /** Called when a pin is clicked */
17
19
  onAnnotationClick?: (annotation: Annotation) => void;
18
20
  /** Called when the image is clicked in annotation mode */
@@ -743,7 +743,7 @@
743
743
  <button
744
744
  type="button"
745
745
  class="w-6 h-6 rounded-full border-2 transition-transform duration-100 {annotColor === c ? 'scale-125 border-base-content' : 'border-transparent hover:scale-110'}"
746
- style="background: {c}; {c === '#111827' ? 'outline: 1px solid oklch(var(--bc)/0.2);' : ''}"
746
+ style="background: {c}; {c === '#111827' ? 'outline: 1px solid color-mix(in oklch, var(--color-base-content) 20%, transparent);' : ''}"
747
747
  onclick={() => { annotColor = c }}
748
748
  aria-label="Color {c}"
749
749
  ></button>
@@ -151,7 +151,7 @@
151
151
  }
152
152
 
153
153
  .pin-cell--filled {
154
- border-color: oklch(var(--p));
154
+ border-color: var(--color-primary);
155
155
  }
156
156
 
157
157
  .pin-cell--pop {
@@ -377,9 +377,9 @@
377
377
  min-height: 2rem;
378
378
  padding: 0 0.75rem;
379
379
  border-radius: var(--rounded-btn, 0.5rem);
380
- background: var(--b2, oklch(0.16 0.01 250));
381
- border: 1px solid oklch(from var(--bc, oklch(0.85 0.02 250)) l c h / 0.3);
382
- color: var(--bc, oklch(0.85 0.02 250));
380
+ background: var(--color-base-200, oklch(0.16 0.01 250));
381
+ border: 1px solid color-mix(in oklch, var(--color-base-content, oklch(0.85 0.02 250)) 30%, transparent);
382
+ color: var(--color-base-content, oklch(0.85 0.02 250));
383
383
  }
384
384
  .sd-sm .sd-chevron {
385
385
  width: 0.625rem;
@@ -63,9 +63,9 @@
63
63
  border-radius: 0.375rem;
64
64
  background: linear-gradient(
65
65
  90deg,
66
- oklch(var(--b2) / 1) 0%,
67
- oklch(var(--b3) / 1) 25%,
68
- oklch(var(--b2) / 1) 50%
66
+ var(--color-base-200) 0%,
67
+ var(--color-base-300) 25%,
68
+ var(--color-base-200) 50%
69
69
  );
70
70
  background-size: 280% 100%;
71
71
  animation: skel-shimmer 1.5s linear infinite;
@@ -81,9 +81,9 @@
81
81
  border-radius: 9999px;
82
82
  background: linear-gradient(
83
83
  90deg,
84
- oklch(var(--b2) / 1) 0%,
85
- oklch(var(--b3) / 1) 25%,
86
- oklch(var(--b2) / 1) 50%
84
+ var(--color-base-200) 0%,
85
+ var(--color-base-300) 25%,
86
+ var(--color-base-200) 50%
87
87
  );
88
88
  background-size: 280% 100%;
89
89
  animation: skel-shimmer 1.5s linear infinite;
@@ -96,9 +96,9 @@
96
96
  border-radius: 0.5rem;
97
97
  background: linear-gradient(
98
98
  90deg,
99
- oklch(var(--b2) / 1) 0%,
100
- oklch(var(--b3) / 1) 25%,
101
- oklch(var(--b2) / 1) 50%
99
+ var(--color-base-200) 0%,
100
+ var(--color-base-300) 25%,
101
+ var(--color-base-200) 50%
102
102
  );
103
103
  background-size: 280% 100%;
104
104
  animation: skel-shimmer 1.5s linear infinite;
@@ -148,7 +148,7 @@
148
148
 
149
149
  /* ── Pill variant ─────────────────────────────────────── */
150
150
  .tabs-pill .tab-list {
151
- background-color: oklch(var(--b2, 93% 0 0) / 1);
151
+ background-color: var(--color-base-200, oklch(93% 0 0));
152
152
  border-radius: 0.75rem;
153
153
  padding: 3px;
154
154
  gap: 0;
@@ -158,7 +158,7 @@
158
158
  position: absolute;
159
159
  top: 0;
160
160
  left: 0;
161
- background-color: oklch(var(--b1, 100% 0 0) / 1);
161
+ background-color: var(--color-base-100, oklch(100% 0 0));
162
162
  border-radius: 0.6rem;
163
163
  box-shadow: 0 1px 3px oklch(0% 0 0 / 10%);
164
164
  transition:
@@ -178,7 +178,7 @@
178
178
 
179
179
  /* ── Underline variant ────────────────────────────────── */
180
180
  .tabs-underline .tab-list {
181
- border-bottom: 1px solid oklch(var(--b3, 88% 0 0) / 1);
181
+ border-bottom: 1px solid var(--color-base-300, oklch(88% 0 0));
182
182
  padding-bottom: 0;
183
183
  gap: 0;
184
184
  }
@@ -206,7 +206,7 @@
206
206
  top: 50%;
207
207
  transform: translateY(-50%);
208
208
  font-size: 0.875rem;
209
- color: oklch(var(--bc) / 0.55);
209
+ color: color-mix(in oklch, var(--color-base-content) 55%, transparent);
210
210
  pointer-events: none;
211
211
  transform-origin: left center;
212
212
  transition:
@@ -219,7 +219,7 @@
219
219
  .jatui-float-field input:focus ~ .jatui-float-label,
220
220
  .jatui-float-field input:not(:placeholder-shown) ~ .jatui-float-label {
221
221
  transform: translateY(-130%) scale(0.82);
222
- color: oklch(var(--p, var(--bc)));
222
+ color: var(--color-primary, var(--color-base-content));
223
223
  font-size: 0.75rem;
224
224
  }
225
225
 
@@ -444,9 +444,9 @@
444
444
 
445
445
  <style>
446
446
  div[contenteditable='true'] { white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; }
447
- div[contenteditable='true']:empty:before { content: attr(data-placeholder); color: oklch(var(--bc) / 0.5); pointer-events: none; }
448
- div[contenteditable='true']:focus:empty:before { content: attr(data-placeholder); color: oklch(var(--bc) / 0.3); }
447
+ div[contenteditable='true']:empty:before { content: attr(data-placeholder); color: color-mix(in oklch, var(--color-base-content) 50%, transparent); pointer-events: none; }
448
+ div[contenteditable='true']:focus:empty:before { content: attr(data-placeholder); color: color-mix(in oklch, var(--color-base-content) 30%, transparent); }
449
449
  div[contenteditable='true']::-webkit-scrollbar { width: 6px; }
450
450
  div[contenteditable='true']::-webkit-scrollbar-track { background: transparent; }
451
- div[contenteditable='true']::-webkit-scrollbar-thumb { background-color: oklch(var(--bc) / 0.2); border-radius: 3px; }
451
+ div[contenteditable='true']::-webkit-scrollbar-thumb { background-color: color-mix(in oklch, var(--color-base-content) 20%, transparent); border-radius: 3px; }
452
452
  </style>
@@ -113,11 +113,11 @@
113
113
  }
114
114
 
115
115
  .message-content :global(.mention-link) {
116
- color: oklch(var(--p) / 0.6);
116
+ color: color-mix(in oklch, var(--color-primary) 60%, transparent);
117
117
  transition: color 0.2s;
118
118
  }
119
119
 
120
120
  .message-content :global(.mention-link):hover {
121
- color: oklch(var(--p) / 0.8);
121
+ color: color-mix(in oklch, var(--color-primary) 80%, transparent);
122
122
  }
123
123
  </style>
@@ -36,13 +36,13 @@
36
36
  };
37
37
 
38
38
  const colorMap: Record<NonNullable<Props['color']>, string> = {
39
- primary: 'oklch(var(--p))',
40
- secondary: 'oklch(var(--s))',
41
- accent: 'oklch(var(--a))',
42
- success: 'oklch(var(--su))',
43
- warning: 'oklch(var(--wa))',
44
- error: 'oklch(var(--er))',
45
- info: 'oklch(var(--in))'
39
+ primary: 'var(--color-primary)',
40
+ secondary: 'var(--color-secondary)',
41
+ accent: 'var(--color-accent)',
42
+ success: 'var(--color-success)',
43
+ warning: 'var(--color-warning)',
44
+ error: 'var(--color-error)',
45
+ info: 'var(--color-info)'
46
46
  };
47
47
 
48
48
  const trackHeight = $derived(heightMap[size]);
@@ -102,7 +102,7 @@
102
102
  justify-content: space-between;
103
103
  align-items: center;
104
104
  font-size: 0.8125rem;
105
- color: oklch(var(--bc) / 0.7);
105
+ color: color-mix(in oklch, var(--color-base-content) 70%, transparent);
106
106
  }
107
107
 
108
108
  .progress-pct {
@@ -114,7 +114,7 @@
114
114
  position: relative;
115
115
  width: 100%;
116
116
  border-radius: 9999px;
117
- background: oklch(var(--b3) / 1);
117
+ background: var(--color-base-300);
118
118
  overflow: hidden;
119
119
  }
120
120
 
@@ -155,7 +155,7 @@
155
155
  flex: 1;
156
156
  height: 100%;
157
157
  border-radius: 9999px;
158
- background: oklch(var(--b1) / 1);
158
+ background: var(--color-base-100);
159
159
  overflow: hidden;
160
160
  position: relative;
161
161
  }
@@ -28,13 +28,13 @@
28
28
  const cy = $derived(size / 2);
29
29
 
30
30
  const colorMap: Record<NonNullable<Props['color']>, string> = {
31
- primary: 'oklch(var(--p))',
32
- secondary: 'oklch(var(--s))',
33
- accent: 'oklch(var(--a))',
34
- success: 'oklch(var(--su))',
35
- warning: 'oklch(var(--wa))',
36
- error: 'oklch(var(--er))',
37
- info: 'oklch(var(--in))'
31
+ primary: 'var(--color-primary)',
32
+ secondary: 'var(--color-secondary)',
33
+ accent: 'var(--color-accent)',
34
+ success: 'var(--color-success)',
35
+ warning: 'var(--color-warning)',
36
+ error: 'var(--color-error)',
37
+ info: 'var(--color-info)'
38
38
  };
39
39
 
40
40
  const strokeColor = $derived(colorMap[color]);
@@ -58,7 +58,7 @@
58
58
  {cy}
59
59
  r={r}
60
60
  fill="none"
61
- stroke="oklch(var(--b3) / 1)"
61
+ stroke="var(--color-base-300)"
62
62
  stroke-width={strokeWidth}
63
63
  />
64
64
  <!-- Progress arc -->
@@ -114,7 +114,7 @@
114
114
  align-items: center;
115
115
  justify-content: center;
116
116
  line-height: 1.1;
117
- color: oklch(var(--bc) / 1);
117
+ color: var(--color-base-content);
118
118
  pointer-events: none;
119
119
  z-index: 1;
120
120
  }
@@ -126,7 +126,7 @@
126
126
 
127
127
  .ring-sublabel {
128
128
  font-size: 0.625em;
129
- color: oklch(var(--bc) / 0.6);
129
+ color: color-mix(in oklch, var(--color-base-content) 60%, transparent);
130
130
  margin-top: 0.125em;
131
131
  }
132
132
 
@@ -28,22 +28,22 @@
28
28
  const trackFill = $derived(count > 1 ? (current - 1) / (count - 1) : 1);
29
29
 
30
30
  const colorMap: Record<NonNullable<Props['color']>, string> = {
31
- primary: 'oklch(var(--p))',
32
- secondary: 'oklch(var(--s))',
33
- accent: 'oklch(var(--a))',
34
- success: 'oklch(var(--su))',
35
- warning: 'oklch(var(--wa))',
36
- error: 'oklch(var(--er))',
37
- info: 'oklch(var(--in))'
31
+ primary: 'var(--color-primary)',
32
+ secondary: 'var(--color-secondary)',
33
+ accent: 'var(--color-accent)',
34
+ success: 'var(--color-success)',
35
+ warning: 'var(--color-warning)',
36
+ error: 'var(--color-error)',
37
+ info: 'var(--color-info)'
38
38
  };
39
39
  const colorFg: Record<NonNullable<Props['color']>, string> = {
40
- primary: 'oklch(var(--pc))',
41
- secondary: 'oklch(var(--sc))',
42
- accent: 'oklch(var(--ac))',
43
- success: 'oklch(var(--suc))',
44
- warning: 'oklch(var(--wac))',
45
- error: 'oklch(var(--erc))',
46
- info: 'oklch(var(--inc))'
40
+ primary: 'var(--color-primary-content)',
41
+ secondary: 'var(--color-secondary-content)',
42
+ accent: 'var(--color-accent-content)',
43
+ success: 'var(--color-success-content)',
44
+ warning: 'var(--color-warning-content)',
45
+ error: 'var(--color-error-content)',
46
+ info: 'var(--color-info-content)'
47
47
  };
48
48
 
49
49
  const fillColor = $derived(colorMap[color]);
@@ -113,7 +113,7 @@
113
113
  right: calc(var(--node) / 2);
114
114
  height: 3px;
115
115
  border-radius: 9999px;
116
- background: oklch(var(--b3) / 1);
116
+ background: var(--color-base-300);
117
117
  overflow: hidden;
118
118
  transform: translateY(-50%);
119
119
  }
@@ -139,13 +139,13 @@
139
139
  width: var(--node);
140
140
  height: var(--node);
141
141
  border-radius: 9999px;
142
- background: oklch(var(--b3) / 1);
143
- color: oklch(var(--bc) / 0.5);
142
+ background: var(--color-base-300);
143
+ color: color-mix(in oklch, var(--color-base-content) 50%, transparent);
144
144
  display: flex;
145
145
  align-items: center;
146
146
  justify-content: center;
147
147
  font-weight: 600;
148
- border: 2px solid oklch(var(--b3) / 1);
148
+ border: 2px solid var(--color-base-300);
149
149
  transition:
150
150
  background 0.2s var(--motion-glide),
151
151
  color 0.2s var(--motion-glide),
@@ -154,7 +154,7 @@
154
154
  }
155
155
 
156
156
  .step--active .step-node {
157
- background: oklch(var(--b1) / 1);
157
+ background: var(--color-base-100);
158
158
  border-color: var(--fill);
159
159
  color: var(--fill);
160
160
  transform: scale(1.18);
@@ -172,7 +172,7 @@
172
172
  }
173
173
 
174
174
  .step-label {
175
- color: oklch(var(--bc) / 0.6);
175
+ color: color-mix(in oklch, var(--color-base-content) 60%, transparent);
176
176
  text-align: center;
177
177
  max-width: 5rem;
178
178
  line-height: 1.2;
@@ -181,7 +181,7 @@
181
181
 
182
182
  .step--active .step-label,
183
183
  .step--complete .step-label {
184
- color: oklch(var(--bc) / 1);
184
+ color: var(--color-base-content);
185
185
  }
186
186
 
187
187
  @media (prefers-reduced-motion: reduce) {
@@ -286,7 +286,7 @@
286
286
  user-select: none;
287
287
  }
288
288
  .dt-th-sortable:hover {
289
- background-color: oklch(var(--b2) / 0.6);
289
+ background-color: color-mix(in oklch, var(--color-base-200) 60%, transparent);
290
290
  }
291
291
 
292
292
  .dt-th-label {
@@ -299,13 +299,13 @@
299
299
  display: inline-flex;
300
300
  align-items: center;
301
301
  margin-left: var(--jatui-space-xs);
302
- color: oklch(var(--bc) / 0.35);
302
+ color: color-mix(in oklch, var(--color-base-content) 35%, transparent);
303
303
  transition: color var(--motion-fast) var(--motion-glide),
304
304
  transform var(--motion-fast) var(--motion-glide);
305
305
  }
306
306
 
307
307
  .dt-sort-active {
308
- color: oklch(var(--p) / 0.9);
308
+ color: color-mix(in oklch, var(--color-primary) 90%, transparent);
309
309
  }
310
310
 
311
311
  @media (prefers-reduced-motion: reduce) {
@@ -313,7 +313,7 @@
313
313
  }
314
314
 
315
315
  .dt-row-selected {
316
- background-color: oklch(var(--p) / 0.06) !important;
316
+ background-color: color-mix(in oklch, var(--color-primary) 6%, transparent) !important;
317
317
  }
318
318
 
319
319
  .dt-select-cell {
@@ -324,7 +324,7 @@
324
324
 
325
325
  .dt-empty {
326
326
  text-align: center;
327
- color: oklch(var(--bc) / 0.35);
327
+ color: color-mix(in oklch, var(--color-base-content) 35%, transparent);
328
328
  padding: 2rem 1rem;
329
329
  font-size: 0.875rem;
330
330
  }
@@ -334,13 +334,13 @@
334
334
  align-items: center;
335
335
  justify-content: space-between;
336
336
  padding: var(--jatui-space-base) var(--jatui-space-xs);
337
- border-top: var(--jatui-border-w) solid oklch(var(--b3) / 1);
337
+ border-top: var(--jatui-border-w) solid var(--color-base-300);
338
338
  margin-top: var(--jatui-space-base);
339
339
  }
340
340
 
341
341
  .dt-page-info {
342
342
  font-size: 0.8125rem;
343
- color: oklch(var(--bc) / 0.5);
343
+ color: color-mix(in oklch, var(--color-base-content) 50%, transparent);
344
344
  }
345
345
 
346
346
  .dt-page-btns {
@@ -354,9 +354,9 @@
354
354
  border-radius: var(--jatui-radius-selector);
355
355
  background: linear-gradient(
356
356
  90deg,
357
- oklch(var(--b2) / 1) 0%,
358
- oklch(var(--b3) / 1) 25%,
359
- oklch(var(--b2) / 1) 50%
357
+ var(--color-base-200) 0%,
358
+ var(--color-base-300) 25%,
359
+ var(--color-base-200) 50%
360
360
  );
361
361
  background-size: 280% 100%;
362
362
  animation: skel-shimmer 1.5s linear infinite;
@@ -2,16 +2,7 @@ import type { Input } from '@atlaskit/pragmatic-drag-and-drop/types';
2
2
  export interface DragData extends Record<string | symbol, unknown> {
3
3
  readonly type: string;
4
4
  }
5
- /**
6
- * Module-scoped Symbol brand for board-managed items.
7
- * ⚠ Symbol identity = module identity. Two copies of this module on one page makes
8
- * isItemData() return false across the boundary — dnd/ must exist EXACTLY ONCE.
9
- * Declare all @atlaskit/pragmatic-drag-and-drop* packages as peerDependencies in
10
- * the host app (host owns the single instance).
11
- */
12
- declare const ITEM: unique symbol;
13
5
  export interface ItemDragData<TItem = unknown> extends DragData {
14
- readonly [ITEM]: true;
15
6
  readonly key: string;
16
7
  readonly item: TItem;
17
8
  readonly container: string;
@@ -30,8 +30,8 @@
30
30
  fromId,
31
31
  toId,
32
32
  containerId,
33
- colorFrom = 'oklch(var(--p))',
34
- colorTo = 'oklch(var(--a))',
33
+ colorFrom = 'var(--color-primary)',
34
+ colorTo = 'var(--color-accent)',
35
35
  strokeWidth = 2,
36
36
  duration = 3,
37
37
  dashLength = 0.25,
@@ -146,7 +146,12 @@
146
146
 
147
147
  <!-- Static base line -->
148
148
  {#if pathD}
149
- <path d={pathD} stroke="oklch(var(--bc) / 0.08)" stroke-width={strokeWidth} fill="none" />
149
+ <path
150
+ d={pathD}
151
+ stroke="color-mix(in oklch, var(--color-base-content) 8%, transparent)"
152
+ stroke-width={strokeWidth}
153
+ fill="none"
154
+ />
150
155
 
151
156
  <!-- Animated beam -->
152
157
  {#if !reducedMotion}
@@ -34,17 +34,17 @@
34
34
  background:
35
35
  radial-gradient(
36
36
  40% 50% at 30% 38%,
37
- color-mix(in srgb, oklch(var(--p)) 30%, transparent),
37
+ color-mix(in srgb, var(--color-primary) 30%, transparent),
38
38
  transparent 60%
39
39
  ),
40
40
  radial-gradient(
41
41
  45% 55% at 72% 62%,
42
- color-mix(in srgb, oklch(var(--s)) 30%, transparent),
42
+ color-mix(in srgb, var(--color-secondary) 30%, transparent),
43
43
  transparent 60%
44
44
  ),
45
45
  radial-gradient(
46
46
  40% 50% at 50% 82%,
47
- color-mix(in srgb, oklch(var(--a)) 25%, transparent),
47
+ color-mix(in srgb, var(--color-accent) 25%, transparent),
48
48
  transparent 60%
49
49
  );
50
50
  filter: blur(16px);
@@ -32,14 +32,14 @@
32
32
  .bento-card {
33
33
  position: relative;
34
34
  border-radius: var(--jatui-radius-box);
35
- border: var(--jatui-border-w) solid oklch(var(--bc) / 0.1);
36
- background: oklch(var(--b1));
35
+ border: var(--jatui-border-w) solid color-mix(in oklch, var(--color-base-content) 10%, transparent);
36
+ background: var(--color-base-100);
37
37
  overflow: hidden;
38
38
  transition: background var(--motion-fast) var(--motion-glide);
39
39
  }
40
40
 
41
41
  .bento-card:hover {
42
- background: var(--bento-tint, oklch(var(--b2, var(--b1))));
42
+ background: var(--bento-tint, var(--color-base-200, var(--color-base-100)));
43
43
  }
44
44
 
45
45
  @media (prefers-reduced-motion: reduce) {
@@ -12,8 +12,8 @@
12
12
 
13
13
  let {
14
14
  duration = 3,
15
- colorFrom = 'oklch(var(--p))',
16
- colorTo = 'oklch(var(--a))',
15
+ colorFrom = 'var(--color-primary)',
16
+ colorTo = 'var(--color-accent)',
17
17
  borderRadius = '0.75rem',
18
18
  class: className = '',
19
19
  children
@@ -64,7 +64,7 @@
64
64
  border-radius: 50%;
65
65
  background: radial-gradient(
66
66
  circle,
67
- color-mix(in srgb, oklch(var(--p)) 18%, transparent),
67
+ color-mix(in srgb, var(--color-primary) 18%, transparent),
68
68
  transparent 70%
69
69
  );
70
70
  transform: translate(-50%, -50%);
@@ -72,21 +72,21 @@
72
72
  height="842"
73
73
  rx="55"
74
74
  ry="55"
75
- fill="oklch(var(--b2, var(--b1)))"
76
- stroke="oklch(var(--bc) / 0.15)"
75
+ fill="var(--color-base-200, var(--color-base-100))"
76
+ stroke="color-mix(in oklch, var(--color-base-content) 15%, transparent)"
77
77
  stroke-width="2"
78
78
  />
79
79
  <!-- Side buttons -->
80
- <rect x="-2" y="160" width="4" height="60" rx="2" fill="oklch(var(--bc) / 0.2)" />
81
- <rect x="-2" y="230" width="4" height="90" rx="2" fill="oklch(var(--bc) / 0.2)" />
82
- <rect x="-2" y="330" width="4" height="90" rx="2" fill="oklch(var(--bc) / 0.2)" />
83
- <rect x="388" y="220" width="4" height="120" rx="2" fill="oklch(var(--bc) / 0.2)" />
80
+ <rect x="-2" y="160" width="4" height="60" rx="2" fill="color-mix(in oklch, var(--color-base-content) 20%, transparent)" />
81
+ <rect x="-2" y="230" width="4" height="90" rx="2" fill="color-mix(in oklch, var(--color-base-content) 20%, transparent)" />
82
+ <rect x="-2" y="330" width="4" height="90" rx="2" fill="color-mix(in oklch, var(--color-base-content) 20%, transparent)" />
83
+ <rect x="388" y="220" width="4" height="120" rx="2" fill="color-mix(in oklch, var(--color-base-content) 20%, transparent)" />
84
84
  <!-- Screen bezel -->
85
- <rect x="15" y="55" width="360" height="734" rx="42" ry="42" fill="oklch(var(--b1))" />
85
+ <rect x="15" y="55" width="360" height="734" rx="42" ry="42" fill="var(--color-base-100)" />
86
86
  <!-- Dynamic island -->
87
- <rect x="155" y="20" width="80" height="30" rx="15" fill="oklch(var(--n))" />
87
+ <rect x="155" y="20" width="80" height="30" rx="15" fill="var(--color-neutral)" />
88
88
  <!-- Home indicator -->
89
- <rect x="150" y="808" width="90" height="5" rx="2.5" fill="oklch(var(--bc) / 0.25)" />
89
+ <rect x="150" y="808" width="90" height="5" rx="2.5" fill="color-mix(in oklch, var(--color-base-content) 25%, transparent)" />
90
90
  {:else if variant === 'safari'}
91
91
  <!-- Safari browser window -->
92
92
  <rect
@@ -96,13 +96,13 @@
96
96
  height="832"
97
97
  rx="10"
98
98
  ry="10"
99
- fill="oklch(var(--b2, var(--b1)))"
100
- stroke="oklch(var(--bc) / 0.15)"
99
+ fill="var(--color-base-200, var(--color-base-100))"
100
+ stroke="color-mix(in oklch, var(--color-base-content) 15%, transparent)"
101
101
  stroke-width="1"
102
102
  />
103
103
  <!-- Title bar -->
104
- <rect x="0" y="0" width="1280" height="88" rx="10" fill="oklch(var(--b3, var(--b2, var(--b1))))" />
105
- <rect x="10" y="44" width="1260" height="44" rx="0" fill="oklch(var(--b3, var(--b2, var(--b1))))" />
104
+ <rect x="0" y="0" width="1280" height="88" rx="10" fill="var(--color-base-300, var(--color-base-200, var(--color-base-100)))" />
105
+ <rect x="10" y="44" width="1260" height="44" rx="0" fill="var(--color-base-300, var(--color-base-200, var(--color-base-100)))" />
106
106
  <!-- Traffic lights -->
107
107
  <circle cx="20" cy="22" r="7" fill="#ff5f57" />
108
108
  <circle cx="44" cy="22" r="7" fill="#febc2e" />
@@ -114,14 +114,14 @@
114
114
  width="640"
115
115
  height="28"
116
116
  rx="14"
117
- fill="oklch(var(--b1))"
118
- stroke="oklch(var(--bc) / 0.1)"
117
+ fill="var(--color-base-100)"
118
+ stroke="color-mix(in oklch, var(--color-base-content) 10%, transparent)"
119
119
  stroke-width="1"
120
120
  />
121
121
  <!-- Screen content area -->
122
- <rect x="1" y="88" width="1278" height="743" fill="oklch(var(--b1))" />
122
+ <rect x="1" y="88" width="1278" height="743" fill="var(--color-base-100)" />
123
123
  <!-- Bottom round corners clip -->
124
- <rect x="0" y="822" width="1280" height="10" rx="0" fill="oklch(var(--b2, var(--b1)))" />
124
+ <rect x="0" y="822" width="1280" height="10" rx="0" fill="var(--color-base-200, var(--color-base-100))" />
125
125
  {:else}
126
126
  <!-- Android frame -->
127
127
  <rect
@@ -131,20 +131,20 @@
131
131
  height="842"
132
132
  rx="42"
133
133
  ry="42"
134
- fill="oklch(var(--b2, var(--b1)))"
135
- stroke="oklch(var(--bc) / 0.15)"
134
+ fill="var(--color-base-200, var(--color-base-100))"
135
+ stroke="color-mix(in oklch, var(--color-base-content) 15%, transparent)"
136
136
  stroke-width="2"
137
137
  />
138
138
  <!-- Side buttons -->
139
- <rect x="-2" y="200" width="4" height="80" rx="2" fill="oklch(var(--bc) / 0.2)" />
140
- <rect x="388" y="180" width="4" height="60" rx="2" fill="oklch(var(--bc) / 0.2)" />
141
- <rect x="388" y="250" width="4" height="100" rx="2" fill="oklch(var(--bc) / 0.2)" />
139
+ <rect x="-2" y="200" width="4" height="80" rx="2" fill="color-mix(in oklch, var(--color-base-content) 20%, transparent)" />
140
+ <rect x="388" y="180" width="4" height="60" rx="2" fill="color-mix(in oklch, var(--color-base-content) 20%, transparent)" />
141
+ <rect x="388" y="250" width="4" height="100" rx="2" fill="color-mix(in oklch, var(--color-base-content) 20%, transparent)" />
142
142
  <!-- Screen -->
143
- <rect x="12" y="24" width="366" height="796" rx="34" fill="oklch(var(--b1))" />
143
+ <rect x="12" y="24" width="366" height="796" rx="34" fill="var(--color-base-100)" />
144
144
  <!-- Front camera -->
145
- <circle cx="195" cy="44" r="6" fill="oklch(var(--n))" />
145
+ <circle cx="195" cy="44" r="6" fill="var(--color-neutral)" />
146
146
  <!-- Nav bar -->
147
- <rect x="130" y="820" width="130" height="5" rx="2.5" fill="oklch(var(--bc) / 0.25)" />
147
+ <rect x="130" y="820" width="130" height="5" rx="2.5" fill="color-mix(in oklch, var(--color-base-content) 25%, transparent)" />
148
148
  {/if}
149
149
  </svg>
150
150
 
@@ -87,8 +87,8 @@
87
87
  align-items: flex-end;
88
88
  gap: 8px;
89
89
  padding: 10px 16px;
90
- background: oklch(var(--b2, var(--b1)) / 0.8);
91
- border: var(--jatui-border-w) solid oklch(var(--bc) / 0.1);
90
+ background: color-mix(in oklch, var(--color-base-200, var(--color-base-100)) 80%, transparent);
91
+ border: var(--jatui-border-w) solid color-mix(in oklch, var(--color-base-content) 10%, transparent);
92
92
  border-radius: var(--jatui-radius-box);
93
93
  backdrop-filter: blur(12px);
94
94
  }
@@ -100,18 +100,18 @@
100
100
  width: 56px;
101
101
  height: 56px;
102
102
  border-radius: var(--jatui-radius-box);
103
- background: oklch(var(--b1));
104
- border: var(--jatui-border-w) solid oklch(var(--bc) / 0.08);
103
+ background: var(--color-base-100);
104
+ border: var(--jatui-border-w) solid color-mix(in oklch, var(--color-base-content) 8%, transparent);
105
105
  cursor: pointer;
106
106
  transform-origin: bottom center;
107
107
  transition: transform var(--motion-fast) var(--motion-glide);
108
- color: oklch(var(--bc));
108
+ color: var(--color-base-content);
109
109
  }
110
110
 
111
111
  .dock-item:hover,
112
112
  .dock-item:focus-visible {
113
- background: oklch(var(--b2, var(--b1)));
114
- outline: 2px solid oklch(var(--p));
113
+ background: var(--color-base-200, var(--color-base-100));
114
+ outline: 2px solid var(--color-primary);
115
115
  outline-offset: 2px;
116
116
  }
117
117
 
@@ -147,10 +147,10 @@
147
147
  font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;
148
148
  font-size: 0.8125rem;
149
149
  line-height: 1.6;
150
- background: oklch(var(--n));
151
- color: oklch(var(--nc));
150
+ background: var(--color-neutral);
151
+ color: var(--color-neutral-content);
152
152
  border-radius: var(--jatui-radius-box);
153
- border: var(--jatui-border-w) solid oklch(var(--bc) / 0.12);
153
+ border: var(--jatui-border-w) solid color-mix(in oklch, var(--color-base-content) 12%, transparent);
154
154
  overflow: hidden;
155
155
  min-width: 320px;
156
156
  }
@@ -160,8 +160,8 @@
160
160
  align-items: center;
161
161
  gap: 6px;
162
162
  padding: 10px 14px;
163
- background: oklch(var(--n) / 0.8);
164
- border-bottom: var(--jatui-border-w) solid oklch(var(--bc) / 0.1);
163
+ background: color-mix(in oklch, var(--color-neutral) 80%, transparent);
164
+ border-bottom: var(--jatui-border-w) solid color-mix(in oklch, var(--color-base-content) 10%, transparent);
165
165
  }
166
166
 
167
167
  .traffic-dot {
@@ -197,13 +197,13 @@
197
197
  }
198
198
 
199
199
  .terminal-prompt {
200
- color: oklch(var(--su, 0.75 0.18 142));
200
+ color: var(--color-success, oklch(0.75 0.18 142));
201
201
  flex-shrink: 0;
202
202
  user-select: none;
203
203
  }
204
204
 
205
205
  .terminal-output {
206
- color: oklch(var(--nc) / 0.7);
206
+ color: color-mix(in oklch, var(--color-neutral-content) 70%, transparent);
207
207
  }
208
208
 
209
209
  .terminal-cursor {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joewinke/jatui",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "private": false,
5
5
  "description": "Shared Svelte 5 component library for JAT projects",
6
6
  "type": "module",
@@ -70,7 +70,7 @@
70
70
  "package": "svelte-package --input src/lib --output dist && node scripts/compile-rune-modules.mjs",
71
71
  "check:demos": "node scripts/check-demo-coverage.mjs",
72
72
  "guard": "node scripts/check-demo-coverage.mjs",
73
- "prepublishOnly": "npm run package"
73
+ "prepublishOnly": "node scripts/guard-ci-publish.mjs && npm run package"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "@atlaskit/pragmatic-drag-and-drop": "~2.0.0",