@imfusion/web-ui 0.5.1-dev.25.gf0207a31 → 0.5.1-dev.3.g8e0a047a
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/README.md +55 -148
- package/bin/install-skill.js +180 -0
- package/dist/index.d.ts +0 -2
- package/dist/index.js +4317 -4956
- package/dist/integrations/image-display-options.js +1 -1
- package/dist/style.css +1 -1
- package/dist/{tabs-CVp_SgBl.js → tabs-DqBFSqq6.js} +1 -1
- package/package.json +24 -35
- package/src/docgen/doc.gen.json +0 -327
- package/src/llms/llms.gen.txt +0 -12
- package/src/llms/skills/imf-web-ui/SKILL.md +11 -15
- package/src/llms/skills/imf-web-ui-components/SKILL.md +1 -1
- package/src/llms/skills/imf-web-ui-frontend-patterns/SKILL.md +93 -0
- package/src/llms/skills/imf-web-ui-frontend-patterns/references/code-conventions.md +133 -0
- package/src/llms/skills/{imf-web-ui-frontend-conventions/references/react.md → imf-web-ui-frontend-patterns/references/react-patterns.md} +12 -26
- package/src/llms/skills/imf-web-ui-imfusion-frontend-setup/SKILL.md +201 -0
- package/src/llms/skills/imf-web-ui-setup/SKILL.md +57 -0
- package/src/llms/skills/imf-web-ui-ux/SKILL.md +4 -4
- package/src/llms/skills/imf-web-ui-ux/references/forms.md +1 -1
- package/bin/install.js +0 -343
- package/bin/install.test.ts +0 -166
- package/dist/build/vite-css-module-names/index.d.ts +0 -20
- package/dist/build/vite-css-module-names.js +0 -17
- package/dist/components/field/field.d.ts +0 -104
- package/dist/components/field/field.meta.d.ts +0 -2
- package/dist/components/field/index.d.ts +0 -2
- package/dist/components/fieldset/fieldset.d.ts +0 -29
- package/dist/components/fieldset/fieldset.meta.d.ts +0 -2
- package/dist/components/fieldset/index.d.ts +0 -2
- package/src/llms/skills/imf-web-ui-agent-setup/SKILL.md +0 -71
- package/src/llms/skills/imf-web-ui-agent-setup/templates/hooks/baseline-staleness.sh +0 -17
- package/src/llms/skills/imf-web-ui-agent-setup/templates/hooks/post-tool-use.sh +0 -21
- package/src/llms/skills/imf-web-ui-agent-setup/templates/hooks/session-start.sh +0 -4
- package/src/llms/skills/imf-web-ui-agent-setup/templates/hooks/user-prompt-submit.sh +0 -4
- package/src/llms/skills/imf-web-ui-agent-setup/templates/settings.json +0 -37
- package/src/llms/skills/imf-web-ui-frontend-conventions/SKILL.md +0 -45
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/assets.md +0 -23
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/class-names.md +0 -42
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/components.md +0 -63
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/data.md +0 -196
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/docs-structure.md +0 -44
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/git.md +0 -33
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/library-boundary.md +0 -37
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/npm-project.md +0 -57
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/project-structure.md +0 -21
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/stack.md +0 -39
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/styling.md +0 -91
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/testing.md +0 -16
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/tooling.md +0 -76
- package/src/llms/skills/imf-web-ui-frontend-conventions/references/typescript.md +0 -45
- package/src/llms/skills/imf-web-ui-frontend-setup/SKILL.md +0 -89
- package/src/llms/skills/imf-web-ui-frontend-setup/templates/AGENTS.md +0 -34
- package/src/llms/skills/imf-web-ui-frontend-setup/templates/README.md +0 -27
- package/src/llms/skills/imf-web-ui-library-setup/SKILL.md +0 -36
- package/src/llms/skills/imf-web-ui-update/SKILL.md +0 -165
|
@@ -3786,4 +3786,4 @@ function Mo({ className: e, ...t }) {
|
|
|
3786
3786
|
}
|
|
3787
3787
|
Mo.displayName = "Tabs.Panel";
|
|
3788
3788
|
//#endregion
|
|
3789
|
-
export { Hn as $,
|
|
3789
|
+
export { Hn as $, M as $n, Vt as $t, Kr as A, Ue as An, xn as At, Tr as B, J as Bn, pn as Bt, ha as C, st as Cn, Tn as Ct, gi as D, Je as Dn, kn as Dt, hi as E, $e as En, wn as Et, Fr as F, X as Fn, vn as Ft, mr as G, F as Gn, en as Gt, Sr as H, V as Hn, fn as Ht, Nr as I, ke as In, yn as It, fr as J, T as Jn, Jt, pr as K, N as Kn, $t as Kt, Mr as L, Ee as Ln, hn as Lt, zr as M, Pe as Mn, Cn as Mt, Ir as N, Ae as Nn, bn as Nt, mi as O, Ke as On, Dn as Ot, Pr as P, je as Pn, _n as Pt, Kn as Q, k as Qn, Kt as Qt, kr as R, be as Rn, mn as Rt, _a as S, ct as Sn, jn as St, ra as T, rt as Tn, En as Tt, br as U, B as Un, sn as Ut, Cr as V, U as Vn, ln as Vt, hr as W, L as Wn, tn as Wt, Gn as X, ee as Xn, qt as Xt, gr as Y, f as Yn, Zt as Yt, Un as Z, u as Zn, Gt as Zt, Ta as _, _t as _n, In as _t, Do as a, jt as an, D as ar, Yn as at, fa as b, ft as bn, Fn as bt, to as c, Pt as cn, g as cr, ur as ct, Xa as d, Ot as dn, E as dr, Bn as dt, zt as en, A as er, Jn as et, Ua as f, gt as fn, zn as ft, ka as g, vt as gn, Ln as gt, Oa as h, yt as hn, Rn as ht, jo as i, Dt as in, h as ir, er as it, Wr as j, Z as jn, Sn as jt, ai as k, qe as kn, An as kt, $a as l, xt as ln, v as lr, qn as lt, Na as m, Ft as mn, Vn as mt, Oo as n, At as nn, w as nr, $n as nt, ko as o, Et as on, p as or, sr as ot, Ra as p, bt as pn, dr as pt, vr as q, O as qn, Qt as qt, Mo as r, St as rn, m as rr, Xn as rt, bo as s, Tt as sn, _ as sr, cr as st, Ao as t, Lt as tn, d as tr, Qn as tt, Za as u, Ct as un, y as ur, Zn as ut, ma as v, It as vn, Nn as vt, pa as w, it as wn, On as wt, da as x, ut as xn, Mn as xt, ga as y, pt as yn, Pn as yt, Or as z, _e as zn, dn as zt };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imfusion/web-ui",
|
|
3
|
-
"version": "0.5.1-dev.
|
|
3
|
+
"version": "0.5.1-dev.3.g8e0a047a",
|
|
4
4
|
"description": "The official Web UI component library for ImFusion web apps",
|
|
5
5
|
"author": "ImFusion GmbH",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -9,17 +9,10 @@
|
|
|
9
9
|
"access": "restricted"
|
|
10
10
|
},
|
|
11
11
|
"type": "module",
|
|
12
|
-
"engines": {
|
|
13
|
-
"node": ">=24"
|
|
14
|
-
},
|
|
15
|
-
"imports": {
|
|
16
|
-
"#/*": "./src/*",
|
|
17
|
-
"#/storybook/*": "./.storybook/*"
|
|
18
|
-
},
|
|
19
12
|
"module": "./dist/index.js",
|
|
20
13
|
"types": "./dist/index.d.ts",
|
|
21
14
|
"bin": {
|
|
22
|
-
"web-ui-install": "bin/install.js"
|
|
15
|
+
"web-ui-install-skills": "./bin/install-skill.js"
|
|
23
16
|
},
|
|
24
17
|
"exports": {
|
|
25
18
|
".": {
|
|
@@ -30,10 +23,6 @@
|
|
|
30
23
|
"types": "./dist/integrations/*/index.d.ts",
|
|
31
24
|
"import": "./dist/integrations/*.js"
|
|
32
25
|
},
|
|
33
|
-
"./build/*": {
|
|
34
|
-
"types": "./dist/build/*/index.d.ts",
|
|
35
|
-
"import": "./dist/build/*.js"
|
|
36
|
-
},
|
|
37
26
|
"./styles.css": "./dist/style.css",
|
|
38
27
|
"./docgen.json": "./src/docgen/doc.gen.json",
|
|
39
28
|
"./llms.txt": "./src/llms/llms.gen.txt",
|
|
@@ -47,36 +36,37 @@
|
|
|
47
36
|
"bin"
|
|
48
37
|
],
|
|
49
38
|
"scripts": {
|
|
39
|
+
"codegen:docgen": "tsx src/docgen/gen-docgen.ts",
|
|
40
|
+
"codegen:llms": "tsx src/llms/gen-llms.ts",
|
|
41
|
+
"codegen:watch": "tsx watch src/codegen/run.ts",
|
|
42
|
+
"codegen:storybook": "tsx src/codegen/run.ts --storybook",
|
|
43
|
+
"codegen": "tsx src/codegen/run.ts",
|
|
44
|
+
"build": "npm run codegen && rm -rf dist && vite build && npm run codegen:docgen && npm run codegen:llms",
|
|
50
45
|
"dev": "tsx scripts/dev.ts",
|
|
51
46
|
"dev:host": "tsx scripts/dev.ts --host",
|
|
52
47
|
"dev:lib": "concurrently -n codegen,lib -c yellow,blue \"npm run codegen:watch\" \"vite build --watch\"",
|
|
53
|
-
"
|
|
54
|
-
"build:storybook": "npm run codegen:storybook && storybook build",
|
|
55
|
-
"storybook": "npm run codegen:storybook && storybook dev -p 6006 --no-open",
|
|
56
|
-
"storybook:free-ports": "tsx scripts/free-storybook-ports.ts",
|
|
57
|
-
"codegen": "tsx src/codegen/run.ts",
|
|
58
|
-
"codegen:watch": "tsx watch src/codegen/run.ts",
|
|
59
|
-
"codegen:storybook": "tsx src/codegen/run.ts --storybook",
|
|
60
|
-
"codegen:docgen": "tsx src/docgen/gen-docgen.ts",
|
|
61
|
-
"codegen:llms": "tsx src/llms/gen-llms.ts",
|
|
62
|
-
"verify:format": "prettier --check .",
|
|
63
|
-
"verify:lint": "eslint . --cache --max-warnings=0",
|
|
64
|
-
"verify:typecheck": "npm run codegen && tsc -p tsconfig.lib.json --noEmit && tsc -p .storybook/tsconfig.json --noEmit",
|
|
65
|
-
"verify:tests": "vitest run",
|
|
66
|
-
"verify:deps": "tsx scripts/check-pinned-dependencies.ts",
|
|
67
|
-
"verify:changelog": "tsx scripts/verify/changelog.ts",
|
|
68
|
-
"verify:staged": "tsx scripts/verify/staged.ts",
|
|
69
|
-
"verify:full": "tsx scripts/verify/full.ts && npm run verify:tests",
|
|
48
|
+
"typecheck": "npm run codegen && tsc -p tsconfig.lib.json --noEmit && tsc -p .storybook/tsconfig.json --noEmit",
|
|
70
49
|
"format": "prettier --write .",
|
|
71
|
-
"
|
|
50
|
+
"format:check": "prettier --check .",
|
|
51
|
+
"lint": "eslint . --cache --max-warnings=0",
|
|
52
|
+
"lint:fix": "eslint . --cache --fix",
|
|
72
53
|
"lint:inspect": "npx @eslint/config-inspector@latest",
|
|
73
|
-
"test:unit": "vitest run --project unit",
|
|
74
|
-
"test:stories": "vitest run --project storybook",
|
|
75
|
-
"test:watch": "vitest",
|
|
76
54
|
"skills:eval": "node src/llms/evals/run.mjs",
|
|
77
55
|
"skills:eval:dev": "WEB_UI_SKILL_EVAL_ROOT=/private/tmp/web-ui-dev-skill-evals WEB_UI_SKILL_EVAL_RESULTS_DIR=.agents/evals/results WEB_UI_SKILL_EVAL_REPORT_PATH=.agents/evals/REPORT.md WEB_UI_SKILL_EVAL_SKILL_FAMILY=web-ui-dev WEB_UI_SKILL_EVAL_WORKSPACE_LABEL='development repository' node src/llms/evals/run.mjs --scenarios-dir .agents/evals/scenarios --setup .agents/evals/setup-env.sh",
|
|
78
56
|
"skills:eval:compare": "node src/llms/evals/compare.mjs",
|
|
79
57
|
"skills:eval:report": "node src/llms/evals/report.mjs",
|
|
58
|
+
"storybook": "npm run codegen:storybook && storybook dev -p 6006 --no-open",
|
|
59
|
+
"storybook:free-ports": "tsx scripts/free-storybook-ports.ts",
|
|
60
|
+
"build:storybook": "npm run codegen:storybook && storybook build",
|
|
61
|
+
"test": "vitest run",
|
|
62
|
+
"test:unit": "vitest run --project unit",
|
|
63
|
+
"test:stories": "vitest run --project storybook",
|
|
64
|
+
"test:watch": "vitest",
|
|
65
|
+
"verify:preflight": "tsx scripts/verify/full.ts",
|
|
66
|
+
"verify:full": "npm run verify:preflight && npm run test",
|
|
67
|
+
"worktree:create": "tsx scripts/worktrees.ts create",
|
|
68
|
+
"worktree:close": "tsx scripts/worktrees.ts close",
|
|
69
|
+
"worktree:discard": "tsx scripts/worktrees.ts discard",
|
|
80
70
|
"knip": "knip",
|
|
81
71
|
"git:config": "git config core.hooksPath .githooks && git config pull.rebase true && git config merge.ff only"
|
|
82
72
|
},
|
|
@@ -134,7 +124,6 @@
|
|
|
134
124
|
"globals": "15.15.0",
|
|
135
125
|
"jiti": "2.7.0",
|
|
136
126
|
"knip": "6.14.2",
|
|
137
|
-
"lightningcss": "1.32.0",
|
|
138
127
|
"nano-staged": "1.0.2",
|
|
139
128
|
"playwright": "1.60.0",
|
|
140
129
|
"prettier": "3.8.3",
|
package/src/docgen/doc.gen.json
CHANGED
|
@@ -1194,333 +1194,6 @@
|
|
|
1194
1194
|
}
|
|
1195
1195
|
]
|
|
1196
1196
|
},
|
|
1197
|
-
"field": {
|
|
1198
|
-
"root": {
|
|
1199
|
-
"name": "Field.Root",
|
|
1200
|
-
"description": "Field.Root — groups a label, control, validation state, and supporting copy.",
|
|
1201
|
-
"props": [
|
|
1202
|
-
{
|
|
1203
|
-
"name": "actionsRef",
|
|
1204
|
-
"required": false,
|
|
1205
|
-
"type": "RefObject<FieldRootActions | null>",
|
|
1206
|
-
"defaultValue": null,
|
|
1207
|
-
"description": ""
|
|
1208
|
-
},
|
|
1209
|
-
{
|
|
1210
|
-
"name": "className",
|
|
1211
|
-
"required": false,
|
|
1212
|
-
"type": "string | ((state: FieldRootState) => string)",
|
|
1213
|
-
"defaultValue": null,
|
|
1214
|
-
"description": ""
|
|
1215
|
-
},
|
|
1216
|
-
{
|
|
1217
|
-
"name": "dirty",
|
|
1218
|
-
"required": false,
|
|
1219
|
-
"type": "boolean",
|
|
1220
|
-
"defaultValue": null,
|
|
1221
|
-
"description": ""
|
|
1222
|
-
},
|
|
1223
|
-
{
|
|
1224
|
-
"name": "disabled",
|
|
1225
|
-
"required": false,
|
|
1226
|
-
"type": "boolean",
|
|
1227
|
-
"defaultValue": "false",
|
|
1228
|
-
"description": ""
|
|
1229
|
-
},
|
|
1230
|
-
{
|
|
1231
|
-
"name": "invalid",
|
|
1232
|
-
"required": false,
|
|
1233
|
-
"type": "boolean",
|
|
1234
|
-
"defaultValue": null,
|
|
1235
|
-
"description": ""
|
|
1236
|
-
},
|
|
1237
|
-
{
|
|
1238
|
-
"name": "name",
|
|
1239
|
-
"required": false,
|
|
1240
|
-
"type": "string",
|
|
1241
|
-
"defaultValue": null,
|
|
1242
|
-
"description": ""
|
|
1243
|
-
},
|
|
1244
|
-
{
|
|
1245
|
-
"name": "render",
|
|
1246
|
-
"required": false,
|
|
1247
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldRootState>",
|
|
1248
|
-
"defaultValue": null,
|
|
1249
|
-
"description": ""
|
|
1250
|
-
},
|
|
1251
|
-
{
|
|
1252
|
-
"name": "style",
|
|
1253
|
-
"required": false,
|
|
1254
|
-
"type": "| CSSProperties\n| ((state: FieldRootState) => CSSProperties)",
|
|
1255
|
-
"defaultValue": null,
|
|
1256
|
-
"description": ""
|
|
1257
|
-
},
|
|
1258
|
-
{
|
|
1259
|
-
"name": "touched",
|
|
1260
|
-
"required": false,
|
|
1261
|
-
"type": "boolean",
|
|
1262
|
-
"defaultValue": null,
|
|
1263
|
-
"description": ""
|
|
1264
|
-
},
|
|
1265
|
-
{
|
|
1266
|
-
"name": "validate",
|
|
1267
|
-
"required": false,
|
|
1268
|
-
"type": "(\n value: unknown,\n formValues: Record<string, any>\n) =>\n | string\n | string[]\n | Promise<string | string[] | null>\n | null",
|
|
1269
|
-
"defaultValue": null,
|
|
1270
|
-
"description": ""
|
|
1271
|
-
},
|
|
1272
|
-
{
|
|
1273
|
-
"name": "validationDebounceTime",
|
|
1274
|
-
"required": false,
|
|
1275
|
-
"type": "number",
|
|
1276
|
-
"defaultValue": "0",
|
|
1277
|
-
"description": ""
|
|
1278
|
-
},
|
|
1279
|
-
{
|
|
1280
|
-
"name": "validationMode",
|
|
1281
|
-
"required": false,
|
|
1282
|
-
"type": "FormValidationMode",
|
|
1283
|
-
"defaultValue": "onSubmit",
|
|
1284
|
-
"description": ""
|
|
1285
|
-
}
|
|
1286
|
-
]
|
|
1287
|
-
},
|
|
1288
|
-
"subComponents": [
|
|
1289
|
-
{
|
|
1290
|
-
"name": "Field.Control",
|
|
1291
|
-
"description": "Field.Control — a native input control with Field labeling and validation.",
|
|
1292
|
-
"props": [
|
|
1293
|
-
{
|
|
1294
|
-
"name": "className",
|
|
1295
|
-
"required": false,
|
|
1296
|
-
"type": "string | ((state: FieldControlState) => string)",
|
|
1297
|
-
"defaultValue": null,
|
|
1298
|
-
"description": ""
|
|
1299
|
-
},
|
|
1300
|
-
{
|
|
1301
|
-
"name": "defaultValue",
|
|
1302
|
-
"required": false,
|
|
1303
|
-
"type": "string | number | readonly string[]",
|
|
1304
|
-
"defaultValue": null,
|
|
1305
|
-
"description": ""
|
|
1306
|
-
},
|
|
1307
|
-
{
|
|
1308
|
-
"name": "onValueChange",
|
|
1309
|
-
"required": false,
|
|
1310
|
-
"type": "(\n value: string,\n eventDetails: {\n reason: \"none\";\n event: Event;\n cancel: () => void;\n allowPropagation: () => void;\n isCanceled: boolean;\n isPropagationAllowed: boolean;\n trigger: Element;\n }\n) => void",
|
|
1311
|
-
"defaultValue": null,
|
|
1312
|
-
"description": ""
|
|
1313
|
-
},
|
|
1314
|
-
{
|
|
1315
|
-
"name": "render",
|
|
1316
|
-
"required": false,
|
|
1317
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldControlState>",
|
|
1318
|
-
"defaultValue": null,
|
|
1319
|
-
"description": ""
|
|
1320
|
-
},
|
|
1321
|
-
{
|
|
1322
|
-
"name": "style",
|
|
1323
|
-
"required": false,
|
|
1324
|
-
"type": "| CSSProperties\n| ((state: FieldControlState) => CSSProperties)",
|
|
1325
|
-
"defaultValue": null,
|
|
1326
|
-
"description": ""
|
|
1327
|
-
}
|
|
1328
|
-
]
|
|
1329
|
-
},
|
|
1330
|
-
{
|
|
1331
|
-
"name": "Field.Description",
|
|
1332
|
-
"description": "Field.Description — supporting information for a field.",
|
|
1333
|
-
"props": [
|
|
1334
|
-
{
|
|
1335
|
-
"name": "className",
|
|
1336
|
-
"required": false,
|
|
1337
|
-
"type": "| string\n| ((state: FieldDescriptionState) => string)",
|
|
1338
|
-
"defaultValue": null,
|
|
1339
|
-
"description": ""
|
|
1340
|
-
},
|
|
1341
|
-
{
|
|
1342
|
-
"name": "render",
|
|
1343
|
-
"required": false,
|
|
1344
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldDescriptionState>",
|
|
1345
|
-
"defaultValue": null,
|
|
1346
|
-
"description": ""
|
|
1347
|
-
},
|
|
1348
|
-
{
|
|
1349
|
-
"name": "style",
|
|
1350
|
-
"required": false,
|
|
1351
|
-
"type": "| CSSProperties\n| ((state: FieldDescriptionState) => CSSProperties)",
|
|
1352
|
-
"defaultValue": null,
|
|
1353
|
-
"description": ""
|
|
1354
|
-
}
|
|
1355
|
-
]
|
|
1356
|
-
},
|
|
1357
|
-
{
|
|
1358
|
-
"name": "Field.Error",
|
|
1359
|
-
"description": "Field.Error — an inline validation message shown when its match condition fails.",
|
|
1360
|
-
"props": [
|
|
1361
|
-
{
|
|
1362
|
-
"name": "className",
|
|
1363
|
-
"required": false,
|
|
1364
|
-
"type": "string | ((state: FieldErrorState) => string)",
|
|
1365
|
-
"defaultValue": null,
|
|
1366
|
-
"description": ""
|
|
1367
|
-
},
|
|
1368
|
-
{
|
|
1369
|
-
"name": "match",
|
|
1370
|
-
"required": false,
|
|
1371
|
-
"type": "boolean | keyof ValidityState",
|
|
1372
|
-
"defaultValue": null,
|
|
1373
|
-
"description": ""
|
|
1374
|
-
},
|
|
1375
|
-
{
|
|
1376
|
-
"name": "render",
|
|
1377
|
-
"required": false,
|
|
1378
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldErrorState>",
|
|
1379
|
-
"defaultValue": null,
|
|
1380
|
-
"description": ""
|
|
1381
|
-
},
|
|
1382
|
-
{
|
|
1383
|
-
"name": "style",
|
|
1384
|
-
"required": false,
|
|
1385
|
-
"type": "| CSSProperties\n| ((state: FieldErrorState) => CSSProperties)",
|
|
1386
|
-
"defaultValue": null,
|
|
1387
|
-
"description": ""
|
|
1388
|
-
}
|
|
1389
|
-
]
|
|
1390
|
-
},
|
|
1391
|
-
{
|
|
1392
|
-
"name": "Field.Item",
|
|
1393
|
-
"description": "Field.Item — groups one checkable option with its label and description.",
|
|
1394
|
-
"props": [
|
|
1395
|
-
{
|
|
1396
|
-
"name": "className",
|
|
1397
|
-
"required": false,
|
|
1398
|
-
"type": "string | ((state: FieldItemState) => string)",
|
|
1399
|
-
"defaultValue": null,
|
|
1400
|
-
"description": ""
|
|
1401
|
-
},
|
|
1402
|
-
{
|
|
1403
|
-
"name": "disabled",
|
|
1404
|
-
"required": false,
|
|
1405
|
-
"type": "boolean",
|
|
1406
|
-
"defaultValue": "false",
|
|
1407
|
-
"description": ""
|
|
1408
|
-
},
|
|
1409
|
-
{
|
|
1410
|
-
"name": "render",
|
|
1411
|
-
"required": false,
|
|
1412
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldItemState>",
|
|
1413
|
-
"defaultValue": null,
|
|
1414
|
-
"description": ""
|
|
1415
|
-
},
|
|
1416
|
-
{
|
|
1417
|
-
"name": "style",
|
|
1418
|
-
"required": false,
|
|
1419
|
-
"type": "| CSSProperties\n| ((state: FieldItemState) => CSSProperties)",
|
|
1420
|
-
"defaultValue": null,
|
|
1421
|
-
"description": ""
|
|
1422
|
-
}
|
|
1423
|
-
]
|
|
1424
|
-
},
|
|
1425
|
-
{
|
|
1426
|
-
"name": "Field.Label",
|
|
1427
|
-
"description": "Field.Label — an accessible label automatically associated with the control.",
|
|
1428
|
-
"props": [
|
|
1429
|
-
{
|
|
1430
|
-
"name": "className",
|
|
1431
|
-
"required": false,
|
|
1432
|
-
"type": "string | ((state: FieldLabelState) => string)",
|
|
1433
|
-
"defaultValue": null,
|
|
1434
|
-
"description": ""
|
|
1435
|
-
},
|
|
1436
|
-
{
|
|
1437
|
-
"name": "nativeLabel",
|
|
1438
|
-
"required": false,
|
|
1439
|
-
"type": "boolean",
|
|
1440
|
-
"defaultValue": "true",
|
|
1441
|
-
"description": ""
|
|
1442
|
-
},
|
|
1443
|
-
{
|
|
1444
|
-
"name": "render",
|
|
1445
|
-
"required": false,
|
|
1446
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldLabelState>",
|
|
1447
|
-
"defaultValue": null,
|
|
1448
|
-
"description": ""
|
|
1449
|
-
},
|
|
1450
|
-
{
|
|
1451
|
-
"name": "style",
|
|
1452
|
-
"required": false,
|
|
1453
|
-
"type": "| CSSProperties\n| ((state: FieldLabelState) => CSSProperties)",
|
|
1454
|
-
"defaultValue": null,
|
|
1455
|
-
"description": ""
|
|
1456
|
-
}
|
|
1457
|
-
]
|
|
1458
|
-
},
|
|
1459
|
-
{
|
|
1460
|
-
"name": "Field.Validity",
|
|
1461
|
-
"description": "Field.Validity — renderless access to the field validity data for custom messages.\nIts function child owns the rendered element and therefore its identity and styling.",
|
|
1462
|
-
"props": []
|
|
1463
|
-
}
|
|
1464
|
-
]
|
|
1465
|
-
},
|
|
1466
|
-
"fieldset": {
|
|
1467
|
-
"root": {
|
|
1468
|
-
"name": "Fieldset.Root",
|
|
1469
|
-
"description": "Fieldset.Root — semantic grouping for related form controls and a shared legend.",
|
|
1470
|
-
"props": [
|
|
1471
|
-
{
|
|
1472
|
-
"name": "className",
|
|
1473
|
-
"required": false,
|
|
1474
|
-
"type": "string | ((state: FieldsetRootState) => string)",
|
|
1475
|
-
"defaultValue": null,
|
|
1476
|
-
"description": ""
|
|
1477
|
-
},
|
|
1478
|
-
{
|
|
1479
|
-
"name": "render",
|
|
1480
|
-
"required": false,
|
|
1481
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldsetRootState>",
|
|
1482
|
-
"defaultValue": null,
|
|
1483
|
-
"description": ""
|
|
1484
|
-
},
|
|
1485
|
-
{
|
|
1486
|
-
"name": "style",
|
|
1487
|
-
"required": false,
|
|
1488
|
-
"type": "| CSSProperties\n| ((state: FieldsetRootState) => CSSProperties)",
|
|
1489
|
-
"defaultValue": null,
|
|
1490
|
-
"description": ""
|
|
1491
|
-
}
|
|
1492
|
-
]
|
|
1493
|
-
},
|
|
1494
|
-
"subComponents": [
|
|
1495
|
-
{
|
|
1496
|
-
"name": "Fieldset.Legend",
|
|
1497
|
-
"description": "Fieldset.Legend — the accessible label for its related controls.",
|
|
1498
|
-
"props": [
|
|
1499
|
-
{
|
|
1500
|
-
"name": "className",
|
|
1501
|
-
"required": false,
|
|
1502
|
-
"type": "string | ((state: FieldsetLegendState) => string)",
|
|
1503
|
-
"defaultValue": null,
|
|
1504
|
-
"description": ""
|
|
1505
|
-
},
|
|
1506
|
-
{
|
|
1507
|
-
"name": "render",
|
|
1508
|
-
"required": false,
|
|
1509
|
-
"type": "| ReactElement<\n unknown,\n string | JSXElementConstructor<any>\n >\n| ComponentRenderFn<HTMLProps, FieldsetLegendState>",
|
|
1510
|
-
"defaultValue": null,
|
|
1511
|
-
"description": ""
|
|
1512
|
-
},
|
|
1513
|
-
{
|
|
1514
|
-
"name": "style",
|
|
1515
|
-
"required": false,
|
|
1516
|
-
"type": "| CSSProperties\n| ((state: FieldsetLegendState) => CSSProperties)",
|
|
1517
|
-
"defaultValue": null,
|
|
1518
|
-
"description": ""
|
|
1519
|
-
}
|
|
1520
|
-
]
|
|
1521
|
-
}
|
|
1522
|
-
]
|
|
1523
|
-
},
|
|
1524
1197
|
"input": {
|
|
1525
1198
|
"root": {
|
|
1526
1199
|
"name": "Input",
|
package/src/llms/llms.gen.txt
CHANGED
|
@@ -73,18 +73,6 @@ Off-canvas panel that slides in from a screen edge. Use for mobile navigation, s
|
|
|
73
73
|
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .drawer (jq: jq '.drawer' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
74
74
|
- further reading (usage/anatomy, not props): https://base-ui.com/react/components/drawer.md
|
|
75
75
|
|
|
76
|
-
## Field
|
|
77
|
-
- category: Inputs, status: stable
|
|
78
|
-
Accessible field composition for a label, form control, supporting description, and inline validation message. Use it to associate a control such as Input, Checkbox, or Select with field state including valid, invalid, dirty, touched, filled, and focused.
|
|
79
|
-
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .field (jq: jq '.field' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
80
|
-
- further reading (usage/anatomy, not props): https://base-ui.com/react/components/field.md
|
|
81
|
-
|
|
82
|
-
## Fieldset
|
|
83
|
-
- category: Inputs, status: stable
|
|
84
|
-
Semantic grouping for related form controls with a shared legend. Also called a form group; use it to communicate a common topic and propagate disabled state without introducing a decorative container.
|
|
85
|
-
- props: node_modules/@imfusion/web-ui/src/docgen/doc.gen.json -> .fieldset (jq: jq '.fieldset' node_modules/@imfusion/web-ui/src/docgen/doc.gen.json)
|
|
86
|
-
- further reading (usage/anatomy, not props): https://base-ui.com/react/components/fieldset.md
|
|
87
|
-
|
|
88
76
|
## ImageDisplayOptions
|
|
89
77
|
- category: Inputs, status: experimental
|
|
90
78
|
A panel or toolbar of controls bound to an image dataset's display options.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
name: imf-web-ui
|
|
3
3
|
description:
|
|
4
4
|
"Entry point for UI work in a project that depends on @imfusion/web-ui. Decides whether guidance is needed at all, then
|
|
5
|
-
routes to the right companion skill — component reference, UX guidance, or frontend
|
|
6
|
-
|
|
5
|
+
routes to the right companion skill — component reference, UX guidance, or frontend patterns. Load when adding or editing
|
|
6
|
+
UI in a consumer repo."
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# imf-web-ui
|
|
@@ -24,17 +24,16 @@ Guidance skills exist to fill gaps, not to add ceremony to clear tasks.
|
|
|
24
24
|
|
|
25
25
|
## Routing
|
|
26
26
|
|
|
27
|
-
| The task at hand
|
|
28
|
-
|
|
|
29
|
-
| Using a specific component; checking props, sub-components, or defaults
|
|
30
|
-
| First-time setup, adding a library dependency, or components rendering unstyled/broken
|
|
31
|
-
| Building/reshaping a screen or flow; choosing between components; layout, density, hierarchy, states
|
|
32
|
-
| Writing wrappers or custom UI; styling beyond defaults; adding files; TypeScript, naming, testing
|
|
33
|
-
| Setting up or auditing an **ImFusion** repo's tooling: formatting, linting, hooks, scripts, structure
|
|
34
|
-
| Setting up or refreshing agent tooling: vendored skills, lifecycle hooks, dependency-shipped Agent Skills | `imf-web-ui-agent-setup` |
|
|
27
|
+
| The task at hand | Open |
|
|
28
|
+
| ----------------------------------------------------------------------------------------------------- | ------------------------------------ |
|
|
29
|
+
| Using a specific component; checking props, sub-components, or defaults | `imf-web-ui-components` |
|
|
30
|
+
| First-time setup, adding a library dependency, or components rendering unstyled/broken | `imf-web-ui-setup` |
|
|
31
|
+
| Building/reshaping a screen or flow; choosing between components; layout, density, hierarchy, states | `imf-web-ui-ux` |
|
|
32
|
+
| Writing wrappers or custom UI; styling beyond defaults; adding files; TypeScript, naming, testing | `imf-web-ui-frontend-patterns` |
|
|
33
|
+
| Setting up or auditing an **ImFusion** repo's tooling: formatting, linting, hooks, scripts, structure | `imf-web-ui-imfusion-frontend-setup` |
|
|
35
34
|
|
|
36
|
-
The
|
|
37
|
-
|
|
35
|
+
The last row is narrow on purpose. It's for "what is this project missing?" — a question about the repo as a whole. Being
|
|
36
|
+
asked to add one config file is just that edit; make it, and don't open a skill to do so.
|
|
38
37
|
|
|
39
38
|
Tasks routinely span two: building a screen usually means `imf-web-ui-ux` for the shape and `imf-web-ui-components` for the
|
|
40
39
|
APIs. That's normal — open both, in that order.
|
|
@@ -44,9 +43,6 @@ APIs. That's normal — open both, in that order.
|
|
|
44
43
|
TanStack is the recommended tooling library — routing, server state, forms, tables. When a task needs one of those and the
|
|
45
44
|
project has no incumbent, propose it, and read the library's own docs (`npx @tanstack/cli`) rather than working from memory.
|
|
46
45
|
|
|
47
|
-
Much of the suite also ships Agent Skills inside the package, reachable via TanStack Intent. Wiring that up is
|
|
48
|
-
`imf-web-ui-agent-setup`.
|
|
49
|
-
|
|
50
46
|
## When to interview the human
|
|
51
47
|
|
|
52
48
|
`imf-web-ui-ux` contains a short per-feature interview. Run it **only** when both hold:
|
|
@@ -3,7 +3,7 @@ name: imf-web-ui-components
|
|
|
3
3
|
description:
|
|
4
4
|
"Look up @imfusion/web-ui component APIs without reading their source: the two-hop lookup (identity index -> prop data),
|
|
5
5
|
compound components, and integrations. Load when you need the props, sub-components, or defaults of a specific component —
|
|
6
|
-
not for choosing between components (imf-web-ui-ux) or first-time setup (imf-web-ui-
|
|
6
|
+
not for choosing between components (imf-web-ui-ux) or first-time setup (imf-web-ui-setup)."
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# imf-web-ui-components
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: imf-web-ui-frontend-patterns
|
|
3
|
+
description:
|
|
4
|
+
"Raise the quality of frontend code written around @imfusion/web-ui — including quickly vibe-coded frontends. Library
|
|
5
|
+
boundary contract (tokens, CSS layers, type derivation), component roles, state placement, effects discipline, code
|
|
6
|
+
conventions (TypeScript, naming, file organisation, testing), and stack defaults. Load when writing wrapper components,
|
|
7
|
+
custom UI, styling beyond the defaults, adding new files to a consumer app, or choosing a routing, data-fetching, form, or
|
|
8
|
+
table library."
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# imf-web-ui-frontend-patterns
|
|
12
|
+
|
|
13
|
+
One guard, once: **if the host project already has a convention — a styling system, a state library, a folder shape — the
|
|
14
|
+
project wins.** These defaults fill vacuums. They are not a license to refactor a consumer codebase toward this document.
|
|
15
|
+
|
|
16
|
+
Everything else below is how to build.
|
|
17
|
+
|
|
18
|
+
## Stay behind the library
|
|
19
|
+
|
|
20
|
+
Never import Base UI (or any other upstream this library wraps) directly — no upstream stylesheets, no upstream components,
|
|
21
|
+
even when upstream docs show it that way. Everything a component needs ships in `@imfusion/web-ui`. If the library is missing
|
|
22
|
+
something upstream has, report the gap (see `imf-web-ui-components`); don't reach around it.
|
|
23
|
+
|
|
24
|
+
## Style through the sanctioned seams
|
|
25
|
+
|
|
26
|
+
All library styles live in the `imf-ui.components` CSS layer, so **any plain selector you write wins** — that's the whole
|
|
27
|
+
override contract:
|
|
28
|
+
|
|
29
|
+
- Target the stable hooks: `data-imf-ui-component` attributes and your own classes/wrappers.
|
|
30
|
+
- Never target the library's internal class names — they are generated and change without notice.
|
|
31
|
+
- Never `!important` — if you think you need it, you're targeting the wrong thing.
|
|
32
|
+
|
|
33
|
+
## Build custom UI from tokens
|
|
34
|
+
|
|
35
|
+
Anything you build that the library doesn't cover — a stat widget, a custom panel — uses `--imf-ui-*` variables for color,
|
|
36
|
+
spacing, radius, and type instead of hardcoded values. That's what makes custom UI look native next to library components,
|
|
37
|
+
and what keeps it correct when the theme changes. A hex code or a magic `px` next to a concept the tokens already name is a
|
|
38
|
+
defect.
|
|
39
|
+
|
|
40
|
+
## Derive types, don't import them
|
|
41
|
+
|
|
42
|
+
Prop types come from the components themselves: `React.ComponentProps<typeof Button>`. The library deliberately exports no
|
|
43
|
+
`Props` types — don't look for them, and don't re-declare prop shapes by hand.
|
|
44
|
+
|
|
45
|
+
## Integrations own their peers
|
|
46
|
+
|
|
47
|
+
Components under `@imfusion/web-ui/integrations/*` depend on optional peers (e.g. `@tanstack/highlight` for `CodeHighlight`).
|
|
48
|
+
Add the peer explicitly to the consumer's `package.json` — never rely on hoisting.
|
|
49
|
+
|
|
50
|
+
## React patterns
|
|
51
|
+
|
|
52
|
+
The full treatment — component roles with an example, state placement, effects discipline, and the react.dev sources to
|
|
53
|
+
consult while building — lives in [references/react-patterns.md](references/react-patterns.md). Read it before writing new
|
|
54
|
+
screens or wrappers. The core in one breath:
|
|
55
|
+
|
|
56
|
+
- **Three roles.** Dumb components own how things look, layout components own arrangement, smart containers own data and
|
|
57
|
+
logic. Styling never lives in containers.
|
|
58
|
+
- **State lives where its truth lives.** URL → query cache → context → store → local state; walk the list, stop at the first
|
|
59
|
+
match.
|
|
60
|
+
- **Effects are a last resort**, and always extracted into purpose-named hooks.
|
|
61
|
+
- **Compose, don't configure.** If a component's prop list reads like a settings page, it wanted to be two or three
|
|
62
|
+
components.
|
|
63
|
+
|
|
64
|
+
## Everything else about the code
|
|
65
|
+
|
|
66
|
+
TypeScript, naming, where files go, and what's worth testing live in
|
|
67
|
+
[references/code-conventions.md](references/code-conventions.md). Read it when you're adding files rather than editing
|
|
68
|
+
existing ones — that's when these choices get made and then inherited by everything after.
|
|
69
|
+
|
|
70
|
+
The split between the two references: `react-patterns.md` covers **writing React** — component roles, where state lives,
|
|
71
|
+
effects discipline, composition. `code-conventions.md` covers **the code around it** — TypeScript, JS style, naming, file
|
|
72
|
+
layout, testing. Starting a new feature usually wants both.
|
|
73
|
+
|
|
74
|
+
## Stack defaults
|
|
75
|
+
|
|
76
|
+
TanStack is the default for the tooling around web-ui, whether the app is greenfield or you're adding one screen to something
|
|
77
|
+
that already exists. The ones you'll reach for most: **Router** (URL state, type-safe search params), **Query** (server
|
|
78
|
+
state), **Form** (form state), and **Table** for data grids, which you pair with web-ui's styled `Table` parts
|
|
79
|
+
(`Table.SortableHeaderCell` carries the sort glue). The suite goes wider than those four — check what exists before adding a
|
|
80
|
+
non-TanStack dependency. This is the stack the state ladder assumes.
|
|
81
|
+
|
|
82
|
+
`useState` is the right tool for local UI state, and most of it is local: whether a panel is open, which tab is active, a
|
|
83
|
+
draft value being typed, a hover flag. Keep those in the component and don't reach for a library.
|
|
84
|
+
|
|
85
|
+
The line is what the state is _for_, not how much of it there is. A library owns the layer once you find yourself rebuilding
|
|
86
|
+
what it does: validation timing and cross-field rules (**Form**), caching and refetching (**Query**), URL as the source of
|
|
87
|
+
truth (**Router**), sorting and pagination over rows (**Table**). web-ui ships none of that logic, and that absence is not an
|
|
88
|
+
argument for writing it yourself. Adding the library mid-project is normal and cheap; unpicking a hand-rolled version of it
|
|
89
|
+
later is not.
|
|
90
|
+
|
|
91
|
+
For best practices and patterns within any of these libraries, go to the library's own guidance rather than working from
|
|
92
|
+
memory: `npx @tanstack/cli` for docs. Where a project has wired up `@tanstack/intent`, use it to reach the Agent Skills its
|
|
93
|
+
TanStack dependencies ship, and read those too.
|