@burdenoff/fe-libs 2026.1027.5 → 2026.1027.7

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 (32) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +2 -5
  2. package/dist/chrome/MobileTabBar.d.ts +9 -1
  3. package/dist/chrome/MobileTabBar.js +70 -70
  4. package/dist/node_modules/@openuidev/devtools/dist/index.js +34 -35
  5. package/dist/node_modules/@openuidev/lang-core/dist/index.js +826 -828
  6. package/dist/node_modules/@openuidev/react-lang/dist/index.js +6 -7
  7. package/dist/shared/assistant/openui/library.js +73 -73
  8. package/package.json +1 -1
  9. package/src/shared/styles/native.css +17 -0
  10. package/dist/node_modules/react-dom/cjs/react-dom-client.development.js +0 -11168
  11. package/dist/node_modules/react-dom/cjs/react-dom-client.production.js +0 -7384
  12. package/dist/node_modules/react-dom/client.js +0 -19
  13. package/dist/node_modules/scheduler/cjs/scheduler.development.js +0 -203
  14. package/dist/node_modules/scheduler/cjs/scheduler.production.js +0 -203
  15. package/dist/node_modules/scheduler/index.js +0 -10
  16. package/dist/node_modules/zod/v4/classic/errors.js +0 -23
  17. package/dist/node_modules/zod/v4/classic/iso.js +0 -31
  18. package/dist/node_modules/zod/v4/classic/parse.js +0 -6
  19. package/dist/node_modules/zod/v4/classic/schemas.js +0 -339
  20. package/dist/node_modules/zod/v4/core/api.js +0 -491
  21. package/dist/node_modules/zod/v4/core/checks.js +0 -283
  22. package/dist/node_modules/zod/v4/core/core.js +0 -44
  23. package/dist/node_modules/zod/v4/core/doc.js +0 -23
  24. package/dist/node_modules/zod/v4/core/errors.js +0 -41
  25. package/dist/node_modules/zod/v4/core/json-schema-processors.js +0 -306
  26. package/dist/node_modules/zod/v4/core/parse.js +0 -68
  27. package/dist/node_modules/zod/v4/core/regexes.js +0 -25
  28. package/dist/node_modules/zod/v4/core/registries.js +0 -40
  29. package/dist/node_modules/zod/v4/core/schemas.js +0 -796
  30. package/dist/node_modules/zod/v4/core/to-json-schema.js +0 -222
  31. package/dist/node_modules/zod/v4/core/util.js +0 -266
  32. package/dist/node_modules/zod/v4/core/versions.js +0 -8
@@ -1,14 +1,13 @@
1
- import { __toESM as e } from "../../../../_virtual/_rolldown/runtime.js";
2
- import { ACTION_STEPS as t, BuiltinActionType as n, ToolNotFoundError as r, action as i, buildMessage as a, builtInValidators as o, createParser as s, createStreamingParser as c, defineAction as l, defineFunction as u, extractToolResult as d, generatePrompt as f, generateSystemPrompt as p, isReactiveAssign as m, mergeStatements as h, parseMessage as g, parseRules as _, parseStructuredRules as v, steps as y, tagSchemaId as b, validate as x } from "../../lang-core/dist/index.js";
3
- import { FormNameContext as S, FormValidationContext as C, Renderer as w, WithPreviewRenderer as T, createLibrary$1 as E, defineComponent$1 as D, reactive as O, useCreateFormValidation as k, useFormName as A, useFormValidation as j, useGetFieldValue as M, useIsQueryLoading as N, useIsStreaming as P, useRenderNode as F, useRendererPreview as I, useRendererQuery as L, useSetDefaultValue as R, useSetFieldValue as z, useStateField as B, useTriggerAction as V } from "./exports-CLfR509v.js";
1
+ import { ACTION_STEPS as e, BuiltinActionType as t, ToolNotFoundError as n, action as r, buildMessage as i, builtInValidators as a, createParser as o, createStreamingParser as s, defineAction as c, defineFunction as l, extractToolResult as u, generatePrompt as d, generateSystemPrompt as f, isReactiveAssign as p, mergeStatements as m, parseMessage as h, parseRules as g, parseStructuredRules as _, steps as v, tagSchemaId as y, validate as b } from "../../lang-core/dist/index.js";
2
+ import { FormNameContext as x, FormValidationContext as S, Renderer as C, WithPreviewRenderer as w, createLibrary$1 as T, defineComponent$1 as E, reactive as D, useCreateFormValidation as O, useFormName as k, useFormValidation as A, useGetFieldValue as j, useIsQueryLoading as M, useIsStreaming as N, useRenderNode as P, useRendererPreview as F, useRendererQuery as I, useSetDefaultValue as L, useSetFieldValue as R, useStateField as z, useTriggerAction as B } from "./exports-CLfR509v.js";
4
3
  //#region node_modules/@openuidev/react-lang/dist/index.mjs
5
4
  if (process.env.NODE_ENV === "development") {
6
- let t = Symbol.for("openui.devtools.autoMount"), n = globalThis;
7
- n[t] || (n[t] = !0, Promise.resolve().then(() => {
5
+ let e = Symbol.for("openui.devtools.autoMount"), t = globalThis;
6
+ t[e] || (t[e] = !0, Promise.resolve().then(() => {
8
7
  typeof document > "u" || Promise.all([
9
8
  import("../../devtools/dist/index.js"),
10
9
  import("react"),
11
- import("../../../react-dom/client.js").then((t) => /* @__PURE__ */ e(t.default, 1))
10
+ import("react-dom/client")
12
11
  ]).then(([{ OpenUIDevtools: e }, t, n]) => {
13
12
  let r = () => {
14
13
  let r = document.createElement("div");
@@ -22,4 +21,4 @@ if (process.env.NODE_ENV === "development") {
22
21
  }));
23
22
  }
24
23
  //#endregion
25
- export { t as ACTION_STEPS, n as BuiltinActionType, S as FormNameContext, C as FormValidationContext, w as Renderer, r as ToolNotFoundError, T as WithPreviewRenderer, i as action, a as buildMessage, o as builtInValidators, E as createLibrary, s as createParser, c as createStreamingParser, l as defineAction, D as defineComponent, u as defineFunction, d as extractToolResult, f as generatePrompt, p as generateSystemPrompt, m as isReactiveAssign, h as mergeStatements, g as parseMessage, _ as parseRules, v as parseStructuredRules, O as reactive, y as steps, b as tagSchemaId, k as useCreateFormValidation, A as useFormName, j as useFormValidation, M as useGetFieldValue, N as useIsQueryLoading, P as useIsStreaming, F as useRenderNode, I as useRendererPreview, L as useRendererQuery, R as useSetDefaultValue, z as useSetFieldValue, B as useStateField, V as useTriggerAction, x as validate };
24
+ export { e as ACTION_STEPS, t as BuiltinActionType, x as FormNameContext, S as FormValidationContext, C as Renderer, n as ToolNotFoundError, w as WithPreviewRenderer, r as action, i as buildMessage, a as builtInValidators, T as createLibrary, o as createParser, s as createStreamingParser, c as defineAction, E as defineComponent, l as defineFunction, u as extractToolResult, d as generatePrompt, f as generateSystemPrompt, p as isReactiveAssign, m as mergeStatements, h as parseMessage, g as parseRules, _ as parseStructuredRules, D as reactive, v as steps, y as tagSchemaId, O as useCreateFormValidation, k as useFormName, A as useFormValidation, j as useGetFieldValue, M as useIsQueryLoading, N as useIsStreaming, P as useRenderNode, F as useRendererPreview, I as useRendererQuery, L as useSetDefaultValue, R as useSetFieldValue, z as useStateField, B as useTriggerAction, b as validate };
@@ -1,87 +1,87 @@
1
1
  import { barWidthPercent as e } from "./limits.js";
2
- import { array as t, number as n, object as r, string as i, union as a } from "../../../node_modules/zod/v4/classic/schemas.js";
3
- import { createLibrary$1 as o, defineComponent$1 as s, useRenderNode as c } from "../../../node_modules/@openuidev/react-lang/dist/exports-CLfR509v.js";
2
+ import { createLibrary$1 as t, defineComponent$1 as n, useRenderNode as r } from "../../../node_modules/@openuidev/react-lang/dist/exports-CLfR509v.js";
4
3
  import "../../../node_modules/@openuidev/react-lang/dist/index.js";
5
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ import { z as o } from "zod/v4";
6
6
  //#region src/shared/assistant/openui/library.tsx
7
- var d = ({ items: e, limit: t, className: n, testId: r, cellClassName: i }) => {
8
- let a = c();
9
- return /* @__PURE__ */ l("div", {
7
+ var s = ({ items: e, limit: t, className: n, testId: a, cellClassName: o }) => {
8
+ let s = r();
9
+ return /* @__PURE__ */ i("div", {
10
10
  className: n,
11
- "data-testid": r,
12
- children: e.slice(0, t).map((e, t) => /* @__PURE__ */ l("div", {
13
- className: i,
14
- children: a(e)
11
+ "data-testid": a,
12
+ children: e.slice(0, t).map((e, t) => /* @__PURE__ */ i("div", {
13
+ className: o,
14
+ children: s(e)
15
15
  }, t))
16
16
  });
17
- }, f = a([i(), n()]), p = s({
17
+ }, c = o.union([o.string(), o.number()]), l = n({
18
18
  name: "Stat",
19
19
  description: "One headline figure: a short label, its value, and an optional one-line hint.",
20
- props: r({
21
- label: i().describe("What the figure measures, e.g. \"Open tasks\""),
22
- value: f.describe("The figure itself, e.g. 12 or \"98%\""),
23
- hint: i().optional().describe("Optional context, e.g. \"+3 since yesterday\"")
20
+ props: o.object({
21
+ label: o.string().describe("What the figure measures, e.g. \"Open tasks\""),
22
+ value: c.describe("The figure itself, e.g. 12 or \"98%\""),
23
+ hint: o.string().optional().describe("Optional context, e.g. \"+3 since yesterday\"")
24
24
  }),
25
- component: ({ props: e }) => /* @__PURE__ */ u("div", {
25
+ component: ({ props: e }) => /* @__PURE__ */ a("div", {
26
26
  className: "min-w-0 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5",
27
27
  "data-testid": "assistant-openui-stat",
28
28
  children: [
29
- /* @__PURE__ */ l("div", {
29
+ /* @__PURE__ */ i("div", {
30
30
  className: "truncate text-[12px] text-text-muted",
31
31
  children: e.label
32
32
  }),
33
- /* @__PURE__ */ l("div", {
33
+ /* @__PURE__ */ i("div", {
34
34
  className: "mt-0.5 truncate text-xl font-semibold leading-tight text-text-primary",
35
35
  children: String(e.value)
36
36
  }),
37
- e.hint ? /* @__PURE__ */ l("div", {
37
+ e.hint ? /* @__PURE__ */ i("div", {
38
38
  className: "mt-0.5 truncate text-[12px] text-text-muted",
39
39
  children: e.hint
40
40
  }) : null
41
41
  ]
42
42
  })
43
- }), m = s({
43
+ }), u = n({
44
44
  name: "StatGrid",
45
45
  description: "A row of up to 8 Stat cards for headline numbers.",
46
- props: r({ stats: t(p.ref) }),
47
- component: ({ props: e }) => /* @__PURE__ */ l(d, {
46
+ props: o.object({ stats: o.array(l.ref) }),
47
+ component: ({ props: e }) => /* @__PURE__ */ i(s, {
48
48
  className: "grid grid-cols-2 gap-2",
49
49
  testId: "assistant-openui-stat-grid",
50
50
  items: e.stats,
51
51
  limit: 8,
52
52
  cellClassName: "min-w-0"
53
53
  })
54
- }), h = s({
54
+ }), d = n({
55
55
  name: "DataTable",
56
56
  description: "A table. columns are the header labels (max 8); rows are arrays of cells in the same order (max 50 rows).",
57
- props: r({
58
- columns: t(i()),
59
- rows: t(t(f)),
60
- caption: i().optional()
57
+ props: o.object({
58
+ columns: o.array(o.string()),
59
+ rows: o.array(o.array(c)),
60
+ caption: o.string().optional()
61
61
  }),
62
62
  component: ({ props: e }) => {
63
63
  let t = e.columns.slice(0, 8), n = e.rows.slice(0, 50);
64
- return /* @__PURE__ */ l("div", {
64
+ return /* @__PURE__ */ i("div", {
65
65
  className: "overflow-x-auto rounded-lg border border-border-subtle",
66
66
  "data-testid": "assistant-openui-table",
67
- children: /* @__PURE__ */ u("table", {
67
+ children: /* @__PURE__ */ a("table", {
68
68
  className: "w-full border-collapse text-[0.9em]",
69
69
  children: [
70
- e.caption ? /* @__PURE__ */ l("caption", {
70
+ e.caption ? /* @__PURE__ */ i("caption", {
71
71
  className: "px-2 py-1.5 text-left text-[12px] text-text-muted",
72
72
  children: e.caption
73
73
  }) : null,
74
- /* @__PURE__ */ l("thead", {
74
+ /* @__PURE__ */ i("thead", {
75
75
  className: "bg-bg-sunken",
76
- children: /* @__PURE__ */ l("tr", { children: t.map((e, t) => /* @__PURE__ */ l("th", {
76
+ children: /* @__PURE__ */ i("tr", { children: t.map((e, t) => /* @__PURE__ */ i("th", {
77
77
  scope: "col",
78
78
  className: "px-2 py-1.5 text-left font-semibold text-text-primary",
79
79
  children: e
80
80
  }, t)) })
81
81
  }),
82
- /* @__PURE__ */ l("tbody", { children: n.map((e, n) => /* @__PURE__ */ l("tr", {
82
+ /* @__PURE__ */ i("tbody", { children: n.map((e, n) => /* @__PURE__ */ i("tr", {
83
83
  className: "border-t border-border-subtle",
84
- children: t.map((t, n) => /* @__PURE__ */ l("td", {
84
+ children: t.map((t, n) => /* @__PURE__ */ i("td", {
85
85
  className: "px-2 py-1.5 align-top text-text-primary",
86
86
  children: e[n] === void 0 ? "" : String(e[n])
87
87
  }, n))
@@ -90,49 +90,49 @@ var d = ({ items: e, limit: t, className: n, testId: r, cellClassName: i }) => {
90
90
  })
91
91
  });
92
92
  }
93
- }), g = s({
93
+ }), f = n({
94
94
  name: "Bar",
95
95
  description: "One bar of a BarChart: a label and a non-negative number.",
96
- props: r({
97
- label: i(),
98
- value: n()
96
+ props: o.object({
97
+ label: o.string(),
98
+ value: o.number()
99
99
  }),
100
- component: ({ props: e }) => /* @__PURE__ */ u("span", { children: [
100
+ component: ({ props: e }) => /* @__PURE__ */ a("span", { children: [
101
101
  e.label,
102
102
  ": ",
103
103
  e.value
104
104
  ] })
105
- }), _ = s({
105
+ }), p = n({
106
106
  name: "BarChart",
107
107
  description: "A horizontal bar chart comparing up to 20 values. Use for rankings and breakdowns.",
108
- props: r({
109
- title: i().optional(),
110
- bars: t(g.ref)
108
+ props: o.object({
109
+ title: o.string().optional(),
110
+ bars: o.array(f.ref)
111
111
  }),
112
112
  component: ({ props: t }) => {
113
113
  let n = t.bars.slice(0, 20).map((e) => e.props), r = Math.max(0, ...n.map((e) => Number.isFinite(e.value) ? e.value : 0));
114
- return /* @__PURE__ */ u("figure", {
114
+ return /* @__PURE__ */ a("figure", {
115
115
  className: "rounded-lg border border-border-subtle bg-bg-surface p-3",
116
116
  "data-testid": "assistant-openui-bar-chart",
117
- children: [t.title ? /* @__PURE__ */ l("figcaption", {
117
+ children: [t.title ? /* @__PURE__ */ i("figcaption", {
118
118
  className: "mb-2 text-[13px] font-semibold text-text-primary",
119
119
  children: t.title
120
- }) : null, /* @__PURE__ */ l("ul", {
120
+ }) : null, /* @__PURE__ */ i("ul", {
121
121
  className: "space-y-1.5",
122
- children: n.map((t, n) => /* @__PURE__ */ u("li", {
122
+ children: n.map((t, n) => /* @__PURE__ */ a("li", {
123
123
  className: "text-[12px]",
124
- children: [/* @__PURE__ */ u("div", {
124
+ children: [/* @__PURE__ */ a("div", {
125
125
  className: "mb-0.5 flex justify-between gap-2 text-text-primary",
126
- children: [/* @__PURE__ */ l("span", {
126
+ children: [/* @__PURE__ */ i("span", {
127
127
  className: "min-w-0 truncate",
128
128
  children: t.label
129
- }), /* @__PURE__ */ l("span", {
129
+ }), /* @__PURE__ */ i("span", {
130
130
  className: "shrink-0 text-text-muted",
131
131
  children: t.value
132
132
  })]
133
- }), /* @__PURE__ */ l("div", {
133
+ }), /* @__PURE__ */ i("div", {
134
134
  className: "h-2 overflow-hidden rounded-full bg-bg-sunken",
135
- children: /* @__PURE__ */ l("div", {
135
+ children: /* @__PURE__ */ i("div", {
136
136
  className: "h-full rounded-full bg-action-primary-bg",
137
137
  style: { width: `${e(t.value, r)}%` }
138
138
  })
@@ -141,51 +141,51 @@ var d = ({ items: e, limit: t, className: n, testId: r, cellClassName: i }) => {
141
141
  })]
142
142
  });
143
143
  }
144
- }), v = s({
144
+ }), m = n({
145
145
  name: "Callout",
146
146
  description: "A short highlighted note: a one-line title and a sentence or two of body.",
147
- props: r({
148
- title: i(),
149
- body: i().optional()
147
+ props: o.object({
148
+ title: o.string(),
149
+ body: o.string().optional()
150
150
  }),
151
- component: ({ props: e }) => /* @__PURE__ */ u("div", {
151
+ component: ({ props: e }) => /* @__PURE__ */ a("div", {
152
152
  className: "rounded-lg border border-border-default bg-bg-sunken px-3 py-2",
153
153
  role: "note",
154
154
  "data-testid": "assistant-openui-callout",
155
- children: [/* @__PURE__ */ l("div", {
155
+ children: [/* @__PURE__ */ i("div", {
156
156
  className: "text-[13px] font-semibold text-text-primary",
157
157
  children: e.title
158
- }), e.body ? /* @__PURE__ */ l("div", {
158
+ }), e.body ? /* @__PURE__ */ i("div", {
159
159
  className: "mt-0.5 text-[13px] leading-relaxed text-text-muted",
160
160
  children: e.body
161
161
  }) : null]
162
162
  })
163
- }), y = o({
163
+ }), h = t({
164
164
  components: [
165
- s({
165
+ n({
166
166
  name: "Stack",
167
167
  description: "The root: lays out up to 12 blocks (StatGrid, DataTable, BarChart, Callout) top to bottom.",
168
- props: r({ children: t(a([
169
- m.ref,
170
- h.ref,
171
- _.ref,
172
- v.ref
168
+ props: o.object({ children: o.array(o.union([
169
+ u.ref,
170
+ d.ref,
171
+ p.ref,
172
+ m.ref
173
173
  ])) }),
174
- component: ({ props: e }) => /* @__PURE__ */ l(d, {
174
+ component: ({ props: e }) => /* @__PURE__ */ i(s, {
175
175
  className: "my-2 flex flex-col gap-2",
176
176
  testId: "assistant-openui-stack",
177
177
  items: e.children,
178
178
  limit: 12
179
179
  })
180
180
  }),
181
- m,
181
+ u,
182
+ l,
183
+ d,
182
184
  p,
183
- h,
184
- _,
185
- g,
186
- v
185
+ f,
186
+ m
187
187
  ],
188
188
  root: "Stack"
189
189
  });
190
190
  //#endregion
191
- export { y as default };
191
+ export { h as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.1027.5",
3
+ "version": "2026.1027.7",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {
@@ -252,10 +252,27 @@ body.keyboard-open [data-native-shell] main {
252
252
  backdrop-filter: saturate(180%) blur(20px);
253
253
  }
254
254
 
255
+ /* Normal flow, not absolutely centered: with 5+ trailing actions (context,
256
+ search, notifications, profile, plus a leading hamburger) an
257
+ absolutely-positioned title ignores the row's actual layout and visually
258
+ overlaps the icons instead of yielding space to them. Flex "centers" it
259
+ well enough when lead/trailing are similar widths, and truncates instead
260
+ of overlapping when they are not — same mechanism Android already used
261
+ below, just keeping iOS's centered alignment. */
255
262
  .platform-ios [data-native-topbar] .native-topbar__title {
263
+ position: static;
264
+ margin: 0;
265
+ max-width: none;
266
+ min-width: 0;
267
+ flex: 1 1 auto;
256
268
  text-align: center;
257
269
  }
258
270
 
271
+ .platform-ios [data-native-topbar] .native-topbar__lead,
272
+ .platform-ios [data-native-topbar] .native-topbar__actions {
273
+ flex: 0 0 auto;
274
+ }
275
+
259
276
  /* Android: opaque 56px bar, title left-aligned next to the back arrow, and no
260
277
  iOS-style back TEXT label. */
261
278
  .platform-android [data-native-topbar] {