@imfusion/web-ui 0.6.4-dev.84.gbfc0d437 → 0.7.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/CHANGELOG.md +391 -0
- package/README.md +17 -14
- package/dist/components/tabs/tabs.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/integrations/image-display-options.js +1 -1
- package/dist/style.css +1 -1
- package/dist/{tabs-By5ir2pt.js → tabs-BS6rqrrA.js} +102 -78
- package/docs/user-guide/AgentTooling.mdx +9 -3
- package/docs/user-guide/BrandAssets.mdx +3 -2
- package/docs/user-guide/Changelog.mdx +13 -10
- package/docs/user-guide/GettingStarted.mdx +5 -4
- package/docs/user-guide/HowItsBuilt.mdx +3 -2
- package/docs/user-guide/Tokens.mdx +4 -3
- package/docs/user-guide/UsagePatterns.mdx +3 -2
- package/package.json +2 -1
- package/src/llms/skills/imf-web-ui-components/SKILL.md +3 -2
- package/src/llms/skills/imf-web-ui-conventions/SKILL.md +1 -0
- package/src/llms/skills/imf-web-ui-update/SKILL.md +11 -5
- package/src/llms/skills/imf-web-ui-ux/SKILL.md +2 -1
- package/src/llms/tokens.gen.json +8 -8
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { t as e } from "./chunk-DmhlhrBa.js";
|
|
2
2
|
import { cva as t } from "class-variance-authority";
|
|
3
3
|
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
-
import { Children as r } from "react";
|
|
5
|
-
import { Slider as
|
|
6
|
-
import { Switch as
|
|
7
|
-
import { Toggle as
|
|
8
|
-
import { ToggleGroup as
|
|
9
|
-
import { Tabs as
|
|
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
10
|
//#region src/utils/resolve-state-props.ts
|
|
11
|
-
function l(e, t) {
|
|
12
|
-
return e instanceof Function ? e(t) : e;
|
|
13
|
-
}
|
|
14
11
|
function u(e, t) {
|
|
15
|
-
return
|
|
12
|
+
return e instanceof Function ? e(t) : e;
|
|
16
13
|
}
|
|
17
14
|
function d(e, t) {
|
|
18
|
-
return
|
|
15
|
+
return u(e, t);
|
|
19
16
|
}
|
|
20
|
-
|
|
17
|
+
function f(e, t) {
|
|
18
|
+
return u(e, t);
|
|
19
|
+
}
|
|
20
|
+
var p = {
|
|
21
21
|
control: "imf-ui-slider-module-control",
|
|
22
22
|
indicator: "imf-ui-slider-module-indicator",
|
|
23
23
|
label: "imf-ui-slider-module-label",
|
|
@@ -25,30 +25,30 @@ var f = {
|
|
|
25
25
|
thumb: "imf-ui-slider-module-thumb",
|
|
26
26
|
track: "imf-ui-slider-module-track",
|
|
27
27
|
value: "imf-ui-slider-module-value"
|
|
28
|
-
},
|
|
29
|
-
Control: () =>
|
|
30
|
-
Indicator: () =>
|
|
31
|
-
Label: () =>
|
|
32
|
-
Root: () =>
|
|
33
|
-
Thumb: () =>
|
|
34
|
-
Track: () =>
|
|
35
|
-
Value: () =>
|
|
36
|
-
}), ee = t(
|
|
37
|
-
function
|
|
38
|
-
return /* @__PURE__ */ n(
|
|
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
39
|
...b,
|
|
40
40
|
"data-imf-ui-component": "Slider.Root",
|
|
41
41
|
"data-orientation": p,
|
|
42
|
-
className: (e) => ee({ className:
|
|
42
|
+
className: (e) => ee({ className: d(b.className, e) }),
|
|
43
43
|
value: e,
|
|
44
44
|
defaultValue: t,
|
|
45
45
|
onValueChange: r,
|
|
46
|
-
onValueCommitted:
|
|
46
|
+
onValueCommitted: i,
|
|
47
47
|
min: o,
|
|
48
48
|
max: s,
|
|
49
49
|
step: c,
|
|
50
50
|
largeStep: l,
|
|
51
|
-
minStepsBetweenValues:
|
|
51
|
+
minStepsBetweenValues: u,
|
|
52
52
|
disabled: f,
|
|
53
53
|
orientation: p,
|
|
54
54
|
name: m,
|
|
@@ -59,77 +59,77 @@ function b({ value: e, defaultValue: t, onValueChange: r, onValueCommitted: a, m
|
|
|
59
59
|
format: y
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
function
|
|
64
|
-
return /* @__PURE__ */ n(
|
|
62
|
+
x.displayName = "Slider.Root";
|
|
63
|
+
function S(e) {
|
|
64
|
+
return /* @__PURE__ */ n(a.Label, {
|
|
65
65
|
...e,
|
|
66
66
|
"data-imf-ui-component": "Slider.Label",
|
|
67
|
-
className: (t) =>
|
|
67
|
+
className: (t) => h({ className: d(e.className, t) })
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
function
|
|
72
|
-
return /* @__PURE__ */ n(
|
|
70
|
+
S.displayName = "Slider.Label";
|
|
71
|
+
function C({ children: e, ...t }) {
|
|
72
|
+
return /* @__PURE__ */ n(a.Value, {
|
|
73
73
|
...t,
|
|
74
74
|
"data-imf-ui-component": "Slider.Value",
|
|
75
|
-
className: (e) =>
|
|
75
|
+
className: (e) => g({ className: d(t.className, e) }),
|
|
76
76
|
children: e
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
|
-
|
|
80
|
-
function
|
|
81
|
-
return /* @__PURE__ */ n(
|
|
79
|
+
C.displayName = "Slider.Value";
|
|
80
|
+
function w(e) {
|
|
81
|
+
return /* @__PURE__ */ n(a.Control, {
|
|
82
82
|
...e,
|
|
83
83
|
"data-imf-ui-component": "Slider.Control",
|
|
84
|
-
className: (t) =>
|
|
84
|
+
className: (t) => _({ className: d(e.className, t) })
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
|
-
|
|
88
|
-
function
|
|
89
|
-
return /* @__PURE__ */ n(
|
|
87
|
+
w.displayName = "Slider.Control";
|
|
88
|
+
function T(e) {
|
|
89
|
+
return /* @__PURE__ */ n(a.Track, {
|
|
90
90
|
...e,
|
|
91
91
|
"data-imf-ui-component": "Slider.Track",
|
|
92
|
-
className: (t) =>
|
|
92
|
+
className: (t) => v({ className: d(e.className, t) })
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
|
-
|
|
96
|
-
function
|
|
97
|
-
return /* @__PURE__ */ n(
|
|
95
|
+
T.displayName = "Slider.Track";
|
|
96
|
+
function E(e) {
|
|
97
|
+
return /* @__PURE__ */ n(a.Indicator, {
|
|
98
98
|
...e,
|
|
99
99
|
"data-imf-ui-component": "Slider.Indicator",
|
|
100
|
-
className: (t) =>
|
|
100
|
+
className: (t) => y({ className: d(e.className, t) })
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
|
-
|
|
104
|
-
function
|
|
105
|
-
return /* @__PURE__ */ n(
|
|
103
|
+
E.displayName = "Slider.Indicator";
|
|
104
|
+
function D({ index: e, ...t }) {
|
|
105
|
+
return /* @__PURE__ */ n(a.Thumb, {
|
|
106
106
|
...t,
|
|
107
107
|
"data-imf-ui-component": "Slider.Thumb",
|
|
108
|
-
className: (e) =>
|
|
108
|
+
className: (e) => b({ className: d(t.className, e) }),
|
|
109
109
|
index: e
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
|
-
|
|
113
|
-
var
|
|
112
|
+
D.displayName = "Slider.Thumb";
|
|
113
|
+
var O = {
|
|
114
114
|
root: "imf-ui-switch-module-root",
|
|
115
115
|
thumb: "imf-ui-switch-module-thumb"
|
|
116
116
|
}, te = /* @__PURE__ */ e({
|
|
117
117
|
Root: () => A,
|
|
118
118
|
Thumb: () => j
|
|
119
|
-
}),
|
|
119
|
+
}), ne = t(O.root), k = t(O.thumb);
|
|
120
120
|
function A(e) {
|
|
121
|
-
return /* @__PURE__ */ n(
|
|
121
|
+
return /* @__PURE__ */ n(o.Root, {
|
|
122
122
|
...e,
|
|
123
123
|
"data-imf-ui-component": "Switch.Root",
|
|
124
|
-
className: (t) =>
|
|
124
|
+
className: (t) => ne({ className: d(e.className, t) })
|
|
125
125
|
});
|
|
126
126
|
}
|
|
127
127
|
A.displayName = "Switch.Root";
|
|
128
128
|
function j(e) {
|
|
129
|
-
return /* @__PURE__ */ n(
|
|
129
|
+
return /* @__PURE__ */ n(o.Thumb, {
|
|
130
130
|
...e,
|
|
131
131
|
"data-imf-ui-component": "Switch.Thumb",
|
|
132
|
-
className: (t) => k({ className:
|
|
132
|
+
className: (t) => k({ className: d(e.className, t) })
|
|
133
133
|
});
|
|
134
134
|
}
|
|
135
135
|
j.displayName = "Switch.Thumb";
|
|
@@ -147,14 +147,14 @@ function F({ style: e, children: t, ...r }) {
|
|
|
147
147
|
"--glyph-count": P(t),
|
|
148
148
|
"--max-glyphs": N
|
|
149
149
|
};
|
|
150
|
-
return /* @__PURE__ */ n(
|
|
150
|
+
return /* @__PURE__ */ n(s, {
|
|
151
151
|
...r,
|
|
152
152
|
"data-imf-ui-component": "Toggle",
|
|
153
153
|
style: (t) => ({
|
|
154
154
|
...i,
|
|
155
|
-
...
|
|
155
|
+
...f(e, t)
|
|
156
156
|
}),
|
|
157
|
-
className: (e) => M({ className:
|
|
157
|
+
className: (e) => M({ className: d(r.className, e) }),
|
|
158
158
|
children: t
|
|
159
159
|
});
|
|
160
160
|
}
|
|
@@ -162,10 +162,10 @@ function F({ style: e, children: t, ...r }) {
|
|
|
162
162
|
//#region src/components/toggle-group/toggle-group.tsx
|
|
163
163
|
var I = t({ root: "imf-ui-toggle-group-module-root" }.root);
|
|
164
164
|
function L(e) {
|
|
165
|
-
return /* @__PURE__ */ n(
|
|
165
|
+
return /* @__PURE__ */ n(c, {
|
|
166
166
|
...e,
|
|
167
167
|
"data-imf-ui-component": "ToggleGroup",
|
|
168
|
-
className: (t) => I({ className:
|
|
168
|
+
className: (t) => I({ className: d(e.className, t) })
|
|
169
169
|
});
|
|
170
170
|
}
|
|
171
171
|
var R = {
|
|
@@ -318,39 +318,63 @@ var W = {
|
|
|
318
318
|
}), K = t(W.list, { variants: { fill: {
|
|
319
319
|
true: W.listFill,
|
|
320
320
|
false: null
|
|
321
|
-
} } }),
|
|
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
|
+
}
|
|
322
337
|
function J(e) {
|
|
323
|
-
return /* @__PURE__ */ n(
|
|
338
|
+
return /* @__PURE__ */ n(l.Root, {
|
|
324
339
|
...e,
|
|
325
340
|
"data-imf-ui-component": "Tabs.Root",
|
|
326
|
-
className: (t) =>
|
|
341
|
+
className: (t) => re({ className: d(e.className, t) })
|
|
327
342
|
});
|
|
328
343
|
}
|
|
329
344
|
J.displayName = "Tabs.Root";
|
|
330
|
-
function Y({ fill: e = !1,
|
|
331
|
-
|
|
332
|
-
|
|
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,
|
|
333
357
|
"data-imf-ui-component": "Tabs.List",
|
|
334
|
-
className: (
|
|
358
|
+
className: (t) => K({
|
|
335
359
|
fill: e,
|
|
336
|
-
className:
|
|
360
|
+
className: d(r.className, t)
|
|
337
361
|
})
|
|
338
362
|
});
|
|
339
363
|
}
|
|
340
364
|
Y.displayName = "Tabs.List";
|
|
341
365
|
function X(e) {
|
|
342
|
-
return /* @__PURE__ */ n(
|
|
366
|
+
return /* @__PURE__ */ n(l.Tab, {
|
|
343
367
|
...e,
|
|
344
368
|
"data-imf-ui-component": "Tabs.Tab",
|
|
345
|
-
className: (t) =>
|
|
369
|
+
className: (t) => ie({ className: d(e.className, t) })
|
|
346
370
|
});
|
|
347
371
|
}
|
|
348
372
|
X.displayName = "Tabs.Tab";
|
|
349
373
|
function Z(e) {
|
|
350
|
-
return /* @__PURE__ */ n(
|
|
374
|
+
return /* @__PURE__ */ n(l.Indicator, {
|
|
351
375
|
...e,
|
|
352
376
|
"data-imf-ui-component": "Tabs.Indicator",
|
|
353
|
-
className: (t) =>
|
|
377
|
+
className: (t) => ae({ className: d(e.className, t) })
|
|
354
378
|
});
|
|
355
379
|
}
|
|
356
380
|
Z.displayName = "Tabs.Indicator";
|
|
@@ -358,17 +382,17 @@ function Q(e) {
|
|
|
358
382
|
return /* @__PURE__ */ n("div", {
|
|
359
383
|
...e,
|
|
360
384
|
"data-imf-ui-component": "Tabs.PanelViewport",
|
|
361
|
-
className:
|
|
385
|
+
className: oe({ className: e.className })
|
|
362
386
|
});
|
|
363
387
|
}
|
|
364
388
|
Q.displayName = "Tabs.PanelViewport";
|
|
365
389
|
function $(e) {
|
|
366
|
-
return /* @__PURE__ */ n(
|
|
390
|
+
return /* @__PURE__ */ n(l.Panel, {
|
|
367
391
|
...e,
|
|
368
392
|
"data-imf-ui-component": "Tabs.Panel",
|
|
369
|
-
className: (t) =>
|
|
393
|
+
className: (t) => se({ className: d(e.className, t) })
|
|
370
394
|
});
|
|
371
395
|
}
|
|
372
396
|
$.displayName = "Tabs.Panel";
|
|
373
397
|
//#endregion
|
|
374
|
-
export {
|
|
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 };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
import { Typo } from "#/components/typo";
|
|
2
3
|
|
|
3
4
|
<Meta title="User Guide/Agent Tooling" />
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
<Typo.Hero>Agent tooling</Typo.Hero>
|
|
6
7
|
|
|
7
8
|
The package ships skills and lifecycle hooks for coding agents working in a project that uses `@imfusion/web-ui`. Both are
|
|
8
9
|
optional, but highly recommended: the library is built to be set up and used through an agent.
|
|
@@ -53,12 +54,17 @@ reference just because the package is installed.
|
|
|
53
54
|
With the hooks installed, the agent is pointed at the router at the start of every session. Without them, the agent usually
|
|
54
55
|
picks it up from the skill's description; invoke it by name when it does not.
|
|
55
56
|
|
|
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. Solid outlines are the
|
|
59
|
+
skills you run; dashed boxes are knowledge the agent reads:
|
|
60
|
+
|
|
61
|
+
<ConsumerLlmFrameworkDiagram />
|
|
62
|
+
|
|
56
63
|
| Skill | Use it for |
|
|
57
64
|
| --- | --- |
|
|
58
65
|
| `/imf-web-ui` | The router: any UI task or library question. |
|
|
59
66
|
| `/imf-web-ui-components` | Component props, parts, defaults, and icons. |
|
|
60
67
|
| `/imf-web-ui-ux` | Choosing components and shaping screens or flows. |
|
|
61
|
-
| `/imf-web-ui-conventions` | Code, styling, data, validation, and project conventions. |
|
|
62
68
|
| `/imf-web-ui-setup` | First-time wiring and approved project setup. |
|
|
63
69
|
| `/imf-web-ui-audit` | A read-only check of an existing project. |
|
|
64
70
|
| `/imf-web-ui-update` | Updating the package and its installed tooling. |
|
|
@@ -124,4 +130,4 @@ The skills ship inside the package under `src/llms/skills/`, and `web-ui install
|
|
|
124
130
|
also exposes generated component, token, and icon indexes for the lookup skill. User guides ship as readable MDX under
|
|
125
131
|
`docs/user-guide/`; agents read them from the installed package without a running Storybook.
|
|
126
132
|
|
|
127
|
-
<PageNav
|
|
133
|
+
<PageNav />
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
2
|
import faviconUrl from "#/assets/public/favicon/favicon.svg";
|
|
3
3
|
import ogUrl from "#/assets/public/favicon/og-image.png";
|
|
4
|
+
import { Typo } from "#/components/typo";
|
|
4
5
|
|
|
5
6
|
<Meta title="User Guide/Brand Assets" />
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
<Typo.Hero>Brand assets</Typo.Hero>
|
|
8
9
|
|
|
9
10
|
The package ships the ImFusion favicon set and a social sharing image as plain files. Import them through the `assets`
|
|
10
11
|
subpath:
|
|
@@ -99,4 +100,4 @@ import iconUrl from "@imfusion/web-ui/assets/favicon/icon-512.png";
|
|
|
99
100
|
The bundler returns the asset's URL for use in application code. Vite also processes `index.html` and rewrites supported
|
|
100
101
|
asset references there. Use the plugin or the copy step when the files need stable public filenames.
|
|
101
102
|
|
|
102
|
-
<PageNav
|
|
103
|
+
<PageNav />
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
2
|
|
|
3
3
|
import { MarkdownDoc } from "#/storybook/docs/markdown-doc";
|
|
4
|
+
import { DocParagraph } from "#/storybook/docs/screenshot-carousel/doc-paragraph";
|
|
4
5
|
import { Separator } from "#/components/separator";
|
|
5
6
|
import { Typo } from "#/components/typo";
|
|
6
7
|
|
|
@@ -8,16 +9,18 @@ import doc from "../../CHANGELOG.md?raw";
|
|
|
8
9
|
|
|
9
10
|
<Meta title="User Guide/Changelog" />
|
|
10
11
|
|
|
11
|
-
<MarkdownDoc sourcePath="CHANGELOG.md"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
<MarkdownDoc sourcePath="CHANGELOG.md"
|
|
13
|
+
components={{
|
|
14
|
+
h1: <Typo.Hero />,
|
|
15
|
+
h2: <Typo.H1 />,
|
|
16
|
+
h3: <Typo.H2 />,
|
|
17
|
+
h4: <Typo.H3 variant="primary" />,
|
|
18
|
+
p: <DocParagraph variant="primary" />,
|
|
19
|
+
ul: <Typo.UnorderedList variant="primary" />,
|
|
20
|
+
hr: <Separator spacing="spacious" variant="dashed" />
|
|
21
|
+
}}
|
|
22
|
+
>
|
|
20
23
|
{doc}
|
|
21
24
|
</MarkdownDoc>
|
|
22
25
|
|
|
23
|
-
<PageNav
|
|
26
|
+
<PageNav />
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
import { Typo } from "#/components/typo";
|
|
2
3
|
|
|
3
4
|
<Meta title="User Guide/Getting Started" />
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
<Typo.Hero>Getting started</Typo.Hero>
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
and one public import surface.
|
|
8
|
+
<Typo.Lead variant="primary">`@imfusion/web-ui` is the shared React UI library for ImFusion web apps. It provides accessible primitives, ImFusion tokens,
|
|
9
|
+
and one public import surface.</Typo.Lead>
|
|
9
10
|
|
|
10
11
|
The library is built to be set up and used through a coding agent. The recommended way to wire it up is to ask the agent,
|
|
11
12
|
rather than follow a manual walkthrough.
|
|
@@ -67,4 +68,4 @@ you approve.
|
|
|
67
68
|
|
|
68
69
|
Make the same two changes yourself: install the package, then add the stylesheet import and `WebUIProvider` shown above.
|
|
69
70
|
|
|
70
|
-
<PageNav
|
|
71
|
+
<PageNav />
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
import { Typo } from "#/components/typo";
|
|
2
3
|
|
|
3
4
|
<Meta title="User Guide/How It's Built" />
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
<Typo.Hero>How it's built</Typo.Hero>
|
|
6
7
|
|
|
7
8
|
You can use the library without knowing its implementation. The snippets below are simplified from the library source.
|
|
8
9
|
|
|
@@ -110,4 +111,4 @@ The first form is pseudo-code; Web UI ships only the second. The
|
|
|
110
111
|
[library-boundary topic](../../src/llms/skills/imf-web-ui-conventions/topics/library-boundary.md) has the consumer import and
|
|
111
112
|
composition rules.
|
|
112
113
|
|
|
113
|
-
<PageNav
|
|
114
|
+
<PageNav />
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
import { Typo } from "#/components/typo";
|
|
2
3
|
|
|
3
4
|
<Meta title="Tokens/Docs" />
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
<Typo.Hero>Tokens</Typo.Hero>
|
|
6
7
|
|
|
7
8
|
The library's theme is a set of CSS custom properties under `--imf-ui-*`.
|
|
8
9
|
|
|
@@ -69,7 +70,7 @@ brand shape axis. Shadow controls share one lighting model across components:
|
|
|
69
70
|
- `--imf-ui-shadow-angle` sets the sun direction; the default `315deg` makes shadows fall down and right.
|
|
70
71
|
- `--imf-ui-shadow-hardness` moves from diffuse (`0`) to crisp (`1`) edges without changing the elevation level.
|
|
71
72
|
- `--imf-ui-shadow-spread` adds pixel spread to every shadow.
|
|
72
|
-
- `--imf-ui-shadow-intensity` sets the
|
|
73
|
+
- `--imf-ui-shadow-intensity` sets the opacity of every elevation level.
|
|
73
74
|
- `--imf-ui-shadow-color` sets the cast color per scheme.
|
|
74
75
|
|
|
75
76
|
Components consume these values through tokens. `node_modules/@imfusion/web-ui/src/llms/tokens.gen.json` lists the shipped
|
|
@@ -84,4 +85,4 @@ update the preview live; to keep a value, set that token in your application CSS
|
|
|
84
85
|
- [Showcase](../../src/tokens/showcase.stories.tsx) applies the controls to real components.
|
|
85
86
|
- [Reference](../../src/tokens/token-reference.stories.tsx) lists every generated token.
|
|
86
87
|
|
|
87
|
-
<PageNav
|
|
88
|
+
<PageNav />
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
import { Typo } from "#/components/typo";
|
|
2
3
|
|
|
3
4
|
<Meta title="User Guide/Usage Patterns" />
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
<Typo.Hero>Usage patterns</Typo.Hero>
|
|
6
7
|
|
|
7
8
|
## Build with components
|
|
8
9
|
|
|
@@ -119,4 +120,4 @@ component colors cannot disagree with them:
|
|
|
119
120
|
<WebUIProvider colorScheme="dark">{children}</WebUIProvider>
|
|
120
121
|
```
|
|
121
122
|
|
|
122
|
-
<PageNav
|
|
123
|
+
<PageNav />
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imfusion/web-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "The official Web UI component library for ImFusion web apps",
|
|
5
5
|
"author": "ImFusion GmbH",
|
|
6
6
|
"homepage": "https://imfusion.com",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"src/assets/public",
|
|
51
51
|
"docs/assets/imfusion-banner.svg",
|
|
52
52
|
"docs/user-guide",
|
|
53
|
+
"CHANGELOG.md",
|
|
53
54
|
"THIRD_PARTY_NOTICES.md",
|
|
54
55
|
"src/llms/install-templates",
|
|
55
56
|
"src/docgen/doc.gen.json",
|
|
@@ -13,13 +13,14 @@ Use the generated package indexes. They are smaller and more reliable than readi
|
|
|
13
13
|
|
|
14
14
|
## Component lookup
|
|
15
15
|
|
|
16
|
-
1. Read the identity index:
|
|
16
|
+
1. Read the identity index first, even when you already know the component's name: it gives the docgen key and the status.
|
|
17
17
|
|
|
18
18
|
```sh
|
|
19
19
|
cat node_modules/@imfusion/web-ui/src/llms/llms.gen.txt
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
It lists each component's name, category, status, purpose, and docgen entry.
|
|
22
|
+
It lists each component's name, category, status, purpose, and docgen entry. The docgen entry is the prop source; the
|
|
23
|
+
`.d.ts` files in `dist/` carry no defaults and hide upstream props behind their base types.
|
|
23
24
|
|
|
24
25
|
2. Read only the matching entry from docgen:
|
|
25
26
|
|
|
@@ -4,6 +4,7 @@ description:
|
|
|
4
4
|
"Apply the ImFusion frontend conventions to consumer code. Use this whenever a task writes a wrapper or custom UI, CSS,
|
|
5
5
|
TypeScript, data fetching, validation, tests, project files, configuration, documentation, dependencies, or agent tooling
|
|
6
6
|
in a project that uses @imfusion/web-ui. Read only the topic references that match the task."
|
|
7
|
+
user-invocable: false
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
# Frontend conventions
|
|
@@ -94,14 +94,20 @@ commit workflow.
|
|
|
94
94
|
|
|
95
95
|
## Audit the consumer migration
|
|
96
96
|
|
|
97
|
-
Start this phase only after the base update commit exists.
|
|
98
|
-
|
|
99
|
-
the
|
|
97
|
+
Start this phase only after the base update commit exists. Read `node_modules/@imfusion/web-ui/CHANGELOG.md`: every release
|
|
98
|
+
section after the pre-update version, up to and including the new one. Each section's highlights, migration guide, and
|
|
99
|
+
`Breaking` entries are the release's own account of what changed. Then compare the old and new package metadata, current
|
|
100
|
+
generated docs, types, and examples, and run the full verification again.
|
|
100
101
|
|
|
101
|
-
|
|
102
|
+
This phase reads and reports: every file stays as it is until the person approves the migration. Open the report with the
|
|
103
|
+
releases read, then report separately:
|
|
102
104
|
|
|
103
|
-
-
|
|
105
|
+
- migrations: every `Breaking` entry and migration step, mapped to the call sites it affects here and the fix the changelog
|
|
106
|
+
shows; a step with no matching code is reported as not applicable;
|
|
107
|
+
- compatibility fixes required by changed imports or types that the changelog does not cover;
|
|
104
108
|
- existing uses affected by a changed API or documented behavior;
|
|
109
|
+
- suggestions: new features from the highlights and `Added` entries that fit what the project already builds, each with the
|
|
110
|
+
project code it would serve; a suggestion stays a proposal until the person asks for it;
|
|
105
111
|
- custom components that overlap with a current Web UI primitive, with evidence and any behavior to preserve.
|
|
106
112
|
|
|
107
113
|
Do not infer a replacement from a name. Inspect the implementation, styles, and call sites. If there are no findings, say so
|
|
@@ -25,7 +25,8 @@ no reason to reply. Ask one at a time, and stop once the choice is clear:
|
|
|
25
25
|
4. What should users see when it is empty, loading, or failing?
|
|
26
26
|
5. Is it a full page or part of another flow?
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
A request that names the component, where it goes, and its initial state is specified: build it with no question. If the
|
|
29
|
+
prompt already answers a question, do not ask it again. Only when nobody is there to answer, or a question has gone
|
|
29
30
|
unanswered, make the conservative choice and state the assumption.
|
|
30
31
|
|
|
31
32
|
## Choose a surface
|
package/src/llms/tokens.gen.json
CHANGED
|
@@ -253,7 +253,7 @@
|
|
|
253
253
|
},
|
|
254
254
|
{
|
|
255
255
|
"name": "--imf-ui-color-primary-bg-luma-dark",
|
|
256
|
-
"value": "0.
|
|
256
|
+
"value": "0.6"
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
"name": "--imf-ui-color-primary-bg-luma-light",
|
|
@@ -265,7 +265,7 @@
|
|
|
265
265
|
},
|
|
266
266
|
{
|
|
267
267
|
"name": "--imf-ui-color-primary-fg-luma-dark",
|
|
268
|
-
"value": "0.
|
|
268
|
+
"value": "0.8"
|
|
269
269
|
},
|
|
270
270
|
{
|
|
271
271
|
"name": "--imf-ui-color-primary-fg-luma-light",
|
|
@@ -781,23 +781,23 @@
|
|
|
781
781
|
},
|
|
782
782
|
{
|
|
783
783
|
"name": "--imf-ui-shadow-2",
|
|
784
|
-
"value": "calc(4px * var(--imf-ui-shadow-x)) calc(4px * var(--imf-ui-shadow-y)) calc(4px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)
|
|
784
|
+
"value": "calc(4px * var(--imf-ui-shadow-x)) calc(4px * var(--imf-ui-shadow-y)) calc(4px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)), transparent)"
|
|
785
785
|
},
|
|
786
786
|
{
|
|
787
787
|
"name": "--imf-ui-shadow-3",
|
|
788
|
-
"value": "calc(6px * var(--imf-ui-shadow-x)) calc(6px * var(--imf-ui-shadow-y)) calc(6px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)
|
|
788
|
+
"value": "calc(6px * var(--imf-ui-shadow-x)) calc(6px * var(--imf-ui-shadow-y)) calc(6px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)), transparent)"
|
|
789
789
|
},
|
|
790
790
|
{
|
|
791
791
|
"name": "--imf-ui-shadow-4",
|
|
792
|
-
"value": "calc(8px * var(--imf-ui-shadow-x)) calc(8px * var(--imf-ui-shadow-y)) calc(8px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)
|
|
792
|
+
"value": "calc(8px * var(--imf-ui-shadow-x)) calc(8px * var(--imf-ui-shadow-y)) calc(8px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)), transparent)"
|
|
793
793
|
},
|
|
794
794
|
{
|
|
795
795
|
"name": "--imf-ui-shadow-5",
|
|
796
|
-
"value": "calc(12px * var(--imf-ui-shadow-x)) calc(12px * var(--imf-ui-shadow-y)) calc(12px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)
|
|
796
|
+
"value": "calc(12px * var(--imf-ui-shadow-x)) calc(12px * var(--imf-ui-shadow-y)) calc(12px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)), transparent)"
|
|
797
797
|
},
|
|
798
798
|
{
|
|
799
799
|
"name": "--imf-ui-shadow-6",
|
|
800
|
-
"value": "calc(16px * var(--imf-ui-shadow-x)) calc(16px * var(--imf-ui-shadow-y)) calc(16px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)
|
|
800
|
+
"value": "calc(16px * var(--imf-ui-shadow-x)) calc(16px * var(--imf-ui-shadow-y)) calc(16px * var(--imf-ui-shadow-blur-scale)) var(--imf-ui-shadow-spread) color-mix(in oklch, var(--imf-ui-shadow-color) calc(var(--imf-ui-shadow-intensity)), transparent)"
|
|
801
801
|
},
|
|
802
802
|
{
|
|
803
803
|
"name": "--imf-ui-shadow-angle",
|
|
@@ -817,7 +817,7 @@
|
|
|
817
817
|
},
|
|
818
818
|
{
|
|
819
819
|
"name": "--imf-ui-shadow-intensity",
|
|
820
|
-
"value": "
|
|
820
|
+
"value": "15%"
|
|
821
821
|
},
|
|
822
822
|
{
|
|
823
823
|
"name": "--imf-ui-shadow-softness",
|