@poodle64/ui 2026.10.10 → 2026.10.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ui/app-dialog/app-dialog.svelte +1 -1
- package/dist/components/ui/app-shell/app-shell.svelte +6 -3
- package/dist/components/ui/list-shell/list-shell.svelte +1 -1
- package/dist/components/ui/page-canvas/page-canvas.svelte +2 -2
- package/dist/components/ui/page-header/page-header.svelte +1 -1
- package/dist/components/ui/record-switcher/record-switcher.svelte +9 -4
- package/dist/components/ui/stat-list/stat-list.svelte +1 -1
- package/dist/styles.css +16 -1
- package/package.json +1 -1
- package/registry/component-map.json +1 -1
- package/registry/component-map.md +1 -1
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
</span>
|
|
82
82
|
{/if}
|
|
83
83
|
<div class="min-w-0 flex-1">
|
|
84
|
-
<Dialog.Title class="font-display text-lg leading-tight font-semibold tracking-
|
|
84
|
+
<Dialog.Title class="font-display text-lg leading-tight font-semibold tracking-[var(--ds-font-display-tracking,-0.025em)]"
|
|
85
85
|
>{title}</Dialog.Title
|
|
86
86
|
>
|
|
87
87
|
{#if subtitle}
|
|
@@ -457,7 +457,7 @@
|
|
|
457
457
|
slot to re-earn a behaviour the shell could give everyone is the shell
|
|
458
458
|
failing to ship something good.
|
|
459
459
|
-->
|
|
460
|
-
<span class="font-display text-body hidden font-semibold tracking-
|
|
460
|
+
<span class="font-display text-body hidden font-semibold tracking-[var(--ds-font-display-tracking,-0.025em)] sm:inline"
|
|
461
461
|
>{brandTitle}</span
|
|
462
462
|
>
|
|
463
463
|
{/if}
|
|
@@ -701,8 +701,11 @@
|
|
|
701
701
|
data-testid="ds-shell-location"
|
|
702
702
|
>
|
|
703
703
|
{#if location}
|
|
704
|
-
<span
|
|
705
|
-
|
|
704
|
+
<span
|
|
705
|
+
class={cn(
|
|
706
|
+
'text-shell-muted-foreground max-w-48 flex-none truncate text-sm',
|
|
707
|
+
controls.content && 'max-sm:hidden'
|
|
708
|
+
)}>{location}</span
|
|
706
709
|
>
|
|
707
710
|
{/if}
|
|
708
711
|
{#if controls.content}{@render controls.content()}{/if}
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
{...restProps}
|
|
63
63
|
>
|
|
64
64
|
<div class="flex flex-none items-center gap-2 px-5 pt-5 pb-3">
|
|
65
|
-
<h2 class="font-display text-display flex-1 truncate font-semibold tracking-
|
|
65
|
+
<h2 class="font-display text-display flex-1 truncate font-semibold tracking-[var(--ds-font-display-tracking,-0.025em)]">
|
|
66
66
|
{title}
|
|
67
67
|
</h2>
|
|
68
68
|
{#if actions}{@render actions()}{/if}
|
|
@@ -332,7 +332,7 @@
|
|
|
332
332
|
<ChevronLeft class="size-4" />
|
|
333
333
|
</Button>
|
|
334
334
|
<span class="text-foreground min-w-16 text-center text-xs font-medium tabular-nums">
|
|
335
|
-
{currentPage}
|
|
335
|
+
{currentPage} of {pageCount}
|
|
336
336
|
</span>
|
|
337
337
|
<Button
|
|
338
338
|
variant="outline"
|
|
@@ -355,7 +355,7 @@
|
|
|
355
355
|
<Minus class="size-4" />
|
|
356
356
|
</Button>
|
|
357
357
|
<span class="text-foreground min-w-11 text-center text-xs font-medium tabular-nums">
|
|
358
|
-
{Math.round(zoom * 100)}
|
|
358
|
+
{zoom === 1 ? 'Fit' : `${Math.round(zoom * 100)}%`}
|
|
359
359
|
</span>
|
|
360
360
|
<Button variant="outline" size="icon" class="size-8" onclick={zoomIn} aria-label="Zoom in">
|
|
361
361
|
<Plus class="size-4" />
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
{/if}
|
|
96
96
|
{#if title}
|
|
97
97
|
<div class="flex items-center gap-2">
|
|
98
|
-
<h1 class="font-display text-display leading-tight font-semibold tracking-[-0.02em]">
|
|
98
|
+
<h1 class="font-display text-display leading-tight font-semibold tracking-[var(--ds-font-display-tracking,-0.02em)]">
|
|
99
99
|
{title}
|
|
100
100
|
</h1>
|
|
101
101
|
{#if info}
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* with its chevron inside, after the section's name. Its menu finds a
|
|
5
5
|
* record by name, lists them under their headings (owned, then sold) with
|
|
6
6
|
* a thumbnail each, and ends with the way to all of them, so it still
|
|
7
|
-
* works at fifty. The record's own pages follow as tabs.
|
|
7
|
+
* works at fifty. The record's own pages follow as tabs. On a phone the
|
|
8
|
+
* breadcrumb (the section's name and the "/") gives way, and the tabs scroll
|
|
9
|
+
* sideways inside the row, so every page stays reachable.
|
|
8
10
|
*
|
|
9
11
|
* It places nothing itself: put it inside `ShellControls` with whatever
|
|
10
12
|
* else the page sets in the bar.
|
|
@@ -81,7 +83,7 @@
|
|
|
81
83
|
</script>
|
|
82
84
|
|
|
83
85
|
<div class={cn('flex min-w-0 items-center gap-2 sm:gap-3', className)} data-slot="record-switcher">
|
|
84
|
-
{#if separator}<span class="text-shell-muted-foreground flex-none" aria-hidden="true">/</span>{/if}
|
|
86
|
+
{#if separator}<span class="text-shell-muted-foreground flex-none max-sm:hidden" aria-hidden="true">/</span>{/if}
|
|
85
87
|
<Popover.Root bind:open onOpenChange={(o) => o && (highlighted = here())}>
|
|
86
88
|
<Popover.Trigger
|
|
87
89
|
class={cn(
|
|
@@ -147,13 +149,16 @@
|
|
|
147
149
|
</Popover.Root>
|
|
148
150
|
|
|
149
151
|
{#if pages.length}
|
|
150
|
-
<nav
|
|
152
|
+
<nav
|
|
153
|
+
aria-label="Pages of {name}"
|
|
154
|
+
class="ml-1 flex min-w-0 items-stretch gap-1 self-stretch overflow-x-auto sm:ml-3"
|
|
155
|
+
>
|
|
151
156
|
{#each pages as p (p.href)}
|
|
152
157
|
<a
|
|
153
158
|
href={p.href}
|
|
154
159
|
aria-current={p.current ? 'page' : undefined}
|
|
155
160
|
class={cn(
|
|
156
|
-
'flex items-center border-b-2 px-2 text-sm transition-colors sm:px-3',
|
|
161
|
+
'flex flex-none items-center border-b-2 px-2 text-sm transition-colors sm:px-3',
|
|
157
162
|
p.current
|
|
158
163
|
? 'border-primary text-foreground font-semibold'
|
|
159
164
|
: 'text-muted-foreground hover:text-foreground border-transparent'
|
package/dist/styles.css
CHANGED
|
@@ -446,6 +446,19 @@
|
|
|
446
446
|
var(--ds-shadow-sm);
|
|
447
447
|
}
|
|
448
448
|
|
|
449
|
+
/**
|
|
450
|
+
* How the display face is set. An app says it once in its palette
|
|
451
|
+
* (`--ds-font-display-transform: uppercase; --ds-font-display-tracking:
|
|
452
|
+
* 0.04em`) and every place the factory sets --ds-font-display follows: this
|
|
453
|
+
* rule for `.font-display`, the components' own tracking, .ds-prose and the
|
|
454
|
+
* librarian's markdown. Unset, each falls back to `inherit`, which is what the
|
|
455
|
+
* property did before, so an app that sets neither renders as it always did.
|
|
456
|
+
*/
|
|
457
|
+
.font-display {
|
|
458
|
+
text-transform: var(--ds-font-display-transform, inherit);
|
|
459
|
+
letter-spacing: var(--ds-font-display-tracking, inherit);
|
|
460
|
+
}
|
|
461
|
+
|
|
449
462
|
/** Tabular figures, so a column of numbers aligns. */
|
|
450
463
|
.ds-tabular {
|
|
451
464
|
font-variant-numeric: tabular-nums;
|
|
@@ -737,7 +750,7 @@
|
|
|
737
750
|
form. The literal keeps this rule correct on its own; the var keeps an
|
|
738
751
|
app's override flowing through. */
|
|
739
752
|
letter-spacing: var(--tracking-eyebrow, 0.06em);
|
|
740
|
-
color:
|
|
753
|
+
color: var(--ds-nav-ink-muted);
|
|
741
754
|
}
|
|
742
755
|
|
|
743
756
|
/* A count badge is small text on a tint, so it carries the 4.5:1 text floor
|
|
@@ -1144,6 +1157,8 @@
|
|
|
1144
1157
|
.ds-prose h3,
|
|
1145
1158
|
.ds-prose h4 {
|
|
1146
1159
|
font-family: var(--ds-font-display);
|
|
1160
|
+
text-transform: var(--ds-font-display-transform, inherit);
|
|
1161
|
+
letter-spacing: var(--ds-font-display-tracking, inherit);
|
|
1147
1162
|
font-weight: 600;
|
|
1148
1163
|
line-height: 1.25;
|
|
1149
1164
|
margin-block: var(--ds-spacing-lg) var(--ds-spacing-sm);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@poodle64/ui",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.12",
|
|
4
4
|
"description": "Household shared component layer: shadcn-svelte primitives (bits-ui) plus the composed page chrome every app builds its routes from, restyled by each app's @poodle64/design-tokens alias layer. One fix reaches every app.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @poodle64/ui — situation → component map
|
|
2
2
|
|
|
3
3
|
<!-- GENERATED by scripts/generate-registry.mjs from scripts/situations.json + package source. DO NOT EDIT. -->
|
|
4
|
-
Generated from `@poodle64/ui@2026.10.
|
|
4
|
+
Generated from `@poodle64/ui@2026.10.12`. 68 components, 19 situations.
|
|
5
5
|
|
|
6
6
|
**Read this before writing a `<div>`.** Find the SITUATION you are in below, then compose the component named for it — do not hand-build it from raw `Card` or utility classes. Import is `import { Name } from '<import path>'`. Props marked `?` are optional. This map is the retrieval step the [`frontend-design` skill] makes mandatory; the [CHI 2026 study] measured composing-from-a-registry at 95% design-system compliance against 71% for writing the CSS from a prose style guide.
|
|
7
7
|
|