@heyramzi/ui 2.20.0 → 2.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/charts/dashboard/data-table.js +1 -2
- package/dist/components/list-page/filter-section.js +1 -1
- package/dist/components/list-page/list-table.js +5 -6
- package/dist/components/list-page/queue-rail.js +2 -1
- package/dist/components/picker/trigger.js +3 -3
- package/dist/components/segmented/segmented.js +5 -5
- package/dist/components/work-parts/looks.js +1 -1
- package/dist/shadcn/alert/alert-variants.js +9 -0
- package/dist/shadcn/alert/index.js +1 -1
- package/dist/shadcn/badge/badge-variants.js +17 -0
- package/dist/shadcn/badge/index.js +1 -1
- package/dist/shadcn/dialog/index.js +3 -2
- package/dist/shadcn/dropdown-menu/menu-item.js +1 -1
- package/dist/shadcn/sheet/index.js +3 -2
- package/dist/shadcn/skeleton/index.js +3 -2
- package/dist/shadcn/toggle/index.js +1 -1
- package/dist/shadcn/toggle/toggle-variants.js +20 -0
- package/dist/status/index.js +2 -0
- package/dist/status/pill-tint.js +13 -0
- package/dist/work/kanban-drag.js +13 -7
- package/package.json +23 -23
- package/src/ai/confirmation/ConfirmationTitle.svelte +1 -4
- package/src/ai/loading-state/PixelLoader.svelte +1 -1
- package/src/animations/dropdown.css +19 -10
- package/src/animations/modal.css +7 -2
- package/src/charts/charts.css +3 -5
- package/src/charts/dashboard/dashboard-section.svelte +1 -1
- package/src/charts/dashboard/data-table.ts +1 -2
- package/src/charts/dashboard/stat-tile.svelte +1 -1
- package/src/charts/number-chart.css +8 -7
- package/src/charts/pop-value.svelte +68 -0
- package/src/charts/primitives/chart-tooltip.svelte +1 -1
- package/src/charts/reference-line.css +1 -1
- package/src/charts/stat-card.css +4 -4
- package/src/components/copy/copy-button.svelte +11 -10
- package/src/components/data-table/row-arrow.svelte +1 -1
- package/src/components/data-table/row-context-menu.svelte +1 -1
- package/src/components/data-table/sortable-head.svelte +2 -2
- package/src/components/data-table/table-skeleton.svelte +5 -5
- package/src/components/docs/doc-page.svelte +1 -3
- package/src/components/docs/on-this-page.svelte +4 -4
- package/src/components/field-row/field-row.svelte +1 -1
- package/src/components/list-page/detail-empty.svelte +3 -8
- package/src/components/list-page/detail-header.svelte +1 -1
- package/src/components/list-page/detail-row.svelte +2 -1
- package/src/components/list-page/empty-state.svelte +15 -7
- package/src/components/list-page/filter-item.svelte +2 -2
- package/src/components/list-page/filter-popover.svelte +1 -1
- package/src/components/list-page/filter-section.ts +1 -4
- package/src/components/list-page/grouped-list.svelte +37 -8
- package/src/components/list-page/list-page-shell.svelte +1 -1
- package/src/components/list-page/list-table.ts +6 -6
- package/src/components/list-page/master-detail.svelte +1 -1
- package/src/components/list-page/queue-rail.ts +2 -2
- package/src/components/list-page/rail-empty.svelte +1 -1
- package/src/components/list-page/rail-row.svelte +5 -5
- package/src/components/open-in/open-in.svelte +2 -1
- package/src/components/picker/trigger.ts +6 -5
- package/src/components/section-card/section-card.svelte +1 -1
- package/src/components/section-header/section-header.svelte +4 -2
- package/src/components/section-header/section-label.svelte +2 -2
- package/src/components/segmented/animated-tabs.svelte +1 -1
- package/src/components/segmented/section-runs.svelte +1 -1
- package/src/components/segmented/segment.svelte +4 -6
- package/src/components/segmented/segmented-track.svelte +18 -52
- package/src/components/segmented/segmented.ts +5 -5
- package/src/components/table-view/table-view.svelte +43 -24
- package/src/components/tags-input/tags-input.svelte +17 -31
- package/src/components/work-parts/looks.ts +1 -1
- package/src/editor/content.css +3 -3
- package/src/editor/editor.svelte +1 -1
- package/src/inbox/thread-inbox.svelte +2 -9
- package/src/panel/side-panel.svelte +9 -4
- package/src/record/info-list.svelte +7 -8
- package/src/record/project-list.svelte +1 -1
- package/src/record/record-demo.svelte +2 -4
- package/src/record/record-rail.svelte +5 -1
- package/src/record/record-shell.svelte +1 -1
- package/src/record/record-stats.svelte +9 -3
- package/src/record/steps-rail.svelte +7 -11
- package/src/shadcn/accordion/accordion-trigger.svelte +1 -1
- package/src/shadcn/alert/alert-variants.ts +17 -0
- package/src/shadcn/alert/alert.svelte +2 -16
- package/src/shadcn/alert/index.ts +1 -1
- package/src/shadcn/alert-dialog/alert-dialog-content.svelte +5 -1
- package/src/shadcn/alert-dialog/alert-dialog-footer.svelte +12 -2
- package/src/shadcn/alert-dialog/alert-dialog-header.svelte +1 -1
- package/src/shadcn/alert-dialog/alert-dialog-title.svelte +1 -1
- package/src/shadcn/badge/badge-variants.ts +23 -0
- package/src/shadcn/badge/badge.svelte +2 -20
- package/src/shadcn/badge/index.ts +1 -1
- package/src/shadcn/bubble/bubble-content.svelte +1 -1
- package/src/shadcn/bubble/bubble.svelte +1 -1
- package/src/shadcn/button/button.svelte +11 -5
- package/src/shadcn/calendar/calendar-month-select.svelte +1 -1
- package/src/shadcn/calendar/calendar-year-select.svelte +1 -1
- package/src/shadcn/calendar/calendar.svelte +1 -1
- package/src/shadcn/card/card.svelte +2 -1
- package/src/shadcn/checkbox/checkbox.svelte +1 -1
- package/src/shadcn/code-block/code-block-actions.svelte +1 -1
- package/src/shadcn/command/command-dialog.svelte +2 -2
- package/src/shadcn/command/command-group.svelte +1 -1
- package/src/shadcn/command/command-input.svelte +1 -1
- package/src/shadcn/command/command-item.svelte +1 -1
- package/src/shadcn/dialog/dialog-body.svelte +22 -0
- package/src/shadcn/dialog/dialog-content.svelte +19 -4
- package/src/shadcn/dialog/dialog-footer.svelte +19 -1
- package/src/shadcn/dialog/dialog-header.svelte +6 -1
- package/src/shadcn/dialog/dialog-title.svelte +2 -1
- package/src/shadcn/dialog/index.ts +3 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-content.svelte +5 -1
- package/src/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/src/shadcn/dropdown-menu/menu-item.ts +1 -1
- package/src/shadcn/field/field-separator.svelte +1 -1
- package/src/shadcn/hover-card/hover-card-content.svelte +1 -1
- package/src/shadcn/input/input.svelte +2 -2
- package/src/shadcn/input-otp/input-otp-slot.svelte +1 -1
- package/src/shadcn/message-scroller/message-scroller-button.svelte +1 -1
- package/src/shadcn/popover/popover-content.svelte +1 -1
- package/src/shadcn/radio-group/radio-group-item.svelte +1 -1
- package/src/shadcn/scroll-area/scroll-area.svelte +1 -1
- package/src/shadcn/select/select-content.svelte +6 -2
- package/src/shadcn/select/select-item.svelte +1 -1
- package/src/shadcn/select/select-trigger.svelte +1 -1
- package/src/shadcn/sheet/index.ts +3 -0
- package/src/shadcn/sheet/sheet-body.svelte +22 -0
- package/src/shadcn/sheet/sheet-content.svelte +27 -5
- package/src/shadcn/sheet/sheet-footer.svelte +14 -2
- package/src/shadcn/sheet/sheet-header.svelte +1 -1
- package/src/shadcn/sheet/sheet-title.svelte +1 -1
- package/src/shadcn/sheet/sheet.css +11 -5
- package/src/shadcn/sidebar/sidebar-group-action.svelte +1 -1
- package/src/shadcn/sidebar/sidebar-group-label.svelte +1 -1
- package/src/shadcn/sidebar/sidebar-inset.svelte +1 -1
- package/src/shadcn/sidebar/sidebar-menu-action.svelte +1 -1
- package/src/shadcn/sidebar/sidebar-menu-button.svelte +2 -2
- package/src/shadcn/sidebar/sidebar-menu-sub-button.svelte +1 -1
- package/src/shadcn/sidebar/sidebar-menu.svelte +1 -1
- package/src/shadcn/sidebar/sidebar.svelte +1 -1
- package/src/shadcn/skeleton/index.ts +3 -0
- package/src/shadcn/skeleton/skeleton-delay.svelte +63 -0
- package/src/shadcn/skeleton/skeleton-delay.svelte.test.ts +57 -0
- package/src/shadcn/skeleton/skeleton.svelte +5 -1
- package/src/shadcn/slider/slider.svelte +1 -1
- package/src/shadcn/switch/switch.svelte +2 -2
- package/src/shadcn/table/table-row.svelte +1 -1
- package/src/shadcn/tabs/tabs-list.svelte +1 -1
- package/src/shadcn/tabs/tabs-trigger.svelte +2 -1
- package/src/shadcn/textarea/textarea.svelte +1 -1
- package/src/shadcn/toggle/index.ts +1 -1
- package/src/shadcn/toggle/toggle-variants.ts +26 -0
- package/src/shadcn/toggle/toggle.svelte +7 -25
- package/src/shadcn/toggle-group/toggle-group.svelte +1 -1
- package/src/shadcn/tooltip/tooltip-content.svelte +1 -1
- package/src/shadcn/trace/trace-collapsible-trigger.svelte +1 -1
- package/src/shadcn/trace/trace.svelte +1 -1
- package/src/status/README.md +1 -1
- package/src/status/index.ts +2 -0
- package/src/status/pill-tint.ts +16 -0
- package/src/status/status-badge.svelte +21 -7
- package/src/status/status-dot.svelte +6 -11
- package/src/status/status-pill.svelte +40 -0
- package/src/svelte-reexports.test.ts +43 -0
- package/src/thread/thread.svelte +54 -136
- package/src/tokens/craft.css +55 -36
- package/src/tokens/palette.css +16 -9
- package/src/work/demo.svelte +48 -42
- package/src/work/detail/detail-demo.svelte +33 -24
- package/src/work/detail/task-chip.svelte +4 -4
- package/src/work/detail/task-detail.svelte +41 -108
- package/src/work/detail/task-property.svelte +7 -13
- package/src/work/detail/task-thread.svelte +48 -119
- package/src/work/docs/doc-editor-page.svelte +5 -4
- package/src/work/docs/doc-menu.svelte +9 -4
- package/src/work/docs/docs-demo.svelte +4 -4
- package/src/work/docs/edited-chip.svelte +11 -4
- package/src/work/gantt/gantt-bar.svelte +18 -14
- package/src/work/gantt/gantt-grid.svelte +7 -7
- package/src/work/gantt/gantt-group-row.svelte +7 -10
- package/src/work/gantt/gantt-header.svelte +3 -1
- package/src/work/gantt/gantt-task-row.svelte +19 -9
- package/src/work/gantt/gantt.css +4 -5
- package/src/work/inbox/inbox-card.svelte +32 -10
- package/src/work/inbox/inbox-draft.svelte +2 -2
- package/src/work/kanban-column.svelte +7 -15
- package/src/work/kanban-drag.ts +13 -8
- package/src/work/task-gantt.svelte +2 -1
- package/src/work/task-list.svelte +54 -53
- package/src/work/time/time-chip.svelte +16 -19
- package/src/work/time/time-dot.svelte +2 -1
- package/src/work/time/time-ring.svelte +2 -3
- package/src/work/time/time-tracker.svelte +72 -166
package/src/thread/thread.svelte
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { AgentAvatar } from "../agents/index.js";
|
|
7
7
|
import RichRenderer from "../editor/renderer.svelte";
|
|
8
8
|
import { Skeleton } from "../shadcn/skeleton/index.js";
|
|
9
|
+
import { Button } from "../shadcn/button/index.js";
|
|
10
|
+
import { TagChip } from "../components/chip/index.js";
|
|
9
11
|
import ThreadBody from "./thread-body.svelte";
|
|
10
12
|
import ThreadEvents from "./thread-events.svelte";
|
|
11
13
|
import {
|
|
@@ -152,20 +154,15 @@
|
|
|
152
154
|
class="block max-h-60 min-h-16 w-full resize-none border-0 bg-transparent px-3 py-2 text-sm leading-relaxed outline-none [field-sizing:content] placeholder:text-muted-foreground"
|
|
153
155
|
></textarea>
|
|
154
156
|
<div class="flex justify-end px-2 pb-2">
|
|
155
|
-
<
|
|
156
|
-
type="button"
|
|
157
|
-
class="thread-button thread-primary"
|
|
158
|
-
onclick={onSend}
|
|
159
|
-
disabled={!value.trim() || sending}
|
|
160
|
-
>
|
|
157
|
+
<Button size="sm" onclick={onSend} disabled={!value.trim() || sending}>
|
|
161
158
|
{sending ? labels.sending : isReply ? labels.reply : labels.send}
|
|
162
|
-
</
|
|
159
|
+
</Button>
|
|
163
160
|
</div>
|
|
164
161
|
</div>
|
|
165
162
|
{/snippet}
|
|
166
163
|
|
|
167
164
|
{#snippet row(comment: ThreadComment, isRoot: boolean)}
|
|
168
|
-
<div class="group/row relative flex gap-3">
|
|
165
|
+
<div class="group/row hover-row relative flex gap-3">
|
|
169
166
|
<span class="relative size-6 shrink-0">
|
|
170
167
|
{#if avatar}
|
|
171
168
|
{@render avatar(comment)}
|
|
@@ -185,7 +182,7 @@
|
|
|
185
182
|
|
|
186
183
|
<div class="min-w-0 flex-1">
|
|
187
184
|
<div class="flex min-h-6 flex-wrap items-center gap-x-2">
|
|
188
|
-
<span class="truncate text-
|
|
185
|
+
<span class="truncate text-(length:--text-control) font-medium">{comment.author.name}</span>
|
|
189
186
|
{#if comment.author.kind === "agent"}
|
|
190
187
|
<span class="sr-only">{labels.agent}</span>
|
|
191
188
|
{/if}
|
|
@@ -197,35 +194,40 @@
|
|
|
197
194
|
{#if anchorChip}
|
|
198
195
|
{@render anchorChip(comment)}
|
|
199
196
|
{:else if onAnchor}
|
|
200
|
-
<button
|
|
201
|
-
|
|
202
|
-
|
|
197
|
+
<button
|
|
198
|
+
type="button"
|
|
199
|
+
class="rounded-sm outline-none focus-visible:shadow-[var(--ring-focus)]"
|
|
200
|
+
onclick={() => onAnchor(comment)}
|
|
201
|
+
><TagChip
|
|
202
|
+
>{#snippet icon()}<MapPin aria-hidden="true" />{/snippet}{labels.pinned}</TagChip
|
|
203
|
+
></button
|
|
204
|
+
>
|
|
203
205
|
{:else}
|
|
204
|
-
<
|
|
205
|
-
|
|
206
|
+
<TagChip
|
|
207
|
+
>{#snippet icon()}<MapPin aria-hidden="true" />{/snippet}{labels.pinned}</TagChip
|
|
206
208
|
>
|
|
207
209
|
{/if}
|
|
208
210
|
{/if}
|
|
209
211
|
{#if editingId !== comment.id}
|
|
210
|
-
<span
|
|
211
|
-
class="ms-auto flex gap-0.5 opacity-0 transition-opacity group-hover/row:opacity-100 focus-within:opacity-100 [@media(hover:none)]:opacity-100"
|
|
212
|
-
>
|
|
212
|
+
<span class="row-action ms-auto flex gap-0.5">
|
|
213
213
|
{#if isRoot && onResolve}
|
|
214
|
-
<
|
|
215
|
-
|
|
216
|
-
|
|
214
|
+
<Button
|
|
215
|
+
variant="ghost"
|
|
216
|
+
size="sm"
|
|
217
|
+
icon
|
|
217
218
|
aria-label={comment.resolved ? labels.unresolve : labels.resolve}
|
|
218
219
|
aria-pressed={comment.resolved ?? false}
|
|
219
220
|
onclick={() => onResolve(comment, !comment.resolved)}
|
|
220
221
|
>
|
|
221
222
|
<Check class="size-3.5" aria-hidden="true" />
|
|
222
|
-
</
|
|
223
|
+
</Button>
|
|
223
224
|
{/if}
|
|
224
225
|
{#if canEdit(comment)}
|
|
225
226
|
{#if onEdit && !comment.content}
|
|
226
|
-
<
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
<Button
|
|
228
|
+
variant="ghost"
|
|
229
|
+
size="sm"
|
|
230
|
+
icon
|
|
229
231
|
aria-label={labels.edit}
|
|
230
232
|
onclick={() => {
|
|
231
233
|
editingId = comment.id;
|
|
@@ -233,17 +235,18 @@
|
|
|
233
235
|
}}
|
|
234
236
|
>
|
|
235
237
|
<PencilSimple class="size-3.5" aria-hidden="true" />
|
|
236
|
-
</
|
|
238
|
+
</Button>
|
|
237
239
|
{/if}
|
|
238
240
|
{#if onDelete}
|
|
239
|
-
<
|
|
240
|
-
|
|
241
|
-
|
|
241
|
+
<Button
|
|
242
|
+
variant="ghost"
|
|
243
|
+
size="sm"
|
|
244
|
+
icon
|
|
242
245
|
aria-label={labels.delete}
|
|
243
246
|
onclick={() => onDelete?.(comment)}
|
|
244
247
|
>
|
|
245
248
|
<Trash class="size-3.5" aria-hidden="true" />
|
|
246
|
-
</
|
|
249
|
+
</Button>
|
|
247
250
|
{/if}
|
|
248
251
|
{/if}
|
|
249
252
|
</span>
|
|
@@ -255,20 +258,20 @@
|
|
|
255
258
|
bind:value={editDraft}
|
|
256
259
|
rows={3}
|
|
257
260
|
aria-label={labels.edit}
|
|
258
|
-
class="mt-1 w-full resize-y rounded-md border border-input bg-transparent px-2.5 py-2 text-sm leading-relaxed outline-none focus-visible:border-ring focus-visible:ring-
|
|
261
|
+
class="mt-1 w-full resize-y rounded-md border border-input bg-transparent px-2.5 py-2 text-sm leading-relaxed outline-none focus-visible:border-ring focus-visible:shadow-(--ring-focus)"
|
|
259
262
|
></textarea>
|
|
260
263
|
<div class="mt-2 flex justify-end gap-1.5">
|
|
261
|
-
<
|
|
262
|
-
>{labels.cancel}</
|
|
263
|
-
>
|
|
264
|
-
<button
|
|
265
|
-
type="button"
|
|
266
|
-
class="thread-button thread-primary"
|
|
267
|
-
onclick={() => saveEdit(comment)}>{labels.save}</button
|
|
264
|
+
<Button variant="ghost" size="sm" onclick={() => (editingId = null)}
|
|
265
|
+
>{labels.cancel}</Button
|
|
268
266
|
>
|
|
267
|
+
<Button size="sm" onclick={() => saveEdit(comment)}>{labels.save}</Button>
|
|
269
268
|
</div>
|
|
270
269
|
{:else if comment.content}
|
|
271
|
-
<div
|
|
270
|
+
<div
|
|
271
|
+
class="text-sm leading-relaxed [--content-gap:0.5em] [--content-leading:1.625] [--content-size:var(--text-sm)]"
|
|
272
|
+
>
|
|
273
|
+
<RichRenderer content={comment.content} />
|
|
274
|
+
</div>
|
|
272
275
|
{:else}
|
|
273
276
|
<ThreadBody text={comment.body} more={labels.showMore} less={labels.showLess} />
|
|
274
277
|
{/if}
|
|
@@ -280,16 +283,18 @@
|
|
|
280
283
|
|
|
281
284
|
<section aria-label={labels.title} class={cn("flex flex-col gap-3", className)}>
|
|
282
285
|
<div class={cn("flex h-7 items-center justify-between", !heading && resolved === 0 && "sr-only")}>
|
|
283
|
-
<h2 class={cn("text-xs font-medium text-muted-foreground", !heading && "sr-only")}>
|
|
286
|
+
<h2 class={cn("text-xs font-medium text-muted-foreground", !heading && "sr-only")}>
|
|
287
|
+
{labels.title}
|
|
288
|
+
</h2>
|
|
284
289
|
{#if resolved > 0}
|
|
285
|
-
<
|
|
286
|
-
|
|
287
|
-
|
|
290
|
+
<Button
|
|
291
|
+
variant="ghost"
|
|
292
|
+
size="sm"
|
|
288
293
|
aria-expanded={showResolved}
|
|
289
294
|
onclick={() => (showResolved = !showResolved)}
|
|
290
295
|
>
|
|
291
296
|
{showResolved ? labels.hideResolved : fillCount(labels.showResolved, resolved)}
|
|
292
|
-
</
|
|
297
|
+
</Button>
|
|
293
298
|
{/if}
|
|
294
299
|
</div>
|
|
295
300
|
|
|
@@ -339,16 +344,17 @@
|
|
|
339
344
|
)}
|
|
340
345
|
</div>
|
|
341
346
|
{:else}
|
|
342
|
-
<
|
|
343
|
-
|
|
344
|
-
|
|
347
|
+
<Button
|
|
348
|
+
variant="ghost"
|
|
349
|
+
size="sm"
|
|
350
|
+
class="ms-9 w-fit"
|
|
345
351
|
onclick={() => {
|
|
346
352
|
replyTo = node.comment.id;
|
|
347
353
|
replyDraft = "";
|
|
348
354
|
}}
|
|
349
355
|
>
|
|
350
356
|
<ArrowBendDownRight class="size-3.5" aria-hidden="true" />{labels.reply}
|
|
351
|
-
</
|
|
357
|
+
</Button>
|
|
352
358
|
{/if}
|
|
353
359
|
{/if}
|
|
354
360
|
</li>
|
|
@@ -356,7 +362,7 @@
|
|
|
356
362
|
{/each}
|
|
357
363
|
</ol>
|
|
358
364
|
{:else if !onPost}
|
|
359
|
-
<p class="text-
|
|
365
|
+
<p class="text-(length:--text-control) text-muted-foreground">{labels.empty}</p>
|
|
360
366
|
{/if}
|
|
361
367
|
|
|
362
368
|
{@render footer?.()}
|
|
@@ -365,91 +371,3 @@
|
|
|
365
371
|
{@render composer(draft, labels.placeholder, sendRoot, (next) => (draft = next), false)}
|
|
366
372
|
{/if}
|
|
367
373
|
</section>
|
|
368
|
-
|
|
369
|
-
<style>
|
|
370
|
-
.thread-icon {
|
|
371
|
-
display: grid;
|
|
372
|
-
place-items: center;
|
|
373
|
-
width: 1.75rem;
|
|
374
|
-
height: 1.75rem;
|
|
375
|
-
border-radius: var(--radius-md, 0.5rem);
|
|
376
|
-
color: var(--color-muted-foreground);
|
|
377
|
-
outline: none;
|
|
378
|
-
transition: background-color var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
.thread-chip {
|
|
382
|
-
display: inline-flex;
|
|
383
|
-
align-items: center;
|
|
384
|
-
gap: 0.25rem;
|
|
385
|
-
height: 1.25rem;
|
|
386
|
-
padding-inline: 0.375rem;
|
|
387
|
-
border-radius: var(--radius-sm, 0.25rem);
|
|
388
|
-
background: var(--color-muted);
|
|
389
|
-
color: var(--color-muted-foreground);
|
|
390
|
-
font-size: 0.75rem;
|
|
391
|
-
outline: none;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
button.thread-chip:focus-visible {
|
|
395
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-ring) 50%, transparent);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
@media (hover: hover) and (pointer: fine) {
|
|
399
|
-
.thread-icon:hover {
|
|
400
|
-
background: var(--color-muted);
|
|
401
|
-
color: var(--color-foreground);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
.thread-icon:focus-visible,
|
|
406
|
-
.thread-button:focus-visible {
|
|
407
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-ring) 50%, transparent);
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
.thread-button {
|
|
411
|
-
height: 1.75rem;
|
|
412
|
-
padding-inline: 0.75rem;
|
|
413
|
-
border-radius: var(--radius-md, 0.5rem);
|
|
414
|
-
font-size: 0.8125rem;
|
|
415
|
-
font-weight: 500;
|
|
416
|
-
outline: none;
|
|
417
|
-
transition: background-color var(--duration-quick, 150ms) var(--ease-smooth-out, ease-out);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
@media (hover: hover) and (pointer: fine) {
|
|
421
|
-
.thread-button:hover:not(:disabled) {
|
|
422
|
-
background: var(--color-muted);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
.thread-button:disabled {
|
|
427
|
-
opacity: 0.5;
|
|
428
|
-
pointer-events: none;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
.thread-primary {
|
|
432
|
-
background: var(--color-primary);
|
|
433
|
-
color: var(--color-primary-foreground);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/* An empty draft reads as an outlined button, not a faded fill. */
|
|
437
|
-
.thread-primary:disabled {
|
|
438
|
-
opacity: 1;
|
|
439
|
-
background: transparent;
|
|
440
|
-
box-shadow: inset 0 0 0 1px var(--color-border);
|
|
441
|
-
color: var(--color-muted-foreground);
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
@media (hover: hover) and (pointer: fine) {
|
|
445
|
-
.thread-primary:hover:not(:disabled) {
|
|
446
|
-
background: color-mix(in oklab, var(--color-primary) 90%, transparent);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
@media (any-pointer: coarse) {
|
|
451
|
-
.thread-button {
|
|
452
|
-
height: 2.5rem;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
</style>
|
package/src/tokens/craft.css
CHANGED
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
/* ── Radius, by role not by size ─────────────────────────────
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
Tailwind's names, so `rounded-lg` is the control radius. Five steps, 4px
|
|
3
|
+
apart; xs and md fold into sm. */
|
|
4
4
|
@theme {
|
|
5
|
-
--radius-
|
|
6
|
-
--radius-
|
|
7
|
-
--radius-md:
|
|
8
|
-
--radius-lg:
|
|
9
|
-
--radius-xl:
|
|
10
|
-
--radius-2xl:
|
|
11
|
-
--radius-3xl:
|
|
5
|
+
--radius-sm: 6px; /* chip, badge, tag, inline code */
|
|
6
|
+
--radius-xs: var(--radius-sm); /* folded, was 4px */
|
|
7
|
+
--radius-md: var(--radius-sm); /* folded, was 7px */
|
|
8
|
+
--radius-lg: 10px; /* control: button, input, select, menu item */
|
|
9
|
+
--radius-xl: 14px; /* card, panel, stage */
|
|
10
|
+
--radius-2xl: 18px; /* overlay: dialog, sheet, popover, command palette */
|
|
11
|
+
--radius-3xl: 22px; /* shell panel, the inset page */
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
/* ── Type, by role ───────────────────────────────────────────
|
|
15
|
-
Tailwind's own `text-xs` to `text-base` cover the rest.
|
|
15
|
+
Tailwind's own `text-xs` to `text-base` cover the rest. Control text sits
|
|
16
|
+
between them: 13px at weight 500 is Linear's property row, measured 31 Aug
|
|
17
|
+
2026 on a 16px root, where 14px reads looser. No line height of its own, so
|
|
18
|
+
it inherits like the `text-[13px]` it replaces. Write it
|
|
19
|
+
`text-(length:--text-control)`: tailwind-merge takes a bare `text-control`
|
|
20
|
+
for a colour and drops it beside `text-muted-foreground`. */
|
|
16
21
|
@theme {
|
|
22
|
+
--text-control: 0.8125rem; /* a picker trigger, a property value */
|
|
17
23
|
--text-2xs: 0.6875rem; /* a count, a kbd hint, a meta line under a tile; the floor */
|
|
18
24
|
}
|
|
19
25
|
|
|
20
26
|
/* ── Elevation ───────────────────────────────────────────────
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
`--elev-card` and its hover carry their own hairline, so a box that also
|
|
28
|
+
draws `border` gets a 2px edge. The other steps carry none. */
|
|
23
29
|
:root {
|
|
24
30
|
/* Resting on the page. A button, a chip, a row. */
|
|
25
31
|
--elev-btn:
|
|
@@ -28,21 +34,28 @@
|
|
|
28
34
|
|
|
29
35
|
/* Sitting on the page. A card, a stage, a panel. */
|
|
30
36
|
--elev-card:
|
|
31
|
-
0 1px 2px
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
var(--elev-hairline), 0 1px 2px color-mix(in oklab, var(--elev-tint) 4%, transparent);
|
|
38
|
+
|
|
39
|
+
/* A hovered card: the edge darkens 3% toward the text and a soft shadow lifts it.
|
|
40
|
+
Pair it with a 1px rise, as `.t-lift` does. */
|
|
41
|
+
--elev-card-hover:
|
|
42
|
+
0 0 0 1px
|
|
43
|
+
color-mix(
|
|
44
|
+
in oklab,
|
|
45
|
+
var(--color-border, var(--border)),
|
|
46
|
+
var(--color-foreground, var(--foreground)) 3%
|
|
47
|
+
),
|
|
48
|
+
0 6px 16px -4px color-mix(in oklab, var(--elev-tint) 8%, transparent);
|
|
49
|
+
|
|
50
|
+
/* Lifted off the page. A popover, a menu, a hovered bordered card. */
|
|
36
51
|
--elev-raised:
|
|
37
|
-
0
|
|
38
|
-
0
|
|
39
|
-
0 20px 40px -12px color-mix(in oklab, var(--elev-tint) 12%, transparent);
|
|
52
|
+
0 2px 4px -1px color-mix(in oklab, var(--elev-tint) 5%, transparent),
|
|
53
|
+
0 8px 20px -6px color-mix(in oklab, var(--elev-tint) 10%, transparent);
|
|
40
54
|
|
|
41
55
|
/* Floating over a dimmed page. A dialog, a sheet, a command palette. */
|
|
42
56
|
--elev-overlay:
|
|
43
|
-
0
|
|
44
|
-
0
|
|
45
|
-
0 40px 72px -20px color-mix(in oklab, var(--elev-tint) 20%, transparent);
|
|
57
|
+
0 4px 8px -2px color-mix(in oklab, var(--elev-tint) 6%, transparent),
|
|
58
|
+
0 24px 48px -12px color-mix(in oklab, var(--elev-tint) 16%, transparent);
|
|
46
59
|
|
|
47
60
|
/* A hairline separates a surface from what's behind it; a rim is light on the
|
|
48
61
|
top edge, which makes a filled control read as a key. */
|
|
@@ -58,8 +71,11 @@
|
|
|
58
71
|
.dark {
|
|
59
72
|
--elev-btn: 0 1px 2px color-mix(in oklab, black 30%, transparent);
|
|
60
73
|
--elev-card:
|
|
61
|
-
0 1px
|
|
62
|
-
0
|
|
74
|
+
0 0 0 1px color-mix(in oklab, white 10%, transparent),
|
|
75
|
+
0 1px 2px color-mix(in oklab, black 24%, transparent);
|
|
76
|
+
--elev-card-hover:
|
|
77
|
+
0 0 0 1px color-mix(in oklab, white 16%, transparent),
|
|
78
|
+
0 8px 20px -6px color-mix(in oklab, black 40%, transparent);
|
|
63
79
|
--elev-raised:
|
|
64
80
|
0 2px 6px color-mix(in oklab, black 30%, transparent),
|
|
65
81
|
0 10px 24px -6px color-mix(in oklab, black 38%, transparent);
|
|
@@ -77,10 +93,12 @@
|
|
|
77
93
|
then a soft halo. */
|
|
78
94
|
:root {
|
|
79
95
|
--ring-color: var(--color-ring, var(--ring));
|
|
80
|
-
--ring-halo: color-mix(in oklab, var(--ring-color)
|
|
81
|
-
/* The
|
|
82
|
-
|
|
83
|
-
--ring-focus: 0 0 0 1px var(--ring-color), 0 0 0
|
|
96
|
+
--ring-halo: color-mix(in oklab, var(--ring-color) 10%, transparent);
|
|
97
|
+
/* The 1px edge carries the 3:1 contrast alone; a 5px 16% halo read as a thick grey band
|
|
98
|
+
(Ramzi, 24 Oct 2026), so it's 2px at 10%. */
|
|
99
|
+
--ring-focus: 0 0 0 1px var(--ring-color), 0 0 0 3px var(--ring-halo);
|
|
100
|
+
/* Rows inside a clipped list focus inward, where an outer ring would be cut off. */
|
|
101
|
+
--ring-focus-inset: inset 0 0 0 1px var(--ring-color), inset 0 0 0 3px var(--ring-halo);
|
|
84
102
|
}
|
|
85
103
|
|
|
86
104
|
/* ── Motion ──────────────────────────────────────────────────
|
|
@@ -124,6 +142,7 @@
|
|
|
124
142
|
--shadow-hairline: var(--elev-hairline);
|
|
125
143
|
--shadow-btn: var(--elev-btn);
|
|
126
144
|
--shadow-card: var(--elev-card);
|
|
145
|
+
--shadow-card-hover: var(--elev-card-hover);
|
|
127
146
|
--shadow-raised: var(--elev-raised);
|
|
128
147
|
--shadow-overlay: var(--elev-overlay);
|
|
129
148
|
--shadow-field: var(--elev-field);
|
|
@@ -132,7 +151,7 @@
|
|
|
132
151
|
because the two never appear apart and utilities cannot be stacked. */
|
|
133
152
|
--shadow-key: var(--elev-rim), var(--elev-btn);
|
|
134
153
|
/* The composed pair, for a surface that draws no border of its own. */
|
|
135
|
-
--shadow-edge-card: var(--elev-
|
|
154
|
+
--shadow-edge-card: var(--elev-card); /* the card step carries its own hairline */
|
|
136
155
|
--shadow-edge-raised: var(--elev-hairline), var(--elev-raised);
|
|
137
156
|
--shadow-edge-overlay: var(--elev-hairline), var(--elev-overlay);
|
|
138
157
|
|
|
@@ -161,12 +180,12 @@
|
|
|
161
180
|
|
|
162
181
|
.hover-row:has(:focus-visible) .row-action,
|
|
163
182
|
.row-action:is(
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
183
|
+
:focus-visible,
|
|
184
|
+
:has(:focus-visible),
|
|
185
|
+
[data-state="open"],
|
|
186
|
+
[aria-expanded="true"],
|
|
187
|
+
:has([data-state="open"], [aria-expanded="true"])
|
|
188
|
+
) {
|
|
170
189
|
opacity: 1;
|
|
171
190
|
}
|
|
172
191
|
|
package/src/tokens/palette.css
CHANGED
|
@@ -31,11 +31,13 @@
|
|
|
31
31
|
|
|
32
32
|
/* Dark surfaces. Light pendants are surface-light, line-light and paper. */
|
|
33
33
|
--brand-ink: oklch(0.145 0 0); /* Page background */
|
|
34
|
-
--brand-surface: oklch(0.
|
|
34
|
+
--brand-surface: oklch(0.2 0 0); /* Cards, panels: 0.055 over the page, the light step */
|
|
35
35
|
--brand-line: oklch(0.29 0 0); /* Borders, dividers */
|
|
36
36
|
--brand-raised: oklch(0.24 0 0); /* Hover surfaces, inputs, between surface and line */
|
|
37
37
|
--brand-paper: oklch(0.97 0 0); /* Text on dark, light backgrounds */
|
|
38
|
-
|
|
38
|
+
/* Two levels, grey canvas and white card: the 0.055 step dark uses, and muted text keeps 6.3:1. */
|
|
39
|
+
--brand-canvas-light: oklch(0.945 0 0); /* The page, the sidebar under it */
|
|
40
|
+
--brand-surface-light: oklch(1 0 0); /* Cards, popovers, the shell panel on a light page */
|
|
39
41
|
--brand-line-light: oklch(0.91 0 0); /* Borders on a light page */
|
|
40
42
|
|
|
41
43
|
/* The key button. Each theme has its own pair, since a hue lifted for dark needs dark text. */
|
|
@@ -111,12 +113,12 @@
|
|
|
111
113
|
--black: oklch(0 0 0);
|
|
112
114
|
|
|
113
115
|
/* === Sidebar Colors === */
|
|
114
|
-
/*
|
|
115
|
-
--sidebar:
|
|
116
|
+
/* The sidebar sits on the canvas, not on a third grey, and the active item is a card on it. */
|
|
117
|
+
--sidebar: var(--brand-canvas-light);
|
|
116
118
|
--sidebar-foreground: oklch(0.45 0 0);
|
|
117
119
|
--sidebar-primary: oklch(0.15 0 0);
|
|
118
120
|
--sidebar-primary-foreground: oklch(0.98 0 0);
|
|
119
|
-
--sidebar-accent:
|
|
121
|
+
--sidebar-accent: var(--brand-surface-light);
|
|
120
122
|
--sidebar-accent-foreground: oklch(0.15 0 0);
|
|
121
123
|
--sidebar-border: oklch(0.91 0 0);
|
|
122
124
|
--sidebar-ring: var(--brand);
|
|
@@ -146,6 +148,7 @@
|
|
|
146
148
|
--color-line: var(--brand-line);
|
|
147
149
|
--color-raised: var(--brand-raised);
|
|
148
150
|
--color-paper: var(--brand-paper);
|
|
151
|
+
--color-canvas-light: var(--brand-canvas-light);
|
|
149
152
|
--color-surface-light: var(--brand-surface-light);
|
|
150
153
|
--color-line-light: var(--brand-line-light);
|
|
151
154
|
|
|
@@ -216,7 +219,7 @@
|
|
|
216
219
|
);
|
|
217
220
|
|
|
218
221
|
/* Light theme color system: the light surfaces and lines of the brand roles */
|
|
219
|
-
--color-background: var(--
|
|
222
|
+
--color-background: var(--brand-canvas-light);
|
|
220
223
|
--color-foreground: var(--gray-900);
|
|
221
224
|
--color-foreground-muted: var(--gray-700);
|
|
222
225
|
|
|
@@ -342,14 +345,18 @@
|
|
|
342
345
|
--color-destructive-foreground: var(--brand-paper);
|
|
343
346
|
|
|
344
347
|
--color-border: var(--brand-line);
|
|
345
|
-
|
|
348
|
+
/* WHY not raised: raised equals muted, so an input's edge vanished on the card. Mixed from the
|
|
349
|
+
brand's own paper and surface so a brand that moves them keeps the step. Neutral defaults:
|
|
350
|
+
L 0.547, 3.7:1 on the card (L 0.2), 4.0:1 on the canvas (L 0.145), past the 3:1 for an edge.
|
|
351
|
+
Fills read it at /30 (L 0.30), a step over the card. */
|
|
352
|
+
--color-input: color-mix(in oklab, var(--brand-paper) 45%, var(--brand-surface));
|
|
346
353
|
--color-ring: var(--brand-on-dark);
|
|
347
354
|
|
|
348
355
|
/* The brand colour lifts for contrast on the dark page. */
|
|
349
356
|
--color-brand: var(--brand-on-dark);
|
|
350
357
|
|
|
351
|
-
/* Dark sidebar */
|
|
352
|
-
--sidebar: var(--brand-
|
|
358
|
+
/* Dark sidebar: on the page, like light, so the cards are the only raised level */
|
|
359
|
+
--sidebar: var(--brand-ink);
|
|
353
360
|
--sidebar-foreground: var(--brand-paper);
|
|
354
361
|
--sidebar-primary: var(--brand-on-dark);
|
|
355
362
|
--sidebar-primary-foreground: oklch(1 0 0);
|