@1agh/maude 0.40.0 → 0.41.0
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/apps/studio/ai-banner.tsx +2 -2
- package/apps/studio/annotations-layer.tsx +53 -2
- package/apps/studio/api.ts +504 -3
- package/apps/studio/artboard-marquee.tsx +1 -1
- package/apps/studio/bin/_canvas-rects-playwright.mjs +55 -0
- package/apps/studio/bin/_canvas-rects-static.mjs +166 -0
- package/apps/studio/bin/_fetch-asset.mjs +556 -0
- package/apps/studio/bin/annotate.mjs +576 -34
- package/apps/studio/bin/canvas-rects.sh +152 -0
- package/apps/studio/bin/fetch-asset.sh +34 -0
- package/apps/studio/bin/read-annotations.mjs +138 -7
- package/apps/studio/bin/smoke.sh +42 -6
- package/apps/studio/build.ts +21 -0
- package/apps/studio/canvas-comment-mount.tsx +138 -4
- package/apps/studio/canvas-edit.ts +744 -11
- package/apps/studio/canvas-lib.tsx +219 -2
- package/apps/studio/canvas-shell.tsx +487 -20
- package/apps/studio/client/app.jsx +1451 -22
- package/apps/studio/client/comments-overlay.css +130 -126
- package/apps/studio/client/github.js +8 -0
- package/apps/studio/client/styles/3-shell-maude.css +48 -0
- package/apps/studio/comments-overlay.tsx +148 -41
- package/apps/studio/context-menu.tsx +15 -5
- package/apps/studio/contextual-toolbar.tsx +262 -4
- package/apps/studio/cursors-overlay.tsx +4 -4
- package/apps/studio/dist/client.bundle.js +20 -20
- package/apps/studio/dist/comment-mount.js +59 -1
- package/apps/studio/dist/styles.css +1 -1
- package/apps/studio/dom-selection.ts +127 -1
- package/apps/studio/drag-state.ts +24 -0
- package/apps/studio/equal-spacing-detector.ts +205 -0
- package/apps/studio/export-dialog.tsx +1 -1
- package/apps/studio/history.ts +47 -1
- package/apps/studio/http.ts +223 -0
- package/apps/studio/input-router.tsx +12 -0
- package/apps/studio/marquee-overlay.tsx +1 -1
- package/apps/studio/measure-overlay.tsx +241 -0
- package/apps/studio/participants-chrome.tsx +3 -3
- package/apps/studio/sizing-mode.ts +117 -0
- package/apps/studio/spacing-handles.ts +166 -0
- package/apps/studio/test/annotate-write.test.ts +890 -0
- package/apps/studio/test/camera-reveal.test.tsx +173 -0
- package/apps/studio/test/canvas-edit.test.ts +50 -0
- package/apps/studio/test/canvas-origin-gate.test.ts +18 -0
- package/apps/studio/test/canvas-rects.test.ts +198 -0
- package/apps/studio/test/comments-overlay.test.ts +117 -0
- package/apps/studio/test/dom-selection.test.ts +130 -0
- package/apps/studio/test/edit-css-occurrence.test.ts +81 -0
- package/apps/studio/test/edit-scope-api.test.ts +115 -0
- package/apps/studio/test/element-resize.test.ts +136 -0
- package/apps/studio/test/element-structural-api.test.ts +360 -0
- package/apps/studio/test/element-structural-edit.test.ts +233 -0
- package/apps/studio/test/equal-spacing-detector.test.ts +165 -1
- package/apps/studio/test/history-rollback.test.ts +26 -0
- package/apps/studio/test/knob-props-authored.test.ts +87 -0
- package/apps/studio/test/read-annotations.test.ts +154 -0
- package/apps/studio/test/sizing-mode.test.ts +102 -0
- package/apps/studio/test/spacing-handles.test.ts +138 -0
- package/apps/studio/test/specimen-select.test.ts +88 -0
- package/apps/studio/test/tool-palette-insert-anchor.test.ts +84 -0
- package/apps/studio/test/undo-sequence-byte-compare.test.ts +211 -0
- package/apps/studio/tool-palette.tsx +122 -2
- package/apps/studio/undo-hud.tsx +2 -2
- package/apps/studio/use-element-resize.tsx +732 -0
- package/apps/studio/use-keyboard-discipline.tsx +205 -15
- package/apps/studio/use-selection-set.tsx +14 -0
- package/apps/studio/use-spacing-handles.tsx +388 -0
- package/apps/studio/whats-new.json +28 -0
- package/cli/commands/design.mjs +6 -1
- package/cli/commands/design.test.mjs +49 -1
- package/cli/lib/fetch-asset.test.mjs +213 -0
- package/package.json +8 -8
- package/plugins/design/dependencies.json +10 -2
|
@@ -4,9 +4,14 @@
|
|
|
4
4
|
* world plane scales the entire layer (pins + composer + thread popover)
|
|
5
5
|
* uniformly with the artboards.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Maude-chrome tokens ONLY (`--maude-chrome-*` / `--maude-hud-*`, defined by
|
|
8
|
+
* canvas-shell.tsx's HUD_TOKENS_CSS) — never the project DS's own `--bg-*` /
|
|
9
|
+
* `--fg-*` / `--accent*` names. This overlay is studio chrome, not canvas
|
|
10
|
+
* content: it must look identical across every project regardless of which
|
|
11
|
+
* design system is loaded, the same discipline already applied to the
|
|
12
|
+
* toolbar/halos/context-menu/export-dialog. Reusing the DS's own token names
|
|
13
|
+
* here was the bug — the composer/pins/thread re-skinned themselves to match
|
|
14
|
+
* whatever palette the open canvas happened to declare.
|
|
10
15
|
*/
|
|
11
16
|
|
|
12
17
|
.cm-layer {
|
|
@@ -28,41 +33,41 @@
|
|
|
28
33
|
height: 24px;
|
|
29
34
|
padding: 0;
|
|
30
35
|
margin: 0;
|
|
31
|
-
background: var(--accent, #6f63ef);
|
|
32
|
-
color: var(--accent-fg, #faf6ef);
|
|
33
|
-
border: 1.5px solid var(--bg-0, #14131a);
|
|
34
|
-
border-radius:
|
|
35
|
-
box-shadow: var(--shadow
|
|
36
|
-
font: 600
|
|
37
|
-
letter-spacing:
|
|
36
|
+
background: var(--maude-hud-accent, #6f63ef);
|
|
37
|
+
color: var(--maude-hud-accent-fg, #faf6ef);
|
|
38
|
+
border: 1.5px solid var(--maude-chrome-bg-0, #14131a);
|
|
39
|
+
border-radius: 5px 5px 5px 2px;
|
|
40
|
+
box-shadow: 0 4px 14px var(--maude-chrome-shadow, rgba(0,0,0,0.3));
|
|
41
|
+
font: 600 11px / 1 var(--maude-chrome-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
|
|
42
|
+
letter-spacing: 0.04em;
|
|
38
43
|
display: grid;
|
|
39
44
|
place-items: center;
|
|
40
45
|
cursor: pointer;
|
|
41
46
|
pointer-events: auto;
|
|
42
47
|
user-select: none;
|
|
43
|
-
transition: background
|
|
48
|
+
transition: background 120ms ease-out;
|
|
44
49
|
will-change: transform;
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
.cm-pin:hover,
|
|
48
53
|
.cm-pin[aria-expanded='true'] {
|
|
49
|
-
background: var(--accent-hover, color-mix(in oklab, var(--accent, #d63b1f) 90%, white));
|
|
54
|
+
background: var(--maude-hud-accent-hover, color-mix(in oklab, var(--maude-hud-accent, #d63b1f) 90%, white));
|
|
50
55
|
}
|
|
51
56
|
|
|
52
57
|
.cm-pin:focus-visible {
|
|
53
58
|
outline: none;
|
|
54
|
-
box-shadow:
|
|
59
|
+
box-shadow: 0 0 0 2px var(--maude-hud-accent, #d63b1f);
|
|
55
60
|
}
|
|
56
61
|
|
|
57
62
|
.cm-pin[data-resolved='true'] {
|
|
58
|
-
background: var(--bg-
|
|
59
|
-
color: var(--fg-
|
|
63
|
+
background: var(--maude-chrome-bg-2, #1c1916);
|
|
64
|
+
color: var(--maude-chrome-fg-1, #6e6660);
|
|
60
65
|
opacity: 0.6;
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
.cm-pin[data-focused='true'] {
|
|
64
69
|
/* Subtle ring — DS hard-edges discipline: no glow, just a hairline outline. */
|
|
65
|
-
outline: 1px solid var(--fg-0, #2a2520);
|
|
70
|
+
outline: 1px solid var(--maude-chrome-fg-0, #2a2520);
|
|
66
71
|
outline-offset: 1px;
|
|
67
72
|
}
|
|
68
73
|
|
|
@@ -70,34 +75,34 @@
|
|
|
70
75
|
.cm-composer {
|
|
71
76
|
position: absolute;
|
|
72
77
|
width: 300px;
|
|
73
|
-
background: var(--bg-1, #faf6ef);
|
|
74
|
-
border: 1px solid var(--border
|
|
75
|
-
border-radius:
|
|
76
|
-
padding:
|
|
77
|
-
box-shadow: var(--shadow
|
|
78
|
-
font:
|
|
79
|
-
color: var(--fg-0, #2a2520);
|
|
78
|
+
background: var(--maude-chrome-bg-1, #faf6ef);
|
|
79
|
+
border: 1px solid var(--maude-chrome-border, #3a352f);
|
|
80
|
+
border-radius: 2px;
|
|
81
|
+
padding: 12px;
|
|
82
|
+
box-shadow: 0 4px 14px var(--maude-chrome-shadow, rgba(0,0,0,0.22));
|
|
83
|
+
font: 13px / 1.5 system-ui, sans-serif;
|
|
84
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
80
85
|
pointer-events: auto;
|
|
81
86
|
z-index: 4;
|
|
82
87
|
}
|
|
83
88
|
|
|
84
89
|
.cm-composer__head {
|
|
85
|
-
font-size:
|
|
86
|
-
color: var(--fg-
|
|
87
|
-
letter-spacing:
|
|
90
|
+
font-size: 11px;
|
|
91
|
+
color: var(--maude-chrome-fg-1, #6e6660);
|
|
92
|
+
letter-spacing: 0.08em;
|
|
88
93
|
text-transform: uppercase;
|
|
89
|
-
margin: 0 0
|
|
94
|
+
margin: 0 0 4px 0;
|
|
90
95
|
display: flex;
|
|
91
96
|
align-items: center;
|
|
92
|
-
gap:
|
|
97
|
+
gap: 4px;
|
|
93
98
|
}
|
|
94
99
|
|
|
95
100
|
.cm-composer__selector {
|
|
96
|
-
color: var(--fg-
|
|
97
|
-
background:
|
|
98
|
-
padding: 0
|
|
99
|
-
border: 1px solid var(--
|
|
100
|
-
font-size:
|
|
101
|
+
color: var(--maude-chrome-fg-0, #4a4540);
|
|
102
|
+
background: color-mix(in oklab, var(--maude-chrome-bg-1, #faf6ef) 80%, var(--maude-hud-accent, #d63b1f) 6%);
|
|
103
|
+
padding: 0 4px;
|
|
104
|
+
border: 1px solid var(--maude-chrome-border, #c8bfb4);
|
|
105
|
+
font-size: 11px;
|
|
101
106
|
letter-spacing: 0;
|
|
102
107
|
text-transform: none;
|
|
103
108
|
}
|
|
@@ -106,53 +111,53 @@
|
|
|
106
111
|
width: 100%;
|
|
107
112
|
min-height: 72px;
|
|
108
113
|
resize: vertical;
|
|
109
|
-
background: var(--bg-0, #ffffff);
|
|
110
|
-
color: var(--fg-0, #2a2520);
|
|
111
|
-
border: 1px solid var(--border
|
|
112
|
-
border-radius:
|
|
113
|
-
padding:
|
|
114
|
+
background: var(--maude-chrome-bg-0, #ffffff);
|
|
115
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
116
|
+
border: 1px solid var(--maude-chrome-border, #3a352f);
|
|
117
|
+
border-radius: 5px;
|
|
118
|
+
padding: 8px;
|
|
114
119
|
font: inherit;
|
|
115
120
|
box-sizing: border-box;
|
|
116
121
|
}
|
|
117
122
|
|
|
118
123
|
.cm-composer__textarea:focus-visible {
|
|
119
124
|
outline: none;
|
|
120
|
-
border-color: var(--accent, #d63b1f);
|
|
121
|
-
box-shadow:
|
|
125
|
+
border-color: var(--maude-hud-accent, #d63b1f);
|
|
126
|
+
box-shadow: 0 0 0 2px var(--maude-hud-accent, #d63b1f);
|
|
122
127
|
}
|
|
123
128
|
|
|
124
129
|
.cm-composer__actions {
|
|
125
130
|
display: flex;
|
|
126
|
-
gap:
|
|
131
|
+
gap: 4px;
|
|
127
132
|
justify-content: flex-end;
|
|
128
|
-
margin-top:
|
|
133
|
+
margin-top: 8px;
|
|
129
134
|
}
|
|
130
135
|
|
|
131
136
|
.cm-btn {
|
|
132
|
-
font: 500
|
|
133
|
-
letter-spacing:
|
|
137
|
+
font: 500 11px / 1.4 var(--maude-chrome-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
|
|
138
|
+
letter-spacing: 0.08em;
|
|
134
139
|
text-transform: uppercase;
|
|
135
|
-
padding:
|
|
136
|
-
border: 1px solid var(--border
|
|
137
|
-
border-radius:
|
|
140
|
+
padding: 4px 8px;
|
|
141
|
+
border: 1px solid var(--maude-chrome-border, #3a352f);
|
|
142
|
+
border-radius: 5px;
|
|
138
143
|
cursor: pointer;
|
|
139
144
|
background: transparent;
|
|
140
|
-
color: var(--fg-0, #2a2520);
|
|
141
|
-
transition: background
|
|
145
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
146
|
+
transition: background 120ms ease-out;
|
|
142
147
|
}
|
|
143
148
|
|
|
144
149
|
.cm-btn:hover {
|
|
145
|
-
background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
|
|
150
|
+
background: var(--maude-chrome-bg-2, color-mix(in oklab, var(--maude-chrome-bg-1, #faf6ef) 80%, var(--maude-chrome-fg-0, #2a2520) 6%));
|
|
146
151
|
}
|
|
147
152
|
|
|
148
153
|
.cm-btn--primary {
|
|
149
|
-
background: var(--accent, #d63b1f);
|
|
150
|
-
color: var(--accent-fg, #faf6ef);
|
|
151
|
-
border-color: var(--accent, #d63b1f);
|
|
154
|
+
background: var(--maude-hud-accent, #d63b1f);
|
|
155
|
+
color: var(--maude-hud-accent-fg, #faf6ef);
|
|
156
|
+
border-color: var(--maude-hud-accent, #d63b1f);
|
|
152
157
|
}
|
|
153
158
|
|
|
154
159
|
.cm-btn--primary:hover {
|
|
155
|
-
background: var(--accent-hover, color-mix(in oklab, var(--accent, #d63b1f) 90%, white));
|
|
160
|
+
background: var(--maude-hud-accent-hover, color-mix(in oklab, var(--maude-hud-accent, #d63b1f) 90%, white));
|
|
156
161
|
}
|
|
157
162
|
|
|
158
163
|
.cm-btn:disabled {
|
|
@@ -162,7 +167,7 @@
|
|
|
162
167
|
|
|
163
168
|
.cm-btn:focus-visible {
|
|
164
169
|
outline: none;
|
|
165
|
-
box-shadow:
|
|
170
|
+
box-shadow: 0 0 0 2px var(--maude-hud-accent, #d63b1f);
|
|
166
171
|
}
|
|
167
172
|
|
|
168
173
|
/* ─── Thread popover ──────────────────────────────────────────────────────── */
|
|
@@ -171,13 +176,13 @@
|
|
|
171
176
|
width: 340px;
|
|
172
177
|
max-height: 60vh;
|
|
173
178
|
overflow: auto;
|
|
174
|
-
background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
|
|
175
|
-
border: 1px solid var(--border
|
|
176
|
-
border-radius:
|
|
177
|
-
padding:
|
|
178
|
-
box-shadow: var(--shadow
|
|
179
|
-
font:
|
|
180
|
-
color: var(--fg-0, #2a2520);
|
|
179
|
+
background: var(--maude-chrome-bg-2, color-mix(in oklab, var(--maude-chrome-bg-1, #faf6ef) 80%, var(--maude-chrome-fg-0, #2a2520) 6%));
|
|
180
|
+
border: 1px solid var(--maude-chrome-border, #3a352f);
|
|
181
|
+
border-radius: 2px;
|
|
182
|
+
padding: 12px;
|
|
183
|
+
box-shadow: 0 4px 14px var(--maude-chrome-shadow, rgba(0,0,0,0.22));
|
|
184
|
+
font: 13px / 1.5 system-ui, sans-serif;
|
|
185
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
181
186
|
pointer-events: auto;
|
|
182
187
|
z-index: 5;
|
|
183
188
|
}
|
|
@@ -185,16 +190,16 @@
|
|
|
185
190
|
.cm-thread__head {
|
|
186
191
|
display: flex;
|
|
187
192
|
flex-direction: column;
|
|
188
|
-
gap:
|
|
189
|
-
padding-bottom:
|
|
190
|
-
border-bottom: 1px solid var(--border
|
|
193
|
+
gap: 4px;
|
|
194
|
+
padding-bottom: 8px;
|
|
195
|
+
border-bottom: 1px solid var(--maude-chrome-border, #3a352f);
|
|
191
196
|
}
|
|
192
197
|
|
|
193
198
|
.cm-thread__head-row {
|
|
194
199
|
display: flex;
|
|
195
200
|
justify-content: flex-start;
|
|
196
201
|
align-items: center;
|
|
197
|
-
gap:
|
|
202
|
+
gap: 4px;
|
|
198
203
|
}
|
|
199
204
|
|
|
200
205
|
/* Plan C P18 — pin/sequence badge in the thread popover header. */
|
|
@@ -205,51 +210,50 @@
|
|
|
205
210
|
width: 18px;
|
|
206
211
|
height: 18px;
|
|
207
212
|
border-radius: 4px;
|
|
208
|
-
background: var(--accent, #d63b1f);
|
|
209
|
-
color: var(--accent-fg, #fff);
|
|
210
|
-
font: 600
|
|
213
|
+
background: var(--maude-hud-accent, #d63b1f);
|
|
214
|
+
color: var(--maude-hud-accent-fg, #fff);
|
|
215
|
+
font: 600 11px / 1 var(--maude-chrome-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
|
|
211
216
|
}
|
|
212
217
|
|
|
213
218
|
.cm-thread__close {
|
|
214
219
|
background: transparent;
|
|
215
|
-
color: var(--fg-
|
|
216
|
-
border: 1px solid var(--border
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
font: 600 var(--type-xs, 11px) / 1.2 var(--font-mono, ui-monospace, monospace);
|
|
220
|
+
color: var(--maude-chrome-fg-1, #6e6660);
|
|
221
|
+
border: 1px solid var(--maude-chrome-border, #3a352f);
|
|
222
|
+
padding: 0 4px;
|
|
223
|
+
font: 600 11px / 1.2 var(--maude-chrome-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
|
|
220
224
|
cursor: pointer;
|
|
221
225
|
align-self: flex-start;
|
|
222
226
|
margin-left: auto;
|
|
223
|
-
transition: background
|
|
227
|
+
transition: background 120ms ease-out;
|
|
224
228
|
}
|
|
225
229
|
|
|
226
230
|
.cm-thread__close:hover {
|
|
227
|
-
background: var(--
|
|
228
|
-
color: var(--fg-0, #2a2520);
|
|
231
|
+
background: color-mix(in oklab, var(--maude-chrome-fg-0, #1c1917) 8%, transparent);
|
|
232
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
229
233
|
}
|
|
230
234
|
|
|
231
235
|
.cm-thread__close:focus-visible {
|
|
232
236
|
outline: none;
|
|
233
|
-
box-shadow:
|
|
237
|
+
box-shadow: 0 0 0 2px var(--maude-hud-accent, #d63b1f);
|
|
234
238
|
}
|
|
235
239
|
|
|
236
240
|
.cm-thread__author {
|
|
237
|
-
color: var(--fg-0, #2a2520);
|
|
241
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
238
242
|
font-weight: 600;
|
|
239
243
|
}
|
|
240
244
|
|
|
241
245
|
.cm-thread__time {
|
|
242
|
-
color: var(--fg-
|
|
243
|
-
font-size:
|
|
246
|
+
color: var(--maude-chrome-fg-1, #6e6660);
|
|
247
|
+
font-size: 11px;
|
|
244
248
|
}
|
|
245
249
|
|
|
246
250
|
.cm-thread__selector {
|
|
247
251
|
display: inline-block;
|
|
248
|
-
color: var(--fg-
|
|
249
|
-
font-size:
|
|
250
|
-
border: 1px solid var(--
|
|
251
|
-
padding: 0
|
|
252
|
-
background:
|
|
252
|
+
color: var(--maude-chrome-fg-1, #6e6660);
|
|
253
|
+
font-size: 11px;
|
|
254
|
+
border: 1px solid var(--maude-chrome-border, #c8bfb4);
|
|
255
|
+
padding: 0 4px;
|
|
256
|
+
background: color-mix(in oklab, var(--maude-chrome-bg-1, #faf6ef) 80%, var(--maude-hud-accent, #d63b1f) 6%);
|
|
253
257
|
align-self: flex-start;
|
|
254
258
|
max-width: 100%;
|
|
255
259
|
overflow: hidden;
|
|
@@ -258,7 +262,7 @@
|
|
|
258
262
|
}
|
|
259
263
|
|
|
260
264
|
.cm-thread__body {
|
|
261
|
-
padding:
|
|
265
|
+
padding: 8px 0;
|
|
262
266
|
white-space: pre-wrap;
|
|
263
267
|
word-break: break-word;
|
|
264
268
|
}
|
|
@@ -266,30 +270,30 @@
|
|
|
266
270
|
.cm-thread__body strong,
|
|
267
271
|
.cm-thread__reply-body strong {
|
|
268
272
|
/* @mention tokens — bold, accent color. Inserted by `renderBodyWithMentions`. */
|
|
269
|
-
color: var(--accent, #d63b1f);
|
|
273
|
+
color: var(--maude-hud-accent, #d63b1f);
|
|
270
274
|
font-weight: 600;
|
|
271
275
|
}
|
|
272
276
|
|
|
273
277
|
.cm-thread__reply {
|
|
274
|
-
padding:
|
|
275
|
-
border-top: 1px solid var(--border
|
|
278
|
+
padding: 8px 0;
|
|
279
|
+
border-top: 1px solid var(--maude-chrome-border, #c8bfb4);
|
|
276
280
|
}
|
|
277
281
|
|
|
278
282
|
.cm-thread__reply-head {
|
|
279
283
|
display: flex;
|
|
280
284
|
align-items: baseline;
|
|
281
|
-
gap:
|
|
282
|
-
margin-bottom:
|
|
285
|
+
gap: 4px;
|
|
286
|
+
margin-bottom: 4px;
|
|
283
287
|
}
|
|
284
288
|
|
|
285
289
|
.cm-thread__reply-author {
|
|
286
|
-
color: var(--fg-
|
|
290
|
+
color: var(--maude-chrome-fg-0, #4a4540);
|
|
287
291
|
font-weight: 600;
|
|
288
292
|
}
|
|
289
293
|
|
|
290
294
|
.cm-thread__reply-time {
|
|
291
|
-
color: var(--
|
|
292
|
-
font-size:
|
|
295
|
+
color: var(--maude-chrome-fg-1, #6e6660);
|
|
296
|
+
font-size: 11px;
|
|
293
297
|
}
|
|
294
298
|
|
|
295
299
|
.cm-thread__reply-body {
|
|
@@ -298,68 +302,68 @@
|
|
|
298
302
|
}
|
|
299
303
|
|
|
300
304
|
.cm-thread__reply-form {
|
|
301
|
-
padding-top:
|
|
302
|
-
border-top: 1px solid var(--border
|
|
305
|
+
padding-top: 8px;
|
|
306
|
+
border-top: 1px solid var(--maude-chrome-border, #3a352f);
|
|
303
307
|
display: flex;
|
|
304
308
|
flex-direction: column;
|
|
305
|
-
gap:
|
|
309
|
+
gap: 4px;
|
|
306
310
|
}
|
|
307
311
|
|
|
308
312
|
.cm-thread__reply-textarea {
|
|
309
313
|
width: 100%;
|
|
310
314
|
min-height: 56px;
|
|
311
315
|
resize: vertical;
|
|
312
|
-
background: var(--bg-0, #ffffff);
|
|
313
|
-
color: var(--fg-0, #2a2520);
|
|
314
|
-
border: 1px solid var(--border
|
|
315
|
-
border-radius:
|
|
316
|
-
padding:
|
|
316
|
+
background: var(--maude-chrome-bg-0, #ffffff);
|
|
317
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
318
|
+
border: 1px solid var(--maude-chrome-border, #3a352f);
|
|
319
|
+
border-radius: 5px;
|
|
320
|
+
padding: 8px;
|
|
317
321
|
font: inherit;
|
|
318
322
|
box-sizing: border-box;
|
|
319
323
|
}
|
|
320
324
|
|
|
321
325
|
.cm-thread__reply-textarea:focus-visible {
|
|
322
326
|
outline: none;
|
|
323
|
-
border-color: var(--accent, #d63b1f);
|
|
324
|
-
box-shadow:
|
|
327
|
+
border-color: var(--maude-hud-accent, #d63b1f);
|
|
328
|
+
box-shadow: 0 0 0 2px var(--maude-hud-accent, #d63b1f);
|
|
325
329
|
}
|
|
326
330
|
|
|
327
331
|
.cm-thread__reply-actions {
|
|
328
332
|
display: flex;
|
|
329
333
|
justify-content: flex-end;
|
|
330
|
-
gap:
|
|
334
|
+
gap: 4px;
|
|
331
335
|
}
|
|
332
336
|
|
|
333
337
|
.cm-thread__actions {
|
|
334
338
|
display: flex;
|
|
335
|
-
gap:
|
|
336
|
-
padding-top:
|
|
337
|
-
margin-top:
|
|
338
|
-
border-top: 1px solid var(--border
|
|
339
|
+
gap: 4px;
|
|
340
|
+
padding-top: 8px;
|
|
341
|
+
margin-top: 8px;
|
|
342
|
+
border-top: 1px solid var(--maude-chrome-border, #3a352f);
|
|
339
343
|
}
|
|
340
344
|
|
|
341
345
|
.cm-thread__actions .cm-btn--danger {
|
|
342
346
|
margin-left: auto;
|
|
343
|
-
color:
|
|
344
|
-
border-color:
|
|
347
|
+
color: #c0392b;
|
|
348
|
+
border-color: #c0392b;
|
|
345
349
|
}
|
|
346
350
|
|
|
347
351
|
.cm-thread__actions .cm-btn--danger:hover {
|
|
348
|
-
background: color-mix(in oklab,
|
|
352
|
+
background: color-mix(in oklab, #c0392b 12%, transparent);
|
|
349
353
|
}
|
|
350
354
|
|
|
351
355
|
/* ─── @mention autocomplete ──────────────────────────────────────────────── */
|
|
352
356
|
.cm-mention-popup {
|
|
353
357
|
position: absolute;
|
|
354
|
-
background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
|
|
355
|
-
border: 1px solid var(--border
|
|
356
|
-
border-radius:
|
|
357
|
-
font:
|
|
358
|
-
color: var(--fg-0, #2a2520);
|
|
358
|
+
background: var(--maude-chrome-bg-2, color-mix(in oklab, var(--maude-chrome-bg-1, #faf6ef) 80%, var(--maude-chrome-fg-0, #2a2520) 6%));
|
|
359
|
+
border: 1px solid var(--maude-chrome-border, #3a352f);
|
|
360
|
+
border-radius: 5px;
|
|
361
|
+
font: 11px / 1.3 var(--maude-chrome-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
|
|
362
|
+
color: var(--maude-chrome-fg-0, #2a2520);
|
|
359
363
|
max-height: 180px;
|
|
360
364
|
min-width: 160px;
|
|
361
365
|
overflow: auto;
|
|
362
|
-
box-shadow: var(--shadow
|
|
366
|
+
box-shadow: 0 4px 14px var(--maude-chrome-shadow, rgba(0,0,0,0.22));
|
|
363
367
|
pointer-events: auto;
|
|
364
368
|
z-index: 6;
|
|
365
369
|
list-style: none;
|
|
@@ -368,16 +372,16 @@
|
|
|
368
372
|
}
|
|
369
373
|
|
|
370
374
|
.cm-mention-popup__item {
|
|
371
|
-
padding:
|
|
375
|
+
padding: 4px 8px;
|
|
372
376
|
cursor: pointer;
|
|
373
377
|
display: flex;
|
|
374
378
|
justify-content: space-between;
|
|
375
|
-
gap:
|
|
379
|
+
gap: 8px;
|
|
376
380
|
}
|
|
377
381
|
|
|
378
382
|
.cm-mention-popup__item[aria-selected='true'] {
|
|
379
|
-
background: var(--accent, #d63b1f);
|
|
380
|
-
color: var(--accent-fg, #faf6ef);
|
|
383
|
+
background: var(--maude-hud-accent, #d63b1f);
|
|
384
|
+
color: var(--maude-hud-accent-fg, #faf6ef);
|
|
381
385
|
}
|
|
382
386
|
|
|
383
387
|
.cm-mention-popup__name {
|
|
@@ -385,11 +389,11 @@
|
|
|
385
389
|
}
|
|
386
390
|
|
|
387
391
|
.cm-mention-popup__email {
|
|
388
|
-
color: var(--fg-
|
|
389
|
-
font-size:
|
|
392
|
+
color: var(--maude-chrome-fg-1, #6e6660);
|
|
393
|
+
font-size: 11px;
|
|
390
394
|
}
|
|
391
395
|
|
|
392
396
|
.cm-mention-popup__item[aria-selected='true'] .cm-mention-popup__email {
|
|
393
|
-
color: var(--accent-fg, #faf6ef);
|
|
397
|
+
color: var(--maude-hud-accent-fg, #faf6ef);
|
|
394
398
|
opacity: 0.85;
|
|
395
399
|
}
|
|
@@ -95,6 +95,14 @@ export const openLocalProject = (path) => invoke('open_local_project', { path })
|
|
|
95
95
|
*/
|
|
96
96
|
export const saveExport = (filename, bytes) => invoke('save_export', { filename, bytes });
|
|
97
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Native "open file" for media upload — the read counterpart to saveExport.
|
|
100
|
+
* WKWebView won't present the file panel for an HTML <input type=file>, so the
|
|
101
|
+
* AssetPicker uses this in the desktop app. Returns { name, bytes:[...] } or null
|
|
102
|
+
* (cancelled). Browser build uses the <input type=file> path instead.
|
|
103
|
+
*/
|
|
104
|
+
export const pickMediaFile = () => invoke('pick_media_file');
|
|
105
|
+
|
|
98
106
|
// ── Tauri shell: auto-update (Phase 32 / Task 1) ────────────────────────────────
|
|
99
107
|
// The shell downloads + stages a newer build in the background and emits
|
|
100
108
|
// `update-ready` with { version, notes }. The client shows a banner; clicking
|
|
@@ -353,6 +353,13 @@
|
|
|
353
353
|
.st-rp-tab .st-rp-tabct { font-family: var(--font-mono); font-size: 10px; color: var(--fg-3); }
|
|
354
354
|
.st-rp-body { flex: 1; overflow-y: auto; padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-4); }
|
|
355
355
|
.st-rp-hd { font-family: var(--font-mono); font-size: var(--type-xs); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--fg-2); }
|
|
356
|
+
/* Stage H (INV-3) edit-scope strip — local (this element) vs shared (edits N places). */
|
|
357
|
+
.st-scope { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); font-size: var(--type-xs); border-bottom: 1px solid var(--border-subtle); flex: none; animation: st-pop var(--dur-soft) var(--ease-out); }
|
|
358
|
+
.st-scope-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
|
|
359
|
+
.st-scope--local { color: var(--fg-2); }
|
|
360
|
+
.st-scope--local .st-scope-dot { background: var(--fg-3); }
|
|
361
|
+
.st-scope--shared { color: var(--accent); }
|
|
362
|
+
.st-scope--shared .st-scope-dot { background: var(--accent); }
|
|
356
363
|
.st-rp-empty { color: var(--fg-2); font-size: var(--type-sm); line-height: 1.6; display: flex; flex-direction: column; gap: var(--space-4); }
|
|
357
364
|
|
|
358
365
|
/* comment pin (inline badge in the panel) */
|
|
@@ -476,6 +483,24 @@
|
|
|
476
483
|
.st-export-recent-row:hover { background: var(--bg-2); }
|
|
477
484
|
.st-export-recent-row .st-mono { color: var(--fg-1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 50%; }
|
|
478
485
|
|
|
486
|
+
/* ─── AssetPicker (feature-element-editing-robustness Stage F1) ───────────── */
|
|
487
|
+
.st-btn { appearance: none; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; min-height: 28px; border: 1px solid var(--border-default); border-radius: var(--radius-sm); background: var(--bg-2); color: var(--fg-1); font-family: var(--font-mono); font-size: var(--type-xs); padding: 0 12px; transition: background var(--dur-soft) var(--ease-out), border-color var(--dur-soft) var(--ease-out); }
|
|
488
|
+
.st-btn:hover { background: var(--bg-3); border-color: var(--border-strong, var(--border-default)); }
|
|
489
|
+
.st-btn:disabled { opacity: 0.55; cursor: default; }
|
|
490
|
+
.st-asset-picker { width: 620px; }
|
|
491
|
+
.st-ap-toolbar { display: flex; align-items: center; gap: var(--space-3); }
|
|
492
|
+
.st-ap-err { color: var(--danger, #e5484d); font-family: var(--font-mono); font-size: var(--type-xs); }
|
|
493
|
+
.st-ap-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(112px, 1fr)); gap: var(--space-3); max-height: 52vh; overflow-y: auto; padding: 2px; }
|
|
494
|
+
.st-ap-empty { grid-column: 1 / -1; color: var(--fg-2); font-family: var(--font-mono); font-size: var(--type-xs); padding: var(--space-6) 0; text-align: center; }
|
|
495
|
+
.st-ap-cell { appearance: none; cursor: pointer; display: flex; flex-direction: column; gap: 4px; padding: 6px; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); background: var(--bg-2); text-align: left; transition: border-color var(--dur-soft) var(--ease-out), background var(--dur-soft) var(--ease-out); }
|
|
496
|
+
.st-ap-cell:hover { border-color: var(--accent, var(--border-strong, var(--border-default))); background: var(--bg-3); }
|
|
497
|
+
.st-ap-thumb { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: var(--radius-xs); background: var(--bg-4, var(--bg-3)); display: block; }
|
|
498
|
+
.st-ap-name { font-family: var(--font-mono); font-size: 10px; color: var(--fg-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
499
|
+
.st-cp-replace { width: 100%; justify-content: center; }
|
|
500
|
+
/* Media "Replace…" — a full-width button, NOT inside the 3-col .st-cp-row grid
|
|
501
|
+
(which would drop it into the 10px provenance-dot column and clip it). */
|
|
502
|
+
.st-cp-mediabtn { padding: var(--space-1) 0 var(--space-2); }
|
|
503
|
+
|
|
479
504
|
/* ─── Inspector panel fields / layers / css (Plan C P11–P13) ───────────────
|
|
480
505
|
* Lifted from Studio.css; complements the already-present `.st-insp-row`,
|
|
481
506
|
* `.st-insp-label`, `.st-rp-*`. */
|
|
@@ -716,6 +741,15 @@ body.st-scrubbing, body.st-scrubbing * { cursor: ew-resize !important; user-sele
|
|
|
716
741
|
.st-cp-boxv--mb, .st-cp-boxv--pb { bottom: 1px; left: 50%; transform: translateX(-50%); }
|
|
717
742
|
.st-cp-boxv--ml, .st-cp-boxv--pl { left: 0; top: 50%; transform: translateY(-50%); }
|
|
718
743
|
.st-cp-boxv--mr, .st-cp-boxv--pr { right: 0; top: 50%; transform: translateY(-50%); }
|
|
744
|
+
/* feature-element-editing-robustness Stage B — Position inset widget. One ring
|
|
745
|
+
(no nested padding box): the 4 inset inputs sit on the outer box edges around
|
|
746
|
+
a centered core showing the current `position` keyword (Figma constraints box). */
|
|
747
|
+
.st-cp-boxv--it { top: 1px; left: 50%; transform: translateX(-50%); }
|
|
748
|
+
.st-cp-boxv--ib { bottom: 1px; left: 50%; transform: translateX(-50%); }
|
|
749
|
+
.st-cp-boxv--il { left: 0; top: 50%; transform: translateY(-50%); }
|
|
750
|
+
.st-cp-boxv--ir { right: 0; top: 50%; transform: translateY(-50%); }
|
|
751
|
+
.st-cp-boxtag--i { color: var(--accent); }
|
|
752
|
+
.st-cp-boxcore--pos { text-transform: none; letter-spacing: 0; }
|
|
719
753
|
.st-cp-boxhint { display: flex; flex-wrap: wrap; gap: var(--space-1); }
|
|
720
754
|
.st-cp-boxhint + .st-cp-row { margin-top: var(--space-1); }
|
|
721
755
|
.st-cp-chip { font-family: var(--font-mono); font-size: 10px; color: var(--fg-2); background: var(--bg-2); border: 1px solid var(--border-default); border-radius: var(--radius-xs); padding: 1px 6px; }
|
|
@@ -762,6 +796,20 @@ body.st-scrubbing, body.st-scrubbing * { cursor: ew-resize !important; user-sele
|
|
|
762
796
|
.st-cp-add:hover { border-color: var(--accent); color: var(--fg-0); }
|
|
763
797
|
.st-cp-note { font-size: 10px; color: var(--fg-2); font-style: italic; }
|
|
764
798
|
|
|
799
|
+
/* Stage M — Fixed / Hug / Fill sizing-mode segmented control (per axis). */
|
|
800
|
+
.st-cp-modes { display: flex; flex-direction: column; gap: var(--space-1); margin-bottom: var(--space-1); }
|
|
801
|
+
.st-cp-modeseg { display: flex; align-items: stretch; gap: var(--space-1); }
|
|
802
|
+
.st-cp-modeax { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; font-family: var(--font-mono); font-size: 10px; color: var(--fg-2); }
|
|
803
|
+
.st-cp-modebtn { flex: 1; appearance: none; cursor: pointer; border: 1px solid var(--border-default); background: var(--bg-3); color: var(--fg-1); font-family: var(--font-mono); font-size: 10px; min-height: 22px; border-radius: var(--radius-xs); padding: 0 var(--space-1); }
|
|
804
|
+
.st-cp-modebtn:hover:not(.is-active):not(:disabled) { background: var(--bg-4); color: var(--fg-0); }
|
|
805
|
+
.st-cp-modebtn.is-active { background: var(--accent-tint); border-color: var(--accent); color: var(--accent); }
|
|
806
|
+
.st-cp-modebtn:disabled { opacity: 0.5; cursor: default; }
|
|
807
|
+
/* Stage M — sub-header for the flex-child row group + the make-flex CTA. */
|
|
808
|
+
.st-cp-subhd { font-family: var(--font-mono); font-size: 10px; color: var(--fg-2); text-transform: uppercase; letter-spacing: 0.04em; margin-top: var(--space-2); }
|
|
809
|
+
.st-cp-makeflex { align-self: flex-start; appearance: none; cursor: pointer; border: 1px dashed var(--border-default); background: transparent; color: var(--fg-1); font-family: var(--font-mono); font-size: var(--type-xs); border-radius: var(--radius-xs); padding: 4px var(--space-2); }
|
|
810
|
+
.st-cp-makeflex:hover:not(:disabled) { border-color: var(--accent); color: var(--fg-0); }
|
|
811
|
+
.st-cp-makeflex:disabled { opacity: 0.5; cursor: default; }
|
|
812
|
+
|
|
765
813
|
/* provenance legend */
|
|
766
814
|
.st-cp-legend { display: flex; flex-wrap: wrap; gap: var(--space-3); padding-top: var(--space-1); border-top: 1px solid var(--border-subtle); }
|
|
767
815
|
.st-cp-legend span { display: inline-flex; align-items: center; gap: var(--space-1); font-family: var(--font-mono); font-size: 10px; color: var(--fg-2); }
|