@godxjp/ui 31.30.1 → 31.31.1

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.
@@ -3,7 +3,7 @@
3
3
  You are about to write code against a design system you did not author. This file is the whole
4
4
  contract. Read it before you write JSX.
5
5
 
6
- **This catalog describes `@godxjp/ui` 31.30.1.** If the project you are editing has a different
6
+ **This catalog describes `@godxjp/ui` 31.31.1.** If the project you are editing has a different
7
7
  version in its `package.json`, read the pinned catalog for THAT version instead
8
8
  (`…/v<their-version>/agent/…`). A catalog newer than the installed package describes props that do
9
9
  not exist yet; older, and it hides props that do. Neither failure announces itself.
@@ -56,10 +56,10 @@ Then ask it: `search_components`, `get_component`, `get_tokens`, `get_rule`, `li
56
56
  its `importPath`, and its examples. Fetch only the handful you picked in step 1.
57
57
  3. `rules.json` — 50 cardinal rules. The ones about raw HTML and hardcoded colour are not
58
58
  style advice.
59
- 4. `tokens.json` — 2176 design tokens, each tagged with its `tier`. **If you were handed a
59
+ 4. `tokens.json` — 2187 design tokens, each tagged with its `tier`. **If you were handed a
60
60
  brand, read the 211 `foundation` entries first** — `--primary`, `--background`,
61
61
  `--radius`, `--font-size-base` are the handful everything else derives from. The
62
- 1853 `component` entries are per-part knobs; reach for one only when a role is
62
+ 1864 `component` entries are per-part knobs; reach for one only when a role is
63
63
  right everywhere except one component.
64
64
  5. `anti-ai-tells.json` — 26 shapes that make generated UI look generated, each with the
65
65
  fix. Read before you reach for a gradient hero or a wall of coloured chips.
@@ -145,7 +145,7 @@ has stopped following the brand.
145
145
  |---|---|---|---|
146
146
  | `foundation` | 211 | the seeds — `--primary`, `--background`, `--foreground`, `--radius`, `--font-size-base`, `--shadow-color`. Everything below is derived from these | **yes — this is the main road.** Handed a brand colour, this is where it goes: `:root { --primary: <H> <S>% <L>%; }` (HSL components, no `hsl()` wrapper) |
147
147
  | `semantic` | 112 | named roles that follow the seeds — `--ring`, `--text-link`, `--primary-hover`, `--overlay-background` | only when the seed is right and ONE role must differ. That role then stops following a later brand change |
148
- | `component` | 1853 | per-part knobs, `--{component}-{part}-{property}` | rarely. Most are declared `initial` with the real default at the call site — deliberate, so a scoped override re-resolves instead of freezing at `:root` |
148
+ | `component` | 1864 | per-part knobs, `--{component}-{part}-{property}` | rarely. Most are declared `initial` with the real default at the call site — deliberate, so a scoped override re-resolves instead of freezing at `:root` |
149
149
 
150
150
  A token whose `value` is `initial` is not empty and not broken: `initial` is the guaranteed-invalid
151
151
  value, so the real default is computed where the element paints it. Set it and yours wins.
@@ -23,7 +23,7 @@
23
23
  "type": "{ label: string; units: number }[]"
24
24
  },
25
25
  {
26
- "description": "Each row has id, label, inclusive start/end unit offsets (`null` for either = the row has no dates: no bar, no handles, a muted \"no dates\" hint, gh#1189), optional `color` (hex from data, e.g. a status colour; grip ink flips black/white by luminance; non-hex keeps the default ink), `muted` (a done row recedes, --range-timeline-bar-muted-alpha), `overdue` (destructive inline-end edge that keeps the colour, plus a localized sr-only \"overdue\"), `tooltip` (ReactNode on hover and keyboard focus of a focusable bar layer named by the row label, beside the grips, never around them), `plan` ({ start, end } | null — the PLANNED range 予定, a dashed ghost bar behind the solid ACTUAL bar 実績; past the planned end a destructive overrun segment with a localized \"+N日\" label (override with `varianceLabel`, `false` hides it); ending before it a small success early marker; both also spoken; the ghost is never draggable), `planNote` (muted text after the bar for a row WITHOUT a plan, e.g. \"baseline後に追加\"), `editable` (true | false | { start?, end? }: which grips a row offers when onRangeChange is set; a started-but-open issue whose end is \"today\" passes { end: false }), and localized startLabel/endLabel including current values. Optional `depth` (0 = top level) nests rows: pass them flat and depth-first (a parent, then its descendants); a row is a parent when the row after it is deeper. The component indents the label cell by `--range-timeline-indent-width` per level (logical padding, so RTL indents from the right; the label column keeps its width) and gives each parent a disclosure button. With no `depth > 0` anywhere the markup is unchanged.",
26
+ "description": "Each row has id, label, inclusive start/end unit offsets (`null` for either = the row has no dates: no bar, no handles, a muted \"no dates\" hint, gh#1189), optional `color` (hex from data, e.g. a status colour; grip ink flips black/white by luminance; non-hex keeps the default ink), `muted` (a done row recedes, --range-timeline-bar-muted-alpha), `overdue` (destructive inline-end edge that keeps the colour, plus a localized sr-only \"overdue\"), `tooltip` (ReactNode on hover and keyboard focus of a focusable bar layer named by the row label, beside the grips, never around them), `plan` ({ start, end } | null — the PLANNED range 予定, a dashed ghost bar behind the solid ACTUAL bar 実績; past the planned end a destructive overrun segment with a localized \"+N日\" label (override with `varianceLabel`, `false` hides it); ending before it a small success early marker; both also spoken; the ghost is never draggable), `planNote` (muted text after the bar for a row WITHOUT a plan, e.g. \"baseline後に追加\"), `editable` (true | false | { start?, end? }: which grips a row offers when onRangeChange is set; a started-but-open issue whose end is \"today\" passes { end: false }), `emptyHint` (what an undated row says: default the localized \"no dates\"; `false` = nothing, a pure context row), FINISH-ONLY rows (`start: null`, `end` set: a finish tick at end, no bar, spoken `startUnknownLabel` ?? \"start unknown\"), `openEnd` (started, completion not recorded: the bar runs to end with a faded inline end, no end grip, spoken `openEndLabel` ?? \"completion not recorded\"), `shape: \"milestone\"` (a diamond at end, start ignored; its plan a hollow diamond at plan.end; overrun / early and their labels as for a bar; ONE grip reported as onRangeChange(id, \"end\", delta); tooltip focusable), a ONE-SIDED plan (only plan.start or plan.end known: a dashed due tick at the known end, or start; a known plan.end still measures overrun / early), `planLabel` (what the ghost means for the row, e.g. \"ベースライン\", spoken as \"ベースラインより3日遅れ\"; overrides the timeline planLabel), `earlyLabel` (visible after the early marker; default the localized \"-N日\"; `false` hides it), `cancelled` (a hatched bar distinct from muted, spoken 中止, no grips), `emphasis` (\"warning\" | \"critical\": an inline-start accent on the row from the mark tier plus a spoken label, for \"at risk\" and the critical path), and localized startLabel/endLabel including current values. Optional `depth` (0 = top level) nests rows: pass them flat and depth-first (a parent, then its descendants); a row is a parent when the row after it is deeper. The component indents the label cell by `--range-timeline-indent-width` per level (logical padding, so RTL indents from the right; the label column keeps its width) and gives each parent a disclosure button. With no `depth > 0` anywhere the markup is unchanged.",
27
27
  "name": "rows",
28
28
  "required": true,
29
29
  "type": "RangeTimelineRow[]"
@@ -97,6 +97,16 @@
97
97
  "description": "A new range is loading while the previous rows stay on screen: dims the body (--range-timeline-busy-body-alpha), draws an indeterminate line under the header (static under prefers-reduced-motion) and sets aria-busy.",
98
98
  "name": "busy",
99
99
  "type": "boolean"
100
+ },
101
+ {
102
+ "description": "What the plan ghost means on every row, e.g. \"予定\" (the live plan) or \"ベースライン\" (a frozen baseline), used in the spoken overrun / early text (\"ベースラインより3日遅れ\"). A row's own planLabel wins. Unset: the plain \"over / ahead of the plan\".",
103
+ "name": "planLabel",
104
+ "type": "string"
105
+ },
106
+ {
107
+ "description": "Dependency connectors, drawn as elbow lines in one decorative SVG over the body. FS (default) runs from the predecessor's finish to the successor's start; SS start to start, FF finish to finish, SF start to finish; a milestone's endpoint is its diamond. Only visible rows dated at the needed endpoint are connected; a folded endpoint hides the link, an off-range one is clamped to the edge. Row centres are measured after layout, so a wrapped label does not shear a line. `violated` turns the connector destructive and puts a focusable 24px marker on its head (named \"Dependency violated: {label}\", with a tooltip), and lists the link for screen readers. Links are data: there is no drawing gesture.",
108
+ "name": "links",
109
+ "type": "{ id: string; from: string; to: string; type?: \"FS\" | \"SS\" | \"FF\" | \"SF\"; violated?: boolean; label?: string }[]"
100
110
  }
101
111
  ],
102
112
  "rules": [],
@@ -549,7 +549,7 @@
549
549
  "type": "{ label: string; units: number }[]"
550
550
  },
551
551
  {
552
- "description": "Each row has id, label, inclusive start/end unit offsets (`null` for either = the row has no dates: no bar, no handles, a muted \"no dates\" hint, gh#1189), optional `color` (hex from data, e.g. a status colour; grip ink flips black/white by luminance; non-hex keeps the default ink), `muted` (a done row recedes, --range-timeline-bar-muted-alpha), `overdue` (destructive inline-end edge that keeps the colour, plus a localized sr-only \"overdue\"), `tooltip` (ReactNode on hover and keyboard focus of a focusable bar layer named by the row label, beside the grips, never around them), `plan` ({ start, end } | null — the PLANNED range 予定, a dashed ghost bar behind the solid ACTUAL bar 実績; past the planned end a destructive overrun segment with a localized \"+N日\" label (override with `varianceLabel`, `false` hides it); ending before it a small success early marker; both also spoken; the ghost is never draggable), `planNote` (muted text after the bar for a row WITHOUT a plan, e.g. \"baseline後に追加\"), `editable` (true | false | { start?, end? }: which grips a row offers when onRangeChange is set; a started-but-open issue whose end is \"today\" passes { end: false }), and localized startLabel/endLabel including current values. Optional `depth` (0 = top level) nests rows: pass them flat and depth-first (a parent, then its descendants); a row is a parent when the row after it is deeper. The component indents the label cell by `--range-timeline-indent-width` per level (logical padding, so RTL indents from the right; the label column keeps its width) and gives each parent a disclosure button. With no `depth > 0` anywhere the markup is unchanged.",
552
+ "description": "Each row has id, label, inclusive start/end unit offsets (`null` for either = the row has no dates: no bar, no handles, a muted \"no dates\" hint, gh#1189), optional `color` (hex from data, e.g. a status colour; grip ink flips black/white by luminance; non-hex keeps the default ink), `muted` (a done row recedes, --range-timeline-bar-muted-alpha), `overdue` (destructive inline-end edge that keeps the colour, plus a localized sr-only \"overdue\"), `tooltip` (ReactNode on hover and keyboard focus of a focusable bar layer named by the row label, beside the grips, never around them), `plan` ({ start, end } | null — the PLANNED range 予定, a dashed ghost bar behind the solid ACTUAL bar 実績; past the planned end a destructive overrun segment with a localized \"+N日\" label (override with `varianceLabel`, `false` hides it); ending before it a small success early marker; both also spoken; the ghost is never draggable), `planNote` (muted text after the bar for a row WITHOUT a plan, e.g. \"baseline後に追加\"), `editable` (true | false | { start?, end? }: which grips a row offers when onRangeChange is set; a started-but-open issue whose end is \"today\" passes { end: false }), `emptyHint` (what an undated row says: default the localized \"no dates\"; `false` = nothing, a pure context row), FINISH-ONLY rows (`start: null`, `end` set: a finish tick at end, no bar, spoken `startUnknownLabel` ?? \"start unknown\"), `openEnd` (started, completion not recorded: the bar runs to end with a faded inline end, no end grip, spoken `openEndLabel` ?? \"completion not recorded\"), `shape: \"milestone\"` (a diamond at end, start ignored; its plan a hollow diamond at plan.end; overrun / early and their labels as for a bar; ONE grip reported as onRangeChange(id, \"end\", delta); tooltip focusable), a ONE-SIDED plan (only plan.start or plan.end known: a dashed due tick at the known end, or start; a known plan.end still measures overrun / early), `planLabel` (what the ghost means for the row, e.g. \"ベースライン\", spoken as \"ベースラインより3日遅れ\"; overrides the timeline planLabel), `earlyLabel` (visible after the early marker; default the localized \"-N日\"; `false` hides it), `cancelled` (a hatched bar distinct from muted, spoken 中止, no grips), `emphasis` (\"warning\" | \"critical\": an inline-start accent on the row from the mark tier plus a spoken label, for \"at risk\" and the critical path), and localized startLabel/endLabel including current values. Optional `depth` (0 = top level) nests rows: pass them flat and depth-first (a parent, then its descendants); a row is a parent when the row after it is deeper. The component indents the label cell by `--range-timeline-indent-width` per level (logical padding, so RTL indents from the right; the label column keeps its width) and gives each parent a disclosure button. With no `depth > 0` anywhere the markup is unchanged.",
553
553
  "name": "rows",
554
554
  "required": true,
555
555
  "type": "RangeTimelineRow[]"
@@ -623,6 +623,16 @@
623
623
  "description": "A new range is loading while the previous rows stay on screen: dims the body (--range-timeline-busy-body-alpha), draws an indeterminate line under the header (static under prefers-reduced-motion) and sets aria-busy.",
624
624
  "name": "busy",
625
625
  "type": "boolean"
626
+ },
627
+ {
628
+ "description": "What the plan ghost means on every row, e.g. \"予定\" (the live plan) or \"ベースライン\" (a frozen baseline), used in the spoken overrun / early text (\"ベースラインより3日遅れ\"). A row's own planLabel wins. Unset: the plain \"over / ahead of the plan\".",
629
+ "name": "planLabel",
630
+ "type": "string"
631
+ },
632
+ {
633
+ "description": "Dependency connectors, drawn as elbow lines in one decorative SVG over the body. FS (default) runs from the predecessor's finish to the successor's start; SS start to start, FF finish to finish, SF start to finish; a milestone's endpoint is its diamond. Only visible rows dated at the needed endpoint are connected; a folded endpoint hides the link, an off-range one is clamped to the edge. Row centres are measured after layout, so a wrapped label does not shear a line. `violated` turns the connector destructive and puts a focusable 24px marker on its head (named \"Dependency violated: {label}\", with a tooltip), and lists the link for screen readers. Links are data: there is no drawing gesture.",
634
+ "name": "links",
635
+ "type": "{ id: string; from: string; to: string; type?: \"FS\" | \"SS\" | \"FF\" | \"SF\"; violated?: boolean; label?: string }[]"
626
636
  }
627
637
  ],
628
638
  "rules": [],
package/agent/index.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "components": 185,
5
5
  "patterns": 21,
6
6
  "rules": 50,
7
- "tokens": 2176,
7
+ "tokens": 2187,
8
8
  "vocabulary": 14
9
9
  },
10
10
  "files": [
@@ -48,19 +48,19 @@
48
48
  "note": "Pin to the tag that matches the @godxjp/ui version you installed. A catalog newer than your package describes props you do not have; older, and it hides props you do.",
49
49
  "read": {
50
50
  "live": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/index.json",
51
- "pinned": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/v31.30.1/agent/index.json"
51
+ "pinned": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/v31.31.1/agent/index.json"
52
52
  },
53
53
  "source": "mcp/src/data — the same data @godxjp/ui-mcp serves — plus the foundation and semantic token tiers, read from src/tokens/*.css",
54
54
  "start": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/START-HERE.md",
55
55
  "tokenTiers": {
56
56
  "component": "per-part knobs, --{component}-{part}-{property}; usually leave these alone",
57
57
  "counts": {
58
- "component": 1853,
58
+ "component": 1864,
59
59
  "foundation": 211,
60
60
  "semantic": 112
61
61
  },
62
62
  "foundation": "the seeds a consumer is invited to set — --primary, --background, --radius",
63
63
  "semantic": "named roles that follow the seeds — --ring, --text-link, --overlay-background"
64
64
  },
65
- "version": "31.30.1"
65
+ "version": "31.31.1"
66
66
  }
package/agent/llms.txt CHANGED
@@ -1,10 +1,10 @@
1
1
  # @godxjp/ui
2
2
 
3
- > A Japanese-enterprise React design system: 185 components, 2176 design tokens,
4
- > 50 cardinal rules. This file is the entry point for AI agents. Catalog version 31.30.1.
3
+ > A Japanese-enterprise React design system: 185 components, 2187 design tokens,
4
+ > 50 cardinal rules. This file is the entry point for AI agents. Catalog version 31.31.1.
5
5
 
6
6
  If your client can run a process, do not read these files — run the MCP server instead
7
- (`npx @godxjp/ui-mcp@31.30.1`). It is searchable and version-locked. These files exist for agents
7
+ (`npx @godxjp/ui-mcp@31.31.1`). It is searchable and version-locked. These files exist for agents
8
8
  that can only fetch URLs.
9
9
 
10
10
  ## Start
@@ -18,7 +18,7 @@ that can only fetch URLs.
18
18
  - [components-index.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components-index.json): 51 KB — all 185 components as name, group, tagline, plus `absorbed`: the names that do NOT exist and map to it (`Combobox` → `Select`).
19
19
  - [components/&lt;Name&gt;.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components/Select.json): one file per component (1 KB–36 KB, median 6 KB). Read the index, then fetch only the ones you chose — this is the selective route, and the reason you do not need the blob.
20
20
  - [components.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components.json): 1.3 MB — every entry in one file. Most URL fetchers truncate a response this size without saying so; prefer the per-component files.
21
- - [tokens.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/tokens.json): every design token with its value, the reason it exists, and its `tier` — 211 `foundation` seeds (`--primary`, `--background`, `--radius`: set these when you are handed a brand), 112 `semantic` roles, 1853 `component` knobs.
21
+ - [tokens.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/tokens.json): every design token with its value, the reason it exists, and its `tier` — 211 `foundation` seeds (`--primary`, `--background`, `--radius`: set these when you are handed a brand), 112 `semantic` roles, 1864 `component` knobs.
22
22
  - [vocabulary.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/vocabulary.json): the controlled prop vocabulary — which prop name means what, across every component.
23
23
  - [rules.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/rules.json): 50 cardinal rules.
24
24
  - [anti-ai-tells.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/anti-ai-tells.json): 26 shapes that make generated UI look generated, each with its fix.
@@ -26,7 +26,7 @@ that can only fetch URLs.
26
26
  ## Pinning
27
27
 
28
28
  Every URL above tracks `main`. To pin to the release a project actually installed, swap `main` for
29
- the tag: `.../godx-jp/godxjp-ui/v31.30.1/agent/...`. A catalog that does not match the installed
29
+ the tag: `.../godx-jp/godxjp-ui/v31.31.1/agent/...`. A catalog that does not match the installed
30
30
  package describes props that are absent, or hides props that are present, and says nothing either way.
31
31
 
32
32
  Pinned catalogs only exist for releases whose tag actually contains `agent/`. If `…/v<version>/agent/index.json` returns 404, that release predates this catalog: read `…/main/…` instead and compare `index.json` → `version` against the package you have, so you at least know which way it drifted.
package/agent/tokens.json CHANGED
@@ -6131,6 +6131,72 @@
6131
6131
  "tier": "component",
6132
6132
  "value": "var(--stroke-md)"
6133
6133
  },
6134
+ {
6135
+ "description": "Schedules: a milestone diamond, a finish-only tick, a one-sided plan tick, an open end's fade, a cancelled hatch, dependency connectors and the row emphasis accent.",
6136
+ "name": "--range-timeline-milestone-size",
6137
+ "tier": "component",
6138
+ "value": "var(--range-timeline-bar-height)"
6139
+ },
6140
+ {
6141
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6142
+ "name": "--range-timeline-finish-inline-size",
6143
+ "tier": "component",
6144
+ "value": "calc(var(--stroke-md) * 2)"
6145
+ },
6146
+ {
6147
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6148
+ "name": "--range-timeline-plan-tick-inline-size",
6149
+ "tier": "component",
6150
+ "value": "var(--stroke-md)"
6151
+ },
6152
+ {
6153
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6154
+ "name": "--range-timeline-open-end-fade-inline-size",
6155
+ "tier": "component",
6156
+ "value": "var(--space-6)"
6157
+ },
6158
+ {
6159
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6160
+ "name": "--range-timeline-cancelled-hatch-gap",
6161
+ "tier": "component",
6162
+ "value": "var(--space-1)"
6163
+ },
6164
+ {
6165
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6166
+ "name": "--range-timeline-cancelled-hatch-line-width",
6167
+ "tier": "component",
6168
+ "value": "var(--stroke-md)"
6169
+ },
6170
+ {
6171
+ "description": "default = hsl(var(--foreground) / 0.45), resolved at the call site",
6172
+ "name": "--range-timeline-cancelled-hatch-color",
6173
+ "tier": "component",
6174
+ "value": "initial"
6175
+ },
6176
+ {
6177
+ "description": "default = hsl(var(--muted-foreground)), resolved at the call site",
6178
+ "name": "--range-timeline-link-color",
6179
+ "tier": "component",
6180
+ "value": "initial"
6181
+ },
6182
+ {
6183
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6184
+ "name": "--range-timeline-link-width",
6185
+ "tier": "component",
6186
+ "value": "var(--stroke-hairline)"
6187
+ },
6188
+ {
6189
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6190
+ "name": "--range-timeline-link-violation-size",
6191
+ "tier": "component",
6192
+ "value": "var(--space-6)"
6193
+ },
6194
+ {
6195
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
6196
+ "name": "--range-timeline-emphasis-width",
6197
+ "tier": "component",
6198
+ "value": "var(--stroke-md)"
6199
+ },
6134
6200
  {
6135
6201
  "description": "The OUTER FRAME of the timeline and its label-column divider — the --border tier, the same rule weight a Card edge and a DataTable row use. The grid INSIDE it now reads the same tier (see --range-timeline-grid-color), which is the point of gh#730: the day grid may never be heavier than the frame around it, and at one tier it cannot become so under any theme.",
6136
6202
  "name": "--range-timeline-border-color",
@@ -62,6 +62,65 @@ export type RangeTimelineRow = {
62
62
  start?: boolean;
63
63
  end?: boolean;
64
64
  };
65
+ /**
66
+ * What an undated row (no `start` / `end`) says in its track. Default: the localized "no dates"
67
+ * hint. `false` says nothing: a pure context row (a phase heading, a group label).
68
+ */
69
+ emptyHint?: React.ReactNode | false;
70
+ /**
71
+ * Spoken with a FINISH-ONLY row (`start: null`, `end` set): a finish was recorded without a known
72
+ * start, drawn as a finish tick at `end`. Default: the localized "start unknown".
73
+ */
74
+ startUnknownLabel?: string;
75
+ /**
76
+ * The row started but its completion is not recorded: the bar runs to `end` (pass the as-of
77
+ * unit), its inline end fades out, and it has no end grip.
78
+ */
79
+ openEnd?: boolean;
80
+ /** Spoken with an `openEnd` bar. Default: the localized "completion not recorded". */
81
+ openEndLabel?: string;
82
+ /**
83
+ * `milestone` draws a diamond at `end` (`start` is ignored); its `plan` is a hollow diamond at
84
+ * `plan.end`; overrun / early and their labels apply as for a bar; one grip moves it, reported
85
+ * as `onRangeChange(id, "end", delta)`.
86
+ */
87
+ shape?: "bar" | "milestone";
88
+ /**
89
+ * What the ghost means for this row, e.g. "ベースライン" (a frozen baseline) or "予定" (the live
90
+ * plan), used in the spoken overrun / early text. Overrides the timeline's `planLabel`.
91
+ */
92
+ planLabel?: string;
93
+ /**
94
+ * Text after the early marker. Default: how early, localized as days ("-2日" / "-2d" / "-2 ngày").
95
+ * `false` shows none.
96
+ */
97
+ earlyLabel?: React.ReactNode | false;
98
+ /** Cancelled (中止): a hatched bar, distinct from `muted`, spoken, and without grips. */
99
+ cancelled?: boolean;
100
+ /**
101
+ * An accent on the row's inline start plus a spoken label, so colour is never the only cue:
102
+ * `warning` (at risk, e.g. a late predecessor) or `critical` (on the critical path).
103
+ */
104
+ emphasis?: "warning" | "critical";
105
+ };
106
+ /**
107
+ * A dependency between two rows, drawn as an elbow connector over the body. `FS` (the default)
108
+ * runs from the predecessor's finish to the successor's start; `SS` start to start, `FF` finish to
109
+ * finish, `SF` start to finish. A milestone's endpoint is its diamond.
110
+ */
111
+ export type RangeTimelineLink = {
112
+ id: string;
113
+ /** The predecessor row's id. */
114
+ from: string;
115
+ /** The successor row's id. */
116
+ to: string;
117
+ type?: "FS" | "SS" | "FF" | "SF";
118
+ /**
119
+ * The schedule breaks this dependency: the connector turns destructive and its head gets a
120
+ * focusable marker (with `label` in a tooltip), also listed for screen readers.
121
+ */
122
+ violated?: boolean;
123
+ label?: string;
65
124
  };
66
125
  export type RangeTimelineProps = React.HTMLAttributes<HTMLElement> & {
67
126
  label: string;
@@ -133,6 +192,16 @@ export type RangeTimelineProps = React.HTMLAttributes<HTMLElement> & {
133
192
  * indeterminate line under the header and sets `aria-busy` (gh#1189).
134
193
  */
135
194
  busy?: boolean;
195
+ /**
196
+ * What the plan ghost means on every row (a row's own `planLabel` wins), e.g. "ベースライン",
197
+ * used in the spoken overrun / early text: "ベースラインより3日遅れ".
198
+ */
199
+ planLabel?: string;
200
+ /**
201
+ * Dependency connectors between rows (FS / SS / FF / SF). Only rows that are visible and dated at
202
+ * the needed endpoint are connected; an endpoint outside the range is clamped to the edge.
203
+ */
204
+ links?: RangeTimelineLink[];
136
205
  };
137
206
  /** A horizontal range axis. Units and labels are data; the design system owns all geometry. */
138
207
  export declare const RangeTimeline: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
@@ -205,4 +274,14 @@ export declare const RangeTimeline: React.ForwardRefExoticComponent<React.HTMLAt
205
274
  * indeterminate line under the header and sets `aria-busy` (gh#1189).
206
275
  */
207
276
  busy?: boolean;
277
+ /**
278
+ * What the plan ghost means on every row (a row's own `planLabel` wins), e.g. "ベースライン",
279
+ * used in the spoken overrun / early text: "ベースラインより3日遅れ".
280
+ */
281
+ planLabel?: string;
282
+ /**
283
+ * Dependency connectors between rows (FS / SS / FF / SF). Only rows that are visible and dated at
284
+ * the needed endpoint are connected; an endpoint outside the range is clamped to the edge.
285
+ */
286
+ links?: RangeTimelineLink[];
208
287
  } & React.RefAttributes<HTMLElement>>;