@imfusion/web-ui 0.8.1-dev.1.g11d9ffbe → 0.8.1-dev.18.g2355b181

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/README.md +17 -17
  3. package/dist/components/account-card/account-card.d.ts +42 -12
  4. package/dist/components/card/card.d.ts +15 -1
  5. package/dist/components/field/field.d.ts +5 -2
  6. package/dist/components/slider/slider.d.ts +11 -1
  7. package/dist/components/typo/typo.d.ts +5 -0
  8. package/dist/index.js +1298 -1221
  9. package/dist/integrations/frame-selection/frame-selection-view.d.ts +24 -0
  10. package/dist/integrations/frame-selection/frame-selection.d.ts +21 -0
  11. package/dist/integrations/frame-selection/frame-selection.meta.d.ts +2 -0
  12. package/dist/integrations/frame-selection/index.d.ts +2 -0
  13. package/dist/integrations/frame-selection.js +121 -0
  14. package/dist/integrations/image-display-options.js +71 -70
  15. package/dist/llms/evals/runner/config.d.ts +1 -0
  16. package/dist/separator-BAxxttef.js +26 -0
  17. package/dist/slider-gyIYWSy3.js +116 -0
  18. package/dist/style.css +1 -1
  19. package/dist/tabs-9d4oaDwZ.js +295 -0
  20. package/dist/utils/break-hints.d.ts +3 -0
  21. package/dist/utils/status-glyphs.d.ts +4 -0
  22. package/dist/vite.js +1 -1
  23. package/dist/web-ui-cli.js +1 -1
  24. package/docs/user-guide/AgentTooling.mdx +8 -3
  25. package/package.json +1 -1
  26. package/src/docgen/doc.gen.json +125 -20
  27. package/src/llms/llms.gen.txt +9 -3
  28. package/src/llms/skills/imf-web-ui/SKILL.md +2 -0
  29. package/src/llms/skills/imf-web-ui-audit/SKILL.md +5 -3
  30. package/src/llms/skills/imf-web-ui-components/SKILL.md +3 -1
  31. package/src/llms/skills/imf-web-ui-conventions/templates/AUDIT_CHECKLIST.md +1 -0
  32. package/src/llms/skills/imf-web-ui-conventions/topics/authentication.md +2 -1
  33. package/src/llms/skills/imf-web-ui-conventions/topics/data.md +5 -3
  34. package/src/llms/skills/imf-web-ui-conventions/topics/typescript.md +14 -0
  35. package/src/llms/skills/imf-web-ui-setup/SKILL.md +2 -0
  36. package/src/llms/skills/imf-web-ui-update/SKILL.md +37 -6
  37. package/src/llms/skills/imf-web-ui-user-profile/SKILL.md +95 -0
  38. package/src/llms/skills/imf-web-ui-ux/SKILL.md +2 -0
  39. package/dist/tabs-BS6rqrrA.js +0 -398
  40. /package/dist/{paths-Oi0v8x-w.js → paths-CUyf9wjm.js} +0 -0
@@ -50,6 +50,7 @@ sections one to one — change a topic's sections and this file follows in the s
50
50
 
51
51
  - [ ] Types
52
52
  - [ ] Immutability & expressions
53
+ - [ ] Functions
53
54
  - [ ] Naming
54
55
 
55
56
  ## Styling — `styling`
@@ -19,7 +19,8 @@ Use one server-backed current-user query as the identity source:
19
19
 
20
20
  - Put it in `api/auth/queries.ts` and define its key and schema with the [data.md](data.md) pattern.
21
21
  - Expose query options as `context.api.auth.getUser()`.
22
- - Call `ensureQueryData` in a loader or a query hook in a component.
22
+ - Call `queryClient.query({ ...options, staleTime: "static" })` in a loader (see [data.md](data.md)) or a query hook in a
23
+ component.
23
24
  - Keep credentials and access tokens out of React state.
24
25
  - Do not infer authentication from local storage, decoded tokens, route flags, or permission-gated UI.
25
26
 
@@ -85,9 +85,11 @@ export function getDetails(options?: QueryOptions<User>) {
85
85
  }
86
86
  ```
87
87
 
88
- Callers choose `ensureQueryData`, `useSuspenseQuery`, or another Query API. Mutation factories likewise return
89
- `mutationOptions`, own their mutation key and parsing, and are passed to `useMutation`; do not inline those options at the
90
- call site.
88
+ Callers choose `queryClient.query`, `useSuspenseQuery`, or another Query API. A router loader reads the cache with
89
+ `queryClient.query({ ...options, staleTime: "static" })`, not the deprecated `ensureQueryData` or `fetchQuery`. Keep
90
+ `"static"`: without it the factory's `staleTime` applies (default 0), so every loader run waits on the network and the page's
91
+ `useQuery` refetches on mount. Mutation factories likewise return `mutationOptions`, own their mutation key and parsing, and
92
+ are passed to `useMutation`; do not inline those options at the call site.
91
93
 
92
94
  ## Router context access
93
95
 
@@ -30,6 +30,20 @@ input. Use `toSorted` and `toReversed` instead of their mutating counterparts.
30
30
  A loop is fine when it has a real early exit or measured hot-path benefit. A long chain or a `reduce` with several jobs wants
31
31
  named intermediate values.
32
32
 
33
+ ## Functions
34
+
35
+ Declare a named function with `function`, including a local helper inside a component. A callback passed inline as a prop or
36
+ argument stays an arrow.
37
+
38
+ ```tsx
39
+ function resetCaptcha() {
40
+ captcha.current?.reset();
41
+ }
42
+
43
+ <Button onClick={() => setOpen(true)}>Open</Button>;
44
+ items.map(item => item.id);
45
+ ```
46
+
33
47
  ## Naming
34
48
 
35
49
  Name what a value is, not how it is built. Booleans read as assertions (`isOpen`, `hasAccess`, `canSubmit`). Props use `onX`;
@@ -15,6 +15,8 @@ working choices.
15
15
 
16
16
  ## Workflow
17
17
 
18
+ Invoke `imf-web-ui-user-profile` first and explain at its levels throughout.
19
+
18
20
  1. Resolve the scope. A named topic limits the assessment to that topic. A bare invocation means `full`, unless the request
19
21
  is about one topic, in which case that topic is the scope: answer what was asked and offer the wider sweep rather than
20
22
  running it. If the argument is unknown, list the supported topics and point to `imf-web-ui-audit`.
@@ -5,7 +5,7 @@ description:
5
5
  lifecycle hooks. Refresh the base first, verify it, then audit any consumer migration separately. Preserve user work and
6
6
  get approval before each commit."
7
7
  argument-hint: "[--dry-run] [optional version or reason]"
8
- allowed-tools: Bash Read Grep
8
+ allowed-tools: Bash Read Grep Skill
9
9
  ---
10
10
 
11
11
  # Update Web UI
@@ -13,6 +13,22 @@ allowed-tools: Bash Read Grep
13
13
  This workflow has two possible commits: the package/tooling update, then an optional consumer migration. Keep them separate.
14
14
  Never overwrite user changes or commit without fresh approval.
15
15
 
16
+ ## Before you start
17
+
18
+ Invoke `imf-web-ui-user-profile` first and explain at its levels throughout.
19
+
20
+ Open with a short orientation, before any command runs, so the person knows the route and when they will be asked:
21
+
22
+ 1. **Preflight**: check the project and stop on uncommitted work.
23
+ 2. **Base update**: install the new package, refresh the skills and hooks, verify, then ask to commit.
24
+ 3. **Migration check**: read what the new releases changed and report what this project needs; changes and their separate
25
+ commit wait for approval.
26
+ 4. **Full audit**: offer `imf-web-ui-audit full`, a read-only check of the whole project against the conventions, wider than
27
+ what this release changed.
28
+
29
+ Name the decision points up front: `latest` or `dev` when the installed version is a prerelease, the base commit, the
30
+ migration commit, and the audit offer. With `--dry-run`, say the run stops after preflight and changes nothing.
31
+
16
32
  ## Preflight
17
33
 
18
34
  1. Work from the frontend package root. In a monorepo, find the package that owns the Web UI dependency.
@@ -20,9 +36,22 @@ Never overwrite user changes or commit without fresh approval.
20
36
  if another lockfile is the active one.
21
37
  3. Record `git status --short`, the installed Web UI version, the installed skill harness(es), hooks, registrations, and
22
38
  `AGENTS.md` fence.
23
- 4. Check for another npm process and stop on a conflict. Uncommitted work is also a conflict: report it and stop before the
24
- first mutating command, even if it looks unrelated to this workflow: what the update touches is only known once it runs,
25
- and the person can commit, stash, or wave it through in one reply. Never reset, clean, restore, or hide it.
39
+ 4. Check for another npm process in this package and stop on a conflict:
40
+
41
+ ```sh
42
+ pgrep npm # process IDs only
43
+ lsof -a -d cwd -p <pid> -Fn # the folder a process runs in
44
+ ps -o args= -p <pid> # its command, only when that folder is this package
45
+ ```
46
+
47
+ A running install, update, or `ci` in this package is a conflict; a long-running `npm exec` server is not. Full process
48
+ listings such as `pgrep -fl` or `ps aux` print every program's arguments, secrets included, so keep them out of the
49
+ transcript.
50
+
51
+ Uncommitted work is also a conflict: report it and stop before the first mutating command, even if it looks unrelated to
52
+ this workflow: what the update touches is only known once it runs, and the person can commit, stash, or wave it through in
53
+ one reply. Never reset, clean, restore, or hide it.
54
+
26
55
  5. With `--dry-run`, stop after reporting what would happen. Do not install, format, stage, commit, or ask for commit
27
56
  approval.
28
57
 
@@ -87,12 +116,13 @@ Update files : <paths>
87
116
  Held back : <paths or none>
88
117
  Conflicts : <paths or none>
89
118
  Commit : <message or not proposed>
119
+ Next : migration check, then the optional full audit
90
120
  ```
91
121
 
92
122
  Ask: **Approve these update-owned changes and commit them?** Stage only approved update paths and follow the repository's
93
123
  commit workflow.
94
124
 
95
- ## Audit the consumer migration
125
+ ## Check the consumer migration
96
126
 
97
127
  Start this phase only after the base update commit exists. Read `node_modules/@imfusion/web-ui/CHANGELOG.md`: every release
98
128
  section after the pre-update version, up to and including the new one. Each section's highlights, migration guide, and
@@ -119,7 +149,8 @@ releases read, then report separately:
119
149
  Do not infer a replacement from a name. Inspect the implementation, styles, and call sites. If there are no findings, say so
120
150
  and do not make an empty migration commit.
121
151
 
122
- Ask whether to run `imf-web-ui-audit full`. Run it only after an explicit yes.
152
+ Offer `imf-web-ui-audit full` as the next step: the migration check covered what the releases changed, the audit checks the
153
+ whole project against the conventions and changes nothing. Run it only after an explicit yes.
123
154
 
124
155
  For approved migration work, ask: **Approve these consumer migration changes and commit them separately?** Then stage only
125
156
  the approved paths, verify again, and use a separate imperative commit message.
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: imf-web-ui-user-profile
3
+ description:
4
+ "Read or create the person's profile: technical background, experience, how they want things explained, and how they like
5
+ to work. Invoke it first in every Web UI skill, and when the person asks to change their profile or how the agent explains
6
+ or paces work."
7
+ user-invocable: false
8
+ allowed-tools: Bash Read Write
9
+ ---
10
+
11
+ # Fit the work to the person
12
+
13
+ The profile records who the person is and how they learn, so every Web UI workflow explains what they need and paces the work
14
+ the way they like. Read it once per session; later skills in the same session reuse what is already loaded.
15
+
16
+ ## Read the profile
17
+
18
+ Resolve the profile path with the shell, then read that exact path:
19
+
20
+ ```sh
21
+ printf '%s\n' "${XDG_CONFIG_HOME:-$HOME/.config}/imfusion/web-ui/consumer-profile.md"
22
+ ```
23
+
24
+ The profile sits outside the project: it belongs to the person, never to the repository, so read-only promises such as the
25
+ audit's still hold when this skill writes it.
26
+
27
+ When the file exists, apply it and return to the calling workflow without comment. When it is missing, run the interview
28
+ before the workflow starts. When the router skips companions for a small task, do the task first and offer the interview
29
+ afterwards.
30
+
31
+ ## Interview
32
+
33
+ Open with one question: may you ask six short questions and save the answers to the profile path, so every later workflow
34
+ fits them and they are never asked again? Mention that they can decline any single question. On no, use the defaults below
35
+ for this session and do not offer the interview again in it.
36
+
37
+ On yes, ask one question per message, in plain prose, and wait for each answer:
38
+
39
+ 1. What is your name?
40
+ 2. What is your technical background: the languages and tools you work with?
41
+ 3. How much have you built for the web, for example with React, HTML, and CSS?
42
+ 4. Beyond Git, how comfortable are you with npm and the terminal?
43
+ 5. How much explanation do you want: just the results, a short gloss for new terms, or the reasoning behind each step?
44
+ 6. How do you like to work: pause after every step, pause after each finished piece, or work freely and stop only before a
45
+ commit?
46
+
47
+ Derive the levels from the answers; ask a short follow-up only when an answer fits no level. The person can decline any
48
+ question: its field stays out of the file, and its default applies: `some`, `comfortable`, `terms`, `slice`.
49
+
50
+ ## The file
51
+
52
+ Show the profile below before writing it. The person can correct or remove any line, or reject the whole profile; on a
53
+ rejection, save nothing and use the defaults for this session. After they confirm, write it and name its path so they can
54
+ edit or delete it later:
55
+
56
+ ```markdown
57
+ ---
58
+ name: <their name>
59
+ frontend: none | some | seasoned
60
+ tooling: new | comfortable
61
+ explanation: results | terms | reasoning
62
+ pace: step | slice | commit
63
+ ---
64
+
65
+ ## Background
66
+
67
+ <their answer to question 2, in their words>
68
+
69
+ ## Notes
70
+
71
+ - <lasting preferences learned later>
72
+ ```
73
+
74
+ When the write fails, keep the answers for this session. When the person later states a lasting preference about how to work
75
+ with them, such as a language, a term they want avoided, or a tool they already know, add it under `Notes` and tell them.
76
+ When they ask to change their profile, run the interview again with the current answers as defaults.
77
+
78
+ ## Apply the profile
79
+
80
+ The fields apply independently.
81
+
82
+ - **Name**: address the person by name.
83
+ - **Background**: explain by analogy to what they already know, such as a component compared to a class for a Java developer.
84
+ - **Frontend `none` or `some`**: give a one-line gloss the first time a frontend term appears, such as component, prop,
85
+ design token, CSS layer, or Storybook. For `none`, also say what a finding means for the running app.
86
+ - **Tooling `new`**: gloss tooling terms on first use, such as lockfile, dist-tag, prerelease, hook, harness, or the
87
+ `AGENTS.md` fence; say in one plain sentence what each command does before it runs, read-only checks included; and before
88
+ an approval question, say what yes changes and how to undo it.
89
+ - **Explanation**: `results` adds nothing beyond what the experience levels call for; `terms` glosses every new term;
90
+ `reasoning` also says why each step happens, and after a report block, what happened and what comes next.
91
+ - **Pace**: `step` ends the reply after each step or phase of the calling workflow and waits for a go-ahead; `slice` pauses
92
+ after each working piece; `commit` runs freely between the workflow's own approval points.
93
+
94
+ Pace adds pauses on top of the calling workflow's approval gates and keeps every one of them. Put explanations around report
95
+ blocks and approval questions, never inside them.
@@ -10,6 +10,8 @@ description:
10
10
  Use this skill for screen-level decisions. Verify component APIs with `imf-web-ui-components`; put code and styling rules in
11
11
  `imf-web-ui-conventions`.
12
12
 
13
+ Invoke `imf-web-ui-user-profile` first and explain at its levels throughout.
14
+
13
15
  The identity index marks components as stable or experimental. Experimental components are usable, but prefer wrapping one
14
16
  when it is used across many call sites so API movement stays local.
15
17
 
@@ -1,398 +0,0 @@
1
- import { t as e } from "./chunk-DmhlhrBa.js";
2
- import { cva as t } from "class-variance-authority";
3
- import { jsx as n } from "react/jsx-runtime";
4
- import { Children as r, useCallback as i } from "react";
5
- import { Slider as a } from "@base-ui/react/slider";
6
- import { Switch as o } from "@base-ui/react/switch";
7
- import { Toggle as s } from "@base-ui/react/toggle";
8
- import { ToggleGroup as c } from "@base-ui/react/toggle-group";
9
- import { Tabs as l } from "@base-ui/react/tabs";
10
- //#region src/utils/resolve-state-props.ts
11
- function u(e, t) {
12
- return e instanceof Function ? e(t) : e;
13
- }
14
- function d(e, t) {
15
- return u(e, t);
16
- }
17
- function f(e, t) {
18
- return u(e, t);
19
- }
20
- var p = {
21
- control: "imf-ui-slider-module-control",
22
- indicator: "imf-ui-slider-module-indicator",
23
- label: "imf-ui-slider-module-label",
24
- root: "imf-ui-slider-module-root",
25
- thumb: "imf-ui-slider-module-thumb",
26
- track: "imf-ui-slider-module-track",
27
- value: "imf-ui-slider-module-value"
28
- }, m = /* @__PURE__ */ e({
29
- Control: () => w,
30
- Indicator: () => E,
31
- Label: () => S,
32
- Root: () => x,
33
- Thumb: () => D,
34
- Track: () => T,
35
- Value: () => C
36
- }), ee = t(p.root), h = t(p.label), g = t(p.value), _ = t(p.control), v = t(p.track), y = t(p.indicator), b = t(p.thumb);
37
- function x({ value: e, defaultValue: t, onValueChange: r, onValueCommitted: i, min: o = 0, max: s = 100, step: c = 1, largeStep: l = 10, minStepsBetweenValues: u = 0, disabled: f = !1, orientation: p = "horizontal", name: m, form: h, locale: g, thumbAlignment: _ = "edge", thumbCollisionBehavior: v = "push", format: y, ...b }) {
38
- return /* @__PURE__ */ n(a.Root, {
39
- ...b,
40
- "data-imf-ui-component": "Slider.Root",
41
- "data-orientation": p,
42
- className: (e) => ee({ className: d(b.className, e) }),
43
- value: e,
44
- defaultValue: t,
45
- onValueChange: r,
46
- onValueCommitted: i,
47
- min: o,
48
- max: s,
49
- step: c,
50
- largeStep: l,
51
- minStepsBetweenValues: u,
52
- disabled: f,
53
- orientation: p,
54
- name: m,
55
- form: h,
56
- locale: g,
57
- thumbAlignment: _,
58
- thumbCollisionBehavior: v,
59
- format: y
60
- });
61
- }
62
- x.displayName = "Slider.Root";
63
- function S(e) {
64
- return /* @__PURE__ */ n(a.Label, {
65
- ...e,
66
- "data-imf-ui-component": "Slider.Label",
67
- className: (t) => h({ className: d(e.className, t) })
68
- });
69
- }
70
- S.displayName = "Slider.Label";
71
- function C({ children: e, ...t }) {
72
- return /* @__PURE__ */ n(a.Value, {
73
- ...t,
74
- "data-imf-ui-component": "Slider.Value",
75
- className: (e) => g({ className: d(t.className, e) }),
76
- children: e
77
- });
78
- }
79
- C.displayName = "Slider.Value";
80
- function w(e) {
81
- return /* @__PURE__ */ n(a.Control, {
82
- ...e,
83
- "data-imf-ui-component": "Slider.Control",
84
- className: (t) => _({ className: d(e.className, t) })
85
- });
86
- }
87
- w.displayName = "Slider.Control";
88
- function T(e) {
89
- return /* @__PURE__ */ n(a.Track, {
90
- ...e,
91
- "data-imf-ui-component": "Slider.Track",
92
- className: (t) => v({ className: d(e.className, t) })
93
- });
94
- }
95
- T.displayName = "Slider.Track";
96
- function E(e) {
97
- return /* @__PURE__ */ n(a.Indicator, {
98
- ...e,
99
- "data-imf-ui-component": "Slider.Indicator",
100
- className: (t) => y({ className: d(e.className, t) })
101
- });
102
- }
103
- E.displayName = "Slider.Indicator";
104
- function D({ index: e, ...t }) {
105
- return /* @__PURE__ */ n(a.Thumb, {
106
- ...t,
107
- "data-imf-ui-component": "Slider.Thumb",
108
- className: (e) => b({ className: d(t.className, e) }),
109
- index: e
110
- });
111
- }
112
- D.displayName = "Slider.Thumb";
113
- var O = {
114
- root: "imf-ui-switch-module-root",
115
- thumb: "imf-ui-switch-module-thumb"
116
- }, te = /* @__PURE__ */ e({
117
- Root: () => A,
118
- Thumb: () => j
119
- }), ne = t(O.root), k = t(O.thumb);
120
- function A(e) {
121
- return /* @__PURE__ */ n(o.Root, {
122
- ...e,
123
- "data-imf-ui-component": "Switch.Root",
124
- className: (t) => ne({ className: d(e.className, t) })
125
- });
126
- }
127
- A.displayName = "Switch.Root";
128
- function j(e) {
129
- return /* @__PURE__ */ n(o.Thumb, {
130
- ...e,
131
- "data-imf-ui-component": "Switch.Thumb",
132
- className: (t) => k({ className: d(e.className, t) })
133
- });
134
- }
135
- j.displayName = "Switch.Thumb";
136
- //#endregion
137
- //#region src/components/toggle/toggle.tsx
138
- var M = t({ root: "imf-ui-toggle-module-root" }.root), N = 2;
139
- function P(e) {
140
- let t = 0;
141
- return r.forEach(e, (e) => {
142
- typeof e == "string" || typeof e == "number" ? t += String(e).trim().length : e != null && typeof e != "boolean" && (t += N);
143
- }), t;
144
- }
145
- function F({ style: e, children: t, ...r }) {
146
- let i = {
147
- "--glyph-count": P(t),
148
- "--max-glyphs": N
149
- };
150
- return /* @__PURE__ */ n(s, {
151
- ...r,
152
- "data-imf-ui-component": "Toggle",
153
- style: (t) => ({
154
- ...i,
155
- ...f(e, t)
156
- }),
157
- className: (e) => M({ className: d(r.className, e) }),
158
- children: t
159
- });
160
- }
161
- //#endregion
162
- //#region src/components/toggle-group/toggle-group.tsx
163
- var I = t({ root: "imf-ui-toggle-group-module-root" }.root);
164
- function L(e) {
165
- return /* @__PURE__ */ n(c, {
166
- ...e,
167
- "data-imf-ui-component": "ToggleGroup",
168
- className: (t) => I({ className: d(e.className, t) })
169
- });
170
- }
171
- var R = {
172
- alignCenter: "imf-ui-row-module-alignCenter",
173
- alignEnd: "imf-ui-row-module-alignEnd",
174
- alignStart: "imf-ui-row-module-alignStart",
175
- alignStretch: "imf-ui-row-module-alignStretch",
176
- gap1: "imf-ui-row-module-gap1",
177
- gap10: "imf-ui-row-module-gap10",
178
- gap2: "imf-ui-row-module-gap2",
179
- gap3: "imf-ui-row-module-gap3",
180
- gap4: "imf-ui-row-module-gap4",
181
- gap5: "imf-ui-row-module-gap5",
182
- gap6: "imf-ui-row-module-gap6",
183
- gap7: "imf-ui-row-module-gap7",
184
- gap8: "imf-ui-row-module-gap8",
185
- gap9: "imf-ui-row-module-gap9",
186
- justifyAround: "imf-ui-row-module-justifyAround",
187
- justifyBetween: "imf-ui-row-module-justifyBetween",
188
- justifyCenter: "imf-ui-row-module-justifyCenter",
189
- justifyEnd: "imf-ui-row-module-justifyEnd",
190
- justifyEvenly: "imf-ui-row-module-justifyEvenly",
191
- justifyStart: "imf-ui-row-module-justifyStart",
192
- root: "imf-ui-row-module-root",
193
- wrap: "imf-ui-row-module-wrap"
194
- }, z = t(R.root, { variants: {
195
- gap: {
196
- 1: R.gap1,
197
- 2: R.gap2,
198
- 3: R.gap3,
199
- 4: R.gap4,
200
- 5: R.gap5,
201
- 6: R.gap6,
202
- 7: R.gap7,
203
- 8: R.gap8,
204
- 9: R.gap9,
205
- 10: R.gap10
206
- },
207
- align: {
208
- start: R.alignStart,
209
- center: R.alignCenter,
210
- end: R.alignEnd,
211
- stretch: R.alignStretch
212
- },
213
- justify: {
214
- start: R.justifyStart,
215
- center: R.justifyCenter,
216
- end: R.justifyEnd,
217
- between: R.justifyBetween,
218
- around: R.justifyAround,
219
- evenly: R.justifyEvenly
220
- },
221
- wrap: {
222
- true: R.wrap,
223
- false: null
224
- }
225
- } });
226
- function B({ gap: e = "2", align: t = "stretch", justify: r = "start", wrap: i = !1, ...a }) {
227
- return /* @__PURE__ */ n("div", {
228
- ...a,
229
- "data-imf-ui-component": "Row",
230
- className: z({
231
- gap: e,
232
- align: t,
233
- justify: r,
234
- wrap: i,
235
- className: a.className
236
- })
237
- });
238
- }
239
- var V = {
240
- alignCenter: "imf-ui-stack-module-alignCenter",
241
- alignEnd: "imf-ui-stack-module-alignEnd",
242
- alignStart: "imf-ui-stack-module-alignStart",
243
- alignStretch: "imf-ui-stack-module-alignStretch",
244
- gap0: "imf-ui-stack-module-gap0",
245
- gap1: "imf-ui-stack-module-gap1",
246
- gap10: "imf-ui-stack-module-gap10",
247
- gap2: "imf-ui-stack-module-gap2",
248
- gap3: "imf-ui-stack-module-gap3",
249
- gap4: "imf-ui-stack-module-gap4",
250
- gap5: "imf-ui-stack-module-gap5",
251
- gap6: "imf-ui-stack-module-gap6",
252
- gap7: "imf-ui-stack-module-gap7",
253
- gap8: "imf-ui-stack-module-gap8",
254
- gap9: "imf-ui-stack-module-gap9",
255
- justifyAround: "imf-ui-stack-module-justifyAround",
256
- justifyBetween: "imf-ui-stack-module-justifyBetween",
257
- justifyCenter: "imf-ui-stack-module-justifyCenter",
258
- justifyEnd: "imf-ui-stack-module-justifyEnd",
259
- justifyEvenly: "imf-ui-stack-module-justifyEvenly",
260
- justifyStart: "imf-ui-stack-module-justifyStart",
261
- root: "imf-ui-stack-module-root"
262
- }, H = t(V.root, { variants: {
263
- gap: {
264
- 0: V.gap0,
265
- 1: V.gap1,
266
- 2: V.gap2,
267
- 3: V.gap3,
268
- 4: V.gap4,
269
- 5: V.gap5,
270
- 6: V.gap6,
271
- 7: V.gap7,
272
- 8: V.gap8,
273
- 9: V.gap9,
274
- 10: V.gap10
275
- },
276
- align: {
277
- start: V.alignStart,
278
- center: V.alignCenter,
279
- end: V.alignEnd,
280
- stretch: V.alignStretch
281
- },
282
- justify: {
283
- start: V.justifyStart,
284
- center: V.justifyCenter,
285
- end: V.justifyEnd,
286
- between: V.justifyBetween,
287
- around: V.justifyAround,
288
- evenly: V.justifyEvenly
289
- }
290
- } });
291
- function U({ gap: e = "4", align: t = "stretch", justify: r = "start", ...i }) {
292
- return /* @__PURE__ */ n("div", {
293
- ...i,
294
- "data-imf-ui-component": "Stack",
295
- className: H({
296
- gap: e,
297
- align: t,
298
- justify: r,
299
- className: i.className
300
- })
301
- });
302
- }
303
- var W = {
304
- indicator: "imf-ui-tabs-module-indicator",
305
- list: "imf-ui-tabs-module-list",
306
- listFill: "imf-ui-tabs-module-listFill",
307
- panel: "imf-ui-tabs-module-panel",
308
- panelViewport: "imf-ui-tabs-module-panelViewport",
309
- root: "imf-ui-tabs-module-root",
310
- tab: "imf-ui-tabs-module-tab"
311
- }, G = /* @__PURE__ */ e({
312
- Indicator: () => Z,
313
- List: () => Y,
314
- Panel: () => $,
315
- PanelViewport: () => Q,
316
- Root: () => J,
317
- Tab: () => X
318
- }), K = t(W.list, { variants: { fill: {
319
- true: W.listFill,
320
- false: null
321
- } } }), re = t(W.root), ie = t(W.tab), ae = t(W.indicator), oe = t(W.panelViewport), se = t(W.panel);
322
- function q(e, t) {
323
- typeof e == "function" ? e(t) : e && (e.current = t);
324
- }
325
- function ce(e) {
326
- let t = new ResizeObserver(() => {
327
- let t = e.dataset.orientation === "vertical" ? e.scrollHeight > e.clientHeight : e.scrollWidth > e.clientWidth;
328
- e.toggleAttribute("data-overflowing", t);
329
- }), n = () => {
330
- t.disconnect(), t.observe(e);
331
- for (let n of e.children) t.observe(n);
332
- }, r = new MutationObserver(n);
333
- return r.observe(e, { childList: !0 }), n(), () => {
334
- t.disconnect(), r.disconnect();
335
- };
336
- }
337
- function J(e) {
338
- return /* @__PURE__ */ n(l.Root, {
339
- ...e,
340
- "data-imf-ui-component": "Tabs.Root",
341
- className: (t) => re({ className: d(e.className, t) })
342
- });
343
- }
344
- J.displayName = "Tabs.Root";
345
- function Y({ fill: e = !1, ref: t, ...r }) {
346
- let a = i((e) => {
347
- if (!e) return;
348
- q(t, e);
349
- let n = ce(e);
350
- return () => {
351
- n(), q(t, null);
352
- };
353
- }, [t]);
354
- return /* @__PURE__ */ n(l.List, {
355
- ...r,
356
- ref: a,
357
- "data-imf-ui-component": "Tabs.List",
358
- className: (t) => K({
359
- fill: e,
360
- className: d(r.className, t)
361
- })
362
- });
363
- }
364
- Y.displayName = "Tabs.List";
365
- function X(e) {
366
- return /* @__PURE__ */ n(l.Tab, {
367
- ...e,
368
- "data-imf-ui-component": "Tabs.Tab",
369
- className: (t) => ie({ className: d(e.className, t) })
370
- });
371
- }
372
- X.displayName = "Tabs.Tab";
373
- function Z(e) {
374
- return /* @__PURE__ */ n(l.Indicator, {
375
- ...e,
376
- "data-imf-ui-component": "Tabs.Indicator",
377
- className: (t) => ae({ className: d(e.className, t) })
378
- });
379
- }
380
- Z.displayName = "Tabs.Indicator";
381
- function Q(e) {
382
- return /* @__PURE__ */ n("div", {
383
- ...e,
384
- "data-imf-ui-component": "Tabs.PanelViewport",
385
- className: oe({ className: e.className })
386
- });
387
- }
388
- Q.displayName = "Tabs.PanelViewport";
389
- function $(e) {
390
- return /* @__PURE__ */ n(l.Panel, {
391
- ...e,
392
- "data-imf-ui-component": "Tabs.Panel",
393
- className: (t) => se({ className: d(e.className, t) })
394
- });
395
- }
396
- $.displayName = "Tabs.Panel";
397
- //#endregion
398
- export { d as C, m as S, S as _, J as a, T as b, U as c, F as d, A as f, E as g, w as h, Q as i, B as l, te as m, Y as n, X as o, j as p, $ as r, G as s, Z as t, L as u, x as v, C as x, D as y };
File without changes