@f-ewald/components 0.4.0 → 0.6.0

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 (87) hide show
  1. package/README.md +29 -0
  2. package/custom-elements.json +3488 -929
  3. package/dist/chat-message.d.ts +39 -0
  4. package/dist/chat-message.d.ts.map +1 -0
  5. package/dist/chat-message.js +155 -0
  6. package/dist/chat-message.js.map +1 -0
  7. package/dist/data-table.d.ts +39 -0
  8. package/dist/data-table.d.ts.map +1 -0
  9. package/dist/data-table.js +119 -0
  10. package/dist/data-table.js.map +1 -0
  11. package/dist/editable-text.d.ts +52 -0
  12. package/dist/editable-text.d.ts.map +1 -0
  13. package/dist/editable-text.js +224 -0
  14. package/dist/editable-text.js.map +1 -0
  15. package/dist/form-select.d.ts +40 -0
  16. package/dist/form-select.d.ts.map +1 -0
  17. package/dist/form-select.js +236 -0
  18. package/dist/form-select.js.map +1 -0
  19. package/dist/gallery-item-variant.d.ts +21 -0
  20. package/dist/gallery-item-variant.d.ts.map +1 -0
  21. package/dist/gallery-item-variant.js +44 -0
  22. package/dist/gallery-item-variant.js.map +1 -0
  23. package/dist/gallery-item.d.ts +28 -0
  24. package/dist/gallery-item.d.ts.map +1 -0
  25. package/dist/gallery-item.js +54 -0
  26. package/dist/gallery-item.js.map +1 -0
  27. package/dist/icons.d.ts +7 -0
  28. package/dist/icons.d.ts.map +1 -1
  29. package/dist/icons.js +7 -0
  30. package/dist/icons.js.map +1 -1
  31. package/dist/index.d.ts +14 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +14 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/live-timer.d.ts +31 -0
  36. package/dist/live-timer.d.ts.map +1 -0
  37. package/dist/live-timer.js +78 -0
  38. package/dist/live-timer.js.map +1 -0
  39. package/dist/photo-gallery.d.ts +117 -0
  40. package/dist/photo-gallery.d.ts.map +1 -0
  41. package/dist/photo-gallery.js +620 -0
  42. package/dist/photo-gallery.js.map +1 -0
  43. package/dist/popover-panel.d.ts +34 -0
  44. package/dist/popover-panel.d.ts.map +1 -0
  45. package/dist/popover-panel.js +173 -0
  46. package/dist/popover-panel.js.map +1 -0
  47. package/dist/stat-meter.d.ts +25 -0
  48. package/dist/stat-meter.d.ts.map +1 -0
  49. package/dist/stat-meter.js +106 -0
  50. package/dist/stat-meter.js.map +1 -0
  51. package/dist/status-pill.d.ts +24 -0
  52. package/dist/status-pill.d.ts.map +1 -0
  53. package/dist/status-pill.js +101 -0
  54. package/dist/status-pill.js.map +1 -0
  55. package/dist/tile-grid.d.ts +32 -0
  56. package/dist/tile-grid.d.ts.map +1 -0
  57. package/dist/tile-grid.js +102 -0
  58. package/dist/tile-grid.js.map +1 -0
  59. package/dist/tokens.css +39 -0
  60. package/dist/tokens.d.ts +28 -3
  61. package/dist/tokens.d.ts.map +1 -1
  62. package/dist/tokens.js +42 -43
  63. package/dist/tokens.js.map +1 -1
  64. package/dist/user-avatar.d.ts +5 -2
  65. package/dist/user-avatar.d.ts.map +1 -1
  66. package/dist/user-avatar.js +22 -6
  67. package/dist/user-avatar.js.map +1 -1
  68. package/dist/utils/duration.d.ts +12 -0
  69. package/dist/utils/duration.d.ts.map +1 -0
  70. package/dist/utils/duration.js +27 -0
  71. package/dist/utils/duration.js.map +1 -0
  72. package/docs/chat-message.md +59 -0
  73. package/docs/data-table.md +63 -0
  74. package/docs/editable-text.md +51 -0
  75. package/docs/form-select.md +64 -0
  76. package/docs/gallery-item-variant.md +37 -0
  77. package/docs/gallery-item.md +47 -0
  78. package/docs/live-timer.md +39 -0
  79. package/docs/map-point.md +2 -1
  80. package/docs/photo-gallery.md +77 -0
  81. package/docs/popover-panel.md +66 -0
  82. package/docs/stat-meter.md +48 -0
  83. package/docs/status-pill.md +43 -0
  84. package/docs/tile-grid.md +58 -0
  85. package/docs/user-avatar.md +1 -1
  86. package/llms.txt +303 -2
  87. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ # `<editable-text>`
2
+
3
+ Jira/GitHub-style click-to-edit text: a display span that turns into an
4
+ `<input>` (or auto-growing `<textarea>` when `multiline`) on click. The
5
+ input/textarea inherits the host's font, so a title wrapped in an `<h1>`
6
+ edits at title size.
7
+
8
+ ## Install
9
+
10
+ ```js
11
+ import "@f-ewald/components/editable-text.js";
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```html
17
+ <editable-text value="Write the quarterly report" label="Title"></editable-text>
18
+ <editable-text multiline placeholder="Add a description…" label="Description"></editable-text>
19
+ ```
20
+
21
+ ## Attributes / properties
22
+
23
+ | Property | Attribute | Type | Default | Description |
24
+ | --- | --- | --- | --- | --- |
25
+ | `value` | `value` | `string` | `""` | Current text. |
26
+ | `multiline` | `multiline` | `boolean` | `false` | `false` renders an `<input>`, `true` an auto-growing `<textarea>`. |
27
+ | `placeholder` | `placeholder` | `string` | `""` | Muted placeholder text shown when `value` is empty, and as the input's placeholder. |
28
+ | `readonly` | `readonly` | `boolean` | `false` | Disables entering edit mode. |
29
+ | `label` | `label` | `string` | `""` | `aria-label` applied to the input/textarea. |
30
+
31
+ ## Events
32
+
33
+ | Event | Description |
34
+ | --- | --- |
35
+ | `change` | Fired with `{ value: string }` when the committed value differs from the previous one. |
36
+
37
+ ## Slots
38
+
39
+ _None._
40
+
41
+ ## CSS custom properties
42
+
43
+ | Custom property |
44
+ | --- |
45
+ | `--ui-border` |
46
+ | `--ui-focus-ring` |
47
+ | `--ui-primary` |
48
+ | `--ui-radius-sm` |
49
+ | `--ui-surface` |
50
+ | `--ui-surface-muted` |
51
+ | `--ui-text-muted` |
@@ -0,0 +1,64 @@
1
+ # `<form-select>`
2
+
3
+ A styled dropdown select: a trigger button showing the current option's
4
+ label, opening a listbox popover on click. Drop-in generic replacement for
5
+ a native `<select>` wherever consistent cross-browser styling and a
6
+ `change` event carrying `{ value }` are wanted (e.g. a task's status
7
+ picker).
8
+
9
+ ## Install
10
+
11
+ ```js
12
+ import "@f-ewald/components/form-select.js";
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```html
18
+ <form-select label="Task state"></form-select>
19
+ <script type="module">
20
+ const select = document.querySelector("form-select");
21
+ select.options = [
22
+ { value: "open", label: "Open" },
23
+ { value: "in_progress", label: "In progress" },
24
+ { value: "done", label: "Done" },
25
+ ];
26
+ select.value = "open";
27
+ select.addEventListener("change", (e) => console.log(e.detail.value));
28
+ </script>
29
+ ```
30
+
31
+ ## Attributes / properties
32
+
33
+ | Property | Attribute | Type | Default | Description |
34
+ | --- | --- | --- | --- | --- |
35
+ | `options` | _(JS property only)_ | `SelectOption[]` | `[]` | The full list of selectable options. |
36
+ | `value` | `value` | `string` | `""` | Currently selected value; must match one of `options[].value`. |
37
+ | `label` | `label` | `string` | `""` | `aria-label` applied to the trigger button. |
38
+ | `disabled` | `disabled` | `boolean` | `false` | Disables the trigger, preventing the popover from opening. |
39
+
40
+ ## Events
41
+
42
+ | Event | Description |
43
+ | --- | --- |
44
+ | `change` | Fired with `{ value: string }` when a different option is picked. |
45
+
46
+ ## Slots
47
+
48
+ _None._
49
+
50
+ ## CSS custom properties
51
+
52
+ | Custom property |
53
+ | --- |
54
+ | `--ui-border` |
55
+ | `--ui-focus-ring` |
56
+ | `--ui-font` |
57
+ | `--ui-font-size-sm` |
58
+ | `--ui-primary` |
59
+ | `--ui-radius-sm` |
60
+ | `--ui-shadow` |
61
+ | `--ui-surface` |
62
+ | `--ui-surface-muted` |
63
+ | `--ui-text` |
64
+ | `--ui-text-muted` |
@@ -0,0 +1,37 @@
1
+ # `<gallery-item-variant>`
2
+
3
+ Responsive image source metadata for a parent `gallery-item`.
4
+
5
+ ## Install
6
+
7
+ ```js
8
+ import "@f-ewald/components/gallery-item-variant.js";
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```html
14
+ <gallery-item-variant
15
+ media="(max-width: 640px)"
16
+ srcset="/photos/coast-portrait.jpg"
17
+ ></gallery-item-variant>
18
+ ```
19
+
20
+ ## Attributes / properties
21
+
22
+ | Property | Attribute | Type | Default | Description |
23
+ | --- | --- | --- | --- | --- |
24
+ | `media` | `media` | `string | undefined` | `—` | Optional media query that controls when this source is selected. |
25
+ | `srcset` | `srcset` | `string` | `""` | Responsive image candidate string passed to a generated `<source>`. |
26
+
27
+ ## Events
28
+
29
+ _None._
30
+
31
+ ## Slots
32
+
33
+ _None._
34
+
35
+ ## CSS custom properties
36
+
37
+ _None._
@@ -0,0 +1,47 @@
1
+ # `<gallery-item>`
2
+
3
+ Declarative image metadata consumed by a parent `photo-gallery`.
4
+
5
+ ## Install
6
+
7
+ ```js
8
+ import "@f-ewald/components/gallery-item.js";
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```html
14
+ <gallery-item
15
+ src="/photos/coast.jpg"
16
+ alt="Rocky California coastline"
17
+ caption="California coast"
18
+ >
19
+ <gallery-item-variant
20
+ media="(max-width: 640px)"
21
+ srcset="/photos/coast-portrait.jpg"
22
+ ></gallery-item-variant>
23
+ </gallery-item>
24
+ ```
25
+
26
+ ## Attributes / properties
27
+
28
+ | Property | Attribute | Type | Default | Description |
29
+ | --- | --- | --- | --- | --- |
30
+ | `src` | `src` | `string` | `""` | URL of the fallback image. |
31
+ | `alt` | `alt` | `string` | `""` | Required alternative text for the image. |
32
+ | `caption` | `caption` | `string | undefined` | `—` | Optional visible caption rendered below the image. |
33
+ | `variants` | _(JS property only)_ | `GalleryItemVariant[]` | `—` | Responsive source variants declared inside this item. _(read-only)_ |
34
+
35
+ ## Events
36
+
37
+ _None._
38
+
39
+ ## Slots
40
+
41
+ | Slot | Description |
42
+ | --- | --- |
43
+ | `(default)` | Optional `gallery-item-variant` responsive image sources. |
44
+
45
+ ## CSS custom properties
46
+
47
+ _None._
@@ -0,0 +1,39 @@
1
+ # `<live-timer>`
2
+
3
+ Per-second ticking count-up timer, e.g. a live "running for 12s" or
4
+ "Sleeping for 3 seconds" indicator. Renders nothing while `since` is unset
5
+ or unparseable.
6
+
7
+ ## Install
8
+
9
+ ```js
10
+ import "@f-ewald/components/live-timer.js";
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```html
16
+ <live-timer since="2026-07-19T12:00:00Z" prefix="Sleeping for "></live-timer>
17
+ <live-timer since="2026-07-19T12:00:00Z" format="compact" prefix="running for "></live-timer>
18
+ ```
19
+
20
+ ## Attributes / properties
21
+
22
+ | Property | Attribute | Type | Default | Description |
23
+ | --- | --- | --- | --- | --- |
24
+ | `since` | `since` | `string | null` | `null` | ISO-8601 start instant; elapsed time is measured from here. |
25
+ | `format` | `format` | `DurationFormat` | `"seconds"` | `"seconds"` -> "1 second", "12 seconds"; `"compact"` -> "12s", "3m 12s", "1h 03m 12s". |
26
+ | `prefix` | `prefix` | `string` | `""` | Text rendered before the formatted value. |
27
+ | `suffix` | `suffix` | `string` | `""` | Text rendered after the formatted value. |
28
+
29
+ ## Events
30
+
31
+ _None._
32
+
33
+ ## Slots
34
+
35
+ _None._
36
+
37
+ ## CSS custom properties
38
+
39
+ _None._
package/docs/map-point.md CHANGED
@@ -19,7 +19,8 @@ import "@f-ewald/components/map-point.js";
19
19
  ## Usage
20
20
 
21
21
  ```html
22
- <map-point></map-point>
22
+ <map-point color="#0099D8"></map-point>
23
+ <map-point color="#fb8072" size="10" ring-width="2"></map-point>
23
24
  ```
24
25
 
25
26
  ## Attributes / properties
@@ -0,0 +1,77 @@
1
+ # `<photo-gallery>`
2
+
3
+ Responsive, accessible image carousel composed from declarative
4
+ `gallery-item` children.
5
+
6
+ ## Install
7
+
8
+ ```js
9
+ import "@f-ewald/components/photo-gallery.js";
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```html
15
+ <photo-gallery delay="5000" show-counter show-indicators>
16
+ <gallery-item
17
+ src="/photos/coast.jpg"
18
+ alt="Rocky California coastline"
19
+ caption="California coast"
20
+ >
21
+ <gallery-item-variant
22
+ media="(max-width: 640px)"
23
+ srcset="/photos/coast-portrait.jpg"
24
+ ></gallery-item-variant>
25
+ </gallery-item>
26
+ <gallery-item src="/photos/bridge.jpg" alt="Golden Gate Bridge"></gallery-item>
27
+ </photo-gallery>
28
+ <script type="module">
29
+ document.querySelector("photo-gallery").addEventListener("slide-change", (event) => {
30
+ console.log(event.detail.currentIndex);
31
+ });
32
+ </script>
33
+ ```
34
+
35
+ ## Attributes / properties
36
+
37
+ | Property | Attribute | Type | Default | Description |
38
+ | --- | --- | --- | --- | --- |
39
+ | `currentIndex` | `current-index` | `number` | `0` | Zero-based active image index. |
40
+ | `delay` | `delay` | `number` | `0` | Autoplay interval in milliseconds. Set to zero to disable autoplay. |
41
+ | `showControls` | `show-controls` | `boolean` | `true` | Whether previous and next buttons are shown. |
42
+ | `showCounter` | `show-counter` | `boolean` | `false` | Whether a current/total counter is shown. |
43
+ | `showIndicators` | `show-indicators` | `boolean` | `false` | Whether clickable slide indicators are shown. |
44
+ | `showAutoplayControl` | `show-autoplay-control` | `boolean` | `true` | Whether autoplay includes a built-in pause/play control. |
45
+ | `paused` | `paused` | `boolean` | `false` | Whether autoplay is explicitly paused. |
46
+ | `aspectRatio` | `aspect-ratio` | `string` | `"16 / 9"` | CSS aspect ratio used by the image viewport. |
47
+ | `objectFit` | `object-fit` | `PhotoGalleryObjectFit` | `"cover"` | How images fit within the stable viewport. |
48
+
49
+ ## Events
50
+
51
+ | Event | Description |
52
+ | --- | --- |
53
+ | `slide-change` | The active image changed. |
54
+
55
+ ## Slots
56
+
57
+ | Slot | Description |
58
+ | --- | --- |
59
+ | `(default)` | Declarative `gallery-item` elements rendered as slides. |
60
+
61
+ ## CSS custom properties
62
+
63
+ | Custom property |
64
+ | --- |
65
+ | `--ui-border` |
66
+ | `--ui-focus-ring` |
67
+ | `--ui-font` |
68
+ | `--ui-font-size` |
69
+ | `--ui-font-size-sm` |
70
+ | `--ui-overlay` |
71
+ | `--ui-primary` |
72
+ | `--ui-radius` |
73
+ | `--ui-radius-sm` |
74
+ | `--ui-surface` |
75
+ | `--ui-surface-muted` |
76
+ | `--ui-text` |
77
+ | `--ui-text-muted` |
@@ -0,0 +1,66 @@
1
+ # `<popover-panel>`
2
+
3
+ Generic anchored popover shell: a floating card positioned relative to its
4
+ nearest `position: relative` ancestor (place it next to its trigger button
5
+ inside such a wrapper), as opposed to `slide-panel`'s fixed screen-edge
6
+ drawer. Closes on outside click or Escape. Header chrome and close button
7
+ match `slide-panel`'s API (`heading`, `panel-close`) so either can be
8
+ swapped in for the other with no consumer-side changes beyond the wrapper.
9
+
10
+ Set `centered` to render as a screen-centered modal with a translucent
11
+ backdrop instead of the default anchored placement.
12
+
13
+ ## Install
14
+
15
+ ```js
16
+ import "@f-ewald/components/popover-panel.js";
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ```html
22
+ <div style="position: relative; display: inline-block;">
23
+ <button id="new-task-btn">New task</button>
24
+ <popover-panel heading="New task">
25
+ Popover body content goes here.
26
+ </popover-panel>
27
+ </div>
28
+ <script type="module">
29
+ const popover = document.querySelector("popover-panel");
30
+ document.querySelector("#new-task-btn").addEventListener("click", () => (popover.open = true));
31
+ popover.addEventListener("panel-close", () => (popover.open = false));
32
+ </script>
33
+ ```
34
+
35
+ ## Attributes / properties
36
+
37
+ | Property | Attribute | Type | Default | Description |
38
+ | --- | --- | --- | --- | --- |
39
+ | `open` | `open` | `boolean` | `false` | Whether the popover is currently visible. |
40
+ | `heading` | `heading` | `string` | `""` | Title text shown in the popover header. |
41
+ | `centered` | `centered` | `boolean` | `false` | Render as a screen-centered modal with a backdrop instead of anchored placement. |
42
+
43
+ ## Events
44
+
45
+ | Event | Description |
46
+ | --- | --- |
47
+ | `panel-close` | User clicked the close (✕) button, pressed Escape, or clicked outside/the backdrop. |
48
+
49
+ ## Slots
50
+
51
+ _None._
52
+
53
+ ## CSS custom properties
54
+
55
+ | Custom property |
56
+ | --- |
57
+ | `--ui-border` |
58
+ | `--ui-font` |
59
+ | `--ui-font-size` |
60
+ | `--ui-radius` |
61
+ | `--ui-radius-sm` |
62
+ | `--ui-shadow-lg` |
63
+ | `--ui-surface` |
64
+ | `--ui-surface-muted` |
65
+ | `--ui-text` |
66
+ | `--ui-text-muted` |
@@ -0,0 +1,48 @@
1
+ # `<stat-meter>`
2
+
3
+ A compact labeled meter for a single percentage reading — e.g. CPU or
4
+ memory usage in a dashboard header. `percent` may be `null` when no
5
+ reading is available yet (e.g. the first tick of a polling metric); the
6
+ bar then renders empty and the value shows an em dash instead of "0%".
7
+
8
+ ## Install
9
+
10
+ ```js
11
+ import "@f-ewald/components/stat-meter.js";
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```html
17
+ <stat-meter label="CPU" percent="42"></stat-meter>
18
+ <stat-meter label="MEM" percent="76"></stat-meter>
19
+ <stat-meter label="I/O"></stat-meter> <!-- percent unset -> null -> renders "—" -->
20
+ <stat-meter label="GPU" percent="88" color="#dc2626"></stat-meter>
21
+ ```
22
+
23
+ ## Attributes / properties
24
+
25
+ | Property | Attribute | Type | Default | Description |
26
+ | --- | --- | --- | --- | --- |
27
+ | `label` | `label` | `string` | `""` | Short label shown before the bar, e.g. "CPU" or "MEM". |
28
+ | `percent` | `percent` | `number | null` | `null` | Percentage 0-100. `null` renders an empty bar and a "—" value instead of "0%". |
29
+ | `color` | `color` | `string` | `""` | Fill color override; falls back to the `--ui-success` token. |
30
+
31
+ ## Events
32
+
33
+ _None._
34
+
35
+ ## Slots
36
+
37
+ _None._
38
+
39
+ ## CSS custom properties
40
+
41
+ | Custom property |
42
+ | --- |
43
+ | `--ui-font` |
44
+ | `--ui-font-size-sm` |
45
+ | `--ui-success` |
46
+ | `--ui-surface-muted` |
47
+ | `--ui-text` |
48
+ | `--ui-text-muted` |
@@ -0,0 +1,43 @@
1
+ # `<status-pill>`
2
+
3
+ Small colored status pill, optionally with a spinning icon — for task/run
4
+ states ("Open", "Blocked", "Done") and live-activity indicators ("Running").
5
+
6
+ ## Install
7
+
8
+ ```js
9
+ import "@f-ewald/components/status-pill.js";
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```html
15
+ <status-pill label="Running" color="primary" spinner></status-pill>
16
+ <status-pill label="Blocked" color="danger"></status-pill>
17
+ ```
18
+
19
+ ## Attributes / properties
20
+
21
+ | Property | Attribute | Type | Default | Description |
22
+ | --- | --- | --- | --- | --- |
23
+ | `label` | `label` | `string` | `""` | Text shown inside the pill. |
24
+ | `color` | `color` | `StatusPillColor` | `"neutral"` | Color variant. |
25
+ | `spinner` | `spinner` | `boolean` | `false` | Renders a small spinning icon before the label. |
26
+
27
+ ## Events
28
+
29
+ _None._
30
+
31
+ ## Slots
32
+
33
+ _None._
34
+
35
+ ## CSS custom properties
36
+
37
+ | Custom property |
38
+ | --- |
39
+ | `--ui-danger` |
40
+ | `--ui-font` |
41
+ | `--ui-primary` |
42
+ | `--ui-success` |
43
+ | `--ui-text-muted` |
@@ -0,0 +1,58 @@
1
+ # `<tile-grid>`
2
+
3
+ A generic, presentational grid shell: renders one bordered card per entry
4
+ in `items`, with each tile's content produced by `renderTile` (default:
5
+ stringify). Knows nothing about what an "item" means — callers own the
6
+ data shape entirely. Modeled directly on `data-table`'s headless pattern.
7
+
8
+ Optional `itemHref` makes whole tiles clickable (navigating via
9
+ `location.hash`), without hijacking clicks on nested interactive elements
10
+ (links/buttons) a tile's rendered content might contain.
11
+
12
+ ## Install
13
+
14
+ ```js
15
+ import "@f-ewald/components/tile-grid.js";
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```html
21
+ <tile-grid></tile-grid>
22
+ <script type="module">
23
+ const grid = document.querySelector("tile-grid");
24
+ grid.items = [
25
+ { name: "notes.txt" },
26
+ { name: "photo.jpg" },
27
+ ];
28
+ grid.renderTile = (item) => item.name;
29
+ </script>
30
+ ```
31
+
32
+ ## Attributes / properties
33
+
34
+ | Property | Attribute | Type | Default | Description |
35
+ | --- | --- | --- | --- | --- |
36
+ | `items` | _(JS property only)_ | `unknown[]` | `[]` | Tile data; opaque to this component beyond what `renderTile` does with it. |
37
+ | `itemKey` | _(JS property only)_ | `(item: unknown, index: number) => string | number` | `—` | Stable identity for `items[i]`, used as the repeat-directive key. Defaults to the item's index. |
38
+ | `renderTile` | _(JS property only)_ | `(item: unknown) => unknown` | `—` | Produces a tile's rendered content for `item`. Default: stringify. |
39
+ | `itemHref` | _(JS property only)_ | `((item: unknown) => string | null) | null` | `null` | When set, clicking a tile (outside any nested link/button) navigates to this hash. |
40
+
41
+ ## Events
42
+
43
+ _None._
44
+
45
+ ## Slots
46
+
47
+ _None._
48
+
49
+ ## CSS custom properties
50
+
51
+ | Custom property |
52
+ | --- |
53
+ | `--ui-border` |
54
+ | `--ui-font` |
55
+ | `--ui-font-size-sm` |
56
+ | `--ui-radius` |
57
+ | `--ui-surface-muted` |
58
+ | `--ui-text` |
@@ -24,7 +24,7 @@ import "@f-ewald/components/user-avatar.js";
24
24
  | --- | --- | --- | --- | --- |
25
25
  | `src` | `src` | `string | null` | `null` | Image URL to show. Falls back to initials/icon if unset or it fails to load. |
26
26
  | `name` | `name` | `string | null` | `null` | Source string for the fallback initial (e.g. a display name or email) — first character, uppercased. |
27
- | `size` | `size` | `number` | `32` | Diameter in CSS pixels. |
27
+ | `size` | `size` | `string | number` | `32` | Diameter in CSS pixels, or a preset name (`xs`=18, `sm`=24, `md`=32, `lg`=48). |
28
28
 
29
29
  ## Events
30
30