@poodle64/ui 2026.10.9 → 2026.10.11

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.
@@ -701,8 +701,11 @@
701
701
  data-testid="ds-shell-location"
702
702
  >
703
703
  {#if location}
704
- <span class="text-shell-muted-foreground max-w-48 flex-none truncate text-sm"
705
- >{location}</span
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}
@@ -547,7 +547,7 @@
547
547
  >
548
548
  {:else if c.cell}
549
549
  <span class={cn(CELL, through, 'flex items-center self-center')} {style}
550
- >{@render c.cell(r)}
550
+ >{@render c.cell(r, c)}
551
551
  {#if c.actions}<span class="pointer-events-auto flex flex-none items-center gap-1" data-slot="ledger-actions">{@render c.actions(r)}</span>{/if}</span
552
552
  >
553
553
  {:else}
@@ -77,8 +77,12 @@ export interface ListColumn<R> {
77
77
  /**
78
78
  * A cell of the module's own markup. On a row that opens, a click passes
79
79
  * through the cell to the row; a control inside takes `pointer-events-auto`.
80
+ * It gets the column too, so one snippet can serve columns built at runtime,
81
+ * telling them apart by `key`. Read the row's figures in the snippet's
82
+ * markup, which follows the row when it changes; a `createRawSnippet` draws
83
+ * once at mount and goes stale.
80
84
  */
81
- cell?: Snippet<[R]>;
85
+ cell?: Snippet<[R, ListColumn<R>]>;
82
86
  }
83
87
  /**
84
88
  * A column the module offers the ledger. The keys `date`, `title`, `amount`
@@ -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} / {pageCount}
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" />
@@ -220,7 +220,7 @@
220
220
  </script>
221
221
 
222
222
  {#snippet value(c: (typeof shown)[number], r: R)}
223
- {#if c.cell}{@render c.cell(r)}{:else}{c.text?.(r) ?? ''}{/if}
223
+ {#if c.cell}{@render c.cell(r, c)}{:else}{c.text?.(r) ?? ''}{/if}
224
224
  {/snippet}
225
225
 
226
226
  {#snippet flags(r: R, all: boolean)}
@@ -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 aria-label="Pages of {name}" class="ml-1 flex items-stretch gap-1 self-stretch sm:ml-3">
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poodle64/ui",
3
- "version": "2026.10.9",
3
+ "version": "2026.10.11",
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
  {
2
2
  "meta": {
3
3
  "package": "@poodle64/ui",
4
- "version": "2026.10.9",
4
+ "version": "2026.10.11",
5
5
  "generatedBy": "scripts/generate-registry.mjs",
6
6
  "source": "scripts/situations.json + package source (DO NOT EDIT the outputs by hand)",
7
7
  "componentCount": 68,
@@ -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.9`. 68 components, 19 situations.
4
+ Generated from `@poodle64/ui@2026.10.11`. 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