@revolist/ui 4.0.4-rc → 4.0.6-rc

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 (240) hide show
  1. package/MIGRATION.md +36 -0
  2. package/OWNERSHIP.md +10 -10
  3. package/README.md +22 -4
  4. package/_chunks/arrow-up-Cw8hW9vp.js +4 -0
  5. package/_chunks/badge.view-D30pMUfi.js +14 -0
  6. package/_chunks/calculator-CDWOuAcp.js +4 -0
  7. package/_chunks/{calendar-xpZ0v3xf.js → calendar-QWDyYzdo.js} +19 -19
  8. package/_chunks/chart-frame-hcOlnQ1K.js +145 -0
  9. package/_chunks/check-BwI7iCAm.js +4 -0
  10. package/_chunks/choice-chips-A6WR-WJe.js +126 -0
  11. package/_chunks/{color-palette-D8vyPfld.js → color-palette-DMJUChWC.js} +20 -22
  12. package/_chunks/color-picker-BK4W1nd6.js +143 -0
  13. package/_chunks/{component-C_T2VN5u.js → component-CMkF17YZ.js} +281 -265
  14. package/_chunks/{component-metadata-BMOOmqx5.js → component-metadata-BKd7U8OW.js} +0 -8
  15. package/_chunks/configurator-actions-By8WSL2m.js +155 -0
  16. package/_chunks/configurator-field-icon-CmcM_sPs.js +53 -0
  17. package/_chunks/{control-AHKXD5Eu.js → control-mlH7l0Uq.js} +42 -17
  18. package/_chunks/{controls-DsNi8V8I.js → controls-FUU-MUKC.js} +171 -186
  19. package/_chunks/{date-control-DrVFX13g.js → date-control-Dup_P3w5.js} +1 -1
  20. package/_chunks/{date-time-qIhp5vaX.js → date-time-9z6pAG5T.js} +317 -278
  21. package/_chunks/dialog.parts-Bi7YbXqS.js +131 -0
  22. package/_chunks/{duration-CL68Em0o.js → duration-D7oRjsmP.js} +5 -5
  23. package/_chunks/editor-popup-ByU7qiub.js +82 -0
  24. package/_chunks/field-configurator-BCINdXpU.js +223 -0
  25. package/_chunks/{framework-mount--RTLIqE-.js → framework-mount-Bk4O_T7T.js} +1 -1
  26. package/_chunks/icon-toolbar-DSjOdwM7.js +134 -0
  27. package/_chunks/magnifying-glass-CvrTDSkB.js +4 -0
  28. package/_chunks/minus-BOAR3A1C.js +4 -0
  29. package/_chunks/mount-Cw2zk58T.js +266 -0
  30. package/_chunks/{native.view-ByyZ1CT5.js → native-Blr3byjO.js} +1 -1
  31. package/_chunks/native-control-pFMuHf3G.js +644 -0
  32. package/_chunks/{number-input-BKwA5FnM.js → number-input-DqXV6vgP.js} +7 -7
  33. package/_chunks/{picker-h1P5RUgp.js → picker-gEGTu1Ki.js} +2 -2
  34. package/_chunks/plus-CbGRkIGl.js +4 -0
  35. package/_chunks/popover-controller-D-AvKQ7B.js +102 -0
  36. package/_chunks/{popup-CT2uD3go.js → popup-C35Isk7p.js} +115 -104
  37. package/_chunks/{rating-choice-DZgmaic0.js → rating-choice-DbxdUJr-.js} +1 -1
  38. package/_chunks/{reorder-list-CSlqAGHw.js → reorder-list-B0_13Sja.js} +1 -1
  39. package/_chunks/request-trail-CCSK6TJA.js +753 -0
  40. package/_chunks/rich-text-5rnc8lpI.js +842 -0
  41. package/_chunks/rotate-left-BF6G883o.js +4 -0
  42. package/_chunks/title-tooltip-Cw6LOZhb.js +11 -0
  43. package/_chunks/tooltip-D4xkio5G.js +54 -0
  44. package/_chunks/tooltip-owner-DjdvqKzz.js +19 -0
  45. package/_chunks/tooltip-session-B6X6x8G_.js +110 -0
  46. package/_chunks/tooltip-text-BXsUEmBH.js +12 -0
  47. package/_chunks/top-layer-popup-CNSDdfJV.js +59 -0
  48. package/_variables.scss +33 -32
  49. package/ai/_chat.scss +28 -3
  50. package/ai/_style.scss +55 -2
  51. package/ai/chat.d.ts +3 -1
  52. package/ai/components.d.ts +13 -2
  53. package/ai/index.d.ts +1 -0
  54. package/ai/index.js +3 -3
  55. package/ai/mount.d.ts +17 -1
  56. package/ai/results/_style.scss +83 -0
  57. package/ai/results/index.d.ts +11 -0
  58. package/ai/results/metrics.d.ts +5 -0
  59. package/ai/results/table.d.ts +5 -0
  60. package/ai/results/text.d.ts +5 -0
  61. package/ai/results/types.d.ts +29 -0
  62. package/ai/transcript.d.ts +2 -0
  63. package/ai/translations.d.ts +1 -1
  64. package/assignee/assignee.scss +5 -1
  65. package/assignee/index.js +2 -2
  66. package/avatar/index.d.ts +25 -2
  67. package/avatar/index.js +33 -32
  68. package/badge.view.d.ts +8 -0
  69. package/brush-range/component.d.ts +1 -3
  70. package/brush-range/component.js +27 -27
  71. package/buttons/remove-button.d.ts +1 -1
  72. package/buttons/remove-button.style.scss +1 -1
  73. package/buttons/svg-button.d.ts +1 -1
  74. package/buttons/svg-button.js +16 -16
  75. package/calendar/_calendar.scss +2 -2
  76. package/calendar/calendar.js +1 -1
  77. package/calendar/index.js +2 -2
  78. package/checkbox/checkbox.scss +1 -22
  79. package/choice-chips/index.d.ts +3 -1
  80. package/choice-chips/index.js +1 -1
  81. package/color-palette/color-palette.js +1 -1
  82. package/color-palette/color-palette.style.scss +1 -1
  83. package/color-palette/color-picker.js +2 -2
  84. package/color-palette/common-palettes.d.ts +1 -1
  85. package/color-palette/common-palettes.js +1 -1
  86. package/color-palette/native.d.ts +15 -2
  87. package/component-catalog.d.ts +9 -7
  88. package/configurator-actions.d.ts +67 -0
  89. package/configurator-actions.js +1 -0
  90. package/configurator-aggregation-list.d.ts +14 -0
  91. package/configurator-aggregation-list.js +61 -0
  92. package/configurator-drop-zone.d.ts +38 -0
  93. package/configurator-drop-zone.js +64 -0
  94. package/configurator-field-icon.d.ts +10 -0
  95. package/configurator-field-icon.js +1 -0
  96. package/configurator-focus.d.ts +4 -0
  97. package/configurator-focus.js +39 -0
  98. package/configurator-sections.d.ts +42 -0
  99. package/configurator-sections.js +71 -0
  100. package/control-presentation.d.ts +8 -2
  101. package/control-presentation.js +25 -20
  102. package/controls.d.ts +1 -2
  103. package/controls.js +4 -3
  104. package/core/editor-popup-position.d.ts +6 -2
  105. package/core/editor-popup.d.ts +4 -0
  106. package/core/editor-popup.js +1 -1
  107. package/core/popover-controller.d.ts +35 -0
  108. package/core/popup-ownership.d.ts +2 -0
  109. package/core/title-tooltip.d.ts +2 -0
  110. package/core/tooltip-session.d.ts +29 -0
  111. package/core/tooltip-surface.d.ts +13 -0
  112. package/core/tooltip-text.d.ts +6 -0
  113. package/core/tooltip.d.ts +35 -0
  114. package/core/top-layer-popup.d.ts +4 -0
  115. package/core/top-layer-popup.js +1 -23
  116. package/date-time/attach.d.ts +1 -1
  117. package/date-time/field.d.ts +3 -2
  118. package/date-time/index.js +1 -1
  119. package/date-time/style.scss +64 -7
  120. package/date-time/time-selection.d.ts +3 -1
  121. package/date-time/types.d.ts +5 -1
  122. package/dialog/dialog-action-footer.d.ts +17 -2
  123. package/dialog/dialog.dom.d.ts +15 -2
  124. package/dialog/dialog.dom.js +9 -9
  125. package/dialog/dialog.parts.d.ts +1 -1
  126. package/dialog/dialog.parts.js +1 -1
  127. package/distribution-chart/_distribution-chart.scss +12 -54
  128. package/distribution-chart/area-chart.js +1 -1
  129. package/distribution-chart/bar-chart.js +1 -1
  130. package/distribution-chart/index.d.ts +1 -1
  131. package/distribution-chart/line-chart.js +1 -1
  132. package/dropdown/content.js +1 -1
  133. package/dropdown/control.js +1 -1
  134. package/dropdown/editor-dropdown.style.scss +5 -0
  135. package/dropdown/index.js +2 -2
  136. package/dropdown/lookup-field.d.ts +5 -0
  137. package/dropdown/lookup-field.js +2 -1
  138. package/dropdown/popup.d.ts +2 -2
  139. package/dropdown/popup.js +1 -1
  140. package/duration/index.js +1 -1
  141. package/editor-actions.js +1 -1
  142. package/field-configurator.d.ts +27 -0
  143. package/field-configurator.js +4 -170
  144. package/field-expansion.d.ts +9 -0
  145. package/filter/filters/slider/_slider.scss +8 -25
  146. package/filter/filters/slider/control.js +2 -0
  147. package/filter/filters/slider/runtime.js +49 -22
  148. package/filter/filters/slider/single.js +1 -1
  149. package/filter-badge.js +1 -1
  150. package/filter-controls.d.ts +0 -1
  151. package/filter-controls.js +5 -6
  152. package/form-controls/index.d.ts +10 -2
  153. package/form-controls/index.js +7 -7
  154. package/form-controls/presentation.js +12 -12
  155. package/formatting/index.d.ts +1 -1
  156. package/formatting/index.js +22 -21
  157. package/formatting/styles.scss +2 -47
  158. package/framework.js +226 -222
  159. package/history-controls.js +27 -1
  160. package/icon-toolbar.d.ts +62 -0
  161. package/icon-toolbar.js +1 -0
  162. package/masked-input/index.js +1 -1
  163. package/native-control.d.ts +1 -2
  164. package/native-control.js +1 -1
  165. package/native-controls.d.ts +54 -2
  166. package/native-styles.css +1 -1
  167. package/native.js +46 -43
  168. package/number-input/index.js +1 -1
  169. package/package.json +36 -1
  170. package/pagination.js +11 -11
  171. package/pdf-viewer/index.js +1 -1
  172. package/pickers.d.ts +5 -1
  173. package/preact-mount.js +1 -1
  174. package/preact.d.ts +8 -6
  175. package/preact.js +71 -64
  176. package/rating-choice.js +1 -1
  177. package/react-control.d.ts +2 -0
  178. package/react-control.js +2 -2
  179. package/react.d.ts +5 -6
  180. package/react.js +68 -66
  181. package/reorder-list.js +1 -1
  182. package/resource-picker/resource-picker-popup.js +1 -1
  183. package/resource-picker/resource-picker.js +4 -4
  184. package/rich-text/engine.d.ts +1 -0
  185. package/rich-text/format-html.d.ts +2 -0
  186. package/rich-text/index.d.ts +4 -0
  187. package/rich-text/index.js +1 -1
  188. package/rich-text/model.d.ts +2 -0
  189. package/rich-text/style.scss +165 -70
  190. package/rich-text/syntax.d.ts +5 -0
  191. package/rich-text/translations.d.ts +2 -0
  192. package/search-input/index.js +1 -1
  193. package/search-input/native.d.ts +21 -2
  194. package/select.d.ts +3 -1
  195. package/select.js +1 -1
  196. package/status-feedback/exit-snapshot.js +4 -4
  197. package/status-feedback/popover.js +4 -4
  198. package/styles/_alert.scss +18 -4
  199. package/styles/_compositions.scss +3 -3
  200. package/styles/_editor-slider.scss +0 -2
  201. package/styles/_field-configurator.scss +147 -0
  202. package/styles/_fields-grid.scss +37 -0
  203. package/styles/_palette.scss +0 -24
  204. package/styles/_primitives.scss +28 -19
  205. package/styles/configurator-actions.scss +141 -0
  206. package/styles/{legacy-pagination.css → pagination.css} +19 -2
  207. package/styles.css +1 -1
  208. package/styles.scss +2 -2
  209. package/surfaces.d.ts +36 -2
  210. package/surfaces.js +35 -132
  211. package/svelte.js +3 -3
  212. package/switch/index.js +15 -14
  213. package/time-grid.d.ts +0 -1
  214. package/time-grid.js +38 -37
  215. package/timeline-track/index.js +2 -2
  216. package/ui.css +1 -1
  217. package/vue.d.ts +26 -30
  218. package/vue.js +117 -121
  219. package/_chunks/chart-frame-Cmc7xU1i.js +0 -130
  220. package/_chunks/choice-chips-CHQTUdLs.js +0 -110
  221. package/_chunks/color-picker-CudqPYZo.js +0 -138
  222. package/_chunks/control-tooltip-uscKfAnV.js +0 -100
  223. package/_chunks/dialog.parts-CKGkC5zP.js +0 -134
  224. package/_chunks/editor-popup-WDdtVDNA.js +0 -81
  225. package/_chunks/history-controls-B3u3INEK.js +0 -27
  226. package/_chunks/mount-DQ1cpppK.js +0 -257
  227. package/_chunks/native-control-C_yok8_-.js +0 -605
  228. package/_chunks/request-trail-DSlFix6i.js +0 -618
  229. package/_chunks/rich-text-CH7gIqOS.js +0 -636
  230. package/avatar/index.view.d.ts +0 -25
  231. package/color-palette/native.view.d.ts +0 -15
  232. package/control-presentation.view.d.ts +0 -8
  233. package/dialog/dialog-action-footer.view.d.ts +0 -20
  234. package/dialog/dialog.dom.view.d.ts +0 -15
  235. package/form-controls/index.view.d.ts +0 -10
  236. package/formatting/control-tooltip.d.ts +0 -27
  237. package/native-controls.view.d.ts +0 -54
  238. package/search-input/native.view.d.ts +0 -21
  239. package/surfaces.view.d.ts +0 -63
  240. /package/styles/{legacy-rating.css → rating.css} +0 -0
@@ -0,0 +1,4 @@
1
+ //#region ../../node_modules/.pnpm/@fortawesome+fontawesome-free@7.3.1/node_modules/@fortawesome/fontawesome-free/svgs/solid/rotate-left.svg?raw
2
+ var e = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc. --><path fill=\"currentColor\" d=\"M24 192l144 0c9.7 0 18.5-5.8 22.2-14.8s1.7-19.3-5.2-26.2l-46.7-46.7c75.3-58.6 184.3-53.3 253.5 15.9 75 75 75 196.5 0 271.5s-196.5 75-271.5 0c-10.2-10.2-19-21.3-26.4-33-9.5-14.9-29.3-19.3-44.2-9.8s-19.3 29.3-9.8 44.2C49.7 408.7 61.4 423.5 75 437 175 537 337 537 437 437S537 175 437 75C342.8-19.3 193.3-24.7 92.7 58.8L41 7C34.1 .2 23.8-1.9 14.8 1.8S0 14.3 0 24L0 168c0 13.3 10.7 24 24 24z\"/></svg>";
3
+ //#endregion
4
+ export { e as t };
@@ -0,0 +1,11 @@
1
+ import { r as e, t } from "./hooks.module-CG3gN83z.js";
2
+ import { n } from "./popover-controller-D-AvKQ7B.js";
3
+ //#region src/core/title-tooltip.ts
4
+ function r(r, i) {
5
+ let a = t(null), o = t(i);
6
+ return o.current = i, e(() => {
7
+ if (a.current && r) return new n().bind(a.current, r, { onEscape: () => o.current?.() });
8
+ }, [r]), a;
9
+ }
10
+ //#endregion
11
+ export { r as t };
@@ -0,0 +1,54 @@
1
+ import { i as e, o as t, r as n } from "./hooks.module-CG3gN83z.js";
2
+ import { t as r } from "./jsxRuntime.module-F6UFnpT-.js";
3
+ import { t as i } from "./tooltip-session-B6X6x8G_.js";
4
+ import { createControlId as a } from "../core/control-id.js";
5
+ //#region src/core/tooltip.tsx
6
+ function o(o, s = !0, c) {
7
+ let [l] = e(() => a("rv-format-control-tooltip")), [u] = e(() => new i());
8
+ u.delay = c?.delay ?? 0;
9
+ let d = t(() => u.hide(), [u]), f = t((e) => {
10
+ e || u.hide(), u.setSurface(e);
11
+ }, [u]);
12
+ return n(() => {
13
+ u.hide();
14
+ }, [o, c?.delay]), n(() => () => u.destroy(), [u]), {
15
+ id: l,
16
+ hide: d,
17
+ triggerProps: {
18
+ "aria-describedby": l,
19
+ onFocus: (e) => u.focus(e.currentTarget),
20
+ onBlur: () => u.blur(),
21
+ onMouseEnter: (e) => u.show(e.currentTarget),
22
+ onMouseLeave: (e) => u.leave(e?.currentTarget),
23
+ onPointerDown: (e) => u.pointerDown(),
24
+ onPointerCancel: () => u.hide(),
25
+ onKeyDown: (e) => u.keyDown(e)
26
+ },
27
+ tooltip: /* @__PURE__ */ r("span", {
28
+ ref: f,
29
+ id: l,
30
+ class: `rv-tooltip ${c?.className ?? "rv-format-control-tooltip"}`,
31
+ role: "tooltip",
32
+ "data-visible": "false",
33
+ hidden: !0,
34
+ children: c?.content ?? o
35
+ })
36
+ };
37
+ }
38
+ function s({ id: a, text: o, content: s, visible: c, anchor: l = null, className: u = "rv-format-control-tooltip" }) {
39
+ let [d] = e(() => new i()), f = t((e) => {
40
+ e || d.hide(), d.setSurface(e);
41
+ }, [d]);
42
+ return n(() => (c && l ? d.show(l) : d.hide(), () => d.hide()), [c, l]), n(() => () => d.destroy(), [d]), /* @__PURE__ */ r("span", {
43
+ ref: f,
44
+ id: a,
45
+ class: `rv-tooltip ${u}`,
46
+ role: "tooltip",
47
+ "data-visible": c,
48
+ hidden: !c,
49
+ children: s ?? o
50
+ });
51
+ }
52
+ var c = o;
53
+ //#endregion
54
+ export { o as n, c as r, s as t };
@@ -0,0 +1,19 @@
1
+ //#region ../chart-utils/src/tooltip-owner.ts
2
+ var e = Symbol.for("@revolist/tooltip-owner");
3
+ function t(t, n, r) {
4
+ let i = t, a = i[e];
5
+ a?.owner !== n && (Object.defineProperty(i, e, {
6
+ configurable: !0,
7
+ writable: !0,
8
+ value: {
9
+ owner: n,
10
+ dismiss: r
11
+ }
12
+ }), a?.dismiss());
13
+ }
14
+ function n(t, n) {
15
+ let r = t;
16
+ r[e]?.owner === n && delete r[e];
17
+ }
18
+ //#endregion
19
+ export { n, t };
@@ -0,0 +1,110 @@
1
+ import { c as e, o as t, r as n, t as r } from "./top-layer-popup-CNSDdfJV.js";
2
+ import { n as i, t as a } from "./tooltip-owner-DjdvqKzz.js";
3
+ //#region src/core/tooltip-session.ts
4
+ var o = class {
5
+ anchor;
6
+ surface;
7
+ timer;
8
+ mode;
9
+ cleanup;
10
+ mounted = !1;
11
+ pointerFocus = !1;
12
+ open = !1;
13
+ addedDescription = !1;
14
+ onHide;
15
+ onEscape;
16
+ delay = 0;
17
+ get isOpen() {
18
+ return this.open;
19
+ }
20
+ get isPending() {
21
+ return this.timer !== void 0;
22
+ }
23
+ setSurface(e) {
24
+ this.surface = e ?? void 0;
25
+ }
26
+ show(e) {
27
+ this.anchor === e && this.open || (this.hide(), this.anchor = e, this.listen(e), this.delay > 0 ? this.timer = setTimeout(() => {
28
+ this.timer = void 0, this.present();
29
+ }, this.delay) : this.present());
30
+ }
31
+ present() {
32
+ let r = this.anchor, i = this.surface;
33
+ if (!r || !i || !r.isConnected) {
34
+ this.hide();
35
+ return;
36
+ }
37
+ a(r.ownerDocument, this, () => this.hide()), e(i), this.mounted = !i.isConnected, this.mounted && r.ownerDocument.body.append(i), i.hidden = !1, i.dataset.visible = "true", Object.assign(i.style, {
38
+ position: "fixed",
39
+ inset: "auto",
40
+ margin: "0",
41
+ transform: "none",
42
+ visibility: "visible",
43
+ positionAnchor: "auto",
44
+ positionArea: "none"
45
+ }), this.mode = n(i, "block");
46
+ let o = r.ownerDocument.defaultView, s = t(r.getBoundingClientRect(), i.getBoundingClientRect(), {
47
+ width: o?.innerWidth ?? 0,
48
+ height: o?.innerHeight ?? 0
49
+ });
50
+ Object.assign(i.style, {
51
+ left: `${s.left}px`,
52
+ top: `${s.top}px`
53
+ });
54
+ let c = new Set((r.getAttribute("aria-describedby") ?? "").split(/\s+/).filter(Boolean));
55
+ this.addedDescription = !c.has(i.id), c.add(i.id), r.setAttribute("aria-describedby", [...c].join(" ")), this.open = !0;
56
+ }
57
+ hide() {
58
+ clearTimeout(this.timer), this.timer = void 0, this.cleanup?.(), this.cleanup = void 0;
59
+ let e = this.anchor, t = this.surface;
60
+ if (e && i(e.ownerDocument, this), t && this.open) {
61
+ if (r(t, this.mode), t.hidden = !0, t.dataset.visible = "false", e && this.addedDescription) {
62
+ let n = (e.getAttribute("aria-describedby") ?? "").split(/\s+/).filter((e) => e && e !== t.id);
63
+ n.length ? e.setAttribute("aria-describedby", n.join(" ")) : e.removeAttribute("aria-describedby");
64
+ }
65
+ this.mounted && t.remove();
66
+ }
67
+ let n = this.open;
68
+ this.open = !1, n && this.onHide?.(), this.mode = void 0, this.mounted = !1;
69
+ }
70
+ focus(e) {
71
+ this.show(e);
72
+ }
73
+ blur() {
74
+ this.pointerFocus = !1, this.hide();
75
+ }
76
+ pointerDown() {
77
+ this.pointerFocus = !0;
78
+ }
79
+ leave(e) {
80
+ (!e || this.pointerFocus || e.ownerDocument.activeElement !== e) && this.hide();
81
+ }
82
+ keyDown(e) {
83
+ e.key === "Escape" && (this.open || this.isPending) && !e.defaultPrevented ? (e.preventDefault(), e.stopPropagation(), this.hide(), this.onEscape?.()) : (e.key === "Enter" || e.key === " ") && this.hide();
84
+ }
85
+ destroy() {
86
+ this.hide(), this.surface = void 0, this.anchor = void 0;
87
+ }
88
+ listen(e) {
89
+ let t = e.ownerDocument, n = t.defaultView, r = e.closest("[popover]"), i = () => this.hide(), a = (t) => {
90
+ t.composedPath().includes(e) || this.hide();
91
+ }, o = (n) => {
92
+ let r = n.target;
93
+ (r === t || r?.contains?.(e)) && this.hide();
94
+ }, s = () => {
95
+ r?.matches(":popover-open") || this.hide();
96
+ }, c = (e) => {
97
+ e.key === "Escape" && this.keyDown(e);
98
+ }, l = n?.MutationObserver, u = l ? new l(() => {
99
+ e.isConnected || this.hide();
100
+ }) : void 0;
101
+ u?.observe(t, {
102
+ childList: !0,
103
+ subtree: !0
104
+ }), t.addEventListener("keydown", c, !0), t.addEventListener("pointerdown", a, !0), t.addEventListener("scroll", o, !0), t.addEventListener("visibilitychange", i), n?.addEventListener("resize", i), n?.addEventListener("blur", i), r?.addEventListener("toggle", s), this.cleanup = () => {
105
+ u?.disconnect(), t.removeEventListener("keydown", c, !0), t.removeEventListener("pointerdown", a, !0), t.removeEventListener("scroll", o, !0), t.removeEventListener("visibilitychange", i), n?.removeEventListener("resize", i), n?.removeEventListener("blur", i), r?.removeEventListener("toggle", s);
106
+ };
107
+ }
108
+ };
109
+ //#endregion
110
+ export { o as t };
@@ -0,0 +1,12 @@
1
+ import { c as e } from "./preact.module-BBM36DnO.js";
2
+ import { t } from "./title-tooltip-Cw6LOZhb.js";
3
+ //#region src/core/tooltip-text.tsx
4
+ function n({ as: n = "span", title: r, children: i, ...a }) {
5
+ let o = t(r);
6
+ return e(n, {
7
+ ...a,
8
+ ref: o
9
+ }, i);
10
+ }
11
+ //#endregion
12
+ export { n as t };
@@ -0,0 +1,59 @@
1
+ import { calculateAnchoredPopoverPosition as e } from "../core/anchored-popover.js";
2
+ import { c as t } from "./preact.module-BBM36DnO.js";
3
+ import { createPreactElement as n } from "../preact-mount.js";
4
+ //#region src/core/tooltip-surface.ts
5
+ var r = "\n.rv-tooltip.rv-tooltip {\n box-sizing: border-box;\n position: fixed;\n z-index: 100000;\n margin: 0;\n inset: auto;\n transform: none;\n opacity: 1;\n visibility: visible;\n padding: 6px 10px;\n border: 0;\n border-radius: 6px;\n background: var(--rv-tooltip-bg, #191919);\n color: var(--rv-tooltip-fg, #fff);\n box-shadow: 0 4px 14px var(--rv-ui-shadow, rgb(0 0 0 / 18%));\n font: 12px/1.4 var(--rv-ui-font-family, Inter, ui-sans-serif, system-ui, sans-serif);\n font-weight: 400;\n text-align: start;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n max-width: min(360px, calc(100vw - 16px));\n max-height: calc(100dvh - 16px);\n overflow: auto;\n pointer-events: none;\n}\n.rv-tooltip[hidden], .rv-tooltip[data-visible=\"false\"] { display: none; }\n.rv-tooltip[data-overflow] { pointer-events: auto; }\n@media (forced-colors: active) {\n .rv-tooltip.rv-tooltip { color: CanvasText; background: Canvas; border: 1px solid CanvasText; }\n}\n";
6
+ function i(e) {
7
+ if (e.querySelector("style[data-rv-tooltip-styles]")) return;
8
+ let i = e.nodeType === 9 ? e : e.ownerDocument, a = n(i, t("style", { "data-rv-tooltip-styles": "" }, r));
9
+ e.nodeType === 9 ? i.head.append(a) : e.append(a);
10
+ }
11
+ function a(e) {
12
+ e.classList.add("rv-tooltip"), e.setAttribute("role", "tooltip");
13
+ let t = e.getRootNode();
14
+ i(t.nodeType === 11 && "host" in t ? t : e.ownerDocument);
15
+ }
16
+ function o(t, n, r) {
17
+ let i = e(t, n, r), a = t.top - n.height - 8;
18
+ return a >= 8 ? {
19
+ left: Math.max(8, Math.min(t.left + (t.width - n.width) / 2, r.width - n.width - 8)),
20
+ top: a
21
+ } : i;
22
+ }
23
+ //#endregion
24
+ //#region src/core/popup-ownership.ts
25
+ function s(e, t) {
26
+ if (!e || !t) return !1;
27
+ let n = /* @__PURE__ */ new Set(), r = (e) => !n.has(e) && (n.add(e), e.contains(t) ? !0 : [...e.querySelectorAll("[aria-controls]")].some((t) => (t.getAttribute("aria-controls") ?? "").split(/\s+/).some((t) => {
28
+ let n = e.ownerDocument.getElementById(t);
29
+ return !!n && r(n);
30
+ })));
31
+ return r(e);
32
+ }
33
+ //#endregion
34
+ //#region src/core/top-layer-popup.ts
35
+ var c = /* @__PURE__ */ new WeakMap();
36
+ function l(e, t = "flex") {
37
+ if (c.has(e) || c.set(e, e.getAttribute("data-rv-ui-surface")), e.setAttribute("data-rv-ui-surface", ""), e.style.display = t, typeof e.showPopover == "function") {
38
+ e.setAttribute("popover", "manual");
39
+ try {
40
+ return e.showPopover(), "popover";
41
+ } catch {
42
+ e.removeAttribute("popover");
43
+ }
44
+ }
45
+ return e.style.display = t, "fallback";
46
+ }
47
+ function u(e, t) {
48
+ let n = c.get(e);
49
+ if (n !== void 0 && (n === null ? e.removeAttribute("data-rv-ui-surface") : e.setAttribute("data-rv-ui-surface", n), c.delete(e)), t === "popover" && typeof e.hidePopover == "function") try {
50
+ e.hidePopover(), e.style.removeProperty("display");
51
+ return;
52
+ } catch {}
53
+ e.style.display = "none";
54
+ }
55
+ function d(e, t) {
56
+ return t ? e.contains(t) ? !0 : [...e.querySelectorAll("[aria-controls]")].some((n) => n.getAttribute("aria-controls")?.split(/\s+/).some((n) => e.ownerDocument.getElementById(n)?.contains(t))) : !1;
57
+ }
58
+ //#endregion
59
+ export { r as a, a as c, s as i, d as n, o, l as r, i as s, u as t };
package/_variables.scss CHANGED
@@ -1,3 +1,4 @@
1
+ @use 'styles/built-in-palettes' as palettes;
1
2
  @use './styles/palette';
2
3
  /**
3
4
  * Variables
@@ -5,47 +6,47 @@
5
6
 
6
7
  $rv-font-weight-medium: 500 !default;
7
8
 
8
- $primary-color-light: palette.$legacy-007bff;
9
- $primary-color-dark: palette.$legacy-0d63e8;
9
+ $primary-color-light: palettes.color('common', 'hex007bff');
10
+ $primary-color-dark: palettes.color('common', 'hex0d63e8');
10
11
 
11
- $text-color-light: palette.$legacy-000;
12
- $text-color-light-secondary: palette.$legacy-757575;
12
+ $text-color-light: palettes.color('common', 'hex000');
13
+ $text-color-light-secondary: palettes.color('common', 'hex757575');
13
14
  $text-color-dark: palette.$white;
14
- $text-color-dark-secondary: palette.$legacy-999;
15
- $background-color-light: palette.$legacy-f6f6f7;
15
+ $text-color-dark-secondary: palettes.color('common', 'hex999');
16
+ $background-color-light: palettes.color('common', 'hexf6f6f7');
16
17
 
17
- $button-alt-bg-light: palette.$legacy-ebebef;
18
- $button-alt-bg-light-hover: palette.$legacy-e4e4e9;
18
+ $button-alt-bg-light: palettes.color('common', 'hexebebef');
19
+ $button-alt-bg-light-hover: palettes.color('common', 'hexe4e4e9');
19
20
 
20
- $background-color-dark: palette.$legacy-333333;
21
+ $background-color-dark: palettes.color('common', 'hex333333');
21
22
 
22
- $border-color-light: palette.$legacy-ebebef;
23
- $border-color-dark: palette.$legacy-ebebef;
23
+ $border-color-light: palettes.color('common', 'hexebebef');
24
+ $border-color-dark: palettes.color('common', 'hexebebef');
24
25
 
25
- $rv-badge-bg-color: palette.$legacy-f0f0f0;
26
- $rv-badge-bg-color-dark: palette.$legacy-2d2d2d;
26
+ $rv-badge-bg-color: palettes.color('common', 'hexf0f0f0');
27
+ $rv-badge-bg-color-dark: palettes.color('common', 'hex2d2d2d');
27
28
 
28
29
  $rv-popup-bg-color: palette.$white;
29
- $rv-popup-border-color: palette.$legacy-d4d4d4;
30
+ $rv-popup-border-color: palettes.color('common', 'hexd4d4d4');
30
31
  $rv-popup-border-opacity: 0.5;
31
- $rv-popup-shadow-color: palette.$legacy-shadow-54;
32
- $rv-popup-hover-bg-color: palette.$legacy-f6f6f7;
32
+ $rv-popup-shadow-color: palettes.color('common', 'rgba_0_0_0_0_15');
33
+ $rv-popup-hover-bg-color: palettes.color('common', 'hexf6f6f7');
33
34
  $rv-popup-border-radius: 8px;
34
35
  $rv-popup-padding: 10px;
35
- $rv-popup-box-shadow: 0 4px 12px #{palette.$legacy-shadow-54};
36
- $rv-popup-bg-color-dark: palette.$legacy-1c1c1c;
37
- $rv-popup-border-color-dark: palette.$legacy-686868;
36
+ $rv-popup-box-shadow: 0 4px 12px #{palettes.color('common', 'rgba_0_0_0_0_15')};
37
+ $rv-popup-bg-color-dark: palettes.color('common', 'hex1c1c1c');
38
+ $rv-popup-border-color-dark: palettes.color('common', 'hex686868');
38
39
  $rv-popup-border-opacity-dark: 0;
39
- $rv-popup-shadow-color-dark: palette.$legacy-shadow-57;
40
- $rv-popup-hover-bg-color-dark: palette.$legacy-2c2c2c;
41
- $rv-popup-box-shadow-dark: 0 4px 12px #{palette.$legacy-shadow-57};
42
-
43
- $rv-low-color: palette.$legacy-fa2057;
44
- $rv-medium-color: palette.$legacy-f7c605;
45
- $rv-high-color: palette.$legacy-01c26e;
46
- $rv-critical-color: palette.$legacy-a8183c;
47
- $rv-info-color: palette.$legacy-5555fc;
48
- $rv-neutral-color: palette.$legacy-161a42;
49
-
50
- $rv-progress-bg-color: palette.$legacy-f0f0f0;
51
- $rv-progress-bg-color-dark: palette.$legacy-252525;
40
+ $rv-popup-shadow-color-dark: palettes.color('common', 'rgba_0_0_0_0_5');
41
+ $rv-popup-hover-bg-color-dark: palettes.color('common', 'hex2c2c2c');
42
+ $rv-popup-box-shadow-dark: 0 4px 12px #{palettes.color('common', 'rgba_0_0_0_0_5')};
43
+
44
+ $rv-low-color: palettes.color('common', 'hexfa2057');
45
+ $rv-medium-color: palettes.color('common', 'hexf7c605');
46
+ $rv-high-color: palettes.color('common', 'hex01c26e');
47
+ $rv-critical-color: palettes.color('common', 'hexa8183c');
48
+ $rv-info-color: palettes.color('common', 'hex5555fc');
49
+ $rv-neutral-color: palettes.color('common', 'hex161a42');
50
+
51
+ $rv-progress-bg-color: palettes.color('common', 'hexf0f0f0');
52
+ $rv-progress-bg-color-dark: palettes.color('common', 'hex252525');
package/ai/_chat.scss CHANGED
@@ -45,13 +45,31 @@
45
45
  color: var(--rv-ui-text-muted);
46
46
  margin-block: 0.5rem;
47
47
  }
48
+ .rv-ai-chat-empty > strong {
49
+ font-size: calc(1em + 2px);
50
+ }
51
+ .rv-ai-chat-empty img {
52
+ max-width: 100%;
53
+ height: auto;
54
+ }
55
+ .rv-ai-mounted-chat .rv-ai-chat-content:has(> .rv-ai-chat-empty:only-child) {
56
+ box-sizing: border-box;
57
+ min-height: 100%;
58
+ }
48
59
  .rv-ai-chat-jump.rv-btn {
49
60
  position: absolute;
50
61
  inset-block-end: 0.75rem;
51
62
  inset-inline-start: 50%;
52
63
  transform: translateX(-50%);
53
- box-shadow: 0 2px 12px var(--rv-ui-focus-ring);
54
- white-space: nowrap;
64
+ width: 2rem;
65
+ min-width: 2rem;
66
+ height: 2rem;
67
+ padding: 0.375rem;
68
+ border: 1px solid var(--rv-ui-border);
69
+ border-radius: 50%;
70
+ background: var(--rv-ui-surface);
71
+ color: var(--rv-ui-text);
72
+ box-shadow: none;
55
73
  }
56
74
  .rv-ai-chat-composer {
57
75
  flex: none;
@@ -65,6 +83,10 @@
65
83
  max-width: 100%;
66
84
  align-self: flex-start;
67
85
  }
86
+ .rv-ai-message--assistant {
87
+ align-self: stretch;
88
+ width: 100%;
89
+ }
68
90
  .rv-ai-message-content {
69
91
  white-space: pre-wrap;
70
92
  overflow-wrap: anywhere;
@@ -127,7 +149,7 @@
127
149
  }
128
150
  .rv-ai-task-icon {
129
151
  display: inline-flex;
130
- width: 1rem;
152
+ width: 1.25rem;
131
153
  height: 1.25rem;
132
154
  flex: none;
133
155
  align-items: center;
@@ -182,6 +204,9 @@
182
204
  .rv-ai-chat-composer {
183
205
  padding: 0.75rem 0 0;
184
206
  }
207
+ .rv-ai-result-actions {
208
+ margin-block-start: 0.75rem;
209
+ }
185
210
  }
186
211
  .rv-ai-chat-result {
187
212
  max-width: 100%;
package/ai/_style.scss CHANGED
@@ -1,4 +1,5 @@
1
1
  @use './chat';
2
+ @use './results/style';
2
3
  .rv-ai-assistant {
3
4
  box-sizing: border-box;
4
5
  width: 100%;
@@ -89,7 +90,8 @@
89
90
  .rv-ai-request-trail .rv-ai-trail-trigger {
90
91
  color: var(--rv-ui-accent-text);
91
92
  background: var(--rv-ui-selected-bg);
92
- &:hover:not(:disabled), &:focus-visible {
93
+ &:hover:not(:disabled),
94
+ &:focus-visible {
93
95
  color: var(--rv-ui-accent-text);
94
96
  background: var(--rv-ui-selected-bg);
95
97
  }
@@ -161,7 +163,11 @@
161
163
  background: var(--rv-ui-surface-hover);
162
164
  }
163
165
  .rv-ai-step[data-current] .rv-ai-step-chip {
164
- background: color-mix(in srgb, var(--rv-ui-selected-bg) 55%, var(--rv-ui-surface));
166
+ background: color-mix(
167
+ in srgb,
168
+ var(--rv-ui-selected-bg) 55%,
169
+ var(--rv-ui-surface)
170
+ );
165
171
  }
166
172
  .rv-ai-step-number {
167
173
  position: relative;
@@ -321,3 +327,50 @@
321
327
  overflow-wrap: anywhere;
322
328
  font-size: 0.875em;
323
329
  }
330
+ .rv-ai-preview-changes {
331
+ max-width: 100%;
332
+ overflow-x: auto;
333
+ table {
334
+ width: 100%;
335
+ border-collapse: collapse;
336
+ font-size: 0.875rem;
337
+ }
338
+ th,
339
+ td {
340
+ padding: 0.5rem 0.625rem;
341
+ border-bottom: 1px solid var(--rv-ui-border);
342
+ text-align: start;
343
+ vertical-align: top;
344
+ overflow-wrap: anywhere;
345
+ }
346
+ th {
347
+ font-weight: 500;
348
+ }
349
+ thead th {
350
+ color: var(--rv-ui-text-muted);
351
+ }
352
+ td {
353
+ min-width: 4rem;
354
+ }
355
+ }
356
+ .rv-ai-preview-item {
357
+ display: block;
358
+ font-weight: 600;
359
+ margin-bottom: 0.125rem;
360
+ }
361
+ .rv-ai-preview-notice {
362
+ margin: 0;
363
+ color: var(--rv-ui-text-muted);
364
+ }
365
+
366
+ // Opt-in bounded chat surfaces; toolbar mounts keep their natural height.
367
+ .rv-ai-assistant--fill {
368
+ padding: 0;
369
+ flex: 1;
370
+ min-height: 0;
371
+ height: 100%;
372
+ > .rv-ai-mounted-chat { flex: 1; min-height: 0; }
373
+ .rv-ai-chat-viewport { max-height: none; }
374
+ .rv-ai-result-actions, .rv-ai-assistant-footer { flex: none; }
375
+ .rv-ai-chat-content { min-height: 100%; box-sizing: border-box; }
376
+ }
package/ai/chat.d.ts CHANGED
@@ -24,8 +24,10 @@ export declare function AiChatContent({ children, className, autoScroll, busy, l
24
24
  export interface AiChatEmptyStateProps extends AiChatPartProps {
25
25
  title?: string;
26
26
  description?: string;
27
+ /** Framework-owned image/text content. Return cleanup for listeners or mounted views. */
28
+ renderContent?(host: HTMLElement): void | (() => void);
27
29
  }
28
- export declare function AiChatEmptyState({ title, description, children, className, translations, }: AiChatEmptyStateProps): h.JSX.Element;
30
+ export declare function AiChatEmptyState({ title, description, children, className, translations, renderContent, }: AiChatEmptyStateProps): h.JSX.Element;
29
31
  /** Existing composer behavior, with chat-specific defaults. */
30
32
  export declare function AiChatComposer(props: AiPromptInputProps): h.JSX.Element;
31
33
  export interface AiMessageProps extends AiChatPartProps {
@@ -55,6 +55,8 @@ export interface AiResultProps {
55
55
  }
56
56
  export declare function AiResult({ translations, summary, matchedRows, countLabel, actions, children, }: AiResultProps): h.JSX.Element;
57
57
  export interface AiAssistantProps {
58
+ /** Fill a bounded parent, with messages scrolling above the composer. */
59
+ layout?: 'flow' | 'fill';
58
60
  translations?: AiUiTranslations;
59
61
  label?: string;
60
62
  children?: ComponentChildren;
@@ -62,14 +64,23 @@ export interface AiAssistantProps {
62
64
  busy?: boolean;
63
65
  }
64
66
  /** Neutral composition; grid/model/query policy remains in the consuming product. */
65
- export declare function AiAssistant({ translations, label, children, footer, busy, }: AiAssistantProps): h.JSX.Element;
67
+ export declare function AiAssistant({ layout, translations, label, children, footer, busy, }: AiAssistantProps): h.JSX.Element;
68
+ export interface AiPreviewChange {
69
+ /** User-facing record, task or chart name. */
70
+ item?: string;
71
+ label: string;
72
+ before?: string;
73
+ after?: string;
74
+ }
66
75
  export interface AiChangePreviewProps {
67
76
  translations?: AiUiTranslations;
68
77
  summary: string;
69
78
  details?: string;
79
+ changes?: readonly AiPreviewChange[];
80
+ notice?: string;
70
81
  disabled?: boolean;
71
82
  onApply(): void;
72
83
  onCancel(): void;
73
84
  }
74
85
  /** Generic approval surface; the host retains the prepared command and its mutation policy. */
75
- export declare function AiChangePreview({ translations, summary, details, disabled, onApply, onCancel, }: AiChangePreviewProps): h.JSX.Element;
86
+ export declare function AiChangePreview({ translations, summary, details, changes, notice, disabled, onApply, onCancel, }: AiChangePreviewProps): h.JSX.Element;
package/ai/index.d.ts CHANGED
@@ -5,3 +5,4 @@ export * from './translations';
5
5
  export type { AiPromptHistoryOptions } from './prompt-history';
6
6
  export { AiTranslationProvider } from './translation-context';
7
7
  export * from './chat';
8
+ export * from './results';
package/ai/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { t as e } from "../_chunks/mount-DQ1cpppK.js";
2
- import { _ as t, a as n, b as r, c as i, d as a, f as o, g as s, h as c, i as l, l as u, m as d, n as f, o as p, p as m, r as h, s as g, t as _, u as v, x as y, y as b } from "../_chunks/request-trail-DSlFix6i.js";
3
- export { r as AI_UI_MESSAGES, o as AiActionStatus, m as AiAssistant, d as AiChangePreview, f as AiChat, h as AiChatComposer, l as AiChatContent, n as AiChatEmptyState, p as AiMessage, g as AiMessageActions, i as AiMessageContent, c as AiPromptInput, u as AiReasoning, _ as AiRequestTrail, s as AiResult, t as AiSuggestions, v as AiTask, a as AiTaskItem, b as AiTranslationProvider, e as mountAiAssistant, y as translateAiText };
1
+ import { t as e } from "../_chunks/mount-Cw2zk58T.js";
2
+ import { C as t, E as n, S as r, T as i, _ as a, a as o, b as s, c, d as l, f as u, g as d, h as f, i as p, l as m, m as h, n as g, o as _, p as v, r as y, s as b, t as x, u as S, w as C, x as w, y as T } from "../_chunks/request-trail-CCSK6TJA.js";
3
+ export { i as AI_UI_MESSAGES, u as AiActionStatus, v as AiAssistant, h as AiChangePreview, g as AiChat, y as AiChatComposer, p as AiChatContent, o as AiChatEmptyState, _ as AiMessage, b as AiMessageActions, c as AiMessageContent, f as AiPromptInput, m as AiReasoning, x as AiRequestTrail, d as AiResult, w as AiResultMetrics, r as AiResultTable, s as AiResultText, T as AiResultView, a as AiSuggestions, S as AiTask, l as AiTaskItem, C as AiTranslationProvider, t as formatAiResultValue, e as mountAiAssistant, n as translateAiText };
package/ai/mount.d.ts CHANGED
@@ -1,5 +1,7 @@
1
+ import { AiResultContent, AiTableRenderer } from './results';
2
+ import { AiChatEmptyStateProps } from './chat';
1
3
  import { AiUiTranslations } from './translations';
2
- import { AiActionPhase, AiPromptInputProps, AiSuggestionChoice } from './components';
4
+ import { AiActionPhase, AiPromptInputProps, AiPreviewChange, AiSuggestionChoice } from './components';
3
5
  import { AiRequestTrailItem, AiRequestTrailProps } from './request-trail';
4
6
  import { AiPromptHistoryOptions } from './prompt-history';
5
7
  export interface AiAssistantMountState {
@@ -14,9 +16,12 @@ export interface AiAssistantMountState {
14
16
  message: string;
15
17
  /** Plain text from a bounded host-owned action result. */
16
18
  resultDetails?: string;
19
+ result?: AiResultContent;
17
20
  pendingAction?: {
18
21
  summary: string;
19
22
  details?: string;
23
+ changes?: readonly AiPreviewChange[];
24
+ notice?: string;
20
25
  };
21
26
  canUndoData?: boolean;
22
27
  canRedoData?: boolean;
@@ -28,7 +33,18 @@ export interface AiAssistantMountState {
28
33
  canEditSteps?: boolean;
29
34
  }
30
35
  export interface AiAssistantMountOptions {
36
+ /** Trusted host renderer for tabular results; never supplied by model output. */
37
+ renderTable?: AiTableRenderer;
31
38
  mode?: 'toolbar' | 'chat';
39
+ layout?: 'flow' | 'fill';
40
+ /** Optional host for reactive undo/redo and view controls. Cleaned up on destroy. */
41
+ controlsMountTo?: HTMLElement;
42
+ /** Hide the chat-clearing control while preserving the transcript. Defaults to true. */
43
+ showClearChat?: boolean;
44
+ /** Hide Restore/Reset, Clear chat and data history controls without disabling their controller methods. */
45
+ showHistoryControls?: boolean;
46
+ /** Optional welcome content shown only while the local chat transcript is empty. */
47
+ emptyState?: AiChatEmptyStateProps | false;
32
48
  onClearChat?(): void;
33
49
  /** Local input recall and optional host persistence; never sent to the model automatically. */
34
50
  promptHistory?: AiPromptHistoryOptions;