@nowline/layout 0.0.0-dev.20260601071750.g04bdff9

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 (193) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +103 -0
  3. package/dist/band-scale.d.ts +56 -0
  4. package/dist/band-scale.d.ts.map +1 -0
  5. package/dist/band-scale.js +86 -0
  6. package/dist/band-scale.js.map +1 -0
  7. package/dist/calendar.d.ts +79 -0
  8. package/dist/calendar.d.ts.map +1 -0
  9. package/dist/calendar.js +210 -0
  10. package/dist/calendar.js.map +1 -0
  11. package/dist/capacity.d.ts +72 -0
  12. package/dist/capacity.d.ts.map +1 -0
  13. package/dist/capacity.js +163 -0
  14. package/dist/capacity.js.map +1 -0
  15. package/dist/dsl-utils.d.ts +5 -0
  16. package/dist/dsl-utils.d.ts.map +1 -0
  17. package/dist/dsl-utils.js +28 -0
  18. package/dist/dsl-utils.js.map +1 -0
  19. package/dist/edge-routing.d.ts +89 -0
  20. package/dist/edge-routing.d.ts.map +1 -0
  21. package/dist/edge-routing.js +435 -0
  22. package/dist/edge-routing.js.map +1 -0
  23. package/dist/frame-tab-geometry.d.ts +78 -0
  24. package/dist/frame-tab-geometry.d.ts.map +1 -0
  25. package/dist/frame-tab-geometry.js +115 -0
  26. package/dist/frame-tab-geometry.js.map +1 -0
  27. package/dist/header-card-geometry.d.ts +29 -0
  28. package/dist/header-card-geometry.d.ts.map +1 -0
  29. package/dist/header-card-geometry.js +41 -0
  30. package/dist/header-card-geometry.js.map +1 -0
  31. package/dist/i18n.d.ts +48 -0
  32. package/dist/i18n.d.ts.map +1 -0
  33. package/dist/i18n.js +114 -0
  34. package/dist/i18n.js.map +1 -0
  35. package/dist/include-chrome-geometry.d.ts +86 -0
  36. package/dist/include-chrome-geometry.d.ts.map +1 -0
  37. package/dist/include-chrome-geometry.js +104 -0
  38. package/dist/include-chrome-geometry.js.map +1 -0
  39. package/dist/index.d.ts +11 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +10 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/inline-date-pin-geometry.d.ts +46 -0
  44. package/dist/inline-date-pin-geometry.d.ts.map +1 -0
  45. package/dist/inline-date-pin-geometry.js +149 -0
  46. package/dist/inline-date-pin-geometry.js.map +1 -0
  47. package/dist/item-bar-geometry.d.ts +157 -0
  48. package/dist/item-bar-geometry.d.ts.map +1 -0
  49. package/dist/item-bar-geometry.js +214 -0
  50. package/dist/item-bar-geometry.js.map +1 -0
  51. package/dist/lane-utilization.d.ts +90 -0
  52. package/dist/lane-utilization.d.ts.map +1 -0
  53. package/dist/lane-utilization.js +206 -0
  54. package/dist/lane-utilization.js.map +1 -0
  55. package/dist/layout-context.d.ts +143 -0
  56. package/dist/layout-context.d.ts.map +1 -0
  57. package/dist/layout-context.js +8 -0
  58. package/dist/layout-context.js.map +1 -0
  59. package/dist/layout.d.ts +18 -0
  60. package/dist/layout.d.ts.map +1 -0
  61. package/dist/layout.js +1298 -0
  62. package/dist/layout.js.map +1 -0
  63. package/dist/nodes/anchor-node.d.ts +16 -0
  64. package/dist/nodes/anchor-node.d.ts.map +1 -0
  65. package/dist/nodes/anchor-node.js +68 -0
  66. package/dist/nodes/anchor-node.js.map +1 -0
  67. package/dist/nodes/footnote-node.d.ts +10 -0
  68. package/dist/nodes/footnote-node.d.ts.map +1 -0
  69. package/dist/nodes/footnote-node.js +41 -0
  70. package/dist/nodes/footnote-node.js.map +1 -0
  71. package/dist/nodes/group-node.d.ts +29 -0
  72. package/dist/nodes/group-node.d.ts.map +1 -0
  73. package/dist/nodes/group-node.js +195 -0
  74. package/dist/nodes/group-node.js.map +1 -0
  75. package/dist/nodes/include-node.d.ts +16 -0
  76. package/dist/nodes/include-node.d.ts.map +1 -0
  77. package/dist/nodes/include-node.js +117 -0
  78. package/dist/nodes/include-node.js.map +1 -0
  79. package/dist/nodes/item-node.d.ts +51 -0
  80. package/dist/nodes/item-node.d.ts.map +1 -0
  81. package/dist/nodes/item-node.js +108 -0
  82. package/dist/nodes/item-node.js.map +1 -0
  83. package/dist/nodes/marker-geometry.d.ts +22 -0
  84. package/dist/nodes/marker-geometry.d.ts.map +1 -0
  85. package/dist/nodes/marker-geometry.js +38 -0
  86. package/dist/nodes/marker-geometry.js.map +1 -0
  87. package/dist/nodes/milestone-node.d.ts +48 -0
  88. package/dist/nodes/milestone-node.d.ts.map +1 -0
  89. package/dist/nodes/milestone-node.js +210 -0
  90. package/dist/nodes/milestone-node.js.map +1 -0
  91. package/dist/nodes/parallel-node.d.ts +21 -0
  92. package/dist/nodes/parallel-node.d.ts.map +1 -0
  93. package/dist/nodes/parallel-node.js +88 -0
  94. package/dist/nodes/parallel-node.js.map +1 -0
  95. package/dist/nodes/roadmap-node.d.ts +76 -0
  96. package/dist/nodes/roadmap-node.d.ts.map +1 -0
  97. package/dist/nodes/roadmap-node.js +788 -0
  98. package/dist/nodes/roadmap-node.js.map +1 -0
  99. package/dist/nodes/swimlane-node.d.ts +38 -0
  100. package/dist/nodes/swimlane-node.d.ts.map +1 -0
  101. package/dist/nodes/swimlane-node.js +308 -0
  102. package/dist/nodes/swimlane-node.js.map +1 -0
  103. package/dist/renderable.d.ts +44 -0
  104. package/dist/renderable.d.ts.map +1 -0
  105. package/dist/renderable.js +21 -0
  106. package/dist/renderable.js.map +1 -0
  107. package/dist/row-packer.d.ts +125 -0
  108. package/dist/row-packer.d.ts.map +1 -0
  109. package/dist/row-packer.js +169 -0
  110. package/dist/row-packer.js.map +1 -0
  111. package/dist/style-resolution.d.ts +14 -0
  112. package/dist/style-resolution.d.ts.map +1 -0
  113. package/dist/style-resolution.js +191 -0
  114. package/dist/style-resolution.js.map +1 -0
  115. package/dist/themes/dark.d.ts +4 -0
  116. package/dist/themes/dark.d.ts.map +1 -0
  117. package/dist/themes/dark.js +241 -0
  118. package/dist/themes/dark.js.map +1 -0
  119. package/dist/themes/grayscale.d.ts +4 -0
  120. package/dist/themes/grayscale.d.ts.map +1 -0
  121. package/dist/themes/grayscale.js +237 -0
  122. package/dist/themes/grayscale.js.map +1 -0
  123. package/dist/themes/index.d.ts +19 -0
  124. package/dist/themes/index.d.ts.map +1 -0
  125. package/dist/themes/index.js +57 -0
  126. package/dist/themes/index.js.map +1 -0
  127. package/dist/themes/light.d.ts +4 -0
  128. package/dist/themes/light.d.ts.map +1 -0
  129. package/dist/themes/light.js +248 -0
  130. package/dist/themes/light.js.map +1 -0
  131. package/dist/themes/shape.d.ts +194 -0
  132. package/dist/themes/shape.d.ts.map +1 -0
  133. package/dist/themes/shape.js +6 -0
  134. package/dist/themes/shape.js.map +1 -0
  135. package/dist/themes/shared.d.ts +145 -0
  136. package/dist/themes/shared.d.ts.map +1 -0
  137. package/dist/themes/shared.js +310 -0
  138. package/dist/themes/shared.js.map +1 -0
  139. package/dist/time-scale.d.ts +39 -0
  140. package/dist/time-scale.d.ts.map +1 -0
  141. package/dist/time-scale.js +62 -0
  142. package/dist/time-scale.js.map +1 -0
  143. package/dist/types.d.ts +516 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +6 -0
  146. package/dist/types.js.map +1 -0
  147. package/dist/view-preset.d.ts +23 -0
  148. package/dist/view-preset.d.ts.map +1 -0
  149. package/dist/view-preset.js +146 -0
  150. package/dist/view-preset.js.map +1 -0
  151. package/dist/working-calendar.d.ts +14 -0
  152. package/dist/working-calendar.d.ts.map +1 -0
  153. package/dist/working-calendar.js +74 -0
  154. package/dist/working-calendar.js.map +1 -0
  155. package/package.json +43 -0
  156. package/src/band-scale.ts +115 -0
  157. package/src/calendar.ts +244 -0
  158. package/src/capacity.ts +191 -0
  159. package/src/dsl-utils.ts +30 -0
  160. package/src/edge-routing.ts +550 -0
  161. package/src/frame-tab-geometry.ts +165 -0
  162. package/src/header-card-geometry.ts +48 -0
  163. package/src/i18n.ts +124 -0
  164. package/src/include-chrome-geometry.ts +156 -0
  165. package/src/index.ts +118 -0
  166. package/src/inline-date-pin-geometry.ts +196 -0
  167. package/src/item-bar-geometry.ts +271 -0
  168. package/src/lane-utilization.ts +259 -0
  169. package/src/layout-context.ts +182 -0
  170. package/src/layout.ts +1530 -0
  171. package/src/nodes/anchor-node.ts +77 -0
  172. package/src/nodes/footnote-node.ts +60 -0
  173. package/src/nodes/group-node.ts +260 -0
  174. package/src/nodes/include-node.ts +168 -0
  175. package/src/nodes/item-node.ts +171 -0
  176. package/src/nodes/marker-geometry.ts +43 -0
  177. package/src/nodes/milestone-node.ts +263 -0
  178. package/src/nodes/parallel-node.ts +110 -0
  179. package/src/nodes/roadmap-node.ts +957 -0
  180. package/src/nodes/swimlane-node.ts +423 -0
  181. package/src/renderable.ts +68 -0
  182. package/src/row-packer.ts +271 -0
  183. package/src/style-resolution.ts +243 -0
  184. package/src/themes/dark.ts +244 -0
  185. package/src/themes/grayscale.ts +240 -0
  186. package/src/themes/index.ts +66 -0
  187. package/src/themes/light.ts +251 -0
  188. package/src/themes/shape.ts +230 -0
  189. package/src/themes/shared.ts +369 -0
  190. package/src/time-scale.ts +78 -0
  191. package/src/types.ts +641 -0
  192. package/src/view-preset.ts +180 -0
  193. package/src/working-calendar.ts +91 -0
@@ -0,0 +1,251 @@
1
+ import type { EntityStyle, NamedColors, Theme } from './shape.js';
2
+
3
+ // Named-color mapping for light theme. These are the DSL's `bg:blue`
4
+ // style tokens translated to concrete palette values.
5
+ export const lightNamed: NamedColors = {
6
+ red: '#e53935',
7
+ blue: '#1e88e5',
8
+ yellow: '#fdd835',
9
+ green: '#43a047',
10
+ orange: '#fb8c00',
11
+ purple: '#8e24aa',
12
+ gray: '#9e9e9e',
13
+ navy: '#0d47a1',
14
+ white: '#ffffff',
15
+ };
16
+
17
+ const baseEntity: EntityStyle = {
18
+ bg: 'none',
19
+ fg: '#0f172a',
20
+ text: '#0f172a',
21
+ border: 'solid',
22
+ icon: 'none',
23
+ shadow: 'none',
24
+ font: 'sans',
25
+ weight: 'normal',
26
+ italic: false,
27
+ textSize: 'md',
28
+ padding: 'sm',
29
+ spacing: 'sm',
30
+ headerHeight: 'sm',
31
+ cornerRadius: 'sm',
32
+ bracket: 'none',
33
+ capacityIcon: 'multiplier',
34
+ };
35
+
36
+ export const lightTheme: Theme = {
37
+ name: 'light',
38
+ surface: {
39
+ page: '#f8fafc',
40
+ chart: '#ffffff',
41
+ headerBox: '#ffffff',
42
+ },
43
+ entities: {
44
+ roadmap: {
45
+ ...baseEntity,
46
+ headerHeight: 'md',
47
+ padding: 'md',
48
+ },
49
+ swimlane: {
50
+ ...baseEntity,
51
+ fg: '#334155',
52
+ text: '#334155',
53
+ padding: 'sm',
54
+ spacing: 'none',
55
+ textSize: 'sm',
56
+ },
57
+ item: {
58
+ ...baseEntity,
59
+ // Status-aware tint applied during layout when bg stays white;
60
+ // see m2d handoff Resolution 3.
61
+ bg: '#ffffff',
62
+ fg: '#94a3b8',
63
+ text: '#0f172a',
64
+ shadow: 'subtle',
65
+ cornerRadius: 'sm',
66
+ },
67
+ parallel: {
68
+ ...baseEntity,
69
+ bracket: 'none',
70
+ padding: 'xs',
71
+ },
72
+ group: {
73
+ ...baseEntity,
74
+ bracket: 'solid',
75
+ padding: 'xs',
76
+ fg: '#475569',
77
+ },
78
+ anchor: {
79
+ ...baseEntity,
80
+ bg: '#0f172a',
81
+ fg: '#0f172a',
82
+ text: '#0f172a',
83
+ cornerRadius: 'sm',
84
+ },
85
+ milestone: {
86
+ ...baseEntity,
87
+ bg: '#312e81',
88
+ fg: '#312e81',
89
+ text: '#ffffff',
90
+ border: 'solid',
91
+ },
92
+ footnote: {
93
+ ...baseEntity,
94
+ bg: 'none',
95
+ fg: '#475569',
96
+ text: '#475569',
97
+ textSize: 'sm',
98
+ },
99
+ label: {
100
+ ...baseEntity,
101
+ bg: '#f1f5f9',
102
+ fg: '#475569',
103
+ text: '#475569',
104
+ textSize: 'xs',
105
+ padding: 'xs',
106
+ cornerRadius: 'full',
107
+ },
108
+ },
109
+ swimlane: {
110
+ bandEven: '#ffffff',
111
+ bandOdd: '#f8fafc',
112
+ separator: '#e2e8f0',
113
+ frameTabText: '#334155',
114
+ frameTabMuted: '#64748b',
115
+ border: '#e2e8f0',
116
+ tabFill: '#f1f5f9',
117
+ tabStroke: '#cbd5e1',
118
+ tabText: '#334155',
119
+ ownerText: '#64748b',
120
+ footnoteIndicator: '#dc2626',
121
+ rowTintEven: '#ffffff',
122
+ rowTintOdd: '#f8fafc',
123
+ utilizationOk: '#10b981',
124
+ utilizationWarn: '#f59e0b',
125
+ utilizationOver: '#ef4444',
126
+ },
127
+ timeline: {
128
+ gridLine: '#cbd5e1',
129
+ minorGridLine: '#e2e8f0',
130
+ tickMark: '#cbd5e1',
131
+ labelText: '#64748b',
132
+ panelFill: '#ffffff',
133
+ border: '#e2e8f0',
134
+ },
135
+ header: {
136
+ cardBorder: '#e2e8f0',
137
+ author: '#64748b',
138
+ },
139
+ item: {
140
+ overflowX: '#dc2626',
141
+ linkIconFg: '#0f172a',
142
+ overflowTailFill: '#fee2e2',
143
+ overflowTailStroke: '#ef4444',
144
+ overflowCaption: '#b91c1c',
145
+ },
146
+ parallel: {
147
+ bracketStroke: '#334155',
148
+ },
149
+ anchorDiamond: {
150
+ fill: '#ffffff',
151
+ stroke: '#334155',
152
+ label: '#334155',
153
+ cutLine: '#64748b',
154
+ },
155
+ milestoneDiamond: {
156
+ fill: '#0f172a',
157
+ label: '#0f172a',
158
+ cutLineNormal: '#1e1b4b',
159
+ cutLineOverrun: '#b91c1c',
160
+ slack: '#0f172a',
161
+ },
162
+ footnotePanel: {
163
+ fill: '#ffffff',
164
+ border: '#e2e8f0',
165
+ header: '#0f172a',
166
+ title: '#0f172a',
167
+ description: '#64748b',
168
+ number: '#dc2626',
169
+ },
170
+ nowline: {
171
+ stroke: '#e53e3e',
172
+ labelText: '#ffffff',
173
+ labelBg: '#e53e3e',
174
+ },
175
+ milestone: {
176
+ dashedInk: '#94a3b8',
177
+ overrun: '#ef4444',
178
+ },
179
+ anchor: {
180
+ predecessorLine: '#94a3b8',
181
+ },
182
+ dependency: {
183
+ edgeStroke: '#475569',
184
+ overflowStroke: '#d32f2f',
185
+ },
186
+ footnote: {
187
+ indicatorText: '#e53e3e',
188
+ descriptionMuted: '#64748b',
189
+ },
190
+ includeRegion: {
191
+ border: '#94a3b8',
192
+ label: '#334155',
193
+ badge: '#64748b',
194
+ fill: '#f8fafc',
195
+ tabFill: '#ffffff',
196
+ tabStroke: '#cbd5e1',
197
+ tabText: '#0f172a',
198
+ badgeFill: '#e2e8f0',
199
+ badgeStroke: '#cbd5e1',
200
+ badgeText: '#475569',
201
+ },
202
+ arrowhead: {
203
+ neutral: '#475569',
204
+ light: '#94a3b8',
205
+ dark: '#0f172a',
206
+ },
207
+ status: {
208
+ done: '#10b981',
209
+ inProgress: '#3b82f6',
210
+ atRisk: '#f59e0b',
211
+ blocked: '#ef4444',
212
+ planned: '#94a3b8',
213
+ neutral: '#94a3b8',
214
+ },
215
+ // Status-dot palettes — the renderer picks one based on the
216
+ // bar's effective bg luminance.
217
+ //
218
+ // `onLight`: deep / 800-900 level. Used when the bar bg is
219
+ // light (pale status tint OR a label-driven light hue). High
220
+ // contrast against either.
221
+ //
222
+ // `onDark`: pale / 100 level. Used when the bar bg is dark or
223
+ // saturated mid-tone (e.g. `bg:blue` → `#1e88e5`). Still
224
+ // hue-tinted so the status meaning carries.
225
+ statusDot: {
226
+ onLight: {
227
+ done: '#065f46',
228
+ inProgress: '#1e3a8a',
229
+ atRisk: '#92400e',
230
+ blocked: '#991b1b',
231
+ planned: '#334155',
232
+ neutral: '#334155',
233
+ },
234
+ onDark: {
235
+ done: '#d1fae5',
236
+ inProgress: '#dbeafe',
237
+ atRisk: '#fef3c7',
238
+ blocked: '#fee2e2',
239
+ planned: '#e2e8f0',
240
+ neutral: '#e2e8f0',
241
+ },
242
+ },
243
+ attribution: {
244
+ mark: '#94a3b8',
245
+ link: '#e53e3e',
246
+ },
247
+ diagnostic: {
248
+ overlayBg: '#fee2e2',
249
+ errorText: '#991b1b',
250
+ },
251
+ };
@@ -0,0 +1,230 @@
1
+ // The `Theme` interface is the single place that enumerates every role a
2
+ // theme must define. Every theme (light, dark, future custom) imports this
3
+ // and declares `const <name>Theme: Theme = { ... }`. `tsc` refuses to compile
4
+ // if any role is omitted — that's our primary drift-prevention mechanism.
5
+
6
+ import type { BorderKind, BracketKind, FontFamily, FontWeight, ShadowKind } from '../types.js';
7
+
8
+ // Per-entity DSL-style defaults. Every property from specs/dsl.md §
9
+ // Style Properties appears here so tsc enforces parity across themes.
10
+ // All color roles are concrete hex strings; `bg` may be 'none' (transparent).
11
+ export interface EntityStyle {
12
+ bg: string;
13
+ fg: string;
14
+ text: string;
15
+ border: BorderKind;
16
+ icon: string;
17
+ shadow: ShadowKind;
18
+ font: FontFamily;
19
+ weight: FontWeight;
20
+ italic: boolean;
21
+ textSize: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
22
+ padding: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
23
+ spacing: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
24
+ headerHeight: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
25
+ cornerRadius: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
26
+ bracket: BracketKind;
27
+ // Glyph used as the suffix on capacity numbers (lane badge / item suffix).
28
+ // Holds whatever the author wrote (built-in name, custom glyph id, or an
29
+ // inline Unicode literal) — interpretation is the renderer's job. Default
30
+ // is `multiplier` so unannotated capacity values render as `5×`.
31
+ capacityIcon: string;
32
+ }
33
+
34
+ export interface Theme {
35
+ name: 'light' | 'dark' | string;
36
+ // Surfaces — base colors drawn under every entity.
37
+ surface: {
38
+ page: string; // overall background
39
+ chart: string; // content area background
40
+ headerBox: string; // header/title block background
41
+ };
42
+ // Per-entity DSL defaults. Mirrors the DSL's `default <entity>` level.
43
+ entities: {
44
+ roadmap: EntityStyle;
45
+ swimlane: EntityStyle;
46
+ item: EntityStyle;
47
+ parallel: EntityStyle;
48
+ group: EntityStyle;
49
+ anchor: EntityStyle;
50
+ milestone: EntityStyle;
51
+ footnote: EntityStyle;
52
+ label: EntityStyle;
53
+ };
54
+ // Alternating swimlane band tints (even/odd index).
55
+ swimlane: {
56
+ bandEven: string;
57
+ bandOdd: string;
58
+ separator: string;
59
+ frameTabText: string;
60
+ frameTabMuted: string;
61
+ // m2.5d: tokens lifted out of the renderer's inline `theme === 'dark'`
62
+ // branches in `renderSwimlane`.
63
+ border: string;
64
+ tabFill: string;
65
+ tabStroke: string;
66
+ tabText: string;
67
+ ownerText: string;
68
+ footnoteIndicator: string;
69
+ rowTintEven: string; // alternating row tint (even rows)
70
+ rowTintOdd: string; // alternating row tint (odd rows)
71
+ // m13: tri-state lane utilization underline. Each token paints one
72
+ // classification band along the bottom edge of the lane band when
73
+ // the lane has `capacity:` and at least one item contributing load.
74
+ // See specs/rendering.md § Lane utilization underline.
75
+ utilizationOk: string; // green; load below `warn-at` (incl. zero)
76
+ utilizationWarn: string; // yellow; load in `[warn-at, over-at)`
77
+ utilizationOver: string; // red; load >= `over-at`
78
+ };
79
+ timeline: {
80
+ gridLine: string;
81
+ // Faint dotted line drawn at every tick boundary (not just majors)
82
+ // when the roadmap's resolved `minor-grid` style is `true`. A step
83
+ // lighter than `gridLine` so the major lines still dominate.
84
+ minorGridLine: string;
85
+ tickMark: string;
86
+ labelText: string;
87
+ // m2.5d: lifted from renderTimeline.
88
+ panelFill: string;
89
+ border: string;
90
+ };
91
+ // m2.5d: all renderer-side palette tokens previously inlined as
92
+ // `theme === 'dark' ? darkColor : lightColor` ternaries. Each new
93
+ // token reads from one of the existing theme objects so the
94
+ // renderer becomes pure data → SVG.
95
+ header: {
96
+ cardBorder: string;
97
+ author: string;
98
+ };
99
+ item: {
100
+ overflowX: string; // red X mark on overrun tail
101
+ linkIconFg: string; // generic link icon color
102
+ overflowTailFill: string;
103
+ overflowTailStroke: string;
104
+ overflowCaption: string; // "past <id>" caption color
105
+ };
106
+ parallel: {
107
+ bracketStroke: string;
108
+ };
109
+ anchorDiamond: {
110
+ fill: string;
111
+ stroke: string;
112
+ label: string;
113
+ cutLine: string;
114
+ };
115
+ milestoneDiamond: {
116
+ fill: string;
117
+ label: string;
118
+ cutLineNormal: string;
119
+ cutLineOverrun: string;
120
+ slack: string;
121
+ };
122
+ footnotePanel: {
123
+ fill: string;
124
+ border: string;
125
+ header: string;
126
+ title: string;
127
+ description: string;
128
+ number: string;
129
+ };
130
+ nowline: {
131
+ stroke: string;
132
+ labelText: string;
133
+ labelBg: string;
134
+ };
135
+ milestone: {
136
+ dashedInk: string; // used on floating/overrun slack arrows
137
+ overrun: string; // accent for overrun highlight
138
+ };
139
+ anchor: {
140
+ predecessorLine: string; // non-binding slack arrow color
141
+ };
142
+ dependency: {
143
+ edgeStroke: string;
144
+ overflowStroke: string;
145
+ };
146
+ footnote: {
147
+ indicatorText: string;
148
+ descriptionMuted: string;
149
+ };
150
+ includeRegion: {
151
+ border: string;
152
+ label: string;
153
+ badge: string;
154
+ // m2.5d: lifted from renderIncludeRegion.
155
+ fill: string;
156
+ tabFill: string;
157
+ tabStroke: string;
158
+ tabText: string;
159
+ badgeFill: string;
160
+ badgeStroke: string;
161
+ badgeText: string;
162
+ };
163
+ // m2.5d: lifted from renderEdge marker defs.
164
+ arrowhead: {
165
+ neutral: string;
166
+ light: string;
167
+ dark: string;
168
+ };
169
+ // Five built-in statuses plus neutral fallback for custom statuses.
170
+ status: {
171
+ done: string;
172
+ inProgress: string;
173
+ atRisk: string;
174
+ blocked: string;
175
+ planned: string;
176
+ neutral: string;
177
+ };
178
+ /**
179
+ * Upper-right status-dot colors. Two palettes — the renderer
180
+ * picks `onLight` for bars whose effective bg is light/pale and
181
+ * `onDark` for bars whose bg is dark/saturated. This lets the
182
+ * dot stay recognizably status-hued on the pale status-tint
183
+ * bars used by default AND on the saturated mid-tone bars that
184
+ * a label's `style:` ref can paint (e.g. `bg:blue` →
185
+ * `#1e88e5` in light theme, `#60a5fa` in dark theme). Both
186
+ * palettes appear in both themes — bar luminance is independent
187
+ * of overall theme, since a label can tint a bar bright or dark
188
+ * regardless of whether the chart background is light or dark.
189
+ */
190
+ statusDot: {
191
+ onLight: {
192
+ done: string;
193
+ inProgress: string;
194
+ atRisk: string;
195
+ blocked: string;
196
+ planned: string;
197
+ neutral: string;
198
+ };
199
+ onDark: {
200
+ done: string;
201
+ inProgress: string;
202
+ atRisk: string;
203
+ blocked: string;
204
+ planned: string;
205
+ neutral: string;
206
+ };
207
+ };
208
+ attribution: {
209
+ mark: string;
210
+ link: string;
211
+ };
212
+ diagnostic: {
213
+ overlayBg: string;
214
+ errorText: string;
215
+ };
216
+ }
217
+
218
+ // Named-color resolver. DSL allows a named color like `blue`, a hex, or
219
+ // `none`. Themes own the mapping from named → hex (different per theme).
220
+ export interface NamedColors {
221
+ red: string;
222
+ blue: string;
223
+ yellow: string;
224
+ green: string;
225
+ orange: string;
226
+ purple: string;
227
+ gray: string;
228
+ navy: string;
229
+ white: string;
230
+ }