@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.
- package/LICENSE +190 -0
- package/README.md +103 -0
- package/dist/band-scale.d.ts +56 -0
- package/dist/band-scale.d.ts.map +1 -0
- package/dist/band-scale.js +86 -0
- package/dist/band-scale.js.map +1 -0
- package/dist/calendar.d.ts +79 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +210 -0
- package/dist/calendar.js.map +1 -0
- package/dist/capacity.d.ts +72 -0
- package/dist/capacity.d.ts.map +1 -0
- package/dist/capacity.js +163 -0
- package/dist/capacity.js.map +1 -0
- package/dist/dsl-utils.d.ts +5 -0
- package/dist/dsl-utils.d.ts.map +1 -0
- package/dist/dsl-utils.js +28 -0
- package/dist/dsl-utils.js.map +1 -0
- package/dist/edge-routing.d.ts +89 -0
- package/dist/edge-routing.d.ts.map +1 -0
- package/dist/edge-routing.js +435 -0
- package/dist/edge-routing.js.map +1 -0
- package/dist/frame-tab-geometry.d.ts +78 -0
- package/dist/frame-tab-geometry.d.ts.map +1 -0
- package/dist/frame-tab-geometry.js +115 -0
- package/dist/frame-tab-geometry.js.map +1 -0
- package/dist/header-card-geometry.d.ts +29 -0
- package/dist/header-card-geometry.d.ts.map +1 -0
- package/dist/header-card-geometry.js +41 -0
- package/dist/header-card-geometry.js.map +1 -0
- package/dist/i18n.d.ts +48 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +114 -0
- package/dist/i18n.js.map +1 -0
- package/dist/include-chrome-geometry.d.ts +86 -0
- package/dist/include-chrome-geometry.d.ts.map +1 -0
- package/dist/include-chrome-geometry.js +104 -0
- package/dist/include-chrome-geometry.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/inline-date-pin-geometry.d.ts +46 -0
- package/dist/inline-date-pin-geometry.d.ts.map +1 -0
- package/dist/inline-date-pin-geometry.js +149 -0
- package/dist/inline-date-pin-geometry.js.map +1 -0
- package/dist/item-bar-geometry.d.ts +157 -0
- package/dist/item-bar-geometry.d.ts.map +1 -0
- package/dist/item-bar-geometry.js +214 -0
- package/dist/item-bar-geometry.js.map +1 -0
- package/dist/lane-utilization.d.ts +90 -0
- package/dist/lane-utilization.d.ts.map +1 -0
- package/dist/lane-utilization.js +206 -0
- package/dist/lane-utilization.js.map +1 -0
- package/dist/layout-context.d.ts +143 -0
- package/dist/layout-context.d.ts.map +1 -0
- package/dist/layout-context.js +8 -0
- package/dist/layout-context.js.map +1 -0
- package/dist/layout.d.ts +18 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +1298 -0
- package/dist/layout.js.map +1 -0
- package/dist/nodes/anchor-node.d.ts +16 -0
- package/dist/nodes/anchor-node.d.ts.map +1 -0
- package/dist/nodes/anchor-node.js +68 -0
- package/dist/nodes/anchor-node.js.map +1 -0
- package/dist/nodes/footnote-node.d.ts +10 -0
- package/dist/nodes/footnote-node.d.ts.map +1 -0
- package/dist/nodes/footnote-node.js +41 -0
- package/dist/nodes/footnote-node.js.map +1 -0
- package/dist/nodes/group-node.d.ts +29 -0
- package/dist/nodes/group-node.d.ts.map +1 -0
- package/dist/nodes/group-node.js +195 -0
- package/dist/nodes/group-node.js.map +1 -0
- package/dist/nodes/include-node.d.ts +16 -0
- package/dist/nodes/include-node.d.ts.map +1 -0
- package/dist/nodes/include-node.js +117 -0
- package/dist/nodes/include-node.js.map +1 -0
- package/dist/nodes/item-node.d.ts +51 -0
- package/dist/nodes/item-node.d.ts.map +1 -0
- package/dist/nodes/item-node.js +108 -0
- package/dist/nodes/item-node.js.map +1 -0
- package/dist/nodes/marker-geometry.d.ts +22 -0
- package/dist/nodes/marker-geometry.d.ts.map +1 -0
- package/dist/nodes/marker-geometry.js +38 -0
- package/dist/nodes/marker-geometry.js.map +1 -0
- package/dist/nodes/milestone-node.d.ts +48 -0
- package/dist/nodes/milestone-node.d.ts.map +1 -0
- package/dist/nodes/milestone-node.js +210 -0
- package/dist/nodes/milestone-node.js.map +1 -0
- package/dist/nodes/parallel-node.d.ts +21 -0
- package/dist/nodes/parallel-node.d.ts.map +1 -0
- package/dist/nodes/parallel-node.js +88 -0
- package/dist/nodes/parallel-node.js.map +1 -0
- package/dist/nodes/roadmap-node.d.ts +76 -0
- package/dist/nodes/roadmap-node.d.ts.map +1 -0
- package/dist/nodes/roadmap-node.js +788 -0
- package/dist/nodes/roadmap-node.js.map +1 -0
- package/dist/nodes/swimlane-node.d.ts +38 -0
- package/dist/nodes/swimlane-node.d.ts.map +1 -0
- package/dist/nodes/swimlane-node.js +308 -0
- package/dist/nodes/swimlane-node.js.map +1 -0
- package/dist/renderable.d.ts +44 -0
- package/dist/renderable.d.ts.map +1 -0
- package/dist/renderable.js +21 -0
- package/dist/renderable.js.map +1 -0
- package/dist/row-packer.d.ts +125 -0
- package/dist/row-packer.d.ts.map +1 -0
- package/dist/row-packer.js +169 -0
- package/dist/row-packer.js.map +1 -0
- package/dist/style-resolution.d.ts +14 -0
- package/dist/style-resolution.d.ts.map +1 -0
- package/dist/style-resolution.js +191 -0
- package/dist/style-resolution.js.map +1 -0
- package/dist/themes/dark.d.ts +4 -0
- package/dist/themes/dark.d.ts.map +1 -0
- package/dist/themes/dark.js +241 -0
- package/dist/themes/dark.js.map +1 -0
- package/dist/themes/grayscale.d.ts +4 -0
- package/dist/themes/grayscale.d.ts.map +1 -0
- package/dist/themes/grayscale.js +237 -0
- package/dist/themes/grayscale.js.map +1 -0
- package/dist/themes/index.d.ts +19 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +57 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/light.d.ts +4 -0
- package/dist/themes/light.d.ts.map +1 -0
- package/dist/themes/light.js +248 -0
- package/dist/themes/light.js.map +1 -0
- package/dist/themes/shape.d.ts +194 -0
- package/dist/themes/shape.d.ts.map +1 -0
- package/dist/themes/shape.js +6 -0
- package/dist/themes/shape.js.map +1 -0
- package/dist/themes/shared.d.ts +145 -0
- package/dist/themes/shared.d.ts.map +1 -0
- package/dist/themes/shared.js +310 -0
- package/dist/themes/shared.js.map +1 -0
- package/dist/time-scale.d.ts +39 -0
- package/dist/time-scale.d.ts.map +1 -0
- package/dist/time-scale.js +62 -0
- package/dist/time-scale.js.map +1 -0
- package/dist/types.d.ts +516 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/view-preset.d.ts +23 -0
- package/dist/view-preset.d.ts.map +1 -0
- package/dist/view-preset.js +146 -0
- package/dist/view-preset.js.map +1 -0
- package/dist/working-calendar.d.ts +14 -0
- package/dist/working-calendar.d.ts.map +1 -0
- package/dist/working-calendar.js +74 -0
- package/dist/working-calendar.js.map +1 -0
- package/package.json +43 -0
- package/src/band-scale.ts +115 -0
- package/src/calendar.ts +244 -0
- package/src/capacity.ts +191 -0
- package/src/dsl-utils.ts +30 -0
- package/src/edge-routing.ts +550 -0
- package/src/frame-tab-geometry.ts +165 -0
- package/src/header-card-geometry.ts +48 -0
- package/src/i18n.ts +124 -0
- package/src/include-chrome-geometry.ts +156 -0
- package/src/index.ts +118 -0
- package/src/inline-date-pin-geometry.ts +196 -0
- package/src/item-bar-geometry.ts +271 -0
- package/src/lane-utilization.ts +259 -0
- package/src/layout-context.ts +182 -0
- package/src/layout.ts +1530 -0
- package/src/nodes/anchor-node.ts +77 -0
- package/src/nodes/footnote-node.ts +60 -0
- package/src/nodes/group-node.ts +260 -0
- package/src/nodes/include-node.ts +168 -0
- package/src/nodes/item-node.ts +171 -0
- package/src/nodes/marker-geometry.ts +43 -0
- package/src/nodes/milestone-node.ts +263 -0
- package/src/nodes/parallel-node.ts +110 -0
- package/src/nodes/roadmap-node.ts +957 -0
- package/src/nodes/swimlane-node.ts +423 -0
- package/src/renderable.ts +68 -0
- package/src/row-packer.ts +271 -0
- package/src/style-resolution.ts +243 -0
- package/src/themes/dark.ts +244 -0
- package/src/themes/grayscale.ts +240 -0
- package/src/themes/index.ts +66 -0
- package/src/themes/light.ts +251 -0
- package/src/themes/shape.ts +230 -0
- package/src/themes/shared.ts +369 -0
- package/src/time-scale.ts +78 -0
- package/src/types.ts +641 -0
- package/src/view-preset.ts +180 -0
- 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
|
+
}
|