@imfusion/web-ui 0.8.1-dev.3.g40eaad1c → 0.8.1-dev.31.g7b15b0d3
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/CHANGELOG.md +71 -0
- package/README.md +19 -17
- package/dist/components/card/card.d.ts +15 -1
- package/dist/components/field/field.d.ts +5 -2
- package/dist/components/slider/slider.d.ts +11 -1
- package/dist/components/typo/typo.d.ts +20 -11
- package/dist/index.js +1374 -1340
- package/dist/integrations/frame-selection/frame-selection-view.d.ts +24 -0
- package/dist/integrations/frame-selection/frame-selection.d.ts +21 -0
- package/dist/integrations/frame-selection/frame-selection.meta.d.ts +2 -0
- package/dist/integrations/frame-selection/index.d.ts +2 -0
- package/dist/integrations/frame-selection.js +121 -0
- package/dist/integrations/image-display-options.js +71 -70
- package/dist/llms/evals/runner/config.d.ts +1 -0
- package/dist/separator-BAxxttef.js +26 -0
- package/dist/slider-gyIYWSy3.js +116 -0
- package/dist/style.css +1 -1
- package/dist/tabs-9d4oaDwZ.js +295 -0
- package/dist/utils/status-glyphs.d.ts +4 -0
- package/dist/vite.js +1 -1
- package/dist/web-ui-cli.js +1 -1
- package/docs/user-guide/AgentTooling.mdx +8 -3
- package/package.json +4 -4
- package/src/docgen/doc.gen.json +149 -2
- package/src/llms/llms.gen.txt +8 -2
- package/src/llms/skills/imf-web-ui/SKILL.md +2 -0
- package/src/llms/skills/imf-web-ui-audit/SKILL.md +5 -3
- package/src/llms/skills/imf-web-ui-components/SKILL.md +3 -1
- package/src/llms/skills/imf-web-ui-conventions/templates/AUDIT_CHECKLIST.md +1 -0
- package/src/llms/skills/imf-web-ui-conventions/topics/authentication.md +2 -1
- package/src/llms/skills/imf-web-ui-conventions/topics/data.md +5 -3
- package/src/llms/skills/imf-web-ui-conventions/topics/styling.md +4 -2
- package/src/llms/skills/imf-web-ui-conventions/topics/typescript.md +14 -0
- package/src/llms/skills/imf-web-ui-setup/SKILL.md +2 -0
- package/src/llms/skills/imf-web-ui-update/SKILL.md +37 -6
- package/src/llms/skills/imf-web-ui-user-profile/SKILL.md +95 -0
- package/src/llms/skills/imf-web-ui-ux/SKILL.md +2 -0
- package/src/llms/tokens.gen.json +3 -3
- package/dist/tabs-BS6rqrrA.js +0 -398
- /package/dist/{paths-Oi0v8x-w.js → paths-CUyf9wjm.js} +0 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { t as e } from "./chunk-DmhlhrBa.js";
|
|
2
|
+
import { l as t, u as n } from "./slider-gyIYWSy3.js";
|
|
3
|
+
import { cva as r } from "class-variance-authority";
|
|
4
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
5
|
+
import { Children as a, useCallback as o } from "react";
|
|
6
|
+
import { Switch as s } from "@base-ui/react/switch";
|
|
7
|
+
import { Toggle as c } from "@base-ui/react/toggle";
|
|
8
|
+
import { ToggleGroup as l } from "@base-ui/react/toggle-group";
|
|
9
|
+
import { Tabs as u } from "@base-ui/react/tabs";
|
|
10
|
+
var d = {
|
|
11
|
+
root: "imf-ui-switch-module-root",
|
|
12
|
+
thumb: "imf-ui-switch-module-thumb"
|
|
13
|
+
}, f = /* @__PURE__ */ e({
|
|
14
|
+
Root: () => h,
|
|
15
|
+
Thumb: () => g
|
|
16
|
+
}), p = r(d.root), m = r(d.thumb);
|
|
17
|
+
function h(e) {
|
|
18
|
+
return /* @__PURE__ */ i(s.Root, {
|
|
19
|
+
...e,
|
|
20
|
+
"data-imf-ui-component": "Switch.Root",
|
|
21
|
+
className: (n) => p({ className: t(e.className, n) })
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
h.displayName = "Switch.Root";
|
|
25
|
+
function g(e) {
|
|
26
|
+
return /* @__PURE__ */ i(s.Thumb, {
|
|
27
|
+
...e,
|
|
28
|
+
"data-imf-ui-component": "Switch.Thumb",
|
|
29
|
+
className: (n) => m({ className: t(e.className, n) })
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
g.displayName = "Switch.Thumb";
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/components/toggle/toggle.tsx
|
|
35
|
+
var _ = r({ root: "imf-ui-toggle-module-root" }.root), v = 2;
|
|
36
|
+
function y(e) {
|
|
37
|
+
let t = 0;
|
|
38
|
+
return a.forEach(e, (e) => {
|
|
39
|
+
typeof e == "string" || typeof e == "number" ? t += String(e).trim().length : e != null && typeof e != "boolean" && (t += v);
|
|
40
|
+
}), t;
|
|
41
|
+
}
|
|
42
|
+
function b({ style: e, children: r, ...a }) {
|
|
43
|
+
let o = {
|
|
44
|
+
"--glyph-count": y(r),
|
|
45
|
+
"--max-glyphs": v
|
|
46
|
+
};
|
|
47
|
+
return /* @__PURE__ */ i(c, {
|
|
48
|
+
...a,
|
|
49
|
+
"data-imf-ui-component": "Toggle",
|
|
50
|
+
style: (t) => ({
|
|
51
|
+
...o,
|
|
52
|
+
...n(e, t)
|
|
53
|
+
}),
|
|
54
|
+
className: (e) => _({ className: t(a.className, e) }),
|
|
55
|
+
children: r
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/components/toggle-group/toggle-group.tsx
|
|
60
|
+
var x = r({ root: "imf-ui-toggle-group-module-root" }.root);
|
|
61
|
+
function S(e) {
|
|
62
|
+
return /* @__PURE__ */ i(l, {
|
|
63
|
+
...e,
|
|
64
|
+
"data-imf-ui-component": "ToggleGroup",
|
|
65
|
+
className: (n) => x({ className: t(e.className, n) })
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
var C = {
|
|
69
|
+
alignCenter: "imf-ui-row-module-alignCenter",
|
|
70
|
+
alignEnd: "imf-ui-row-module-alignEnd",
|
|
71
|
+
alignStart: "imf-ui-row-module-alignStart",
|
|
72
|
+
alignStretch: "imf-ui-row-module-alignStretch",
|
|
73
|
+
gap1: "imf-ui-row-module-gap1",
|
|
74
|
+
gap10: "imf-ui-row-module-gap10",
|
|
75
|
+
gap2: "imf-ui-row-module-gap2",
|
|
76
|
+
gap3: "imf-ui-row-module-gap3",
|
|
77
|
+
gap4: "imf-ui-row-module-gap4",
|
|
78
|
+
gap5: "imf-ui-row-module-gap5",
|
|
79
|
+
gap6: "imf-ui-row-module-gap6",
|
|
80
|
+
gap7: "imf-ui-row-module-gap7",
|
|
81
|
+
gap8: "imf-ui-row-module-gap8",
|
|
82
|
+
gap9: "imf-ui-row-module-gap9",
|
|
83
|
+
justifyAround: "imf-ui-row-module-justifyAround",
|
|
84
|
+
justifyBetween: "imf-ui-row-module-justifyBetween",
|
|
85
|
+
justifyCenter: "imf-ui-row-module-justifyCenter",
|
|
86
|
+
justifyEnd: "imf-ui-row-module-justifyEnd",
|
|
87
|
+
justifyEvenly: "imf-ui-row-module-justifyEvenly",
|
|
88
|
+
justifyStart: "imf-ui-row-module-justifyStart",
|
|
89
|
+
root: "imf-ui-row-module-root",
|
|
90
|
+
wrap: "imf-ui-row-module-wrap"
|
|
91
|
+
}, w = r(C.root, { variants: {
|
|
92
|
+
gap: {
|
|
93
|
+
1: C.gap1,
|
|
94
|
+
2: C.gap2,
|
|
95
|
+
3: C.gap3,
|
|
96
|
+
4: C.gap4,
|
|
97
|
+
5: C.gap5,
|
|
98
|
+
6: C.gap6,
|
|
99
|
+
7: C.gap7,
|
|
100
|
+
8: C.gap8,
|
|
101
|
+
9: C.gap9,
|
|
102
|
+
10: C.gap10
|
|
103
|
+
},
|
|
104
|
+
align: {
|
|
105
|
+
start: C.alignStart,
|
|
106
|
+
center: C.alignCenter,
|
|
107
|
+
end: C.alignEnd,
|
|
108
|
+
stretch: C.alignStretch
|
|
109
|
+
},
|
|
110
|
+
justify: {
|
|
111
|
+
start: C.justifyStart,
|
|
112
|
+
center: C.justifyCenter,
|
|
113
|
+
end: C.justifyEnd,
|
|
114
|
+
between: C.justifyBetween,
|
|
115
|
+
around: C.justifyAround,
|
|
116
|
+
evenly: C.justifyEvenly
|
|
117
|
+
},
|
|
118
|
+
wrap: {
|
|
119
|
+
true: C.wrap,
|
|
120
|
+
false: null
|
|
121
|
+
}
|
|
122
|
+
} });
|
|
123
|
+
function T({ gap: e = "2", align: t = "stretch", justify: n = "start", wrap: r = !1, ...a }) {
|
|
124
|
+
return /* @__PURE__ */ i("div", {
|
|
125
|
+
...a,
|
|
126
|
+
"data-imf-ui-component": "Row",
|
|
127
|
+
className: w({
|
|
128
|
+
gap: e,
|
|
129
|
+
align: t,
|
|
130
|
+
justify: n,
|
|
131
|
+
wrap: r,
|
|
132
|
+
className: a.className
|
|
133
|
+
})
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
var E = {
|
|
137
|
+
alignCenter: "imf-ui-stack-module-alignCenter",
|
|
138
|
+
alignEnd: "imf-ui-stack-module-alignEnd",
|
|
139
|
+
alignStart: "imf-ui-stack-module-alignStart",
|
|
140
|
+
alignStretch: "imf-ui-stack-module-alignStretch",
|
|
141
|
+
gap0: "imf-ui-stack-module-gap0",
|
|
142
|
+
gap1: "imf-ui-stack-module-gap1",
|
|
143
|
+
gap10: "imf-ui-stack-module-gap10",
|
|
144
|
+
gap2: "imf-ui-stack-module-gap2",
|
|
145
|
+
gap3: "imf-ui-stack-module-gap3",
|
|
146
|
+
gap4: "imf-ui-stack-module-gap4",
|
|
147
|
+
gap5: "imf-ui-stack-module-gap5",
|
|
148
|
+
gap6: "imf-ui-stack-module-gap6",
|
|
149
|
+
gap7: "imf-ui-stack-module-gap7",
|
|
150
|
+
gap8: "imf-ui-stack-module-gap8",
|
|
151
|
+
gap9: "imf-ui-stack-module-gap9",
|
|
152
|
+
justifyAround: "imf-ui-stack-module-justifyAround",
|
|
153
|
+
justifyBetween: "imf-ui-stack-module-justifyBetween",
|
|
154
|
+
justifyCenter: "imf-ui-stack-module-justifyCenter",
|
|
155
|
+
justifyEnd: "imf-ui-stack-module-justifyEnd",
|
|
156
|
+
justifyEvenly: "imf-ui-stack-module-justifyEvenly",
|
|
157
|
+
justifyStart: "imf-ui-stack-module-justifyStart",
|
|
158
|
+
root: "imf-ui-stack-module-root"
|
|
159
|
+
}, D = r(E.root, { variants: {
|
|
160
|
+
gap: {
|
|
161
|
+
0: E.gap0,
|
|
162
|
+
1: E.gap1,
|
|
163
|
+
2: E.gap2,
|
|
164
|
+
3: E.gap3,
|
|
165
|
+
4: E.gap4,
|
|
166
|
+
5: E.gap5,
|
|
167
|
+
6: E.gap6,
|
|
168
|
+
7: E.gap7,
|
|
169
|
+
8: E.gap8,
|
|
170
|
+
9: E.gap9,
|
|
171
|
+
10: E.gap10
|
|
172
|
+
},
|
|
173
|
+
align: {
|
|
174
|
+
start: E.alignStart,
|
|
175
|
+
center: E.alignCenter,
|
|
176
|
+
end: E.alignEnd,
|
|
177
|
+
stretch: E.alignStretch
|
|
178
|
+
},
|
|
179
|
+
justify: {
|
|
180
|
+
start: E.justifyStart,
|
|
181
|
+
center: E.justifyCenter,
|
|
182
|
+
end: E.justifyEnd,
|
|
183
|
+
between: E.justifyBetween,
|
|
184
|
+
around: E.justifyAround,
|
|
185
|
+
evenly: E.justifyEvenly
|
|
186
|
+
}
|
|
187
|
+
} });
|
|
188
|
+
function O({ gap: e = "4", align: t = "stretch", justify: n = "start", ...r }) {
|
|
189
|
+
return /* @__PURE__ */ i("div", {
|
|
190
|
+
...r,
|
|
191
|
+
"data-imf-ui-component": "Stack",
|
|
192
|
+
className: D({
|
|
193
|
+
gap: e,
|
|
194
|
+
align: t,
|
|
195
|
+
justify: n,
|
|
196
|
+
className: r.className
|
|
197
|
+
})
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
var k = {
|
|
201
|
+
indicator: "imf-ui-tabs-module-indicator",
|
|
202
|
+
list: "imf-ui-tabs-module-list",
|
|
203
|
+
listFill: "imf-ui-tabs-module-listFill",
|
|
204
|
+
panel: "imf-ui-tabs-module-panel",
|
|
205
|
+
panelViewport: "imf-ui-tabs-module-panelViewport",
|
|
206
|
+
root: "imf-ui-tabs-module-root",
|
|
207
|
+
tab: "imf-ui-tabs-module-tab"
|
|
208
|
+
}, A = /* @__PURE__ */ e({
|
|
209
|
+
Indicator: () => H,
|
|
210
|
+
List: () => B,
|
|
211
|
+
Panel: () => W,
|
|
212
|
+
PanelViewport: () => U,
|
|
213
|
+
Root: () => z,
|
|
214
|
+
Tab: () => V
|
|
215
|
+
}), j = r(k.list, { variants: { fill: {
|
|
216
|
+
true: k.listFill,
|
|
217
|
+
false: null
|
|
218
|
+
} } }), M = r(k.root), N = r(k.tab), P = r(k.indicator), F = r(k.panelViewport), I = r(k.panel);
|
|
219
|
+
function L(e, t) {
|
|
220
|
+
typeof e == "function" ? e(t) : e && (e.current = t);
|
|
221
|
+
}
|
|
222
|
+
function R(e) {
|
|
223
|
+
let t = new ResizeObserver(() => {
|
|
224
|
+
let t = e.dataset.orientation === "vertical" ? e.scrollHeight > e.clientHeight : e.scrollWidth > e.clientWidth;
|
|
225
|
+
e.toggleAttribute("data-overflowing", t);
|
|
226
|
+
}), n = () => {
|
|
227
|
+
t.disconnect(), t.observe(e);
|
|
228
|
+
for (let n of e.children) t.observe(n);
|
|
229
|
+
}, r = new MutationObserver(n);
|
|
230
|
+
return r.observe(e, { childList: !0 }), n(), () => {
|
|
231
|
+
t.disconnect(), r.disconnect();
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function z(e) {
|
|
235
|
+
return /* @__PURE__ */ i(u.Root, {
|
|
236
|
+
...e,
|
|
237
|
+
"data-imf-ui-component": "Tabs.Root",
|
|
238
|
+
className: (n) => M({ className: t(e.className, n) })
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
z.displayName = "Tabs.Root";
|
|
242
|
+
function B({ fill: e = !1, ref: n, ...r }) {
|
|
243
|
+
let a = o((e) => {
|
|
244
|
+
if (!e) return;
|
|
245
|
+
L(n, e);
|
|
246
|
+
let t = R(e);
|
|
247
|
+
return () => {
|
|
248
|
+
t(), L(n, null);
|
|
249
|
+
};
|
|
250
|
+
}, [n]);
|
|
251
|
+
return /* @__PURE__ */ i(u.List, {
|
|
252
|
+
...r,
|
|
253
|
+
ref: a,
|
|
254
|
+
"data-imf-ui-component": "Tabs.List",
|
|
255
|
+
className: (n) => j({
|
|
256
|
+
fill: e,
|
|
257
|
+
className: t(r.className, n)
|
|
258
|
+
})
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
B.displayName = "Tabs.List";
|
|
262
|
+
function V(e) {
|
|
263
|
+
return /* @__PURE__ */ i(u.Tab, {
|
|
264
|
+
...e,
|
|
265
|
+
"data-imf-ui-component": "Tabs.Tab",
|
|
266
|
+
className: (n) => N({ className: t(e.className, n) })
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
V.displayName = "Tabs.Tab";
|
|
270
|
+
function H(e) {
|
|
271
|
+
return /* @__PURE__ */ i(u.Indicator, {
|
|
272
|
+
...e,
|
|
273
|
+
"data-imf-ui-component": "Tabs.Indicator",
|
|
274
|
+
className: (n) => P({ className: t(e.className, n) })
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
H.displayName = "Tabs.Indicator";
|
|
278
|
+
function U(e) {
|
|
279
|
+
return /* @__PURE__ */ i("div", {
|
|
280
|
+
...e,
|
|
281
|
+
"data-imf-ui-component": "Tabs.PanelViewport",
|
|
282
|
+
className: F({ className: e.className })
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
U.displayName = "Tabs.PanelViewport";
|
|
286
|
+
function W(e) {
|
|
287
|
+
return /* @__PURE__ */ i(u.Panel, {
|
|
288
|
+
...e,
|
|
289
|
+
"data-imf-ui-component": "Tabs.Panel",
|
|
290
|
+
className: (n) => I({ className: t(e.className, n) })
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
W.displayName = "Tabs.Panel";
|
|
294
|
+
//#endregion
|
|
295
|
+
export { z as a, O as c, b as d, h as f, U as i, T as l, f as m, B as n, V as o, g as p, W as r, A as s, H as t, S as u };
|
package/dist/vite.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as e } from "./paths-
|
|
1
|
+
import { n as e } from "./paths-CUyf9wjm.js";
|
|
2
2
|
import { readFileSync as t, readdirSync as n, realpathSync as r } from "node:fs";
|
|
3
3
|
import { dirname as i, join as a, resolve as o, sep as s } from "node:path";
|
|
4
4
|
import { fileURLToPath as c } from "node:url";
|
package/dist/web-ui-cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { n as e, r as t, t as n } from "./paths-
|
|
2
|
+
import { n as e, r as t, t as n } from "./paths-CUyf9wjm.js";
|
|
3
3
|
import { chmodSync as r, cpSync as i, existsSync as a, lstatSync as o, mkdirSync as s, readFileSync as c, readdirSync as l, readlinkSync as u, realpathSync as d, rmSync as f, symlinkSync as p, writeFileSync as m } from "node:fs";
|
|
4
4
|
import { dirname as h, relative as g, resolve as _ } from "node:path";
|
|
5
5
|
import { Command as ee, Option as te } from "commander";
|
|
@@ -55,8 +55,12 @@ With the hooks installed, the agent is pointed at the router at the start of eve
|
|
|
55
55
|
picks it up from the skill's description; invoke it by name when it does not.
|
|
56
56
|
|
|
57
57
|
The router answers library questions from the packaged user guides and hands other tasks to a skill. Setup, audit, and UX
|
|
58
|
-
work from `imf-web-ui-conventions`, a knowledge skill that holds the ImFusion frontend conventions.
|
|
59
|
-
|
|
58
|
+
work from `imf-web-ui-conventions`, a knowledge skill that holds the ImFusion frontend conventions. Every skill
|
|
59
|
+
you run first reads `imf-web-ui-user-profile`. On the first run it asks a few questions about your name, your
|
|
60
|
+
background, your experience, how much explanation you want, and how you like to work, then saves the answers to
|
|
61
|
+
`~/.config/imfusion/web-ui/consumer-profile.md` if you agree. Say "change my profile" to answer again.
|
|
62
|
+
|
|
63
|
+
Solid outlines are the skills you run; dashed boxes are knowledge the agent reads:
|
|
60
64
|
|
|
61
65
|
<ConsumerLlmFrameworkDiagram />
|
|
62
66
|
|
|
@@ -83,7 +87,8 @@ The hooks put the agent on the right skill at the right moment and ask it to ver
|
|
|
83
87
|
## Keeping it current
|
|
84
88
|
|
|
85
89
|
Ask the agent to update the library, for example "Update @imfusion/web-ui". That runs `/imf-web-ui-update`, which installs
|
|
86
|
-
the newer package and refreshes the skills, hook scripts, and registrations to match it.
|
|
90
|
+
the newer package and refreshes the skills, hook scripts, and registrations to match it. It then reports what the new
|
|
91
|
+
releases change for your code and offers `/imf-web-ui-audit full` as a wider check of the project.
|
|
87
92
|
|
|
88
93
|
To do the same by hand, update the package, then run:
|
|
89
94
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imfusion/web-ui",
|
|
3
|
-
"version": "0.8.1-dev.
|
|
3
|
+
"version": "0.8.1-dev.31.g7b15b0d3",
|
|
4
4
|
"description": "The official Web UI component library for ImFusion web apps",
|
|
5
5
|
"author": "ImFusion GmbH",
|
|
6
6
|
"homepage": "https://imfusion.com",
|
|
@@ -91,15 +91,15 @@
|
|
|
91
91
|
"test:stories": "vitest run --project storybook",
|
|
92
92
|
"test:watch": "vitest",
|
|
93
93
|
"skills:eval": "tsx src/llms/evals/runner/run.ts",
|
|
94
|
-
"skills:eval:dev": "WEB_UI_SKILL_EVAL_ROOT=/private/tmp/web-ui-dev-skill-evals WEB_UI_SKILL_EVAL_RESULTS_DIR=.agents/evals/results WEB_UI_SKILL_EVAL_REPORT_PATH=.agents/evals/REPORT.md WEB_UI_SKILL_EVAL_SKILL_FAMILY=web-ui-dev WEB_UI_SKILL_EVAL_WORKSPACE_LABEL='development repository' tsx src/llms/evals/runner/run.ts --scenarios-dir .agents/evals/scenarios --setup .agents/evals/setup-env.sh",
|
|
94
|
+
"skills:eval:dev": "WEB_UI_SKILL_EVAL_SCENARIOS_DIR=.agents/evals/scenarios WEB_UI_SKILL_EVAL_SKILLS_DIR=.agents/skills WEB_UI_SKILL_EVAL_ROOT=/private/tmp/web-ui-dev-skill-evals WEB_UI_SKILL_EVAL_RESULTS_DIR=.agents/evals/results WEB_UI_SKILL_EVAL_REPORT_PATH=.agents/evals/REPORT.md WEB_UI_SKILL_EVAL_SKILL_FAMILY=web-ui-dev WEB_UI_SKILL_EVAL_WORKSPACE_LABEL='development repository' tsx src/llms/evals/runner/run.ts --scenarios-dir .agents/evals/scenarios --setup .agents/evals/setup-env.sh",
|
|
95
95
|
"skills:eval:compare": "tsx src/llms/evals/runner/compare.ts",
|
|
96
96
|
"skills:eval:affected": "tsx src/llms/evals/runner/affected.ts",
|
|
97
97
|
"skills:eval:report": "tsx src/llms/evals/runner/report.ts",
|
|
98
98
|
"git:config": "git config core.hooksPath .githooks && git config pull.rebase true && git config merge.ff only"
|
|
99
99
|
},
|
|
100
100
|
"peerDependencies": {
|
|
101
|
-
"@imfusion/sdk": "
|
|
102
|
-
"@imfusion/sdk-react": "
|
|
101
|
+
"@imfusion/sdk": "*",
|
|
102
|
+
"@imfusion/sdk-react": "*",
|
|
103
103
|
"@tanstack/highlight": "^0.1.0",
|
|
104
104
|
"react": "^19.0.0",
|
|
105
105
|
"react-dom": "^19.0.0"
|
package/src/docgen/doc.gen.json
CHANGED
|
@@ -499,6 +499,19 @@
|
|
|
499
499
|
"description": "Width divided by height, or \"auto\" to use the image's intrinsic ratio."
|
|
500
500
|
}
|
|
501
501
|
]
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
"name": "Card.Status",
|
|
505
|
+
"description": "Card.Status — a tinted slot that marks the card's status with the variant's glyph. Pass\nchildren to replace the glyph. Like `Card.Image`, place it first among the slots: a column\nbeside the body in a horizontal card, a band above it in a vertical one. Decorative\n(`aria-hidden`); the card's text carries the status.",
|
|
506
|
+
"props": [
|
|
507
|
+
{
|
|
508
|
+
"name": "variant",
|
|
509
|
+
"required": false,
|
|
510
|
+
"type": "| \"info\"\n| \"positive\"\n| \"warning\"\n| \"negative\"\n| null",
|
|
511
|
+
"defaultValue": "info",
|
|
512
|
+
"description": ""
|
|
513
|
+
}
|
|
514
|
+
]
|
|
502
515
|
}
|
|
503
516
|
]
|
|
504
517
|
},
|
|
@@ -1963,7 +1976,7 @@
|
|
|
1963
1976
|
},
|
|
1964
1977
|
{
|
|
1965
1978
|
"name": "Field.Error",
|
|
1966
|
-
"description": "Field.Error — an inline validation message shown when its match condition fails.",
|
|
1979
|
+
"description": "Field.Error — an inline validation message shown when its match condition fails.\nIt announces itself with `role=\"alert\"`; pass another `role` to quiet it.",
|
|
1967
1980
|
"props": [
|
|
1968
1981
|
{
|
|
1969
1982
|
"name": "className",
|
|
@@ -5556,7 +5569,7 @@
|
|
|
5556
5569
|
"slider": {
|
|
5557
5570
|
"root": {
|
|
5558
5571
|
"name": "Slider.Root",
|
|
5559
|
-
"description": "Slider.Root — value selector along a continuous or stepped track.",
|
|
5572
|
+
"description": "Slider.Root — value selector along a continuous or stepped track.\n\n`variant=\"position\"` draws a scrollbar-like trough and bar thumb for picking one position\nbetween `min` and `max`, such as a slice or frame; `onValueChange` reports the position.",
|
|
5560
5573
|
"props": [
|
|
5561
5574
|
{
|
|
5562
5575
|
"name": "className",
|
|
@@ -5704,6 +5717,13 @@
|
|
|
5704
5717
|
"type": "number | readonly number[]",
|
|
5705
5718
|
"defaultValue": null,
|
|
5706
5719
|
"description": "The value of the slider.\nFor ranged sliders, provide an array with two values."
|
|
5720
|
+
},
|
|
5721
|
+
{
|
|
5722
|
+
"name": "variant",
|
|
5723
|
+
"required": false,
|
|
5724
|
+
"type": "\"default\" | \"position\" | null",
|
|
5725
|
+
"defaultValue": "default",
|
|
5726
|
+
"description": ""
|
|
5707
5727
|
}
|
|
5708
5728
|
]
|
|
5709
5729
|
},
|
|
@@ -7787,6 +7807,13 @@
|
|
|
7787
7807
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
7788
7808
|
"defaultValue": "support",
|
|
7789
7809
|
"description": ""
|
|
7810
|
+
},
|
|
7811
|
+
{
|
|
7812
|
+
"name": "weight",
|
|
7813
|
+
"required": false,
|
|
7814
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
7815
|
+
"defaultValue": null,
|
|
7816
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
7790
7817
|
}
|
|
7791
7818
|
]
|
|
7792
7819
|
},
|
|
@@ -7814,6 +7841,40 @@
|
|
|
7814
7841
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
7815
7842
|
"defaultValue": "main",
|
|
7816
7843
|
"description": ""
|
|
7844
|
+
},
|
|
7845
|
+
{
|
|
7846
|
+
"name": "weight",
|
|
7847
|
+
"required": false,
|
|
7848
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
7849
|
+
"defaultValue": null,
|
|
7850
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
7851
|
+
}
|
|
7852
|
+
]
|
|
7853
|
+
},
|
|
7854
|
+
{
|
|
7855
|
+
"name": "Typo.Eyebrow",
|
|
7856
|
+
"description": "Typo.Eyebrow — short uppercase label above a heading. Also called a kicker or overline.",
|
|
7857
|
+
"props": [
|
|
7858
|
+
{
|
|
7859
|
+
"name": "ref",
|
|
7860
|
+
"required": false,
|
|
7861
|
+
"type": "Ref<HTMLHeadingElement>",
|
|
7862
|
+
"defaultValue": null,
|
|
7863
|
+
"description": "Allows getting a ref to the component instance.\nOnce the component unmounts, React will set `ref.current` to `null`\n(or call the ref with `null` if you passed a callback ref).\n@see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs}"
|
|
7864
|
+
},
|
|
7865
|
+
{
|
|
7866
|
+
"name": "render",
|
|
7867
|
+
"required": false,
|
|
7868
|
+
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, {}>",
|
|
7869
|
+
"defaultValue": null,
|
|
7870
|
+
"description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render."
|
|
7871
|
+
},
|
|
7872
|
+
{
|
|
7873
|
+
"name": "variant",
|
|
7874
|
+
"required": false,
|
|
7875
|
+
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
7876
|
+
"defaultValue": "support",
|
|
7877
|
+
"description": ""
|
|
7817
7878
|
}
|
|
7818
7879
|
]
|
|
7819
7880
|
},
|
|
@@ -7997,6 +8058,13 @@
|
|
|
7997
8058
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
7998
8059
|
"defaultValue": "oncolor",
|
|
7999
8060
|
"description": ""
|
|
8061
|
+
},
|
|
8062
|
+
{
|
|
8063
|
+
"name": "weight",
|
|
8064
|
+
"required": false,
|
|
8065
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
8066
|
+
"defaultValue": null,
|
|
8067
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
8000
8068
|
}
|
|
8001
8069
|
]
|
|
8002
8070
|
},
|
|
@@ -8058,6 +8126,13 @@
|
|
|
8058
8126
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
8059
8127
|
"defaultValue": "main",
|
|
8060
8128
|
"description": ""
|
|
8129
|
+
},
|
|
8130
|
+
{
|
|
8131
|
+
"name": "weight",
|
|
8132
|
+
"required": false,
|
|
8133
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
8134
|
+
"defaultValue": null,
|
|
8135
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
8061
8136
|
}
|
|
8062
8137
|
]
|
|
8063
8138
|
},
|
|
@@ -8092,6 +8167,13 @@
|
|
|
8092
8167
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
8093
8168
|
"defaultValue": "primary",
|
|
8094
8169
|
"description": ""
|
|
8170
|
+
},
|
|
8171
|
+
{
|
|
8172
|
+
"name": "weight",
|
|
8173
|
+
"required": false,
|
|
8174
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
8175
|
+
"defaultValue": null,
|
|
8176
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
8095
8177
|
}
|
|
8096
8178
|
]
|
|
8097
8179
|
},
|
|
@@ -8119,6 +8201,13 @@
|
|
|
8119
8201
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
8120
8202
|
"defaultValue": "main",
|
|
8121
8203
|
"description": ""
|
|
8204
|
+
},
|
|
8205
|
+
{
|
|
8206
|
+
"name": "weight",
|
|
8207
|
+
"required": false,
|
|
8208
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
8209
|
+
"defaultValue": null,
|
|
8210
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
8122
8211
|
}
|
|
8123
8212
|
]
|
|
8124
8213
|
},
|
|
@@ -8146,6 +8235,13 @@
|
|
|
8146
8235
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
8147
8236
|
"defaultValue": "main",
|
|
8148
8237
|
"description": ""
|
|
8238
|
+
},
|
|
8239
|
+
{
|
|
8240
|
+
"name": "weight",
|
|
8241
|
+
"required": false,
|
|
8242
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
8243
|
+
"defaultValue": null,
|
|
8244
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
8149
8245
|
}
|
|
8150
8246
|
]
|
|
8151
8247
|
},
|
|
@@ -8173,6 +8269,13 @@
|
|
|
8173
8269
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
8174
8270
|
"defaultValue": "minor",
|
|
8175
8271
|
"description": ""
|
|
8272
|
+
},
|
|
8273
|
+
{
|
|
8274
|
+
"name": "weight",
|
|
8275
|
+
"required": false,
|
|
8276
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
8277
|
+
"defaultValue": null,
|
|
8278
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
8176
8279
|
}
|
|
8177
8280
|
]
|
|
8178
8281
|
},
|
|
@@ -8200,6 +8303,13 @@
|
|
|
8200
8303
|
"type": "| \"main\"\n| \"support\"\n| \"minor\"\n| \"brand\"\n| \"primary\"\n| \"negative\"\n| \"positive\"\n| \"warning\"\n| \"info\"\n| \"oncolor\"\n| \"accent-1\"\n| \"accent-2\"\n| \"accent-3\"\n| null",
|
|
8201
8304
|
"defaultValue": "main",
|
|
8202
8305
|
"description": ""
|
|
8306
|
+
},
|
|
8307
|
+
{
|
|
8308
|
+
"name": "weight",
|
|
8309
|
+
"required": false,
|
|
8310
|
+
"type": "\"strong\" | \"regular\" | \"medium\"",
|
|
8311
|
+
"defaultValue": null,
|
|
8312
|
+
"description": "Font weight. Omit to keep the member's default; `medium` firms up short body text on cards."
|
|
8203
8313
|
}
|
|
8204
8314
|
]
|
|
8205
8315
|
}
|
|
@@ -8309,6 +8419,43 @@
|
|
|
8309
8419
|
}
|
|
8310
8420
|
]
|
|
8311
8421
|
},
|
|
8422
|
+
"frame-selection": {
|
|
8423
|
+
"root": {
|
|
8424
|
+
"name": "FrameSelection",
|
|
8425
|
+
"description": "FrameSelection - a position slider bound to the focused frame of the multi-frame image sets in `data`.\nEvery matching image set follows the slider, and a `{focus} | {count}` readout sits beside it.\nRenders nothing when `data` holds no multi-frame image set.\n\nMust render inside an `ImFusionProvider`.",
|
|
8426
|
+
"props": [
|
|
8427
|
+
{
|
|
8428
|
+
"name": "data",
|
|
8429
|
+
"required": true,
|
|
8430
|
+
"type": "HandleArray<Data>",
|
|
8431
|
+
"defaultValue": null,
|
|
8432
|
+
"description": "Datasets to scan, for example from `useVisibleData()`. Non-image data, single-frame image sets, and image sets whose\nframe count differs from the first multi-frame set are ignored."
|
|
8433
|
+
},
|
|
8434
|
+
{
|
|
8435
|
+
"name": "disabled",
|
|
8436
|
+
"required": false,
|
|
8437
|
+
"type": "boolean",
|
|
8438
|
+
"defaultValue": "false",
|
|
8439
|
+
"description": "Whether the slider ignores user interaction."
|
|
8440
|
+
},
|
|
8441
|
+
{
|
|
8442
|
+
"name": "label",
|
|
8443
|
+
"required": false,
|
|
8444
|
+
"type": "string",
|
|
8445
|
+
"defaultValue": "Frame",
|
|
8446
|
+
"description": "Accessible name of the slider thumb."
|
|
8447
|
+
},
|
|
8448
|
+
{
|
|
8449
|
+
"name": "orientation",
|
|
8450
|
+
"required": false,
|
|
8451
|
+
"type": "\"horizontal\" | \"vertical\"",
|
|
8452
|
+
"defaultValue": "horizontal",
|
|
8453
|
+
"description": "Direction of the slider; the vertical layout stacks the readout under it."
|
|
8454
|
+
}
|
|
8455
|
+
]
|
|
8456
|
+
},
|
|
8457
|
+
"subComponents": []
|
|
8458
|
+
},
|
|
8312
8459
|
"image-display-options": {
|
|
8313
8460
|
"root": {
|
|
8314
8461
|
"name": "ImageDisplayOptions",
|
package/src/llms/llms.gen.txt
CHANGED
|
@@ -38,7 +38,7 @@ Persistent, in-place status message for information, success, warnings, and erro
|
|
|
38
38
|
|
|
39
39
|
## Card
|
|
40
40
|
- category: Layout, status: stable
|
|
41
|
-
Surface container for related content on a tonal background. Also called a panel or tile; compose it from optional image, header, content, and footer parts.
|
|
41
|
+
Surface container for related content on a tonal background. Also called a panel or tile; compose it from optional image, status, header, content, and footer parts.
|
|
42
42
|
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .card (jq: jq '.card' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
43
43
|
|
|
44
44
|
## Checkbox
|
|
@@ -96,6 +96,12 @@ Semantic group for related form controls with a shared legend. Also called a for
|
|
|
96
96
|
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .fieldset (jq: jq '.fieldset' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
97
97
|
- further reading (usage/anatomy, not props): https://base-ui.com/react/components/fieldset.md
|
|
98
98
|
|
|
99
|
+
## FrameSelection
|
|
100
|
+
- category: Inputs, status: experimental
|
|
101
|
+
Frame or slice picker bound to the focused frame of ImFusion image sets, with a focus and count readout. For a position picker not tied to the SDK, use Slider with variant="position".
|
|
102
|
+
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .frame-selection (jq: jq '.frame-selection' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
103
|
+
- further reading (usage/anatomy, not props): https://docs.imfusion.com/
|
|
104
|
+
|
|
99
105
|
## Icon
|
|
100
106
|
- category: Display, status: stable
|
|
101
107
|
Renders a Web UI icon with an optional semantic foreground color. The default inherits the surrounding currentColor.
|
|
@@ -160,7 +166,7 @@ Line that divides content horizontally or vertically. Also called a divider or r
|
|
|
160
166
|
|
|
161
167
|
## Slider
|
|
162
168
|
- category: Inputs, status: stable
|
|
163
|
-
Numeric input for choosing one value or a range by dragging a thumb. Also called a range input; use it when relative magnitude matters.
|
|
169
|
+
Numeric input for choosing one value or a range by dragging a thumb. Also called a range input; use it when relative magnitude matters. The position variant is a scrubber for picking one slice or frame.
|
|
164
170
|
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .slider (jq: jq '.slider' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
165
171
|
- further reading (usage/anatomy, not props): https://base-ui.com/react/components/slider.md
|
|
166
172
|
|
|
@@ -11,6 +11,8 @@ description:
|
|
|
11
11
|
Start here for UI work and library questions in a project that uses `@imfusion/web-ui`. This skill is a map, not a second
|
|
12
12
|
copy of every convention.
|
|
13
13
|
|
|
14
|
+
Invoke `imf-web-ui-user-profile` first and explain at its levels throughout.
|
|
15
|
+
|
|
14
16
|
## 1. Decide whether guidance is needed
|
|
15
17
|
|
|
16
18
|
Skip a companion when the task is explicit and small, an existing local pattern already solves it in the file being changed,
|