@urbicon-ui/blocks 6.10.1 → 6.12.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.
@@ -137,6 +137,7 @@ declare const blocksTranslations: {
137
137
  readonly complete: "Completed";
138
138
  readonly active: "In progress";
139
139
  readonly pending: "Pending";
140
+ readonly attention: "Needs attention";
140
141
  readonly blocked: "Blocked";
141
142
  readonly skipped: "Skipped";
142
143
  };
@@ -318,6 +319,7 @@ declare const blocksTranslations: {
318
319
  readonly complete: "Abgeschlossen";
319
320
  readonly active: "In Bearbeitung";
320
321
  readonly pending: "Ausstehend";
322
+ readonly attention: "Aufmerksamkeit erforderlich";
321
323
  readonly blocked: "Blockiert";
322
324
  readonly skipped: "Übersprungen";
323
325
  };
@@ -20,6 +20,8 @@
20
20
  onFocusChange,
21
21
  node,
22
22
  meta,
23
+ marker,
24
+ trailing,
23
25
  class: className = '',
24
26
  unstyled: unstyledProp = false,
25
27
  slotClasses: slotClassesProp = {},
@@ -310,6 +312,25 @@
310
312
  <span class="sr-only">{statusLabel(item.status)}</span>
311
313
  {/snippet}
312
314
 
315
+ {#snippet markerDot(item: JourneyNode, styles: Styles | null)}
316
+ <!-- Decorative either way: the status is announced via the sr-only label,
317
+ so custom glyph content never needs to be readable. -->
318
+ <span class={sc(styles, 'marker')} data-journey-marker="" aria-hidden="true">
319
+ {#if marker}{@render marker(item)}{/if}
320
+ </span>
321
+ {/snippet}
322
+
323
+ {#snippet headerRow(item: JourneyNode, index: number, focused: boolean, styles: Styles | null)}
324
+ <div class={sc(styles, 'header')}>
325
+ {@render trigger(item, index, focused, styles)}
326
+ {#if trailing}
327
+ <div class={sc(styles, 'trailing')} data-journey-trailing="">
328
+ {@render trailing(item)}
329
+ </div>
330
+ {/if}
331
+ </div>
332
+ {/snippet}
333
+
313
334
  {#snippet trigger(item: JourneyNode, index: number, focused: boolean, styles: Styles | null)}
314
335
  {@const interactive = item.focusable !== false}
315
336
  {#if interactive}
@@ -373,11 +394,11 @@
373
394
  {/if}
374
395
  </div>
375
396
  {/if}
376
- <!-- DOM order trigger → spine (visual order flipped via order-*):
397
+ <!-- DOM order header → spine (visual order flipped via order-*):
377
398
  a segment label is announced after the node it departs from. -->
378
- {@render trigger(item, index, focused, styles)}
399
+ {@render headerRow(item, index, focused, styles)}
379
400
  <div class={sc(styles, 'markerColumn')}>
380
- <span class={sc(styles, 'marker')} data-journey-marker="" aria-hidden="true"></span>
401
+ {@render markerDot(item, styles)}
381
402
  {#if !last}
382
403
  <span data-journey-connector="" class={sc(styles, 'connector')} aria-hidden="true"
383
404
  ></span>
@@ -404,7 +425,7 @@
404
425
  </div>
405
426
  {/if}
406
427
  <div class={sc(styles, 'markerColumn')}>
407
- <span class={sc(styles, 'marker')} data-journey-marker="" aria-hidden="true"></span>
428
+ {@render markerDot(item, styles)}
408
429
  {#if !last}
409
430
  <span data-journey-connector="" class={sc(styles, 'connector')} aria-hidden="true"
410
431
  ></span>
@@ -412,7 +433,7 @@
412
433
  </div>
413
434
  <div class={sc(styles, 'content', last && 'pb-0')}>
414
435
  <div class={sc(styles, 'card')}>
415
- {@render trigger(item, index, focused, styles)}
436
+ {@render headerRow(item, index, focused, styles)}
416
437
  {#if detailMode === 'inline' && node && item.focusable !== false}
417
438
  <div
418
439
  id={detailDomId(index)}
@@ -2,7 +2,7 @@ import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  import type { JourneyTimelineSlots, JourneyTimelineVariants } from './journey-timeline.variants.js';
4
4
  /** Lifecycle status of a journey node — drives marker colour and title tone. */
5
- export type JourneyStatus = 'complete' | 'active' | 'pending' | 'blocked' | 'skipped';
5
+ export type JourneyStatus = 'complete' | 'active' | 'pending' | 'attention' | 'blocked' | 'skipped';
6
6
  /** A single node (waypoint) on a {@link JourneyTimelineProps | JourneyTimeline}. */
7
7
  export interface JourneyNode {
8
8
  /** Stable unique identifier — used as the focus key and for `{#each}` keying. */
@@ -12,8 +12,9 @@ export interface JourneyNode {
12
12
  /**
13
13
  * Lifecycle status. Maps to a semantic dot marker + title tone:
14
14
  * `complete` (success), `active` (primary, ringed), `pending` (hollow),
15
- * `blocked` (danger), `skipped` (muted). The status is also announced through
16
- * a visually-hidden label.
15
+ * `attention` (warning — worth a look, does not block), `blocked` (danger),
16
+ * `skipped` (muted). The status is also announced through a visually-hidden
17
+ * label.
17
18
  */
18
19
  status: JourneyStatus;
19
20
  /** Short context line shown below the title. */
@@ -51,13 +52,17 @@ export interface JourneyNode {
51
52
  * shows rich detail (`node` snippet); the rest stay quiet, compact context
52
53
  * rows. The chronicle axis is first-class: per-node `meta` (time/date/actor)
53
54
  * renders on a meta rail, connectors carry meaning (`solid | dashed | dotted`)
54
- * and `segmentLabel` annotates the stretch between nodes. Detail placement is
55
- * configurable: `detail="inline"` expands in place (vertical default);
56
- * `detail="panel"` renders a stable readout beside (wide) or docked below
57
- * (narrow) the rail horizontal always uses the panel. Use `Stepper` for a
58
- * prospective wizard/progress indicator and `Tab` for switching between peer
59
- * views; JourneyTimeline is read-only observation of a sequence, not process
60
- * control or navigation.
55
+ * and `segmentLabel` annotates the stretch between nodes. Rows extend without
56
+ * forking the layout: a `marker` snippet puts glyphs inside the status dots, a
57
+ * `trailing` snippet adds badges/help/actions beside each header (outside the
58
+ * button safe for interactive elements), and the `attention` status flags
59
+ * optional-but-noteworthy rows. Detail placement is configurable:
60
+ * `detail="inline"` expands in place (vertical default); `detail="panel"`
61
+ * renders a stable readout beside (wide) or docked below (narrow) the rail —
62
+ * horizontal always uses the panel. Use `Stepper` for a prospective
63
+ * wizard/progress indicator and `Tab` for switching between peer views;
64
+ * JourneyTimeline is read-only observation of a sequence, not process control
65
+ * or navigation.
61
66
  *
62
67
  * @tag navigation
63
68
  * @tag display
@@ -127,14 +132,30 @@ export interface JourneyTimelineProps extends Pick<JourneyTimelineVariants, 'ori
127
132
  * the plain `item.meta` text (e.g. planned + actual time with a Badge).
128
133
  */
129
134
  meta?: Snippet<[JourneyNode]>;
135
+ /**
136
+ * Custom content *inside* each status dot — a glyph, count or icon. The dot
137
+ * keeps its status colour, shape and size contract (scale it via
138
+ * `slotClasses.marker`, e.g. `size-5`). Markers stay decorative
139
+ * (`aria-hidden`); the status is still announced through the hidden label.
140
+ */
141
+ marker?: Snippet<[JourneyNode]>;
142
+ /**
143
+ * End-of-row content beside each node's header — status badges, a help
144
+ * affordance, quick actions. Renders *outside* the trigger button (a sibling
145
+ * in the header row), so interactive elements are valid HTML and activating
146
+ * them never moves the focused node. Right-aligned in vertical orientation,
147
+ * appended to the label pill in horizontal.
148
+ */
149
+ trailing?: Snippet<[JourneyNode]>;
130
150
  /** Extra classes merged onto the root element. */
131
151
  class?: string;
132
152
  /** Remove all default tv() classes. */
133
153
  unstyled?: boolean;
134
154
  /**
135
155
  * Per-slot class overrides. Slots: base | rail | node | metaColumn | meta |
136
- * markerColumn | marker | connector | content | card | trigger | labelGroup |
137
- * title | subtitle | segment | detail | detailInner | detailContent | panel
156
+ * markerColumn | marker | connector | content | card | header | trigger |
157
+ * trailing | labelGroup | title | subtitle | segment | detail | detailInner |
158
+ * detailContent | panel
138
159
  */
139
160
  slotClasses?: Partial<Record<JourneyTimelineSlots, string>>;
140
161
  /**
@@ -6,6 +6,9 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
6
6
  node: string;
7
7
  markerColumn: string;
8
8
  connector: string;
9
+ header: string;
10
+ trigger: string;
11
+ trailing: string;
9
12
  segment: string;
10
13
  };
11
14
  horizontal: {
@@ -14,6 +17,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
14
17
  node: string;
15
18
  metaColumn: string;
16
19
  markerColumn: string;
20
+ header: string;
17
21
  trigger: string;
18
22
  connector: string;
19
23
  segment: string;
@@ -71,6 +75,10 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
71
75
  marker: string;
72
76
  title: string;
73
77
  };
78
+ attention: {
79
+ marker: string;
80
+ title: string;
81
+ };
74
82
  blocked: {
75
83
  marker: string;
76
84
  title: string;
@@ -128,7 +136,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
128
136
  base: (props?: ({
129
137
  orientation?: "horizontal" | "vertical" | undefined;
130
138
  size?: "sm" | "md" | "lg" | undefined;
131
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
139
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
132
140
  focused?: boolean | undefined;
133
141
  interactive?: boolean | undefined;
134
142
  travelled?: boolean | undefined;
@@ -142,7 +150,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
142
150
  rail: (props?: ({
143
151
  orientation?: "horizontal" | "vertical" | undefined;
144
152
  size?: "sm" | "md" | "lg" | undefined;
145
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
153
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
146
154
  focused?: boolean | undefined;
147
155
  interactive?: boolean | undefined;
148
156
  travelled?: boolean | undefined;
@@ -156,7 +164,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
156
164
  node: (props?: ({
157
165
  orientation?: "horizontal" | "vertical" | undefined;
158
166
  size?: "sm" | "md" | "lg" | undefined;
159
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
167
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
160
168
  focused?: boolean | undefined;
161
169
  interactive?: boolean | undefined;
162
170
  travelled?: boolean | undefined;
@@ -170,7 +178,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
170
178
  metaColumn: (props?: ({
171
179
  orientation?: "horizontal" | "vertical" | undefined;
172
180
  size?: "sm" | "md" | "lg" | undefined;
173
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
181
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
174
182
  focused?: boolean | undefined;
175
183
  interactive?: boolean | undefined;
176
184
  travelled?: boolean | undefined;
@@ -184,7 +192,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
184
192
  meta: (props?: ({
185
193
  orientation?: "horizontal" | "vertical" | undefined;
186
194
  size?: "sm" | "md" | "lg" | undefined;
187
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
195
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
188
196
  focused?: boolean | undefined;
189
197
  interactive?: boolean | undefined;
190
198
  travelled?: boolean | undefined;
@@ -198,7 +206,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
198
206
  markerColumn: (props?: ({
199
207
  orientation?: "horizontal" | "vertical" | undefined;
200
208
  size?: "sm" | "md" | "lg" | undefined;
201
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
209
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
202
210
  focused?: boolean | undefined;
203
211
  interactive?: boolean | undefined;
204
212
  travelled?: boolean | undefined;
@@ -212,7 +220,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
212
220
  marker: (props?: ({
213
221
  orientation?: "horizontal" | "vertical" | undefined;
214
222
  size?: "sm" | "md" | "lg" | undefined;
215
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
223
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
216
224
  focused?: boolean | undefined;
217
225
  interactive?: boolean | undefined;
218
226
  travelled?: boolean | undefined;
@@ -226,7 +234,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
226
234
  connector: (props?: ({
227
235
  orientation?: "horizontal" | "vertical" | undefined;
228
236
  size?: "sm" | "md" | "lg" | undefined;
229
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
237
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
230
238
  focused?: boolean | undefined;
231
239
  interactive?: boolean | undefined;
232
240
  travelled?: boolean | undefined;
@@ -240,7 +248,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
240
248
  content: (props?: ({
241
249
  orientation?: "horizontal" | "vertical" | undefined;
242
250
  size?: "sm" | "md" | "lg" | undefined;
243
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
251
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
244
252
  focused?: boolean | undefined;
245
253
  interactive?: boolean | undefined;
246
254
  travelled?: boolean | undefined;
@@ -254,7 +262,21 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
254
262
  card: (props?: ({
255
263
  orientation?: "horizontal" | "vertical" | undefined;
256
264
  size?: "sm" | "md" | "lg" | undefined;
257
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
265
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
266
+ focused?: boolean | undefined;
267
+ interactive?: boolean | undefined;
268
+ travelled?: boolean | undefined;
269
+ connectorStyle?: "solid" | "dashed" | "dotted" | undefined;
270
+ detail?: "inline" | "panel" | undefined;
271
+ withMeta?: boolean | undefined;
272
+ } & {
273
+ class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
274
+ className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
275
+ }) | undefined) => string;
276
+ header: (props?: ({
277
+ orientation?: "horizontal" | "vertical" | undefined;
278
+ size?: "sm" | "md" | "lg" | undefined;
279
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
258
280
  focused?: boolean | undefined;
259
281
  interactive?: boolean | undefined;
260
282
  travelled?: boolean | undefined;
@@ -268,7 +290,21 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
268
290
  trigger: (props?: ({
269
291
  orientation?: "horizontal" | "vertical" | undefined;
270
292
  size?: "sm" | "md" | "lg" | undefined;
271
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
293
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
294
+ focused?: boolean | undefined;
295
+ interactive?: boolean | undefined;
296
+ travelled?: boolean | undefined;
297
+ connectorStyle?: "solid" | "dashed" | "dotted" | undefined;
298
+ detail?: "inline" | "panel" | undefined;
299
+ withMeta?: boolean | undefined;
300
+ } & {
301
+ class?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
302
+ className?: string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | (string | false | /*elided*/ any | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined)[] | null | undefined;
303
+ }) | undefined) => string;
304
+ trailing: (props?: ({
305
+ orientation?: "horizontal" | "vertical" | undefined;
306
+ size?: "sm" | "md" | "lg" | undefined;
307
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
272
308
  focused?: boolean | undefined;
273
309
  interactive?: boolean | undefined;
274
310
  travelled?: boolean | undefined;
@@ -282,7 +318,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
282
318
  labelGroup: (props?: ({
283
319
  orientation?: "horizontal" | "vertical" | undefined;
284
320
  size?: "sm" | "md" | "lg" | undefined;
285
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
321
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
286
322
  focused?: boolean | undefined;
287
323
  interactive?: boolean | undefined;
288
324
  travelled?: boolean | undefined;
@@ -296,7 +332,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
296
332
  title: (props?: ({
297
333
  orientation?: "horizontal" | "vertical" | undefined;
298
334
  size?: "sm" | "md" | "lg" | undefined;
299
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
335
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
300
336
  focused?: boolean | undefined;
301
337
  interactive?: boolean | undefined;
302
338
  travelled?: boolean | undefined;
@@ -310,7 +346,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
310
346
  subtitle: (props?: ({
311
347
  orientation?: "horizontal" | "vertical" | undefined;
312
348
  size?: "sm" | "md" | "lg" | undefined;
313
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
349
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
314
350
  focused?: boolean | undefined;
315
351
  interactive?: boolean | undefined;
316
352
  travelled?: boolean | undefined;
@@ -324,7 +360,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
324
360
  segment: (props?: ({
325
361
  orientation?: "horizontal" | "vertical" | undefined;
326
362
  size?: "sm" | "md" | "lg" | undefined;
327
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
363
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
328
364
  focused?: boolean | undefined;
329
365
  interactive?: boolean | undefined;
330
366
  travelled?: boolean | undefined;
@@ -338,7 +374,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
338
374
  detail: (props?: ({
339
375
  orientation?: "horizontal" | "vertical" | undefined;
340
376
  size?: "sm" | "md" | "lg" | undefined;
341
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
377
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
342
378
  focused?: boolean | undefined;
343
379
  interactive?: boolean | undefined;
344
380
  travelled?: boolean | undefined;
@@ -352,7 +388,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
352
388
  detailInner: (props?: ({
353
389
  orientation?: "horizontal" | "vertical" | undefined;
354
390
  size?: "sm" | "md" | "lg" | undefined;
355
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
391
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
356
392
  focused?: boolean | undefined;
357
393
  interactive?: boolean | undefined;
358
394
  travelled?: boolean | undefined;
@@ -366,7 +402,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
366
402
  detailContent: (props?: ({
367
403
  orientation?: "horizontal" | "vertical" | undefined;
368
404
  size?: "sm" | "md" | "lg" | undefined;
369
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
405
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
370
406
  focused?: boolean | undefined;
371
407
  interactive?: boolean | undefined;
372
408
  travelled?: boolean | undefined;
@@ -380,7 +416,7 @@ export declare const journeyTimelineVariants: (props?: import("../../utils/varia
380
416
  panel: (props?: ({
381
417
  orientation?: "horizontal" | "vertical" | undefined;
382
418
  size?: "sm" | "md" | "lg" | undefined;
383
- status?: "active" | "blocked" | "complete" | "pending" | "skipped" | undefined;
419
+ status?: "active" | "blocked" | "attention" | "complete" | "pending" | "skipped" | undefined;
384
420
  focused?: boolean | undefined;
385
421
  interactive?: boolean | undefined;
386
422
  travelled?: boolean | undefined;
@@ -19,9 +19,10 @@ export const journeyTimelineVariants = tv({
19
19
  // grows down inside; horizontal: a full-width row the line grows right in.
20
20
  markerColumn: 'flex items-center',
21
21
  // The status dot. Deliberately small — the line is the protagonist, the
22
- // dots are punctuation (contrast: Stepper's large glyph discs).
22
+ // dots are punctuation (contrast: Stepper's large glyph discs). The grid
23
+ // centring only matters when a `marker` snippet puts a glyph inside.
23
24
  marker: [
24
- 'box-border shrink-0 rounded-commit border-2',
25
+ 'box-border grid shrink-0 place-items-center rounded-commit border-2',
25
26
  'transition-[background-color,border-color,box-shadow] duration-[var(--blocks-duration-fast)]'
26
27
  ],
27
28
  // The connecting line. Drawn with borders so `connectorStyle` can switch
@@ -39,13 +40,19 @@ export const journeyTimelineVariants = tv({
39
40
  'rounded-contain border border-transparent',
40
41
  'transition-[background-color,border-color,box-shadow] duration-[var(--blocks-duration-normal)] ease-[var(--blocks-ease-gentle)]'
41
42
  ],
43
+ // Header row: the trigger plus the optional trailing area. Keeping
44
+ // `trailing` a *sibling* of the button (never a child) keeps interactive
45
+ // trailing content valid HTML and off the activation target.
46
+ header: 'flex',
42
47
  // The interactive header — title + subtitle. A <button> for focusable
43
48
  // nodes, a plain <div> for pure waypoints (focusable === false).
44
49
  trigger: [
45
- 'flex w-full appearance-none flex-col items-start gap-0.5 border-0 bg-transparent p-0 text-left',
50
+ 'flex appearance-none flex-col items-start gap-0.5 border-0 bg-transparent p-0 text-left',
46
51
  'rounded-contain',
47
52
  'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base'
48
53
  ],
54
+ // End-of-row content (badges, help, quick actions) beside the trigger.
55
+ trailing: 'flex shrink-0 items-center gap-1',
49
56
  labelGroup: 'flex min-w-0 flex-col',
50
57
  title: [
51
58
  'font-medium leading-tight',
@@ -75,6 +82,9 @@ export const journeyTimelineVariants = tv({
75
82
  node: 'grid',
76
83
  markerColumn: 'flex-col',
77
84
  connector: 'my-1 w-0 min-h-3 flex-1 border-l-2',
85
+ header: 'items-start gap-x-3',
86
+ trigger: 'min-w-0 flex-1',
87
+ trailing: 'ml-auto',
78
88
  segment: 'flex items-center'
79
89
  },
80
90
  horizontal: {
@@ -84,13 +94,14 @@ export const journeyTimelineVariants = tv({
84
94
  // Stacked station: meta row above the spine, label pill below. Every
85
95
  // node but the last stretches so the spine distributes the stations.
86
96
  node: 'flex flex-col [&:not(:last-child)]:flex-1',
87
- // Visual order is meta → spine → labels, but the DOM keeps the trigger
97
+ // Visual order is meta → spine → header, but the DOM keeps the header
88
98
  // before the spine so a segment label is read *after* its node.
89
99
  metaColumn: 'order-1 text-left',
90
100
  markerColumn: 'order-2 w-full flex-row',
101
+ header: 'order-3 items-center gap-x-1.5 self-start',
91
102
  // Shrink-to-fit pill around the labels only — the marker sits on the
92
103
  // spine above, so the whole rail reads as stations on one line.
93
- trigger: 'order-3 w-auto self-start',
104
+ trigger: 'w-auto',
94
105
  connector: 'h-0 min-w-3 flex-1 border-t-2',
95
106
  // Segment labels sit *in* the line (line — label — line); they widen
96
107
  // the gap instead of overlapping the next station's marker.
@@ -152,6 +163,12 @@ export const journeyTimelineVariants = tv({
152
163
  marker: 'bg-surface-base border-border-strong',
153
164
  title: 'text-text-secondary'
154
165
  },
166
+ // Worth a look, does not block — hollow like pending but on the warning
167
+ // token, mirroring Stepper's per-step warning state.
168
+ attention: {
169
+ marker: 'bg-surface-base border-warning',
170
+ title: 'text-warning-emphasis'
171
+ },
155
172
  blocked: {
156
173
  marker: 'bg-danger border-danger',
157
174
  title: 'text-danger'
@@ -248,7 +265,7 @@ export const journeyTimelineVariants = tv({
248
265
  node: 'gap-y-0.5',
249
266
  metaColumn: 'min-h-3.5',
250
267
  markerColumn: 'h-4 gap-1 pr-1',
251
- trigger: '-mx-1.5 px-1.5 py-1'
268
+ trigger: '-ml-1.5 px-1.5 py-1'
252
269
  }
253
270
  },
254
271
  {
@@ -258,7 +275,7 @@ export const journeyTimelineVariants = tv({
258
275
  node: 'gap-y-1',
259
276
  metaColumn: 'min-h-4',
260
277
  markerColumn: 'h-4 gap-1.5 pr-1.5',
261
- trigger: '-mx-2 px-2 py-1.5'
278
+ trigger: '-ml-2 px-2 py-1.5'
262
279
  }
263
280
  },
264
281
  {
@@ -268,7 +285,7 @@ export const journeyTimelineVariants = tv({
268
285
  node: 'gap-y-1',
269
286
  metaColumn: 'min-h-4.5',
270
287
  markerColumn: 'h-5 gap-2 pr-2',
271
- trigger: '-mx-2.5 px-2.5 py-2'
288
+ trigger: '-ml-2.5 px-2.5 py-2'
272
289
  }
273
290
  },
274
291
  // Vertical + panel: two-column layout on wide viewports; on narrow ones the
@@ -135,6 +135,7 @@ declare const _default: {
135
135
  readonly complete: "Abgeschlossen";
136
136
  readonly active: "In Bearbeitung";
137
137
  readonly pending: "Ausstehend";
138
+ readonly attention: "Aufmerksamkeit erforderlich";
138
139
  readonly blocked: "Blockiert";
139
140
  readonly skipped: "Übersprungen";
140
141
  };
@@ -135,6 +135,7 @@ export default {
135
135
  complete: 'Abgeschlossen',
136
136
  active: 'In Bearbeitung',
137
137
  pending: 'Ausstehend',
138
+ attention: 'Aufmerksamkeit erforderlich',
138
139
  blocked: 'Blockiert',
139
140
  skipped: 'Übersprungen'
140
141
  }
@@ -135,6 +135,7 @@ declare const _default: {
135
135
  readonly complete: "Completed";
136
136
  readonly active: "In progress";
137
137
  readonly pending: "Pending";
138
+ readonly attention: "Needs attention";
138
139
  readonly blocked: "Blocked";
139
140
  readonly skipped: "Skipped";
140
141
  };
@@ -135,6 +135,7 @@ export default {
135
135
  complete: 'Completed',
136
136
  active: 'In progress',
137
137
  pending: 'Pending',
138
+ attention: 'Needs attention',
138
139
  blocked: 'Blocked',
139
140
  skipped: 'Skipped'
140
141
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urbicon-ui/blocks",
3
- "version": "6.10.1",
3
+ "version": "6.12.0",
4
4
  "description": "Svelte 5 UI component library with Tailwind CSS 4, OKLCH design tokens and zero runtime dependencies",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -91,8 +91,8 @@
91
91
  "@sveltejs/package": "^2.5.8",
92
92
  "@sveltejs/vite-plugin-svelte": "^7.0.0",
93
93
  "@tailwindcss/vite": "^4.3.1",
94
- "@urbicon-ui/i18n": "6.10.1",
95
- "@urbicon-ui/shared-types": "6.10.1",
94
+ "@urbicon-ui/i18n": "6.12.0",
95
+ "@urbicon-ui/shared-types": "6.12.0",
96
96
  "prettier": "^3.8.4",
97
97
  "prettier-plugin-svelte": "^4.1.1",
98
98
  "prettier-plugin-tailwindcss": "^0.8.0",