@imfusion/web-ui 0.11.1-dev.47.g23180a23 → 0.11.1-dev.49.gcda1589f

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 (31) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{code-BX1Humcy.js → code-BaLXMEMa.js} +2 -2
  3. package/dist/icon-button-roSB497o.js +171 -0
  4. package/dist/index.js +2599 -2780
  5. package/dist/integrations/code-highlight.js +2 -2
  6. package/dist/integrations/frame-selection.js +1 -1
  7. package/dist/integrations/image-display-options.js +75 -73
  8. package/dist/integrations/layout-mode/index.d.ts +2 -0
  9. package/dist/integrations/layout-mode/layout-mode-view.d.ts +32 -0
  10. package/dist/integrations/layout-mode/layout-mode.d.ts +13 -0
  11. package/dist/integrations/layout-mode/layout-mode.meta.d.ts +2 -0
  12. package/dist/integrations/layout-mode.js +103 -0
  13. package/dist/integrations/view-tools/index.d.ts +4 -0
  14. package/dist/integrations/view-tools/use-view-interaction.d.ts +21 -0
  15. package/dist/integrations/view-tools/view-tools-view.d.ts +23 -0
  16. package/dist/integrations/view-tools/view-tools.d.ts +14 -0
  17. package/dist/integrations/view-tools/view-tools.meta.d.ts +2 -0
  18. package/dist/integrations/view-tools.js +133 -0
  19. package/dist/rolldown-runtime-Dy4uBu1J.js +11 -0
  20. package/dist/row-CImu8yXV.js +136 -0
  21. package/dist/{scroll-area-CUo1NBaW.js → scroll-area-CXQ_SxPX.js} +21 -20
  22. package/dist/{slider-BKDxeTmk.js → slider-CpIZMAFl.js} +24 -23
  23. package/dist/style.css +1 -1
  24. package/dist/tabs-BqgyMmo6.js +173 -0
  25. package/dist/toggle-group-Bhb3qicp.js +31 -0
  26. package/dist/toggle-group-eGr6_hgQ.js +125 -0
  27. package/dist/{utils-RZJAXfcf.js → utils-J6vbjIt1.js} +11 -21
  28. package/package.json +3 -3
  29. package/src/docgen/doc.gen.json +130 -0
  30. package/src/llms/llms.gen.txt +12 -0
  31. package/dist/tabs-CLeLjFNy.js +0 -423
@@ -0,0 +1,173 @@
1
+ import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
2
+ import { a as t } from "./utils-J6vbjIt1.js";
3
+ import { cva as n, cx as r } from "class-variance-authority";
4
+ import { jsx as i } from "react/jsx-runtime";
5
+ import { createContext as a, useCallback as o, useContext as s } from "react";
6
+ import { Switch as c } from "@base-ui/react/switch";
7
+ import { Tabs as l } from "@base-ui/react/tabs";
8
+ var u = {
9
+ root: "imf-ui-switch-module-root",
10
+ thumb: "imf-ui-switch-module-thumb"
11
+ }, d = /* @__PURE__ */ e({
12
+ Root: () => m,
13
+ Thumb: () => h
14
+ }), f = n(u.root), p = n(u.thumb);
15
+ function m(e) {
16
+ return /* @__PURE__ */ i(c.Root, {
17
+ ...e,
18
+ "data-imf-ui-component": "Switch.Root",
19
+ className: (n) => f({ className: t(e.className, n) })
20
+ });
21
+ }
22
+ m.displayName = "Switch.Root";
23
+ function h(e) {
24
+ return /* @__PURE__ */ i(c.Thumb, {
25
+ ...e,
26
+ "data-imf-ui-component": "Switch.Thumb",
27
+ className: (n) => p({ className: t(e.className, n) })
28
+ });
29
+ }
30
+ h.displayName = "Switch.Thumb";
31
+ var g = {
32
+ item: "imf-ui-tabs-underline-module-item",
33
+ rule: "imf-ui-tabs-underline-module-rule"
34
+ }, _ = n(g.rule), v = n(g.item), y = {
35
+ indicator: "imf-ui-tabs-module-indicator",
36
+ indicatorUnderline: "imf-ui-tabs-module-indicatorUnderline",
37
+ list: "imf-ui-tabs-module-list",
38
+ listFill: "imf-ui-tabs-module-listFill",
39
+ listUnderline: "imf-ui-tabs-module-listUnderline",
40
+ panel: "imf-ui-tabs-module-panel",
41
+ panelUnderline: "imf-ui-tabs-module-panelUnderline",
42
+ panelViewport: "imf-ui-tabs-module-panelViewport",
43
+ panelViewportUnderline: "imf-ui-tabs-module-panelViewportUnderline",
44
+ root: "imf-ui-tabs-module-root",
45
+ tab: "imf-ui-tabs-module-tab",
46
+ tabUnderline: "imf-ui-tabs-module-tabUnderline"
47
+ }, b = /* @__PURE__ */ e({
48
+ Indicator: () => N,
49
+ List: () => j,
50
+ Panel: () => F,
51
+ PanelViewport: () => P,
52
+ Root: () => A,
53
+ Tab: () => M
54
+ }), x = n(y.list, { variants: {
55
+ fill: {
56
+ true: y.listFill,
57
+ false: null
58
+ },
59
+ appearance: {
60
+ boxed: null,
61
+ underline: r(y.listUnderline, _())
62
+ }
63
+ } }), S = n(y.root), C = n(null, { variants: { appearance: {
64
+ boxed: y.tab,
65
+ underline: r(y.tabUnderline, v())
66
+ } } }), w = n(null, { variants: { appearance: {
67
+ boxed: y.indicator,
68
+ underline: y.indicatorUnderline
69
+ } } }), T = n(y.panelViewport, { variants: { appearance: {
70
+ boxed: null,
71
+ underline: y.panelViewportUnderline
72
+ } } }), E = n(y.panel, { variants: { appearance: {
73
+ boxed: null,
74
+ underline: y.panelUnderline
75
+ } } }), D = a("boxed");
76
+ function O(e, t) {
77
+ typeof e == "function" ? e(t) : e && (e.current = t);
78
+ }
79
+ function k(e) {
80
+ let t = new ResizeObserver(() => {
81
+ let t = e.dataset.orientation === "vertical" ? e.scrollHeight > e.clientHeight : e.scrollWidth > e.clientWidth;
82
+ e.toggleAttribute("data-overflowing", t);
83
+ }), n = () => {
84
+ t.disconnect(), t.observe(e);
85
+ for (let n of e.children) t.observe(n);
86
+ }, r = new MutationObserver(n);
87
+ return r.observe(e, { childList: !0 }), n(), () => {
88
+ t.disconnect(), r.disconnect();
89
+ };
90
+ }
91
+ function A({ appearance: e = "boxed", ...n }) {
92
+ let r = n.orientation === "vertical" ? "boxed" : e;
93
+ return /* @__PURE__ */ i(D, {
94
+ value: r,
95
+ children: /* @__PURE__ */ i(l.Root, {
96
+ ...n,
97
+ "data-imf-ui-component": "Tabs.Root",
98
+ className: (e) => S({ className: t(n.className, e) })
99
+ })
100
+ });
101
+ }
102
+ A.displayName = "Tabs.Root";
103
+ function j({ fill: e = !1, ref: n, ...r }) {
104
+ let a = s(D), c = o((e) => {
105
+ if (!e) return;
106
+ O(n, e);
107
+ let t = k(e);
108
+ return () => {
109
+ t(), O(n, null);
110
+ };
111
+ }, [n]);
112
+ return /* @__PURE__ */ i(l.List, {
113
+ ...r,
114
+ ref: c,
115
+ "data-imf-ui-component": "Tabs.List",
116
+ className: (n) => x({
117
+ fill: e,
118
+ appearance: a,
119
+ className: t(r.className, n)
120
+ })
121
+ });
122
+ }
123
+ j.displayName = "Tabs.List";
124
+ function M(e) {
125
+ let n = s(D);
126
+ return /* @__PURE__ */ i(l.Tab, {
127
+ ...e,
128
+ "data-imf-ui-component": "Tabs.Tab",
129
+ className: (r) => C({
130
+ appearance: n,
131
+ className: t(e.className, r)
132
+ })
133
+ });
134
+ }
135
+ M.displayName = "Tabs.Tab";
136
+ function N(e) {
137
+ let n = s(D);
138
+ return /* @__PURE__ */ i(l.Indicator, {
139
+ ...e,
140
+ "data-imf-ui-component": "Tabs.Indicator",
141
+ className: (r) => w({
142
+ appearance: n,
143
+ className: t(e.className, r)
144
+ })
145
+ });
146
+ }
147
+ N.displayName = "Tabs.Indicator";
148
+ function P(e) {
149
+ let t = s(D);
150
+ return /* @__PURE__ */ i("div", {
151
+ ...e,
152
+ "data-imf-ui-component": "Tabs.PanelViewport",
153
+ className: T({
154
+ appearance: t,
155
+ className: e.className
156
+ })
157
+ });
158
+ }
159
+ P.displayName = "Tabs.PanelViewport";
160
+ function F(e) {
161
+ let n = s(D);
162
+ return /* @__PURE__ */ i(l.Panel, {
163
+ ...e,
164
+ "data-imf-ui-component": "Tabs.Panel",
165
+ className: (r) => E({
166
+ appearance: n,
167
+ className: t(e.className, r)
168
+ })
169
+ });
170
+ }
171
+ F.displayName = "Tabs.Panel";
172
+ //#endregion
173
+ export { A as a, v as c, h as d, d as f, P as i, _ as l, j as n, M as o, F as r, b as s, N as t, m as u };
@@ -0,0 +1,31 @@
1
+ import { t as e } from "./meta-V_KyLeGn.js";
2
+ import "./toggle-group-eGr6_hgQ.js";
3
+ //#region src/components/toggle/toggle.meta.ts
4
+ var t = {
5
+ name: "Toggle",
6
+ category: e.inputs,
7
+ status: "experimental",
8
+ description: "Two-state button for a pressed or unpressed option. Compose several in ToggleGroup for a segmented control.",
9
+ origin: "adapted",
10
+ internalDependencies: ["Kbd"],
11
+ upstream: {
12
+ name: "Base UI",
13
+ websiteLink: "https://base-ui.com/",
14
+ docLink: "https://base-ui.com/react/components/toggle",
15
+ llmDocLink: "https://base-ui.com/react/components/toggle.md"
16
+ }
17
+ }, n = {
18
+ name: "ToggleGroup",
19
+ category: e.inputs,
20
+ status: "experimental",
21
+ description: "Group of connected Toggle buttons that share a selection. Also called a segmented control; set `multiple` for more than one active option.",
22
+ origin: "adapted",
23
+ upstream: {
24
+ name: "Base UI",
25
+ websiteLink: "https://base-ui.com/",
26
+ docLink: "https://base-ui.com/react/components/toggle-group",
27
+ llmDocLink: "https://base-ui.com/react/components/toggle-group.md"
28
+ }
29
+ };
30
+ //#endregion
31
+ export { t as n, n as t };
@@ -0,0 +1,125 @@
1
+ import { _M as e, mh as t } from "./icons-vc1WZCxX.js";
2
+ import { t as n } from "./meta-V_KyLeGn.js";
3
+ import { a as r, o as i } from "./utils-J6vbjIt1.js";
4
+ import { cva as a } from "class-variance-authority";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { Children as c, createContext as l, useContext as u } from "react";
7
+ import { Toggle as d } from "@base-ui/react/toggle";
8
+ import { ToggleGroup as f } from "@base-ui/react/toggle-group";
9
+ var p = {
10
+ flat: "imf-ui-kbd-module-flat",
11
+ icon: "imf-ui-kbd-module-icon",
12
+ primary: "imf-ui-kbd-module-primary",
13
+ root: "imf-ui-kbd-module-root"
14
+ }, m = a(p.root, { variants: { variant: {
15
+ default: null,
16
+ primary: p.primary,
17
+ flat: p.flat
18
+ } } });
19
+ function h({ variant: n = "default", icon: r = !1, children: i, ...a }) {
20
+ return /* @__PURE__ */ s("kbd", {
21
+ ...a,
22
+ "data-imf-ui-component": "Kbd",
23
+ className: m({
24
+ variant: n,
25
+ className: a.className
26
+ }),
27
+ children: [r && /* @__PURE__ */ o(e, {
28
+ glyph: t,
29
+ strokeWidth: 2,
30
+ "aria-hidden": !0,
31
+ className: p.icon
32
+ }), i]
33
+ });
34
+ }
35
+ //#endregion
36
+ //#region src/components/kbd/kbd.meta.ts
37
+ var g = {
38
+ name: "Kbd",
39
+ category: n.display,
40
+ status: "experimental",
41
+ description: "Shows a keyboard key or shortcut, such as the letter that activates a button. Also called a key hint; Button and Toggle render it through their `shortcut` prop.",
42
+ origin: "native",
43
+ internalDependencies: ["Icon"]
44
+ }, _ = {
45
+ ctrl: "Control",
46
+ control: "Control",
47
+ cmd: "Meta",
48
+ "⌘": "Meta",
49
+ meta: "Meta",
50
+ opt: "Alt",
51
+ option: "Alt",
52
+ "⌥": "Alt",
53
+ alt: "Alt",
54
+ shift: "Shift",
55
+ "⇧": "Shift",
56
+ esc: "Escape",
57
+ escape: "Escape"
58
+ };
59
+ function v(e) {
60
+ let t = e.trim().split(/\s+/).filter(Boolean);
61
+ if (t.length !== 0) return t.map((e) => _[e.toLowerCase()] ?? (e.length === 1 ? e.toUpperCase() : e)).join("+");
62
+ }
63
+ //#endregion
64
+ //#region src/components/toggle-group/toggle-group-size.ts
65
+ var y = l("md"), b = {
66
+ root: "imf-ui-toggle-module-root",
67
+ shortcut: "imf-ui-toggle-module-shortcut",
68
+ sizeSm: "imf-ui-toggle-module-sizeSm"
69
+ }, x = a(b.root, { variants: { size: {
70
+ sm: b.sizeSm,
71
+ md: null
72
+ } } }), S = 2;
73
+ function C(e) {
74
+ let t = 0;
75
+ return c.forEach(e, (e) => {
76
+ typeof e == "string" || typeof e == "number" ? t += String(e).trim().length : e != null && typeof e != "boolean" && (t += S);
77
+ }), t;
78
+ }
79
+ function w({ style: e, shortcut: t, size: n, children: a, ...c }) {
80
+ let l = u(y), f = {
81
+ "--glyph-count": C(a),
82
+ "--max-glyphs": S
83
+ };
84
+ return /* @__PURE__ */ s(d, {
85
+ "aria-keyshortcuts": t ? v(t) : void 0,
86
+ ...c,
87
+ "data-imf-ui-component": "Toggle",
88
+ style: (t) => ({
89
+ ...f,
90
+ ...i(e, t)
91
+ }),
92
+ className: (e) => x({
93
+ size: n ?? l,
94
+ className: r(c.className, e)
95
+ }),
96
+ children: [a, t && /* @__PURE__ */ o(h, {
97
+ variant: "flat",
98
+ className: b.shortcut,
99
+ "aria-hidden": !0,
100
+ children: t
101
+ })]
102
+ });
103
+ }
104
+ var T = {
105
+ root: "imf-ui-toggle-group-module-root",
106
+ sizeSm: "imf-ui-toggle-group-module-sizeSm"
107
+ }, E = a(T.root, { variants: { size: {
108
+ sm: T.sizeSm,
109
+ md: null
110
+ } } });
111
+ function D({ size: e = "md", ...t }) {
112
+ return /* @__PURE__ */ o(y.Provider, {
113
+ value: e ?? "md",
114
+ children: /* @__PURE__ */ o(f, {
115
+ ...t,
116
+ "data-imf-ui-component": "ToggleGroup",
117
+ className: (n) => E({
118
+ size: e,
119
+ className: r(t.className, n)
120
+ })
121
+ })
122
+ });
123
+ }
124
+ //#endregion
125
+ export { h as a, g as i, w as n, v as r, D as t };
@@ -1,28 +1,18 @@
1
1
  import { createContext as e, useCallback as t, useContext as n, useEffect as r, useId as i, useMemo as a, useState as o } from "react";
2
- //#region \0rolldown/runtime.js
3
- var s = Object.defineProperty, c = (e, t) => {
4
- let n = {};
5
- for (var r in e) s(n, r, {
6
- get: e[r],
7
- enumerable: !0
8
- });
9
- return t || s(n, Symbol.toStringTag, { value: "Module" }), n;
10
- };
11
- //#endregion
12
2
  //#region src/utils/resolve-state-props.ts
13
- function l(e, t) {
3
+ function s(e, t) {
14
4
  return e instanceof Function ? e(t) : e;
15
5
  }
16
- function u(e, t) {
17
- return l(e, t);
6
+ function c(e, t) {
7
+ return s(e, t);
18
8
  }
19
- function d(e, t) {
20
- return l(e, t);
9
+ function l(e, t) {
10
+ return s(e, t);
21
11
  }
22
12
  //#endregion
23
13
  //#region src/utils/item-parts.tsx
24
- var f = e(null);
25
- function p() {
14
+ var u = e(null);
15
+ function d() {
26
16
  let e = i(), t = i(), [n, r] = o(!1), [s, c] = o(!1);
27
17
  return {
28
18
  context: a(() => ({
@@ -37,13 +27,13 @@ function p() {
37
27
  }
38
28
  };
39
29
  }
40
- function m(e) {
41
- let t = n(f), i = e === "label" ? t?.setHasLabel : t?.setHasDescription;
30
+ function f(e) {
31
+ let t = n(u), i = e === "label" ? t?.setHasLabel : t?.setHasDescription;
42
32
  return r(() => (i?.(!0), () => i?.(!1)), [i]), e === "label" ? t?.labelId : t?.descriptionId;
43
33
  }
44
34
  //#endregion
45
35
  //#region src/utils/stable-popup-height.ts
46
- function h({ ref: e }) {
36
+ function p({ ref: e }) {
47
37
  let [n, r] = o();
48
38
  return {
49
39
  ref: t((t) => {
@@ -53,4 +43,4 @@ function h({ ref: e }) {
53
43
  };
54
44
  }
55
45
  //#endregion
56
- export { u as a, p as i, f as n, d as o, m as r, c as s, h as t };
46
+ export { c as a, d as i, u as n, l as o, f as r, p as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imfusion/web-ui",
3
- "version": "0.11.1-dev.47.g23180a23",
3
+ "version": "0.11.1-dev.49.gcda1589f",
4
4
  "description": "The official Web UI component library for ImFusion web apps",
5
5
  "author": "ImFusion GmbH",
6
6
  "homepage": "https://imfusion.com",
@@ -122,8 +122,8 @@
122
122
  "commander": "15.0.0"
123
123
  },
124
124
  "devDependencies": {
125
- "@imfusion/sdk": "1.0.0",
126
- "@imfusion/sdk-react": "1.0.0",
125
+ "@imfusion/sdk": "1.3.0",
126
+ "@imfusion/sdk-react": "1.3.0",
127
127
  "@storybook/addon-a11y": "10.6.2",
128
128
  "@storybook/addon-docs": "10.6.2",
129
129
  "@storybook/addon-mcp": "10.6.2",
@@ -14160,5 +14160,135 @@
14160
14160
  ]
14161
14161
  },
14162
14162
  "subComponents": []
14163
+ },
14164
+ "layout-mode": {
14165
+ "root": {
14166
+ "name": "LayoutMode",
14167
+ "description": "LayoutMode - picks the ImFusion viewer's layout mode: Auto, Rows, Focus + stack, or Focus + rows.\n`compact` is a row of icon toggles; `labeled` stacks them vertically with each mode's name beside its icon.\n\nMust render inside `ImFusionReady`, within an `ImFusionProvider`.",
14168
+ "props": [
14169
+ {
14170
+ "name": "autoLabel",
14171
+ "required": false,
14172
+ "type": "string",
14173
+ "defaultValue": null,
14174
+ "description": "Name of the toggle that lets the viewer choose between Rows and Focus + stack."
14175
+ },
14176
+ {
14177
+ "name": "className",
14178
+ "required": false,
14179
+ "type": "string | ((state: ToggleGroupState) => string)",
14180
+ "defaultValue": null,
14181
+ "description": "CSS class applied to the element, or a function that\nreturns a class based on the component's state."
14182
+ },
14183
+ {
14184
+ "name": "disabled",
14185
+ "required": false,
14186
+ "type": "boolean",
14187
+ "defaultValue": "false",
14188
+ "description": "Whether the toggle group should ignore user interaction."
14189
+ },
14190
+ {
14191
+ "name": "focusPlusRowsLabel",
14192
+ "required": false,
14193
+ "type": "string",
14194
+ "defaultValue": null,
14195
+ "description": "Name of the toggle that shows one large view with the others in rows beside it."
14196
+ },
14197
+ {
14198
+ "name": "focusPlusStackLabel",
14199
+ "required": false,
14200
+ "type": "string",
14201
+ "defaultValue": null,
14202
+ "description": "Name of the toggle that shows one large view with the others stacked beside it."
14203
+ },
14204
+ {
14205
+ "name": "label",
14206
+ "required": false,
14207
+ "type": "string",
14208
+ "defaultValue": null,
14209
+ "description": "Accessible name of the group."
14210
+ },
14211
+ {
14212
+ "name": "loopFocus",
14213
+ "required": false,
14214
+ "type": "boolean",
14215
+ "defaultValue": "true",
14216
+ "description": "Whether to loop keyboard focus back to the first item\nwhen the end of the list is reached while using the arrow keys."
14217
+ },
14218
+ {
14219
+ "name": "orientation",
14220
+ "required": false,
14221
+ "type": "Orientation",
14222
+ "defaultValue": "horizontal",
14223
+ "description": ""
14224
+ },
14225
+ {
14226
+ "name": "ref",
14227
+ "required": false,
14228
+ "type": "Ref<HTMLDivElement>",
14229
+ "defaultValue": null,
14230
+ "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}"
14231
+ },
14232
+ {
14233
+ "name": "render",
14234
+ "required": false,
14235
+ "type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, ToggleGroupState>",
14236
+ "defaultValue": null,
14237
+ "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."
14238
+ },
14239
+ {
14240
+ "name": "rowsLabel",
14241
+ "required": false,
14242
+ "type": "string",
14243
+ "defaultValue": null,
14244
+ "description": "Name of the toggle that arranges the views in up to two rows."
14245
+ },
14246
+ {
14247
+ "name": "size",
14248
+ "required": false,
14249
+ "type": "\"sm\" | \"md\" | null",
14250
+ "defaultValue": null,
14251
+ "description": ""
14252
+ },
14253
+ {
14254
+ "name": "style",
14255
+ "required": false,
14256
+ "type": "| CSSProperties\n| ((state: ToggleGroupState) => CSSProperties)",
14257
+ "defaultValue": null,
14258
+ "description": "Style applied to the element, or a function that\nreturns a style object based on the component's state."
14259
+ },
14260
+ {
14261
+ "name": "variant",
14262
+ "required": false,
14263
+ "type": "\"compact\" | \"labeled\" | null",
14264
+ "defaultValue": null,
14265
+ "description": ""
14266
+ }
14267
+ ]
14268
+ },
14269
+ "subComponents": []
14270
+ },
14271
+ "view-tools": {
14272
+ "root": {
14273
+ "name": "ViewTools",
14274
+ "description": "ViewTools - Pan, Zoom, and Windowing toggles that limit the left mouse button in the main 2D and MPR views to one\naction, and a button that resets the view group. Releasing the active toggle restores the default input mapping.\nThe active tool is the one `useViewInteraction` reads and sets.\n\nMust render inside `ImFusionReady`, within an `ImFusionProvider`. Needs `@imfusion/sdk` 1.3.0 or later.",
14275
+ "props": [
14276
+ {
14277
+ "name": "orientation",
14278
+ "required": false,
14279
+ "type": "\"horizontal\" | \"vertical\"",
14280
+ "defaultValue": null,
14281
+ "description": "Lays the tools out in a row or a column."
14282
+ },
14283
+ {
14284
+ "name": "ref",
14285
+ "required": false,
14286
+ "type": "Ref<HTMLDivElement>",
14287
+ "defaultValue": null,
14288
+ "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}"
14289
+ }
14290
+ ]
14291
+ },
14292
+ "subComponents": []
14163
14293
  }
14164
14294
  }
@@ -157,6 +157,12 @@ Single-line text input for form data entry. Also called a text field; it support
157
157
  Shows a keyboard key or shortcut, such as the letter that activates a button. Also called a key hint; Button and Toggle render it through their `shortcut` prop.
158
158
  - props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .kbd (jq: jq '.kbd' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
159
159
 
160
+ ## LayoutMode
161
+ - category: Inputs, status: experimental
162
+ Picker bound to the ImFusion viewer's layout mode: Auto, Rows, Focus + stack, or Focus + rows, as a compact icon row or a labeled vertical list. Also called a layout or view arrangement switch; for a segmented choice not tied to the SDK, use ToggleGroup.
163
+ - props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .layout-mode (jq: jq '.layout-mode' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
164
+ - further reading (usage/anatomy, not props): https://docs.imfusion.com/
165
+
160
166
  ## Logo
161
167
  - category: Display, status: stable
162
168
  Renders a logo from a URL or inline React element with consistent sizing. Also called a wordmark or brand mark.
@@ -302,3 +308,9 @@ Hover- or focus-triggered label for brief help about a control or term. Also cal
302
308
  - category: Display, status: stable
303
309
  Semantic text primitives for display and standard headings, paragraphs, lists, quotes, links, and inline code. The namespace uses native HTML elements and token-based text roles.
304
310
  - props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .typo (jq: jq '.typo' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
311
+
312
+ ## ViewTools
313
+ - category: Inputs, status: experimental
314
+ Toolbar that limits mouse interaction in the ImFusion main 2D and MPR views to pan, zoom, or windowing, with a reset button for the view group. For a segmented control not tied to the SDK, use ToggleGroup.
315
+ - props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .view-tools (jq: jq '.view-tools' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
316
+ - further reading (usage/anatomy, not props): https://docs.imfusion.com/