@lyric_dev/data-loom 0.2.4

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.
@@ -0,0 +1,238 @@
1
+ :root {
2
+ --bg: #0e1116;
3
+ --panel: #161b22;
4
+ --panel-2: #1c232d;
5
+ --border: #2a3038;
6
+ --text: #d7dde5;
7
+ --muted: #8b96a3;
8
+ --accent: #6ea8fe;
9
+ --draft: #6b7585;
10
+ --progress: #d8a64a;
11
+ --done: #4cae6a;
12
+ --warn: #d6604d;
13
+ --edge: #3b4654;
14
+ }
15
+
16
+ * { box-sizing: border-box; }
17
+
18
+ html, body {
19
+ margin: 0;
20
+ height: 100%;
21
+ background: var(--bg);
22
+ color: var(--text);
23
+ font: 14px/1.45 "Segoe UI", system-ui, -apple-system, sans-serif;
24
+ }
25
+
26
+ .topbar {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: 24px;
30
+ padding: 0 18px;
31
+ height: 52px;
32
+ border-bottom: 1px solid var(--border);
33
+ background: var(--panel);
34
+ }
35
+ .brand { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 17px; letter-spacing: 0.3px; }
36
+ .brand-logo { display: block; }
37
+
38
+ .tabs { display: flex; gap: 4px; }
39
+ .tab {
40
+ background: transparent;
41
+ border: 1px solid transparent;
42
+ color: var(--muted);
43
+ padding: 6px 14px;
44
+ border-radius: 7px;
45
+ cursor: pointer;
46
+ font: inherit;
47
+ }
48
+ .tab.active { color: var(--text); background: var(--panel-2); border-color: var(--border); }
49
+ .tab.disabled { opacity: 0.45; cursor: not-allowed; }
50
+
51
+ .project { margin-left: auto; display: flex; align-items: center; gap: 8px; }
52
+ .project-label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 1px; }
53
+ #project-select {
54
+ background: var(--panel-2);
55
+ color: var(--text);
56
+ border: 1px solid var(--border);
57
+ border-radius: 7px;
58
+ padding: 5px 9px;
59
+ font: inherit;
60
+ font-size: 13px;
61
+ max-width: 240px;
62
+ }
63
+ #project-select:hover { border-color: var(--accent); }
64
+
65
+ .conn { margin-left: 18px; display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; }
66
+ .dot { width: 9px; height: 9px; border-radius: 50%; background: var(--warn); transition: background 0.2s; }
67
+ .dot.live { background: var(--done); }
68
+ .gen { color: var(--border); }
69
+
70
+ main { padding: 22px; height: calc(100% - 52px); overflow: auto; }
71
+
72
+ .board-wrap { position: relative; }
73
+ .edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; overflow: visible; }
74
+
75
+ .board { display: flex; flex-direction: column; position: relative; z-index: 1; }
76
+
77
+ .phase-band { border: 1px dashed var(--border); border-radius: 12px; padding: 14px 16px; }
78
+ .phase-band-cards { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 16px; }
79
+ .phase-arrow { text-align: center; color: var(--muted); font-size: 20px; line-height: 1; padding: 8px 0; }
80
+ .phase-head {
81
+ font-size: 12px; text-transform: uppercase; letter-spacing: 1px;
82
+ color: var(--muted); margin-bottom: 12px; padding-left: 2px;
83
+ }
84
+ .phase-head b { color: var(--text); }
85
+
86
+ .card {
87
+ background: var(--panel);
88
+ border: 1px solid var(--border);
89
+ border-left: 3px solid var(--draft);
90
+ border-radius: 9px;
91
+ padding: 12px 13px;
92
+ width: 250px;
93
+ cursor: pointer;
94
+ transition: border-color 0.15s, transform 0.05s;
95
+ }
96
+ .card:hover { border-color: var(--accent); }
97
+ .card:active { transform: translateY(1px); }
98
+ .card.s-draft { border-left-color: var(--draft); }
99
+ .card.s-in-progress { border-left-color: var(--progress); }
100
+ .card.s-done { border-left-color: var(--done); }
101
+ .card.warn { box-shadow: inset 0 0 0 1px var(--warn); }
102
+
103
+ .card-name { font-weight: 600; word-break: break-word; }
104
+ .card-meta { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
105
+
106
+ .pill {
107
+ font-size: 11px; padding: 2px 8px; border-radius: 999px;
108
+ border: 1px solid var(--border); color: var(--muted);
109
+ }
110
+ .pill.s-draft { color: var(--draft); }
111
+ .pill.s-in-progress { color: var(--progress); border-color: #4a3f24; }
112
+ .pill.s-done { color: var(--done); border-color: #234d31; }
113
+
114
+ .caps { font-size: 11px; color: var(--muted); }
115
+ .caps .add { color: var(--done); }
116
+ .caps .mod { color: var(--progress); }
117
+ .tasks-mini { font-size: 11px; color: var(--muted); }
118
+
119
+ .doneband { margin-top: 26px; border-top: 1px dashed var(--border); padding-top: 14px; }
120
+ .doneband.hidden { display: none; }
121
+ .doneband-head { cursor: pointer; color: var(--muted); font-size: 12px; user-select: none; }
122
+ .doneband-items { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px; }
123
+ .doneband-items.collapsed { display: none; }
124
+ .done-chip { background: var(--panel); border: 1px solid var(--border); border-radius: 7px; padding: 6px 10px; font-size: 12px; color: var(--muted); }
125
+
126
+ .detail {
127
+ position: fixed; top: 52px; right: 0; width: 340px; height: calc(100% - 52px);
128
+ background: var(--panel-2); border-left: 1px solid var(--border);
129
+ padding: 20px; overflow: auto; z-index: 5;
130
+ box-shadow: -8px 0 24px rgba(0,0,0,0.3);
131
+ }
132
+ .detail.hidden { display: none; }
133
+ .detail-close { position: absolute; top: 12px; right: 14px; background: none; border: none; color: var(--muted); font-size: 22px; cursor: pointer; }
134
+ .detail h2 { margin: 0 26px 4px 0; font-size: 16px; word-break: break-word; }
135
+ .detail h3 { font-size: 11px; text-transform: uppercase; letter-spacing: 1px; color: var(--muted); margin: 18px 0 6px; }
136
+ .detail ul { margin: 0; padding-left: 18px; }
137
+ .detail li { margin: 2px 0; }
138
+ .detail .empty { color: var(--border); }
139
+ .detail code { background: var(--bg); padding: 1px 5px; border-radius: 4px; }
140
+
141
+ .empty-state { color: var(--muted); padding: 40px; text-align: center; }
142
+
143
+ /* views */
144
+ .view { display: none; }
145
+ .view.active { display: block; }
146
+
147
+ /* topology (HOW tab) */
148
+ .topo-legend { display: flex; gap: 18px; align-items: center; color: var(--muted); font-size: 12px; margin-bottom: 10px; }
149
+ .topo-legend .swatch { display: inline-block; width: 18px; height: 0; border-top: 2px solid var(--edge); vertical-align: middle; margin-right: 5px; }
150
+ .topo-legend .swatch.dashed { border-top-style: dashed; }
151
+ .topo-hint { margin-left: auto; color: var(--border); }
152
+
153
+ .topo-wrap { position: relative; min-height: 560px; }
154
+ #topo-nodes { position: absolute; inset: 0; z-index: 1; }
155
+
156
+ .topo-node {
157
+ position: absolute;
158
+ transform: translate(-50%, -50%);
159
+ background: var(--panel);
160
+ border: 1px solid var(--border);
161
+ border-radius: 10px;
162
+ padding: 10px 12px;
163
+ width: 168px;
164
+ text-align: center;
165
+ }
166
+ .topo-node.hub {
167
+ background: var(--panel-2);
168
+ border-color: var(--accent);
169
+ box-shadow: 0 0 0 1px var(--accent), 0 0 24px rgba(110, 168, 254, 0.18);
170
+ width: 150px;
171
+ }
172
+ .topo-name { font-weight: 600; word-break: break-word; }
173
+ .topo-sub { font-size: 11px; color: var(--muted); margin-top: 3px; }
174
+ .topo-state { font-size: 11px; color: var(--muted); margin-top: 7px; display: flex; align-items: center; justify-content: center; gap: 6px; }
175
+
176
+ .live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex: none; }
177
+ .live-unknown .live-dot { background: var(--muted); }
178
+ .live-checking .live-dot { background: var(--progress); }
179
+ .live-available .live-dot, .live-already-running .live-dot { background: var(--done); }
180
+ .live-needs-auth .live-dot { background: #c79a3a; }
181
+ .live-unreachable .live-dot { background: var(--warn); }
182
+ .live-on-demand .live-dot { background: var(--accent); }
183
+
184
+ .topo-check {
185
+ margin-top: 9px;
186
+ background: transparent;
187
+ border: 1px solid var(--border);
188
+ color: var(--muted);
189
+ border-radius: 6px;
190
+ padding: 3px 12px;
191
+ font: inherit;
192
+ font-size: 12px;
193
+ cursor: pointer;
194
+ }
195
+ .topo-check:hover { border-color: var(--accent); color: var(--text); }
196
+
197
+ .topo-empty { position: absolute; top: 50%; left: 50%; transform: translate(-50%, 60px); color: var(--muted); }
198
+
199
+ /* conflicts banner (roadmap) */
200
+ .conflicts {
201
+ background: rgba(214, 96, 77, 0.08);
202
+ border: 1px solid var(--warn);
203
+ border-radius: 9px;
204
+ padding: 11px 14px;
205
+ margin-bottom: 18px;
206
+ }
207
+ .conflicts.hidden { display: none; }
208
+ .conflicts-head { color: var(--warn); font-weight: 600; margin-bottom: 6px; font-size: 13px; }
209
+ .conflict-item { font-size: 13px; color: var(--text); padding: 2px 0; }
210
+ .conflict-item::before { content: "•"; color: var(--warn); margin-right: 8px; }
211
+
212
+ /* phase-planning: readiness */
213
+ .pill.r-ready { color: var(--accent); border-color: #2f4a6b; }
214
+ .pill.r-blocked { color: var(--muted); }
215
+ .card.next { box-shadow: 0 0 0 2px var(--accent); }
216
+ .blocked-note { font-size: 11px; color: var(--muted); margin-top: 7px; }
217
+ .blocked-note::before { content: "⏳ "; }
218
+
219
+ /* dependency-review (roadmap) — informational, distinct from the warn banner */
220
+ .review {
221
+ display: flex; align-items: center; gap: 10px;
222
+ background: rgba(110, 168, 254, 0.08);
223
+ border: 1px solid #2f4a6b;
224
+ border-radius: 9px;
225
+ padding: 10px 14px;
226
+ margin-bottom: 18px;
227
+ color: var(--text); font-size: 13px;
228
+ }
229
+ .review.hidden { display: none; }
230
+ .review-badge {
231
+ flex: none;
232
+ min-width: 20px; height: 20px; padding: 0 6px;
233
+ display: inline-flex; align-items: center; justify-content: center;
234
+ background: var(--accent); color: var(--bg);
235
+ border-radius: 999px; font-weight: 700; font-size: 12px;
236
+ }
237
+ .pill.review { color: var(--accent); border-color: #2f4a6b; }
238
+ .card.needs-review { border-left-style: dashed; }