@imfusion/web-ui 0.8.1-dev.1.g11d9ffbe → 0.8.1-dev.18.g2355b181
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 +49 -1
- package/README.md +17 -17
- package/dist/components/account-card/account-card.d.ts +42 -12
- 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 +5 -0
- package/dist/index.js +1298 -1221
- 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/break-hints.d.ts +3 -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 +1 -1
- package/src/docgen/doc.gen.json +125 -20
- package/src/llms/llms.gen.txt +9 -3
- 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/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/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
package/src/docgen/doc.gen.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"account-card": {
|
|
3
3
|
"root": {
|
|
4
4
|
"name": "AccountCard.Root",
|
|
5
|
-
"description": "AccountCard.Root — the
|
|
5
|
+
"description": "AccountCard.Root — the signed-in person's card: `AccountCard.Link` and, in its top row, `AccountCard.Action`. The\naction sits beside the link, not inside it, since a link cannot contain a button.",
|
|
6
6
|
"props": [
|
|
7
7
|
{
|
|
8
8
|
"name": "context",
|
|
@@ -10,27 +10,13 @@
|
|
|
10
10
|
"type": "\"default\" | \"oncolor\" | null",
|
|
11
11
|
"defaultValue": "default",
|
|
12
12
|
"description": ""
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"name": "ref",
|
|
16
|
-
"required": false,
|
|
17
|
-
"type": "Ref<HTMLAnchorElement>",
|
|
18
|
-
"defaultValue": null,
|
|
19
|
-
"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}"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"name": "render",
|
|
23
|
-
"required": false,
|
|
24
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, {}>",
|
|
25
|
-
"defaultValue": null,
|
|
26
|
-
"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."
|
|
27
13
|
}
|
|
28
14
|
]
|
|
29
15
|
},
|
|
30
16
|
"subComponents": [
|
|
31
17
|
{
|
|
32
18
|
"name": "AccountCard.Action",
|
|
33
|
-
"description": "AccountCard.Action — a
|
|
19
|
+
"description": "AccountCard.Action — a slot in the card's top row, beside the link, such as a ghost icon `Button` that logs out. The\nbutton carries its own `aria-label` and its own `context`.",
|
|
34
20
|
"props": []
|
|
35
21
|
},
|
|
36
22
|
{
|
|
@@ -55,12 +41,47 @@
|
|
|
55
41
|
},
|
|
56
42
|
{
|
|
57
43
|
"name": "AccountCard.Description",
|
|
58
|
-
"description": "AccountCard.Description —
|
|
44
|
+
"description": "AccountCard.Description — the organization, under a rule at the foot of the card.",
|
|
45
|
+
"props": []
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "AccountCard.Group",
|
|
49
|
+
"description": "AccountCard.Group — a list of cards, such as accounts to switch between. Inside it a link with `aria-current=\"page\"`\nshows as current; a standalone card is always the signed-in account and shows no current state.",
|
|
50
|
+
"props": []
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "AccountCard.Link",
|
|
54
|
+
"description": "AccountCard.Link — the link to the account, holding `AccountCard.Avatar`, `AccountCard.Title`,\n`AccountCard.Subtitle`, `AccountCard.Description`, and `AccountCard.Role`. Pass a router link through `render`. Its\naccessible name is its text; the avatar stays decorative.",
|
|
55
|
+
"props": [
|
|
56
|
+
{
|
|
57
|
+
"name": "ref",
|
|
58
|
+
"required": false,
|
|
59
|
+
"type": "Ref<HTMLAnchorElement>",
|
|
60
|
+
"defaultValue": null,
|
|
61
|
+
"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}"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "render",
|
|
65
|
+
"required": false,
|
|
66
|
+
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, {}>",
|
|
67
|
+
"defaultValue": null,
|
|
68
|
+
"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."
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "AccountCard.Role",
|
|
74
|
+
"description": "AccountCard.Role — a mono uppercase label beside the description, such as the person's role.",
|
|
75
|
+
"props": []
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "AccountCard.Subtitle",
|
|
79
|
+
"description": "AccountCard.Subtitle — the quiet line under the title: the email's domain, or the whole email once the title is a\nname. Text wraps before an `@` and after a dot.",
|
|
59
80
|
"props": []
|
|
60
81
|
},
|
|
61
82
|
{
|
|
62
83
|
"name": "AccountCard.Title",
|
|
63
|
-
"description": "AccountCard.Title — the account's name, or
|
|
84
|
+
"description": "AccountCard.Title — the account's name, or the email's local part until a name exists. Set large; text wraps before\nan `@` and after a dot.",
|
|
64
85
|
"props": []
|
|
65
86
|
}
|
|
66
87
|
]
|
|
@@ -478,6 +499,19 @@
|
|
|
478
499
|
"description": "Width divided by height, or \"auto\" to use the image's intrinsic ratio."
|
|
479
500
|
}
|
|
480
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
|
+
]
|
|
481
515
|
}
|
|
482
516
|
]
|
|
483
517
|
},
|
|
@@ -1942,7 +1976,7 @@
|
|
|
1942
1976
|
},
|
|
1943
1977
|
{
|
|
1944
1978
|
"name": "Field.Error",
|
|
1945
|
-
"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.",
|
|
1946
1980
|
"props": [
|
|
1947
1981
|
{
|
|
1948
1982
|
"name": "className",
|
|
@@ -5535,7 +5569,7 @@
|
|
|
5535
5569
|
"slider": {
|
|
5536
5570
|
"root": {
|
|
5537
5571
|
"name": "Slider.Root",
|
|
5538
|
-
"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.",
|
|
5539
5573
|
"props": [
|
|
5540
5574
|
{
|
|
5541
5575
|
"name": "className",
|
|
@@ -5683,6 +5717,13 @@
|
|
|
5683
5717
|
"type": "number | readonly number[]",
|
|
5684
5718
|
"defaultValue": null,
|
|
5685
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": ""
|
|
5686
5727
|
}
|
|
5687
5728
|
]
|
|
5688
5729
|
},
|
|
@@ -7796,6 +7837,33 @@
|
|
|
7796
7837
|
}
|
|
7797
7838
|
]
|
|
7798
7839
|
},
|
|
7840
|
+
{
|
|
7841
|
+
"name": "Typo.Eyebrow",
|
|
7842
|
+
"description": "Typo.Eyebrow — short uppercase label above a heading. Also called a kicker or overline.",
|
|
7843
|
+
"props": [
|
|
7844
|
+
{
|
|
7845
|
+
"name": "ref",
|
|
7846
|
+
"required": false,
|
|
7847
|
+
"type": "Ref<HTMLHeadingElement>",
|
|
7848
|
+
"defaultValue": null,
|
|
7849
|
+
"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}"
|
|
7850
|
+
},
|
|
7851
|
+
{
|
|
7852
|
+
"name": "render",
|
|
7853
|
+
"required": false,
|
|
7854
|
+
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, {}>",
|
|
7855
|
+
"defaultValue": null,
|
|
7856
|
+
"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."
|
|
7857
|
+
},
|
|
7858
|
+
{
|
|
7859
|
+
"name": "variant",
|
|
7860
|
+
"required": false,
|
|
7861
|
+
"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",
|
|
7862
|
+
"defaultValue": "support",
|
|
7863
|
+
"description": ""
|
|
7864
|
+
}
|
|
7865
|
+
]
|
|
7866
|
+
},
|
|
7799
7867
|
{
|
|
7800
7868
|
"name": "Typo.H1",
|
|
7801
7869
|
"description": "Typo.H1 — top-level page heading.",
|
|
@@ -8288,6 +8356,43 @@
|
|
|
8288
8356
|
}
|
|
8289
8357
|
]
|
|
8290
8358
|
},
|
|
8359
|
+
"frame-selection": {
|
|
8360
|
+
"root": {
|
|
8361
|
+
"name": "FrameSelection",
|
|
8362
|
+
"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`.",
|
|
8363
|
+
"props": [
|
|
8364
|
+
{
|
|
8365
|
+
"name": "data",
|
|
8366
|
+
"required": true,
|
|
8367
|
+
"type": "HandleArray<Data>",
|
|
8368
|
+
"defaultValue": null,
|
|
8369
|
+
"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."
|
|
8370
|
+
},
|
|
8371
|
+
{
|
|
8372
|
+
"name": "disabled",
|
|
8373
|
+
"required": false,
|
|
8374
|
+
"type": "boolean",
|
|
8375
|
+
"defaultValue": "false",
|
|
8376
|
+
"description": "Whether the slider ignores user interaction."
|
|
8377
|
+
},
|
|
8378
|
+
{
|
|
8379
|
+
"name": "label",
|
|
8380
|
+
"required": false,
|
|
8381
|
+
"type": "string",
|
|
8382
|
+
"defaultValue": "Frame",
|
|
8383
|
+
"description": "Accessible name of the slider thumb."
|
|
8384
|
+
},
|
|
8385
|
+
{
|
|
8386
|
+
"name": "orientation",
|
|
8387
|
+
"required": false,
|
|
8388
|
+
"type": "\"horizontal\" | \"vertical\"",
|
|
8389
|
+
"defaultValue": "horizontal",
|
|
8390
|
+
"description": "Direction of the slider; the vertical layout stacks the readout under it."
|
|
8391
|
+
}
|
|
8392
|
+
]
|
|
8393
|
+
},
|
|
8394
|
+
"subComponents": []
|
|
8395
|
+
},
|
|
8291
8396
|
"image-display-options": {
|
|
8292
8397
|
"root": {
|
|
8293
8398
|
"name": "ImageDisplayOptions",
|
package/src/llms/llms.gen.txt
CHANGED
|
@@ -11,7 +11,7 @@ props, which always live in the docgen file above.
|
|
|
11
11
|
|
|
12
12
|
## AccountCard
|
|
13
13
|
- category: Display, status: experimental
|
|
14
|
-
|
|
14
|
+
Card linking to the signed-in person's account: avatar, a large name or email, a quiet line under it, and organization and role at its foot, with a trailing action such as Log out. Also called an ID card or user row; for a bare person badge, use Avatar.
|
|
15
15
|
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .account-card (jq: jq '.account-card' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
16
16
|
|
|
17
17
|
## AppShell
|
|
@@ -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,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: imf-web-ui-audit
|
|
3
3
|
description:
|
|
4
|
-
"Audit an existing ImFusion frontend against the @imfusion/web-ui conventions without changing files. Use this for
|
|
5
|
-
project health check, a pre-setup review, or one named topic. Report broken and missing pieces, working deviations,
|
|
4
|
+
"Audit an existing ImFusion frontend against the @imfusion/web-ui conventions without changing project files. Use this for
|
|
5
|
+
a project health check, a pre-setup review, or one named topic. Report broken and missing pieces, working deviations,
|
|
6
6
|
evidence, and an ordered plan."
|
|
7
7
|
argument-hint: "[full|<topic>]"
|
|
8
|
-
allowed-tools: Read Glob Grep
|
|
8
|
+
allowed-tools: Read Glob Grep Skill
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Audit a consumer project
|
|
@@ -21,6 +21,8 @@ it low, and do not let it crowd the sections a consumer has to act on.
|
|
|
21
21
|
|
|
22
22
|
## Workflow
|
|
23
23
|
|
|
24
|
+
Invoke `imf-web-ui-user-profile` first and explain at its levels throughout.
|
|
25
|
+
|
|
24
26
|
1. Resolve the argument. Bare means `full`; an unknown topic is an error, not a reason to widen the scope.
|
|
25
27
|
2. Enter plan mode unless this audit is being called as verification by another skill or the host has no plan mode.
|
|
26
28
|
3. Read the report template and existing reviewer notes, then dispatch one investigator per in-scope topic. Tell each
|
|
@@ -4,13 +4,15 @@ description:
|
|
|
4
4
|
"Look up @imfusion/web-ui component APIs, compound parts, defaults, and icon glyphs without reading source. Use this
|
|
5
5
|
whenever a consumer task names a Web UI component or icon and you need to choose a prop, part, default, or glyph. Do not
|
|
6
6
|
use it to choose between components or bootstrap a project."
|
|
7
|
-
allowed-tools: Bash
|
|
7
|
+
allowed-tools: Bash Skill
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Look up components
|
|
11
11
|
|
|
12
12
|
Use the generated package indexes. They are smaller and more reliable than reading the library source.
|
|
13
13
|
|
|
14
|
+
Invoke `imf-web-ui-user-profile` first and explain at its levels throughout.
|
|
15
|
+
|
|
14
16
|
## Component lookup
|
|
15
17
|
|
|
16
18
|
1. Read the identity index first, even when you already know the component's name: it gives the docgen key and the status.
|