@imfusion/web-ui 0.8.1-dev.2.g74f81c31 → 0.8.1-dev.20.g50b02289

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/README.md +17 -17
  3. package/dist/components/account-card/account-card.d.ts +42 -12
  4. package/dist/components/card/card.d.ts +15 -1
  5. package/dist/components/field/field.d.ts +5 -2
  6. package/dist/components/slider/slider.d.ts +11 -1
  7. package/dist/components/typo/typo.d.ts +20 -11
  8. package/dist/index.js +1256 -1172
  9. package/dist/integrations/frame-selection/frame-selection-view.d.ts +24 -0
  10. package/dist/integrations/frame-selection/frame-selection.d.ts +21 -0
  11. package/dist/integrations/frame-selection/frame-selection.meta.d.ts +2 -0
  12. package/dist/integrations/frame-selection/index.d.ts +2 -0
  13. package/dist/integrations/frame-selection.js +121 -0
  14. package/dist/integrations/image-display-options.js +71 -70
  15. package/dist/llms/evals/runner/config.d.ts +1 -0
  16. package/dist/separator-BAxxttef.js +26 -0
  17. package/dist/slider-gyIYWSy3.js +116 -0
  18. package/dist/style.css +1 -1
  19. package/dist/tabs-9d4oaDwZ.js +295 -0
  20. package/dist/utils/break-hints.d.ts +3 -0
  21. package/dist/utils/status-glyphs.d.ts +4 -0
  22. package/dist/vite.js +1 -1
  23. package/dist/web-ui-cli.js +1 -1
  24. package/docs/user-guide/AgentTooling.mdx +8 -3
  25. package/package.json +1 -1
  26. package/src/docgen/doc.gen.json +188 -20
  27. package/src/llms/llms.gen.txt +9 -3
  28. package/src/llms/skills/imf-web-ui/SKILL.md +2 -0
  29. package/src/llms/skills/imf-web-ui-audit/SKILL.md +5 -3
  30. package/src/llms/skills/imf-web-ui-components/SKILL.md +3 -1
  31. package/src/llms/skills/imf-web-ui-conventions/templates/AUDIT_CHECKLIST.md +1 -0
  32. package/src/llms/skills/imf-web-ui-conventions/topics/authentication.md +2 -1
  33. package/src/llms/skills/imf-web-ui-conventions/topics/data.md +5 -3
  34. package/src/llms/skills/imf-web-ui-conventions/topics/typescript.md +14 -0
  35. package/src/llms/skills/imf-web-ui-setup/SKILL.md +2 -0
  36. package/src/llms/skills/imf-web-ui-update/SKILL.md +37 -6
  37. package/src/llms/skills/imf-web-ui-user-profile/SKILL.md +95 -0
  38. package/src/llms/skills/imf-web-ui-ux/SKILL.md +2 -0
  39. package/dist/tabs-BS6rqrrA.js +0 -398
  40. /package/dist/{paths-Oi0v8x-w.js → paths-CUyf9wjm.js} +0 -0
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: imf-web-ui-user-profile
3
+ description:
4
+ "Read or create the person's profile: technical background, experience, how they want things explained, and how they like
5
+ to work. Invoke it first in every Web UI skill, and when the person asks to change their profile or how the agent explains
6
+ or paces work."
7
+ user-invocable: false
8
+ allowed-tools: Bash Read Write
9
+ ---
10
+
11
+ # Fit the work to the person
12
+
13
+ The profile records who the person is and how they learn, so every Web UI workflow explains what they need and paces the work
14
+ the way they like. Read it once per session; later skills in the same session reuse what is already loaded.
15
+
16
+ ## Read the profile
17
+
18
+ Resolve the profile path with the shell, then read that exact path:
19
+
20
+ ```sh
21
+ printf '%s\n' "${XDG_CONFIG_HOME:-$HOME/.config}/imfusion/web-ui/consumer-profile.md"
22
+ ```
23
+
24
+ The profile sits outside the project: it belongs to the person, never to the repository, so read-only promises such as the
25
+ audit's still hold when this skill writes it.
26
+
27
+ When the file exists, apply it and return to the calling workflow without comment. When it is missing, run the interview
28
+ before the workflow starts. When the router skips companions for a small task, do the task first and offer the interview
29
+ afterwards.
30
+
31
+ ## Interview
32
+
33
+ Open with one question: may you ask six short questions and save the answers to the profile path, so every later workflow
34
+ fits them and they are never asked again? Mention that they can decline any single question. On no, use the defaults below
35
+ for this session and do not offer the interview again in it.
36
+
37
+ On yes, ask one question per message, in plain prose, and wait for each answer:
38
+
39
+ 1. What is your name?
40
+ 2. What is your technical background: the languages and tools you work with?
41
+ 3. How much have you built for the web, for example with React, HTML, and CSS?
42
+ 4. Beyond Git, how comfortable are you with npm and the terminal?
43
+ 5. How much explanation do you want: just the results, a short gloss for new terms, or the reasoning behind each step?
44
+ 6. How do you like to work: pause after every step, pause after each finished piece, or work freely and stop only before a
45
+ commit?
46
+
47
+ Derive the levels from the answers; ask a short follow-up only when an answer fits no level. The person can decline any
48
+ question: its field stays out of the file, and its default applies: `some`, `comfortable`, `terms`, `slice`.
49
+
50
+ ## The file
51
+
52
+ Show the profile below before writing it. The person can correct or remove any line, or reject the whole profile; on a
53
+ rejection, save nothing and use the defaults for this session. After they confirm, write it and name its path so they can
54
+ edit or delete it later:
55
+
56
+ ```markdown
57
+ ---
58
+ name: <their name>
59
+ frontend: none | some | seasoned
60
+ tooling: new | comfortable
61
+ explanation: results | terms | reasoning
62
+ pace: step | slice | commit
63
+ ---
64
+
65
+ ## Background
66
+
67
+ <their answer to question 2, in their words>
68
+
69
+ ## Notes
70
+
71
+ - <lasting preferences learned later>
72
+ ```
73
+
74
+ When the write fails, keep the answers for this session. When the person later states a lasting preference about how to work
75
+ with them, such as a language, a term they want avoided, or a tool they already know, add it under `Notes` and tell them.
76
+ When they ask to change their profile, run the interview again with the current answers as defaults.
77
+
78
+ ## Apply the profile
79
+
80
+ The fields apply independently.
81
+
82
+ - **Name**: address the person by name.
83
+ - **Background**: explain by analogy to what they already know, such as a component compared to a class for a Java developer.
84
+ - **Frontend `none` or `some`**: give a one-line gloss the first time a frontend term appears, such as component, prop,
85
+ design token, CSS layer, or Storybook. For `none`, also say what a finding means for the running app.
86
+ - **Tooling `new`**: gloss tooling terms on first use, such as lockfile, dist-tag, prerelease, hook, harness, or the
87
+ `AGENTS.md` fence; say in one plain sentence what each command does before it runs, read-only checks included; and before
88
+ an approval question, say what yes changes and how to undo it.
89
+ - **Explanation**: `results` adds nothing beyond what the experience levels call for; `terms` glosses every new term;
90
+ `reasoning` also says why each step happens, and after a report block, what happened and what comes next.
91
+ - **Pace**: `step` ends the reply after each step or phase of the calling workflow and waits for a go-ahead; `slice` pauses
92
+ after each working piece; `commit` runs freely between the workflow's own approval points.
93
+
94
+ Pace adds pauses on top of the calling workflow's approval gates and keeps every one of them. Put explanations around report
95
+ blocks and approval questions, never inside them.
@@ -10,6 +10,8 @@ description:
10
10
  Use this skill for screen-level decisions. Verify component APIs with `imf-web-ui-components`; put code and styling rules in
11
11
  `imf-web-ui-conventions`.
12
12
 
13
+ Invoke `imf-web-ui-user-profile` first and explain at its levels throughout.
14
+
13
15
  The identity index marks components as stable or experimental. Experimental components are usable, but prefer wrapping one
14
16
  when it is used across many call sites so API movement stays local.
15
17
 
@@ -1,398 +0,0 @@
1
- import { t as e } from "./chunk-DmhlhrBa.js";
2
- import { cva as t } from "class-variance-authority";
3
- import { jsx as n } from "react/jsx-runtime";
4
- import { Children as r, useCallback as i } from "react";
5
- import { Slider as a } from "@base-ui/react/slider";
6
- import { Switch as o } from "@base-ui/react/switch";
7
- import { Toggle as s } from "@base-ui/react/toggle";
8
- import { ToggleGroup as c } from "@base-ui/react/toggle-group";
9
- import { Tabs as l } from "@base-ui/react/tabs";
10
- //#region src/utils/resolve-state-props.ts
11
- function u(e, t) {
12
- return e instanceof Function ? e(t) : e;
13
- }
14
- function d(e, t) {
15
- return u(e, t);
16
- }
17
- function f(e, t) {
18
- return u(e, t);
19
- }
20
- var p = {
21
- control: "imf-ui-slider-module-control",
22
- indicator: "imf-ui-slider-module-indicator",
23
- label: "imf-ui-slider-module-label",
24
- root: "imf-ui-slider-module-root",
25
- thumb: "imf-ui-slider-module-thumb",
26
- track: "imf-ui-slider-module-track",
27
- value: "imf-ui-slider-module-value"
28
- }, m = /* @__PURE__ */ e({
29
- Control: () => w,
30
- Indicator: () => E,
31
- Label: () => S,
32
- Root: () => x,
33
- Thumb: () => D,
34
- Track: () => T,
35
- Value: () => C
36
- }), ee = t(p.root), h = t(p.label), g = t(p.value), _ = t(p.control), v = t(p.track), y = t(p.indicator), b = t(p.thumb);
37
- function x({ value: e, defaultValue: t, onValueChange: r, onValueCommitted: i, min: o = 0, max: s = 100, step: c = 1, largeStep: l = 10, minStepsBetweenValues: u = 0, disabled: f = !1, orientation: p = "horizontal", name: m, form: h, locale: g, thumbAlignment: _ = "edge", thumbCollisionBehavior: v = "push", format: y, ...b }) {
38
- return /* @__PURE__ */ n(a.Root, {
39
- ...b,
40
- "data-imf-ui-component": "Slider.Root",
41
- "data-orientation": p,
42
- className: (e) => ee({ className: d(b.className, e) }),
43
- value: e,
44
- defaultValue: t,
45
- onValueChange: r,
46
- onValueCommitted: i,
47
- min: o,
48
- max: s,
49
- step: c,
50
- largeStep: l,
51
- minStepsBetweenValues: u,
52
- disabled: f,
53
- orientation: p,
54
- name: m,
55
- form: h,
56
- locale: g,
57
- thumbAlignment: _,
58
- thumbCollisionBehavior: v,
59
- format: y
60
- });
61
- }
62
- x.displayName = "Slider.Root";
63
- function S(e) {
64
- return /* @__PURE__ */ n(a.Label, {
65
- ...e,
66
- "data-imf-ui-component": "Slider.Label",
67
- className: (t) => h({ className: d(e.className, t) })
68
- });
69
- }
70
- S.displayName = "Slider.Label";
71
- function C({ children: e, ...t }) {
72
- return /* @__PURE__ */ n(a.Value, {
73
- ...t,
74
- "data-imf-ui-component": "Slider.Value",
75
- className: (e) => g({ className: d(t.className, e) }),
76
- children: e
77
- });
78
- }
79
- C.displayName = "Slider.Value";
80
- function w(e) {
81
- return /* @__PURE__ */ n(a.Control, {
82
- ...e,
83
- "data-imf-ui-component": "Slider.Control",
84
- className: (t) => _({ className: d(e.className, t) })
85
- });
86
- }
87
- w.displayName = "Slider.Control";
88
- function T(e) {
89
- return /* @__PURE__ */ n(a.Track, {
90
- ...e,
91
- "data-imf-ui-component": "Slider.Track",
92
- className: (t) => v({ className: d(e.className, t) })
93
- });
94
- }
95
- T.displayName = "Slider.Track";
96
- function E(e) {
97
- return /* @__PURE__ */ n(a.Indicator, {
98
- ...e,
99
- "data-imf-ui-component": "Slider.Indicator",
100
- className: (t) => y({ className: d(e.className, t) })
101
- });
102
- }
103
- E.displayName = "Slider.Indicator";
104
- function D({ index: e, ...t }) {
105
- return /* @__PURE__ */ n(a.Thumb, {
106
- ...t,
107
- "data-imf-ui-component": "Slider.Thumb",
108
- className: (e) => b({ className: d(t.className, e) }),
109
- index: e
110
- });
111
- }
112
- D.displayName = "Slider.Thumb";
113
- var O = {
114
- root: "imf-ui-switch-module-root",
115
- thumb: "imf-ui-switch-module-thumb"
116
- }, te = /* @__PURE__ */ e({
117
- Root: () => A,
118
- Thumb: () => j
119
- }), ne = t(O.root), k = t(O.thumb);
120
- function A(e) {
121
- return /* @__PURE__ */ n(o.Root, {
122
- ...e,
123
- "data-imf-ui-component": "Switch.Root",
124
- className: (t) => ne({ className: d(e.className, t) })
125
- });
126
- }
127
- A.displayName = "Switch.Root";
128
- function j(e) {
129
- return /* @__PURE__ */ n(o.Thumb, {
130
- ...e,
131
- "data-imf-ui-component": "Switch.Thumb",
132
- className: (t) => k({ className: d(e.className, t) })
133
- });
134
- }
135
- j.displayName = "Switch.Thumb";
136
- //#endregion
137
- //#region src/components/toggle/toggle.tsx
138
- var M = t({ root: "imf-ui-toggle-module-root" }.root), N = 2;
139
- function P(e) {
140
- let t = 0;
141
- return r.forEach(e, (e) => {
142
- typeof e == "string" || typeof e == "number" ? t += String(e).trim().length : e != null && typeof e != "boolean" && (t += N);
143
- }), t;
144
- }
145
- function F({ style: e, children: t, ...r }) {
146
- let i = {
147
- "--glyph-count": P(t),
148
- "--max-glyphs": N
149
- };
150
- return /* @__PURE__ */ n(s, {
151
- ...r,
152
- "data-imf-ui-component": "Toggle",
153
- style: (t) => ({
154
- ...i,
155
- ...f(e, t)
156
- }),
157
- className: (e) => M({ className: d(r.className, e) }),
158
- children: t
159
- });
160
- }
161
- //#endregion
162
- //#region src/components/toggle-group/toggle-group.tsx
163
- var I = t({ root: "imf-ui-toggle-group-module-root" }.root);
164
- function L(e) {
165
- return /* @__PURE__ */ n(c, {
166
- ...e,
167
- "data-imf-ui-component": "ToggleGroup",
168
- className: (t) => I({ className: d(e.className, t) })
169
- });
170
- }
171
- var R = {
172
- alignCenter: "imf-ui-row-module-alignCenter",
173
- alignEnd: "imf-ui-row-module-alignEnd",
174
- alignStart: "imf-ui-row-module-alignStart",
175
- alignStretch: "imf-ui-row-module-alignStretch",
176
- gap1: "imf-ui-row-module-gap1",
177
- gap10: "imf-ui-row-module-gap10",
178
- gap2: "imf-ui-row-module-gap2",
179
- gap3: "imf-ui-row-module-gap3",
180
- gap4: "imf-ui-row-module-gap4",
181
- gap5: "imf-ui-row-module-gap5",
182
- gap6: "imf-ui-row-module-gap6",
183
- gap7: "imf-ui-row-module-gap7",
184
- gap8: "imf-ui-row-module-gap8",
185
- gap9: "imf-ui-row-module-gap9",
186
- justifyAround: "imf-ui-row-module-justifyAround",
187
- justifyBetween: "imf-ui-row-module-justifyBetween",
188
- justifyCenter: "imf-ui-row-module-justifyCenter",
189
- justifyEnd: "imf-ui-row-module-justifyEnd",
190
- justifyEvenly: "imf-ui-row-module-justifyEvenly",
191
- justifyStart: "imf-ui-row-module-justifyStart",
192
- root: "imf-ui-row-module-root",
193
- wrap: "imf-ui-row-module-wrap"
194
- }, z = t(R.root, { variants: {
195
- gap: {
196
- 1: R.gap1,
197
- 2: R.gap2,
198
- 3: R.gap3,
199
- 4: R.gap4,
200
- 5: R.gap5,
201
- 6: R.gap6,
202
- 7: R.gap7,
203
- 8: R.gap8,
204
- 9: R.gap9,
205
- 10: R.gap10
206
- },
207
- align: {
208
- start: R.alignStart,
209
- center: R.alignCenter,
210
- end: R.alignEnd,
211
- stretch: R.alignStretch
212
- },
213
- justify: {
214
- start: R.justifyStart,
215
- center: R.justifyCenter,
216
- end: R.justifyEnd,
217
- between: R.justifyBetween,
218
- around: R.justifyAround,
219
- evenly: R.justifyEvenly
220
- },
221
- wrap: {
222
- true: R.wrap,
223
- false: null
224
- }
225
- } });
226
- function B({ gap: e = "2", align: t = "stretch", justify: r = "start", wrap: i = !1, ...a }) {
227
- return /* @__PURE__ */ n("div", {
228
- ...a,
229
- "data-imf-ui-component": "Row",
230
- className: z({
231
- gap: e,
232
- align: t,
233
- justify: r,
234
- wrap: i,
235
- className: a.className
236
- })
237
- });
238
- }
239
- var V = {
240
- alignCenter: "imf-ui-stack-module-alignCenter",
241
- alignEnd: "imf-ui-stack-module-alignEnd",
242
- alignStart: "imf-ui-stack-module-alignStart",
243
- alignStretch: "imf-ui-stack-module-alignStretch",
244
- gap0: "imf-ui-stack-module-gap0",
245
- gap1: "imf-ui-stack-module-gap1",
246
- gap10: "imf-ui-stack-module-gap10",
247
- gap2: "imf-ui-stack-module-gap2",
248
- gap3: "imf-ui-stack-module-gap3",
249
- gap4: "imf-ui-stack-module-gap4",
250
- gap5: "imf-ui-stack-module-gap5",
251
- gap6: "imf-ui-stack-module-gap6",
252
- gap7: "imf-ui-stack-module-gap7",
253
- gap8: "imf-ui-stack-module-gap8",
254
- gap9: "imf-ui-stack-module-gap9",
255
- justifyAround: "imf-ui-stack-module-justifyAround",
256
- justifyBetween: "imf-ui-stack-module-justifyBetween",
257
- justifyCenter: "imf-ui-stack-module-justifyCenter",
258
- justifyEnd: "imf-ui-stack-module-justifyEnd",
259
- justifyEvenly: "imf-ui-stack-module-justifyEvenly",
260
- justifyStart: "imf-ui-stack-module-justifyStart",
261
- root: "imf-ui-stack-module-root"
262
- }, H = t(V.root, { variants: {
263
- gap: {
264
- 0: V.gap0,
265
- 1: V.gap1,
266
- 2: V.gap2,
267
- 3: V.gap3,
268
- 4: V.gap4,
269
- 5: V.gap5,
270
- 6: V.gap6,
271
- 7: V.gap7,
272
- 8: V.gap8,
273
- 9: V.gap9,
274
- 10: V.gap10
275
- },
276
- align: {
277
- start: V.alignStart,
278
- center: V.alignCenter,
279
- end: V.alignEnd,
280
- stretch: V.alignStretch
281
- },
282
- justify: {
283
- start: V.justifyStart,
284
- center: V.justifyCenter,
285
- end: V.justifyEnd,
286
- between: V.justifyBetween,
287
- around: V.justifyAround,
288
- evenly: V.justifyEvenly
289
- }
290
- } });
291
- function U({ gap: e = "4", align: t = "stretch", justify: r = "start", ...i }) {
292
- return /* @__PURE__ */ n("div", {
293
- ...i,
294
- "data-imf-ui-component": "Stack",
295
- className: H({
296
- gap: e,
297
- align: t,
298
- justify: r,
299
- className: i.className
300
- })
301
- });
302
- }
303
- var W = {
304
- indicator: "imf-ui-tabs-module-indicator",
305
- list: "imf-ui-tabs-module-list",
306
- listFill: "imf-ui-tabs-module-listFill",
307
- panel: "imf-ui-tabs-module-panel",
308
- panelViewport: "imf-ui-tabs-module-panelViewport",
309
- root: "imf-ui-tabs-module-root",
310
- tab: "imf-ui-tabs-module-tab"
311
- }, G = /* @__PURE__ */ e({
312
- Indicator: () => Z,
313
- List: () => Y,
314
- Panel: () => $,
315
- PanelViewport: () => Q,
316
- Root: () => J,
317
- Tab: () => X
318
- }), K = t(W.list, { variants: { fill: {
319
- true: W.listFill,
320
- false: null
321
- } } }), re = t(W.root), ie = t(W.tab), ae = t(W.indicator), oe = t(W.panelViewport), se = t(W.panel);
322
- function q(e, t) {
323
- typeof e == "function" ? e(t) : e && (e.current = t);
324
- }
325
- function ce(e) {
326
- let t = new ResizeObserver(() => {
327
- let t = e.dataset.orientation === "vertical" ? e.scrollHeight > e.clientHeight : e.scrollWidth > e.clientWidth;
328
- e.toggleAttribute("data-overflowing", t);
329
- }), n = () => {
330
- t.disconnect(), t.observe(e);
331
- for (let n of e.children) t.observe(n);
332
- }, r = new MutationObserver(n);
333
- return r.observe(e, { childList: !0 }), n(), () => {
334
- t.disconnect(), r.disconnect();
335
- };
336
- }
337
- function J(e) {
338
- return /* @__PURE__ */ n(l.Root, {
339
- ...e,
340
- "data-imf-ui-component": "Tabs.Root",
341
- className: (t) => re({ className: d(e.className, t) })
342
- });
343
- }
344
- J.displayName = "Tabs.Root";
345
- function Y({ fill: e = !1, ref: t, ...r }) {
346
- let a = i((e) => {
347
- if (!e) return;
348
- q(t, e);
349
- let n = ce(e);
350
- return () => {
351
- n(), q(t, null);
352
- };
353
- }, [t]);
354
- return /* @__PURE__ */ n(l.List, {
355
- ...r,
356
- ref: a,
357
- "data-imf-ui-component": "Tabs.List",
358
- className: (t) => K({
359
- fill: e,
360
- className: d(r.className, t)
361
- })
362
- });
363
- }
364
- Y.displayName = "Tabs.List";
365
- function X(e) {
366
- return /* @__PURE__ */ n(l.Tab, {
367
- ...e,
368
- "data-imf-ui-component": "Tabs.Tab",
369
- className: (t) => ie({ className: d(e.className, t) })
370
- });
371
- }
372
- X.displayName = "Tabs.Tab";
373
- function Z(e) {
374
- return /* @__PURE__ */ n(l.Indicator, {
375
- ...e,
376
- "data-imf-ui-component": "Tabs.Indicator",
377
- className: (t) => ae({ className: d(e.className, t) })
378
- });
379
- }
380
- Z.displayName = "Tabs.Indicator";
381
- function Q(e) {
382
- return /* @__PURE__ */ n("div", {
383
- ...e,
384
- "data-imf-ui-component": "Tabs.PanelViewport",
385
- className: oe({ className: e.className })
386
- });
387
- }
388
- Q.displayName = "Tabs.PanelViewport";
389
- function $(e) {
390
- return /* @__PURE__ */ n(l.Panel, {
391
- ...e,
392
- "data-imf-ui-component": "Tabs.Panel",
393
- className: (t) => se({ className: d(e.className, t) })
394
- });
395
- }
396
- $.displayName = "Tabs.Panel";
397
- //#endregion
398
- export { d as C, m as S, S as _, J as a, T as b, U as c, F as d, A as f, E as g, w as h, Q as i, B as l, te as m, Y as n, X as o, j as p, $ as r, G as s, Z as t, L as u, x as v, C as x, D as y };
File without changes