From c1effca1b46f8b0fd0a4b44015b2941f798db0a7 Mon Sep 17 00:00:00 2001 From: dev Date: Tue, 23 Jun 2026 03:49:14 +0200 Subject: [PATCH] feat(timeline): cross-layer Timeline component (history/feed + progress) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unifies the history/feed pattern (per-item status + evaluative intent) with the progress/stepper pattern (a root `active` index) in one component. Two independent color axes: status drives the marker treatment (filled / ring / hollow); intent overrides the hue via the canonical data-intent channel and feeds the `emerge-reveal` event in live feeds. - morfo:
    /
  1. contract — data-status, data-intent, aria-current; one `emerge-reveal` event (fromProp intent); scope soma/sema/eidos. - soma: Provider + Item — status derivation (active|explicit), auto-index, live-feed emission gated to appends. 4 unit tests. - sema: emerge-reveal pack (soften gain via op:add + haptic tick). - eidos: rail · markers · connectors; vertical/horizontal + start/end/alternate; independent `size` (type) and `markerSize` (circle) axes; connector solid/dashed/dotted; live-feed reveal. Markers hold icons or numbers. - demo: web/routes/uix/components/timeline (6-tab interactive testbed) + nav. Connector runs behind the markers (continuous rail); horizontal entries stack via flex; horizontal-alternate pins fixed-height rows for a straight rail. Co-Authored-By: Claude Opus 4.8 --- src/uix/eidos/components/timeline/README.md | 89 +++ src/uix/eidos/components/timeline/index.ts | 48 ++ .../timeline/timeline-connector.svelte | 11 + .../timeline/timeline-content.svelte | 10 + .../timeline/timeline-description.svelte | 10 + .../components/timeline/timeline-item.svelte | 12 + .../timeline/timeline-marker.svelte | 10 + .../components/timeline/timeline-time.svelte | 10 + .../components/timeline/timeline-title.svelte | 10 + .../eidos/components/timeline/timeline.css | 479 ++++++++++++++ .../eidos/components/timeline/timeline.svelte | 31 + src/uix/eidos/components/timeline/types.ts | 58 ++ src/uix/eidos/generated/base.css | 45 ++ src/uix/eidos/lib/recipes/base.ts | 62 ++ src/uix/langs/components/index.ts | 2 + src/uix/langs/components/timeline.ts | 15 + src/uix/morfo/components/timeline.ts | 190 ++++++ src/uix/sema/components/index.ts | 1 + src/uix/sema/components/timeline.ts | 36 ++ src/uix/soma/components/index.ts | 1 + src/uix/soma/components/timeline/README.md | 134 ++++ .../timeline/components/timeline-item.svelte | 41 ++ .../timeline/components/timeline.svelte | 41 ++ src/uix/soma/components/timeline/exports.ts | 8 + src/uix/soma/components/timeline/index.ts | 1 + src/uix/soma/components/timeline/langs.ts | 8 + .../timeline/timeline-provider.svelte.test.ts | 179 ++++++ .../timeline/timeline-provider.svelte.ts | 186 ++++++ src/uix/soma/components/timeline/types.ts | 53 ++ web/routes/uix/+layout@.svelte | 3 + .../uix/components/timeline/+page.svelte | 607 ++++++++++++++++++ 31 files changed, 2391 insertions(+) create mode 100644 src/uix/eidos/components/timeline/README.md create mode 100644 src/uix/eidos/components/timeline/index.ts create mode 100644 src/uix/eidos/components/timeline/timeline-connector.svelte create mode 100644 src/uix/eidos/components/timeline/timeline-content.svelte create mode 100644 src/uix/eidos/components/timeline/timeline-description.svelte create mode 100644 src/uix/eidos/components/timeline/timeline-item.svelte create mode 100644 src/uix/eidos/components/timeline/timeline-marker.svelte create mode 100644 src/uix/eidos/components/timeline/timeline-time.svelte create mode 100644 src/uix/eidos/components/timeline/timeline-title.svelte create mode 100644 src/uix/eidos/components/timeline/timeline.css create mode 100644 src/uix/eidos/components/timeline/timeline.svelte create mode 100644 src/uix/eidos/components/timeline/types.ts create mode 100644 src/uix/langs/components/timeline.ts create mode 100644 src/uix/morfo/components/timeline.ts create mode 100644 src/uix/sema/components/timeline.ts create mode 100644 src/uix/soma/components/timeline/README.md create mode 100644 src/uix/soma/components/timeline/components/timeline-item.svelte create mode 100644 src/uix/soma/components/timeline/components/timeline.svelte create mode 100644 src/uix/soma/components/timeline/exports.ts create mode 100644 src/uix/soma/components/timeline/index.ts create mode 100644 src/uix/soma/components/timeline/langs.ts create mode 100644 src/uix/soma/components/timeline/timeline-provider.svelte.test.ts create mode 100644 src/uix/soma/components/timeline/timeline-provider.svelte.ts create mode 100644 src/uix/soma/components/timeline/types.ts create mode 100644 web/routes/uix/components/timeline/+page.svelte diff --git a/src/uix/eidos/components/timeline/README.md b/src/uix/eidos/components/timeline/README.md new file mode 100644 index 000000000..b90a079e1 --- /dev/null +++ b/src/uix/eidos/components/timeline/README.md @@ -0,0 +1,89 @@ +# Timeline (eidos) + +The visual layer for `Timeline` — the rail, markers, connectors, orientation and +alternating layout. Behavior (the status model, `active` derivation, the live +feed + `emerge-reveal`) lives in soma: see +[`soma/components/timeline/README.md`](../../../soma/components/timeline/README.md). + +```svelte + + + + {#each events as ev, i} + {@const Ico = ev.icon} + + {#snippet children({ status })} + + {#if i < events.length - 1}{/if} + {ev.time} + + {ev.title} + {ev.body} + + {/snippet} + + {/each} + +``` + +## Parts + +| Part | Element | Owner | Notes | +| ------------- | -------- | ----- | ---------------------------------------------- | +| `Timeline` | `
      ` | soma | Root. Status model + live feed. | +| `Item` | `
    1. ` | soma | Entry. Exposes `{ status }`. | +| `Marker` | `
      ` | eidos | The dot. Holds an icon or number; tinted. | +| `Connector` | `
      ` | eidos | The rail line. `variant` = solid/dashed/dotted. | +| `Time` | `