@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.
@@ -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 i } from "@base-ui/react/slider";
6
- import { Switch as a } from "@base-ui/react/switch";
7
- import { Toggle as o } from "@base-ui/react/toggle";
8
- import { ToggleGroup as s } from "@base-ui/react/toggle-group";
9
- import { Tabs as c } from "@base-ui/react/tabs";
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 l(e, t);
12
+ return e instanceof Function ? e(t) : e;
16
13
  }
17
14
  function d(e, t) {
18
- return l(e, t);
15
+ return u(e, t);
19
16
  }
20
- var f = {
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
- }, p = /* @__PURE__ */ e({
29
- Control: () => C,
30
- Indicator: () => T,
31
- Label: () => x,
32
- Root: () => b,
33
- Thumb: () => E,
34
- Track: () => w,
35
- Value: () => S
36
- }), ee = t(f.root), m = t(f.label), h = t(f.value), g = t(f.control), _ = t(f.track), v = t(f.indicator), y = t(f.thumb);
37
- function b({ value: e, defaultValue: t, onValueChange: r, onValueCommitted: a, min: o = 0, max: s = 100, step: c = 1, largeStep: l = 10, minStepsBetweenValues: d = 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(i.Root, {
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: u(b.className, e) }),
42
+ className: (e) => ee({ className: d(b.className, e) }),
43
43
  value: e,
44
44
  defaultValue: t,
45
45
  onValueChange: r,
46
- onValueCommitted: a,
46
+ onValueCommitted: i,
47
47
  min: o,
48
48
  max: s,
49
49
  step: c,
50
50
  largeStep: l,
51
- minStepsBetweenValues: d,
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
- b.displayName = "Slider.Root";
63
- function x(e) {
64
- return /* @__PURE__ */ n(i.Label, {
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) => m({ className: u(e.className, t) })
67
+ className: (t) => h({ className: d(e.className, t) })
68
68
  });
69
69
  }
70
- x.displayName = "Slider.Label";
71
- function S({ children: e, ...t }) {
72
- return /* @__PURE__ */ n(i.Value, {
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) => h({ className: u(t.className, e) }),
75
+ className: (e) => g({ className: d(t.className, e) }),
76
76
  children: e
77
77
  });
78
78
  }
79
- S.displayName = "Slider.Value";
80
- function C(e) {
81
- return /* @__PURE__ */ n(i.Control, {
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) => g({ className: u(e.className, t) })
84
+ className: (t) => _({ className: d(e.className, t) })
85
85
  });
86
86
  }
87
- C.displayName = "Slider.Control";
88
- function w(e) {
89
- return /* @__PURE__ */ n(i.Track, {
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) => _({ className: u(e.className, t) })
92
+ className: (t) => v({ className: d(e.className, t) })
93
93
  });
94
94
  }
95
- w.displayName = "Slider.Track";
96
- function T(e) {
97
- return /* @__PURE__ */ n(i.Indicator, {
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) => v({ className: u(e.className, t) })
100
+ className: (t) => y({ className: d(e.className, t) })
101
101
  });
102
102
  }
103
- T.displayName = "Slider.Indicator";
104
- function E({ index: e, ...t }) {
105
- return /* @__PURE__ */ n(i.Thumb, {
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) => y({ className: u(t.className, e) }),
108
+ className: (e) => b({ className: d(t.className, e) }),
109
109
  index: e
110
110
  });
111
111
  }
112
- E.displayName = "Slider.Thumb";
113
- var D = {
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
- }), O = t(D.root), k = t(D.thumb);
119
+ }), ne = t(O.root), k = t(O.thumb);
120
120
  function A(e) {
121
- return /* @__PURE__ */ n(a.Root, {
121
+ return /* @__PURE__ */ n(o.Root, {
122
122
  ...e,
123
123
  "data-imf-ui-component": "Switch.Root",
124
- className: (t) => O({ className: u(e.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(a.Thumb, {
129
+ return /* @__PURE__ */ n(o.Thumb, {
130
130
  ...e,
131
131
  "data-imf-ui-component": "Switch.Thumb",
132
- className: (t) => k({ className: u(e.className, t) })
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(o, {
150
+ return /* @__PURE__ */ n(s, {
151
151
  ...r,
152
152
  "data-imf-ui-component": "Toggle",
153
153
  style: (t) => ({
154
154
  ...i,
155
- ...d(e, t)
155
+ ...f(e, t)
156
156
  }),
157
- className: (e) => M({ className: u(r.className, e) }),
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(s, {
165
+ return /* @__PURE__ */ n(c, {
166
166
  ...e,
167
167
  "data-imf-ui-component": "ToggleGroup",
168
- className: (t) => I({ className: u(e.className, t) })
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
- } } }), q = t(W.root), ne = t(W.tab), re = t(W.indicator), ie = t(W.panelViewport), ae = t(W.panel);
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(c.Root, {
338
+ return /* @__PURE__ */ n(l.Root, {
324
339
  ...e,
325
340
  "data-imf-ui-component": "Tabs.Root",
326
- className: (t) => q({ className: u(e.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, ...t }) {
331
- return /* @__PURE__ */ n(c.List, {
332
- ...t,
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: (n) => K({
358
+ className: (t) => K({
335
359
  fill: e,
336
- className: u(t.className, n)
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(c.Tab, {
366
+ return /* @__PURE__ */ n(l.Tab, {
343
367
  ...e,
344
368
  "data-imf-ui-component": "Tabs.Tab",
345
- className: (t) => ne({ className: u(e.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(c.Indicator, {
374
+ return /* @__PURE__ */ n(l.Indicator, {
351
375
  ...e,
352
376
  "data-imf-ui-component": "Tabs.Indicator",
353
- className: (t) => re({ className: u(e.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: ie({ className: e.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(c.Panel, {
390
+ return /* @__PURE__ */ n(l.Panel, {
367
391
  ...e,
368
392
  "data-imf-ui-component": "Tabs.Panel",
369
- className: (t) => ae({ className: u(e.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 { u as C, p as S, x as _, J as a, w as b, U as c, F as d, A as f, T as g, C 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, b as v, S as x, E as y };
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
- # Agent tooling
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>Importing and composing components, then changing their look with tokens, CSS, and state attributes.</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
- # Brand assets
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>Where behavior comes from, what Web UI adds on top, and why components are split into parts.</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" components={{
12
- h1: <Typo.Hero />,
13
- h2: <Typo.H1 />,
14
- h3: <Typo.H2 />,
15
- h4: <Typo.H3 />,
16
- p: <Typo.P variant="primary" />,
17
- ul: <Typo.UnorderedList variant="primary" />,
18
- hr: <Separator spacing="spacious" variant="dashed" />
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>The token families, the control tokens that change them, and how to try them live.</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
- # Getting started
6
+ <Typo.Hero>Getting started</Typo.Hero>
6
7
 
7
- `@imfusion/web-ui` is the shared React UI library for ImFusion web apps. It provides accessible primitives, ImFusion tokens,
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>Which agents the tooling supports, the skills it installs, and the hooks that point an agent at them.</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
- # How it's built
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>What changed in each release, with migration steps for breaking changes.</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
- # Tokens
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 lowest-level opacity; higher levels add one point each.
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>What a primitive is, how compound parts compose, and what each component page shows.</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
- # Usage patterns
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>The favicon set and social sharing image the package ships, and three ways to put them in an application.</PageNav>
123
+ <PageNav />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imfusion/web-ui",
3
- "version": "0.6.4-dev.84.gbfc0d437",
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. Use the pre-update package metadata as the comparison baseline;
98
- don't assume a changelog exists. Compare the old and new package metadata, current generated docs, types, and examples. Run
99
- the full verification again.
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
- Report separately:
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
- - compatibility fixes required by changed imports or types;
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
- If the prompt already answers a question, do not ask it again. Only when nobody is there to answer, or a question has gone
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
@@ -253,7 +253,7 @@
253
253
  },
254
254
  {
255
255
  "name": "--imf-ui-color-primary-bg-luma-dark",
256
- "value": "0.65"
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.75"
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) + 1%), transparent)"
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) + 2%), transparent)"
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) + 3%), transparent)"
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) + 4%), transparent)"
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) + 5%), transparent)"
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": "12%"
820
+ "value": "15%"
821
821
  },
822
822
  {
823
823
  "name": "--imf-ui-shadow-softness",