@revolist/ui 4.0.4-rc → 4.0.5-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 (192) hide show
  1. package/OWNERSHIP.md +1 -1
  2. package/README.md +16 -0
  3. package/_chunks/arrow-up-Cw8hW9vp.js +4 -0
  4. package/_chunks/badge.view-D30pMUfi.js +14 -0
  5. package/_chunks/calculator-CDWOuAcp.js +4 -0
  6. package/_chunks/{calendar-xpZ0v3xf.js → calendar-DsXIhybL.js} +19 -19
  7. package/_chunks/chart-frame-CuZABXVI.js +141 -0
  8. package/_chunks/check-BwI7iCAm.js +4 -0
  9. package/_chunks/choice-chips-BhP8MZjs.js +126 -0
  10. package/_chunks/{color-palette-D8vyPfld.js → color-palette-DMJUChWC.js} +20 -22
  11. package/_chunks/color-picker-B4TQvxxB.js +143 -0
  12. package/_chunks/{component-C_T2VN5u.js → component-qKctqdzk.js} +281 -265
  13. package/_chunks/configurator-actions-C19O1rda.js +155 -0
  14. package/_chunks/configurator-field-icon-CmcM_sPs.js +53 -0
  15. package/_chunks/{control-AHKXD5Eu.js → control-BkWukVt9.js} +13 -13
  16. package/_chunks/{controls-DsNi8V8I.js → controls-BLQnWEd7.js} +147 -155
  17. package/_chunks/{date-control-DrVFX13g.js → date-control-Cgw5PwlZ.js} +1 -1
  18. package/_chunks/date-time-B8rK5gpC.js +784 -0
  19. package/_chunks/{dialog.parts-CKGkC5zP.js → dialog.parts-BSbvnEwX.js} +21 -21
  20. package/_chunks/{duration-CL68Em0o.js → duration-DwFXonEV.js} +1 -4
  21. package/_chunks/editor-popup-BaaxL89T.js +81 -0
  22. package/_chunks/field-configurator-1eQP0tKy.js +223 -0
  23. package/_chunks/icon-toolbar-xbqa0hu9.js +128 -0
  24. package/_chunks/magnifying-glass-CvrTDSkB.js +4 -0
  25. package/_chunks/minus-BOAR3A1C.js +4 -0
  26. package/_chunks/mount-D1i5DLRn.js +266 -0
  27. package/_chunks/native-control-DO0d1kgx.js +636 -0
  28. package/_chunks/{number-input-BKwA5FnM.js → number-input-s9ddPwX6.js} +7 -7
  29. package/_chunks/{picker-h1P5RUgp.js → picker-AY05b41W.js} +2 -2
  30. package/_chunks/plus-CbGRkIGl.js +4 -0
  31. package/_chunks/popover-controller-D-AvKQ7B.js +102 -0
  32. package/_chunks/{popup-CT2uD3go.js → popup-UXGCiv3n.js} +97 -97
  33. package/_chunks/{rating-choice-DZgmaic0.js → rating-choice-BEs_QFZC.js} +1 -1
  34. package/_chunks/{reorder-list-CSlqAGHw.js → reorder-list-A49l172e.js} +1 -1
  35. package/_chunks/request-trail-DCOfa5zw.js +753 -0
  36. package/_chunks/rich-text-xfMWadGi.js +842 -0
  37. package/_chunks/rotate-left-BF6G883o.js +4 -0
  38. package/_chunks/title-tooltip-Cw6LOZhb.js +11 -0
  39. package/_chunks/tooltip-D4xkio5G.js +54 -0
  40. package/_chunks/tooltip-owner-DjdvqKzz.js +19 -0
  41. package/_chunks/tooltip-session-B6X6x8G_.js +110 -0
  42. package/_chunks/tooltip-text-BXsUEmBH.js +12 -0
  43. package/_chunks/top-layer-popup-CNSDdfJV.js +59 -0
  44. package/ai/_chat.scss +28 -3
  45. package/ai/_style.scss +55 -2
  46. package/ai/chat.d.ts +3 -1
  47. package/ai/components.d.ts +13 -2
  48. package/ai/index.d.ts +1 -0
  49. package/ai/index.js +3 -3
  50. package/ai/mount.d.ts +17 -1
  51. package/ai/results/_style.scss +80 -0
  52. package/ai/results/index.d.ts +11 -0
  53. package/ai/results/metrics.d.ts +5 -0
  54. package/ai/results/table.d.ts +5 -0
  55. package/ai/results/text.d.ts +5 -0
  56. package/ai/results/types.d.ts +29 -0
  57. package/ai/transcript.d.ts +2 -0
  58. package/ai/translations.d.ts +1 -1
  59. package/assignee/index.js +2 -2
  60. package/avatar/index.js +32 -31
  61. package/badge.view.d.ts +8 -0
  62. package/brush-range/component.js +28 -27
  63. package/buttons/svg-button.d.ts +1 -1
  64. package/buttons/svg-button.js +16 -16
  65. package/calendar/_calendar.scss +2 -2
  66. package/calendar/calendar.js +1 -1
  67. package/calendar/index.js +2 -2
  68. package/choice-chips/index.d.ts +3 -1
  69. package/choice-chips/index.js +1 -1
  70. package/color-palette/color-palette.js +1 -1
  71. package/color-palette/color-palette.style.scss +1 -1
  72. package/color-palette/color-picker.js +2 -2
  73. package/component-catalog.d.ts +6 -1
  74. package/configurator-actions.d.ts +67 -0
  75. package/configurator-actions.js +1 -0
  76. package/configurator-aggregation-list.d.ts +14 -0
  77. package/configurator-aggregation-list.js +61 -0
  78. package/configurator-drop-zone.d.ts +38 -0
  79. package/configurator-drop-zone.js +64 -0
  80. package/configurator-field-icon.d.ts +10 -0
  81. package/configurator-field-icon.js +1 -0
  82. package/configurator-focus.d.ts +4 -0
  83. package/configurator-focus.js +39 -0
  84. package/configurator-sections.d.ts +42 -0
  85. package/configurator-sections.js +71 -0
  86. package/control-presentation.js +24 -19
  87. package/controls.d.ts +1 -2
  88. package/controls.js +4 -3
  89. package/core/editor-popup.js +1 -1
  90. package/core/popover-controller.d.ts +35 -0
  91. package/core/popup-ownership.d.ts +2 -0
  92. package/core/title-tooltip.d.ts +2 -0
  93. package/core/tooltip-session.d.ts +29 -0
  94. package/core/tooltip-surface.d.ts +13 -0
  95. package/core/tooltip-text.d.ts +6 -0
  96. package/core/tooltip.d.ts +35 -0
  97. package/core/top-layer-popup.d.ts +4 -0
  98. package/core/top-layer-popup.js +1 -23
  99. package/date-time/index.js +1 -1
  100. package/date-time/style.scss +50 -7
  101. package/date-time/time-selection.d.ts +3 -1
  102. package/dialog/dialog.dom.js +8 -8
  103. package/dialog/dialog.parts.js +1 -1
  104. package/distribution-chart/_distribution-chart.scss +1 -57
  105. package/distribution-chart/area-chart.js +1 -1
  106. package/distribution-chart/bar-chart.js +1 -1
  107. package/distribution-chart/line-chart.js +1 -1
  108. package/dropdown/content.js +1 -1
  109. package/dropdown/control.js +1 -1
  110. package/dropdown/index.js +2 -2
  111. package/dropdown/lookup-field.js +2 -1
  112. package/dropdown/popup.d.ts +2 -2
  113. package/dropdown/popup.js +1 -1
  114. package/duration/index.js +1 -1
  115. package/editor-actions.js +1 -1
  116. package/field-configurator.d.ts +19 -0
  117. package/field-configurator.js +4 -170
  118. package/field-expansion.d.ts +9 -0
  119. package/filter/filters/slider/_slider.scss +0 -17
  120. package/filter/filters/slider/control.js +2 -0
  121. package/filter/filters/slider/runtime.js +49 -22
  122. package/filter/filters/slider/single.js +1 -1
  123. package/filter-badge.js +1 -1
  124. package/filter-controls.js +1 -1
  125. package/form-controls/index.js +6 -6
  126. package/form-controls/presentation.js +12 -12
  127. package/formatting/control-tooltip.d.ts +2 -27
  128. package/formatting/index.js +22 -21
  129. package/formatting/styles.scss +2 -47
  130. package/framework.js +215 -208
  131. package/history-controls.js +27 -1
  132. package/icon-toolbar.d.ts +58 -0
  133. package/icon-toolbar.js +1 -0
  134. package/masked-input/index.js +1 -1
  135. package/native-control.d.ts +1 -2
  136. package/native-control.js +1 -1
  137. package/native-styles.css +1 -1
  138. package/native.js +45 -42
  139. package/number-input/index.js +1 -1
  140. package/package.json +36 -1
  141. package/pagination.js +1 -1
  142. package/pdf-viewer/index.js +1 -1
  143. package/pickers.d.ts +5 -1
  144. package/preact-mount.js +1 -1
  145. package/preact.d.ts +7 -0
  146. package/preact.js +68 -61
  147. package/rating-choice.js +1 -1
  148. package/react.d.ts +5 -0
  149. package/react.js +67 -65
  150. package/reorder-list.js +1 -1
  151. package/resource-picker/resource-picker-popup.js +1 -1
  152. package/resource-picker/resource-picker.js +4 -4
  153. package/rich-text/engine.d.ts +1 -0
  154. package/rich-text/format-html.d.ts +2 -0
  155. package/rich-text/index.d.ts +4 -0
  156. package/rich-text/index.js +1 -1
  157. package/rich-text/model.d.ts +2 -0
  158. package/rich-text/style.scss +165 -70
  159. package/rich-text/syntax.d.ts +5 -0
  160. package/rich-text/translations.d.ts +2 -0
  161. package/select.d.ts +3 -1
  162. package/select.js +1 -1
  163. package/status-feedback/exit-snapshot.js +4 -4
  164. package/status-feedback/popover.js +4 -4
  165. package/styles/_compositions.scss +3 -3
  166. package/styles/_field-configurator.scss +146 -0
  167. package/styles/_fields-grid.scss +35 -0
  168. package/styles/_primitives.scss +25 -18
  169. package/styles/configurator-actions.scss +141 -0
  170. package/styles/legacy-pagination.css +19 -2
  171. package/styles.css +1 -1
  172. package/surfaces.d.ts +3 -0
  173. package/surfaces.js +34 -131
  174. package/surfaces.view.d.ts +4 -34
  175. package/svelte.js +1 -1
  176. package/switch/index.js +15 -14
  177. package/time-grid.js +37 -36
  178. package/timeline-track/index.js +2 -2
  179. package/ui.css +1 -1
  180. package/vue.d.ts +24 -9
  181. package/vue.js +118 -116
  182. package/_chunks/chart-frame-Cmc7xU1i.js +0 -130
  183. package/_chunks/choice-chips-CHQTUdLs.js +0 -110
  184. package/_chunks/color-picker-CudqPYZo.js +0 -138
  185. package/_chunks/control-tooltip-uscKfAnV.js +0 -100
  186. package/_chunks/date-time-qIhp5vaX.js +0 -768
  187. package/_chunks/editor-popup-WDdtVDNA.js +0 -81
  188. package/_chunks/history-controls-B3u3INEK.js +0 -27
  189. package/_chunks/mount-DQ1cpppK.js +0 -257
  190. package/_chunks/native-control-C_yok8_-.js +0 -605
  191. package/_chunks/request-trail-DSlFix6i.js +0 -618
  192. package/_chunks/rich-text-CH7gIqOS.js +0 -636
@@ -0,0 +1,64 @@
1
+ import { i as e } from "./_chunks/preact.module-BBM36DnO.js";
2
+ import { t } from "./_chunks/jsxRuntime.module-F6UFnpT-.js";
3
+ import { a as n, f as r, o as i, p as a, v as o } from "./_chunks/field-configurator-1eQP0tKy.js";
4
+ import { useFieldDropTarget as s } from "./field-reorder.hook.js";
5
+ //#region src/configurator-drop-zone.tsx
6
+ function c({ title: c, label: l, footer: u, removeLabel: d, headerActions: f, renderActions: p, allowFieldRemoving: m = !0, panel: h, items: g, itemKeys: _, dimensions: v, placeholder: y, i18n: b, renderItem: x, onRemove: S, onDrop: C, onDragOver: w, canDrop: T = () => !0, onDragEnter: E, onItemDragStart: D, onItemDragEnd: O, allowFieldDragging: k = !0, dragActive: A, renderIcon: j }) {
7
+ let M = g.length === 0, N = s(g.length, {
8
+ enabled: k,
9
+ active: A,
10
+ canDrop: T,
11
+ onDragOver: w,
12
+ onDrop: (e, t) => C(h, e, t)
13
+ });
14
+ return /* @__PURE__ */ t(i, {
15
+ ...N.list,
16
+ className: "pivot-layout-zone",
17
+ "aria-label": l,
18
+ "data-pivot-area": h,
19
+ heading: c,
20
+ headingClassName: "zone-title",
21
+ actions: f,
22
+ children: [/* @__PURE__ */ t(r, {
23
+ empty: M,
24
+ placeholder: y ?? b.dragHere,
25
+ className: `min-h-[3rem] overflow-auto grow panel-card ${M ? "empty" : ""} ${N.isOver ? "drag-over" : ""}`,
26
+ ...N.list,
27
+ onDragEnter: E,
28
+ children: g.map((r, i) => {
29
+ let s = v.get(r), l = N.position(i);
30
+ return /* @__PURE__ */ t(o, {
31
+ ...N.row(i),
32
+ draggable: k,
33
+ onDragStart: (e) => {
34
+ k ? (e.dataTransfer?.setData("text/plain", String(r)), e.dataTransfer && (e.dataTransfer.effectAllowed = "move"), N.start(i), D(i, r, e)) : e.preventDefault();
35
+ },
36
+ onDragEnd: () => {
37
+ N.clear(), O();
38
+ },
39
+ indicator: l && /* @__PURE__ */ t(n, {
40
+ position: l,
41
+ index: N.boundary ?? void 0,
42
+ className: `pivot-zone-drop-divider ${l}`
43
+ }),
44
+ contentClassName: "pivot-dimension-cell",
45
+ icon: j?.(s),
46
+ label: /* @__PURE__ */ t("span", {
47
+ className: "pivot-zone-field-caption flex grow",
48
+ children: x?.(i, s) ?? s?.name ?? r
49
+ }),
50
+ actions: /* @__PURE__ */ t(e, { children: [p?.(i, r), m && /* @__PURE__ */ t(a, {
51
+ className: "pivot-remove-button",
52
+ onClick: () => S(i),
53
+ locale: {
54
+ title: d?.(i, r) ?? b.remove,
55
+ ariaLabel: d?.(i, r) ?? b.remove
56
+ }
57
+ })] })
58
+ }, _?.[i] ?? `${c}-${i}`);
59
+ })
60
+ }), u]
61
+ });
62
+ }
63
+ //#endregion
64
+ export { c as ConfiguratorDropZone };
@@ -0,0 +1,10 @@
1
+ export interface ConfiguratorFieldMetadata {
2
+ columnType?: string;
3
+ dataType?: 'string' | 'number' | 'date' | 'boolean';
4
+ }
5
+ /** Shared descriptive field identity; never infers or formats source values. */
6
+ export declare function resolveConfiguratorFieldIcon(dimension?: ConfiguratorFieldMetadata): {
7
+ kind: string;
8
+ svg: string;
9
+ label: string;
10
+ };
@@ -0,0 +1 @@
1
+ export { t as resolveConfiguratorFieldIcon } from "./_chunks/configurator-field-icon-CmcM_sPs.js";
@@ -0,0 +1,4 @@
1
+ /** Return focus only from this editor. Release a temporary tab stop on blur or disposal. */
2
+ export declare function focusConfiguratorOrigin(origin: HTMLElement, root: HTMLElement | null): () => void;
3
+ /** A single mounted owner's lease; synchronous focus callbacks cannot revive a disposed lease. */
4
+ export declare function useConfiguratorOriginFocus(): (origin: HTMLElement, root: HTMLElement | null) => void;
@@ -0,0 +1,39 @@
1
+ import { r as e, t } from "./_chunks/hooks.module-CG3gN83z.js";
2
+ //#region src/configurator-focus.ts
3
+ var n = () => {};
4
+ function r(e, t) {
5
+ if (!e.isConnected || !t?.isConnected || e.ownerDocument !== t.ownerDocument) return !1;
6
+ let n = e.ownerDocument.activeElement;
7
+ return !n || n === e.ownerDocument.body || n === e || t.contains(n);
8
+ }
9
+ function i(e, t) {
10
+ if (!r(e, t)) return n;
11
+ let i = e.ownerDocument, a = i.activeElement;
12
+ if (e.focus({ preventScroll: !0 }), i.activeElement === e || e.hasAttribute("tabindex") || !e.isConnected || !t.isConnected || i.activeElement !== a && i.activeElement !== i.body) return n;
13
+ let o = !0, s = () => {
14
+ o && (o = !1, e.removeEventListener("blur", s), e.getAttribute("tabindex") === "-1" && e.removeAttribute("tabindex"));
15
+ };
16
+ e.setAttribute("tabindex", "-1"), e.addEventListener("blur", s);
17
+ try {
18
+ e.focus({ preventScroll: !0 }), (i.activeElement !== e || !e.isConnected || !t.isConnected) && s();
19
+ } catch (e) {
20
+ throw s(), e;
21
+ }
22
+ return s;
23
+ }
24
+ function a() {
25
+ let a = t(n), o = t(0), s = t(!0);
26
+ return e(() => (s.current = !0, () => {
27
+ s.current = !1, o.current++;
28
+ let e = a.current;
29
+ a.current = n, e();
30
+ }), []), (e, t) => {
31
+ if (!s.current || !r(e, t)) return;
32
+ let c = ++o.current, l = a.current;
33
+ if (a.current = n, l(), !s.current || c !== o.current) return;
34
+ let u = i(e, t);
35
+ !s.current || c !== o.current ? u() : a.current = u;
36
+ };
37
+ }
38
+ //#endregion
39
+ export { i as focusConfiguratorOrigin, a as useConfiguratorOriginFocus };
@@ -0,0 +1,42 @@
1
+ import { h, ComponentChildren } from './_vendor/preact/src/index';
2
+ /** Application-owned content. Return cleanup when mounting another framework or UI. */
3
+ export interface ConfiguratorSection {
4
+ id: string;
5
+ label: string;
6
+ hidden?: boolean;
7
+ disabled?: boolean;
8
+ render?: () => ComponentChildren;
9
+ mount?: (host: HTMLElement) => void | (() => void);
10
+ }
11
+ export interface ConfiguratorSectionsConfig {
12
+ /** Custom tabs appended after the built-in tabs. IDs must be unique and cannot replace built-ins. */
13
+ sections?: readonly ConfiguratorSection[];
14
+ initialSection?: string;
15
+ onSectionChange?: (id: string) => void;
16
+ }
17
+ /** Selection follows current availability, without discarding mounted editor drafts. */
18
+ export declare function useConfiguratorSections(config: ConfiguratorSectionsConfig, builtins: readonly ConfiguratorSection[], disabled?: boolean): {
19
+ sections: ConfiguratorSection[];
20
+ custom: ConfiguratorSection[];
21
+ active: string | undefined;
22
+ select: (id: string) => void;
23
+ };
24
+ /** Shared switch spacing and opaque sticky backdrop for every configurator. */
25
+ export declare function ConfiguratorHeader({ children, className }: {
26
+ children?: ComponentChildren;
27
+ className?: string;
28
+ }): h.JSX.Element;
29
+ export declare function ConfiguratorSectionTabs({ sections, active, onChange, prefix, label, className }: {
30
+ sections: readonly ConfiguratorSection[];
31
+ active?: string;
32
+ onChange: (id: string) => void;
33
+ prefix: string;
34
+ label: string;
35
+ className?: string;
36
+ }): h.JSX.Element;
37
+ /** Inactive sections retain chat transcripts and host drafts until removed. */
38
+ export declare function ConfiguratorSectionPanels({ sections, active, prefix }: {
39
+ sections: readonly ConfiguratorSection[];
40
+ active?: string;
41
+ prefix: string;
42
+ }): h.JSX.Element;
@@ -0,0 +1,71 @@
1
+ import { i as e } from "./_chunks/preact.module-BBM36DnO.js";
2
+ import { i as t, r as n, t as r } from "./_chunks/hooks.module-CG3gN83z.js";
3
+ import { t as i } from "./_chunks/jsxRuntime.module-F6UFnpT-.js";
4
+ import { SegmentedSwitch as a } from "./segmented-switch/index.js";
5
+ //#region src/configurator-sections.tsx
6
+ function o(e, n, r = !1) {
7
+ let i = new Set(n.map((e) => e.id)), a = (e.sections ?? []).filter((e) => !e.id || i.has(e.id) ? !1 : (i.add(e.id), !0)), o = [...n, ...a].filter((e) => !e.hidden).map((e) => r ? {
8
+ ...e,
9
+ disabled: !0
10
+ } : e), [s, c] = t(e.initialSection ?? n[0]?.id), l = o.find((e) => e.id === s && (r || !e.disabled))?.id ?? o.find((e) => !e.disabled)?.id ?? (r ? o[0]?.id : void 0);
11
+ return {
12
+ sections: o,
13
+ custom: o.filter((e) => !n.some((t) => t.id === e.id)),
14
+ active: l,
15
+ select: (t) => {
16
+ t !== l && o.some((e) => e.id === t && !e.disabled) && (c(t), e.onSectionChange?.(t));
17
+ }
18
+ };
19
+ }
20
+ function s({ children: e, className: t = "" }) {
21
+ return /* @__PURE__ */ i("header", {
22
+ className: `rv-configurator-header ${t}`,
23
+ children: e
24
+ });
25
+ }
26
+ function c({ sections: e, active: t, onChange: n, prefix: r, label: o, className: s = "" }) {
27
+ return /* @__PURE__ */ i(a, {
28
+ value: t ?? "",
29
+ ariaLabel: o,
30
+ role: "tablist",
31
+ className: `rv-configurator-section-tabs ${s}`,
32
+ options: e.map((e) => ({
33
+ value: e.id,
34
+ label: e.label,
35
+ disabled: e.disabled,
36
+ id: `${r}-tab-${e.id}`,
37
+ ariaControls: `${r}-panel-${e.id}`
38
+ })),
39
+ onChange: n
40
+ });
41
+ }
42
+ function l({ section: e }) {
43
+ let t = r(null);
44
+ return n(() => {
45
+ if (t.current && e.mount) return e.mount(t.current);
46
+ }, [e.mount]), /* @__PURE__ */ i("div", {
47
+ ref: t,
48
+ class: "rv-configurator-section-content",
49
+ children: e.render?.()
50
+ });
51
+ }
52
+ function u({ sections: t, active: n, prefix: r }) {
53
+ return /* @__PURE__ */ i(e, { children: t.map((e) => /* @__PURE__ */ i(d, {
54
+ section: e,
55
+ active: n === e.id,
56
+ prefix: r
57
+ }, e.id)) });
58
+ }
59
+ function d({ section: e, active: t, prefix: n }) {
60
+ let a = r(!1);
61
+ return t && (a.current = !0), /* @__PURE__ */ i("section", {
62
+ hidden: !t,
63
+ role: "tabpanel",
64
+ id: `${n}-panel-${e.id}`,
65
+ "aria-labelledby": `${n}-tab-${e.id}`,
66
+ class: "rv-configurator-custom-section",
67
+ children: a.current && /* @__PURE__ */ i(l, { section: e })
68
+ });
69
+ }
70
+ //#endregion
71
+ export { s as ConfiguratorHeader, u as ConfiguratorSectionPanels, c as ConfiguratorSectionTabs, o as useConfiguratorSections };
@@ -1,36 +1,41 @@
1
1
  import { c as e } from "./_chunks/preact.module-BBM36DnO.js";
2
2
  import { t } from "./_chunks/jsxRuntime.module-F6UFnpT-.js";
3
3
  import { createPreactElement as n } from "./preact-mount.js";
4
- import { controlAttributes as r, controlClassName as i } from "./control-attributes.js";
4
+ import { n as r } from "./_chunks/popover-controller-D-AvKQ7B.js";
5
+ import { controlAttributes as i, controlClassName as a } from "./control-attributes.js";
5
6
  //#region src/control-presentation.view.tsx
6
- function a(e, t, n, ...i) {
7
+ function o(e, t, n, ...r) {
7
8
  let a = n ?? {};
8
9
  if (t === "button" && a.busy === !0) {
9
- let n = i.length ? i : [a.children];
10
- return e(t, r(t, a), e("span", {
10
+ let n = r.length ? r : [a.children];
11
+ return e(t, i(t, a), e("span", {
11
12
  class: "rv-button-spinner",
12
13
  "aria-hidden": "true"
13
14
  }), ...n);
14
15
  }
15
- return e(t, r(t, a), ...i);
16
+ return e(t, i(t, a), ...r);
16
17
  }
17
- function o(t, r, i = {}) {
18
- let o = a(e, r, i);
19
- return i.onChange && !(r === "button" && i.busy) && Object.assign(o.props, { onChange: i.onChange }), n(t, o);
18
+ function s(t, r, i = {}) {
19
+ let a = o(e, r, i);
20
+ return i.onChange && !(r === "button" && i.busy) && Object.assign(a.props, { onChange: i.onChange }), n(t, a);
20
21
  }
21
- var s = /* @__PURE__ */ new WeakMap();
22
- function c(e, t) {
23
- return s.set(e, t), e;
22
+ var c = /* @__PURE__ */ new WeakMap();
23
+ function l(e, t) {
24
+ return c.set(e, t), e;
24
25
  }
25
- function l(e) {
26
- return typeof e == "string" ? e : e && (typeof e == "function" || typeof e == "object") ? s.get(e) : void 0;
26
+ function u(e) {
27
+ return typeof e == "string" ? e : e && (typeof e == "function" || typeof e == "object") ? c.get(e) : void 0;
27
28
  }
28
- function u(e, r) {
29
- e.classList.add("rv-btn", "rv-btn-ghost", "rv-btn-icon"), e.setAttribute("aria-label", r), e.title = r, e.querySelector(".rv-control-tooltip")?.remove(), e.append(n(e.ownerDocument, /* @__PURE__ */ t("span", {
29
+ var d = /* @__PURE__ */ new WeakMap();
30
+ function f(e, i) {
31
+ e.classList.add("rv-btn", "rv-btn-ghost", "rv-btn-icon"), e.setAttribute("aria-label", i), d.get(e)?.(), e.removeAttribute("title"), e.querySelector(".rv-control-tooltip")?.remove();
32
+ let a = n(e.ownerDocument, /* @__PURE__ */ t("span", {
30
33
  class: "rv-control-tooltip",
31
- "aria-hidden": "true",
32
- children: r
33
- })));
34
+ role: "tooltip",
35
+ hidden: !0,
36
+ children: i
37
+ }));
38
+ e.append(a), d.set(e, new r().bind(e, i, { surface: a }));
34
39
  }
35
40
  //#endregion
36
- export { r as controlAttributes, i as controlClassName, o as createControl, u as decorateIconAction, l as nativeControlTag, c as registerControl, a as renderControl };
41
+ export { i as controlAttributes, a as controlClassName, s as createControl, f as decorateIconAction, u as nativeControlTag, l as registerControl, o as renderControl };
package/controls.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { BadgeOptions } from './badge';
2
1
  import { h, ComponentChildren, JSX } from './_vendor/preact/src/index';
3
2
  import { SegmentedSwitchProps, SegmentedSwitchValue } from './segmented-switch';
4
3
  import { EditorPane, EditorSplitLayout } from './editor-layout';
@@ -106,7 +105,7 @@ export declare function Panel({ children, className, label }: ShellProps): h.JSX
106
105
  export declare function Toolbar({ children, className, label }: ShellProps): h.JSX.Element;
107
106
  export declare function ToolbarGroup({ children, className, label }: ShellProps): h.JSX.Element;
108
107
  export declare function ToolbarSeparator(): h.JSX.Element;
109
- export declare function Badge({ children, className, variant, shape, }: ShellProps & BadgeOptions): h.JSX.Element;
108
+ export { Badge } from './badge.view';
110
109
  export declare function CountBadge({ count, label }: {
111
110
  count: number;
112
111
  label: string;
package/controls.js CHANGED
@@ -1,3 +1,4 @@
1
- import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, R as d, S as f, T as p, _ as m, a as h, b as g, c as _, d as v, f as y, g as b, h as x, i as S, j as C, k as w, l as T, m as E, n as D, o as O, p as k, r as A, s as j, t as M, u as N, v as P, w as F, x as I, y as L } from "./_chunks/controls-DsNi8V8I.js";
2
- import { EditorList as R, EditorListGroup as z, EditorListItem as B, EditorListItemContent as V, EditorPane as H, EditorSplitLayout as U } from "./editor-layout/index.js";
3
- export { d as Alert, M as Badge, D as Button, A as ButtonGroup, S as Chip, h as CircularProgress, O as CountBadge, j as DateInput, _ as DateTimeInput, T as Disclosure, N as EmptyState, v as FieldError, y as FieldHint, k as FormSection, E as IconButton, R as Listbox, z as ListboxGroup, B as ListboxOption, V as ListboxOptionContent, x as LoadingOverlay, b as Menu, m as MenuItem, P as MenuSeparator, L as NumberInput, g as NumberStepper, I as Pagination, H as Pane, f as Panel, t as RadioGroup, F as Rating, p as ResizeHandle, r as SegmentedControl, n as Spinner, U as SplitLayout, l as Submenu, w as TabPanel, e as Tabs, C as TextInput, s as Textarea, c as TimeInput, u as ToggleButton, i as Toolbar, a as ToolbarGroup, o as ToolbarSeparator };
1
+ import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, S as d, T as f, _ as p, a as m, b as h, c as g, d as _, f as v, g as y, h as b, i as x, j as S, k as C, l as w, m as T, n as E, o as D, p as O, r as k, s as A, t as j, u as M, v as N, w as P, x as F, y as I } from "./_chunks/controls-BLQnWEd7.js";
2
+ import { EditorList as L, EditorListGroup as R, EditorListItem as z, EditorListItemContent as B, EditorPane as V, EditorSplitLayout as H } from "./editor-layout/index.js";
3
+ import { t as U } from "./_chunks/badge.view-D30pMUfi.js";
4
+ export { o as Alert, U as Badge, j as Button, E as ButtonGroup, k as Chip, x as CircularProgress, m as CountBadge, D as DateInput, A as DateTimeInput, g as Disclosure, w as EmptyState, M as FieldError, _ as FieldHint, v as FormSection, O as IconButton, L as Listbox, R as ListboxGroup, z as ListboxOption, B as ListboxOptionContent, T as LoadingOverlay, b as Menu, y as MenuItem, p as MenuSeparator, N as NumberInput, I as NumberStepper, h as Pagination, V as Pane, F as Panel, d as RadioGroup, t as Rating, P as ResizeHandle, f as SegmentedControl, r as Spinner, H as SplitLayout, n as Submenu, l as TabPanel, C as Tabs, e as TextInput, S as Textarea, s as TimeInput, c as ToggleButton, u as Toolbar, i as ToolbarGroup, a as ToolbarSeparator };
@@ -1 +1 @@
1
- export { t as mountEditorPopup } from "../_chunks/editor-popup-WDdtVDNA.js";
1
+ export { t as mountEditorPopup } from "../_chunks/editor-popup-BaaxL89T.js";
@@ -0,0 +1,35 @@
1
+ export interface PopoverOptions {
2
+ anchor: HTMLElement | SVGElement;
3
+ placement?: 'above';
4
+ content: HTMLElement;
5
+ /** Defaults to the document body. */
6
+ appendTo?: HTMLElement;
7
+ onClose?: () => void;
8
+ restoreFocus?: boolean;
9
+ closeOnOutside?: boolean;
10
+ closeOnEscape?: boolean;
11
+ display?: string;
12
+ }
13
+ /** One owner for native top-layer promotion, viewport positioning and disposal. */
14
+ export declare class PopoverController {
15
+ private active?;
16
+ get isOpen(): boolean;
17
+ open(options: PopoverOptions): {
18
+ close: (restoreFocus?: boolean) => void;
19
+ refresh: () => void;
20
+ };
21
+ refresh(): void;
22
+ close(restoreFocus?: boolean): void;
23
+ destroy(): void;
24
+ }
25
+ export declare function createTooltipElement(document: Document, className?: string): HTMLDivElement;
26
+ /** Imperative binding adapter over the same session used by useTooltip. */
27
+ export declare class TooltipController {
28
+ private release?;
29
+ bind(anchor: HTMLElement | SVGElement, text: string, options?: {
30
+ trigger?: 'hover' | 'click';
31
+ surface?: HTMLElement;
32
+ onEscape?: () => void;
33
+ }): () => void;
34
+ destroy(): void;
35
+ }
@@ -0,0 +1,2 @@
1
+ /** Includes portalled descendants linked by their owning trigger's aria-controls. */
2
+ export declare function ownsPopupTarget(root: HTMLElement | null | undefined, target: Node | null): boolean;
@@ -0,0 +1,2 @@
1
+ /** Native title replacement, without wrappers or changes to consumer handlers. */
2
+ export declare function useTitleTooltip<T extends HTMLElement | SVGElement>(title?: string, onEscape?: () => void): import('../_vendor/preact/src/index').RefObject<T>;
@@ -0,0 +1,29 @@
1
+ export type TooltipAnchor = HTMLElement | SVGElement;
2
+ /** One lifecycle for declarative and imperative tooltip adapters. */
3
+ export declare class TooltipSession {
4
+ private anchor?;
5
+ private surface?;
6
+ private timer?;
7
+ private mode?;
8
+ private cleanup?;
9
+ private mounted;
10
+ private pointerFocus;
11
+ private open;
12
+ private addedDescription;
13
+ onHide?: () => void;
14
+ onEscape?: () => void;
15
+ delay: number;
16
+ get isOpen(): boolean;
17
+ get isPending(): boolean;
18
+ setSurface(surface: HTMLElement | null): void;
19
+ show(anchor: TooltipAnchor): void;
20
+ private present;
21
+ hide(): void;
22
+ focus(anchor: TooltipAnchor): void;
23
+ blur(): void;
24
+ pointerDown(): void;
25
+ leave(anchor?: TooltipAnchor): void;
26
+ keyDown(event: KeyboardEvent): void;
27
+ destroy(): void;
28
+ private listen;
29
+ }
@@ -0,0 +1,13 @@
1
+ /** Shared presentation for text hints and rich product/chart tooltip content. */
2
+ export declare const TOOLTIP_STYLES = "\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";
3
+ /** Also installs into shadow roots/fullscreen roots used by standalone charts. */
4
+ export declare function ensureTooltipStyles(root: Document | ShadowRoot): void;
5
+ export declare function prepareTooltipSurface(element: HTMLElement): void;
6
+ /** Shared hint placement: centered above the trigger, with a bounded below fallback. */
7
+ export declare function calculateTooltipPosition(anchor: DOMRect, popup: DOMRect, viewport: {
8
+ width: number;
9
+ height: number;
10
+ }): import('./anchored-popover').AnchoredPopoverPosition | {
11
+ left: number;
12
+ top: number;
13
+ };
@@ -0,0 +1,6 @@
1
+ import { JSX } from '../_vendor/preact/src/index';
2
+ /** Wrapper-free shared hint for otherwise native text and label elements. */
3
+ export declare function TooltipText({ as, title, children, ...attributes }: Omit<JSX.HTMLAttributes<HTMLElement>, 'title'> & {
4
+ as?: 'span' | 'label' | 'div';
5
+ title?: string;
6
+ }): JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { h, ComponentChildren, TargetedEvent } from '../_vendor/preact/src/index';
2
+ type TooltipPresentation = {
3
+ className?: string;
4
+ placement?: 'above';
5
+ delay?: number;
6
+ content?: ComponentChildren;
7
+ };
8
+ /** Preact adapter; the session owns all tooltip behavior and DOM lifecycle. */
9
+ export declare function useControlTooltip(text: string, _floating?: boolean, presentation?: TooltipPresentation): {
10
+ readonly id: string;
11
+ readonly hide: () => void;
12
+ readonly triggerProps: {
13
+ readonly 'aria-describedby': string;
14
+ readonly onFocus: (event: TargetedEvent<HTMLElement>) => void;
15
+ readonly onBlur: () => void;
16
+ readonly onMouseEnter: (event: TargetedEvent<HTMLElement>) => void;
17
+ readonly onMouseLeave: (event?: TargetedEvent<HTMLElement>) => void;
18
+ readonly onPointerDown: (_event: TargetedEvent<HTMLElement>) => void;
19
+ readonly onPointerCancel: () => void;
20
+ readonly onKeyDown: (event: KeyboardEvent) => void;
21
+ };
22
+ readonly tooltip: h.JSX.Element;
23
+ };
24
+ /** Controlled surface adapter retained for existing consumers. */
25
+ export declare function ControlTooltip({ id, text, content, visible, anchor, className }: {
26
+ readonly id: string;
27
+ readonly text: string;
28
+ readonly content?: ComponentChildren;
29
+ readonly visible: boolean;
30
+ readonly anchor?: HTMLElement | null;
31
+ readonly className?: string;
32
+ readonly placement?: 'above';
33
+ }): h.JSX.Element;
34
+ export declare const useTooltip: typeof useControlTooltip;
35
+ export {};
@@ -1,3 +1,5 @@
1
+ export { ensureTooltipStyles, prepareTooltipSurface, TOOLTIP_STYLES } from './tooltip-surface';
2
+ export { ownsPopupTarget } from './popup-ownership';
1
3
  export type TopLayerPopupMode = 'popover' | 'fallback';
2
4
  export type TopLayerPopupElement = HTMLElement & {
3
5
  showPopover?: () => void;
@@ -7,3 +9,5 @@ export type TopLayerPopupElement = HTMLElement & {
7
9
  export declare function showTopLayerPopup(element: TopLayerPopupElement, visibleDisplay?: string): TopLayerPopupMode;
8
10
  /** Hides an overlay opened by `showTopLayerPopup`; safe to call repeatedly. */
9
11
  export declare function hideTopLayerPopup(element: TopLayerPopupElement, mode?: TopLayerPopupMode): void;
12
+ /** Includes portalled popup content linked by descendant aria-controls triggers. */
13
+ export declare function popupOwnsTarget(panel: HTMLElement, target: Node | null): boolean;
@@ -1,23 +1 @@
1
- //#region src/core/top-layer-popup.ts
2
- var e = /* @__PURE__ */ new WeakMap();
3
- function t(t, n = "flex") {
4
- if (e.has(t) || e.set(t, t.getAttribute("data-rv-ui-surface")), t.setAttribute("data-rv-ui-surface", ""), t.style.display = n, typeof t.showPopover == "function") {
5
- t.setAttribute("popover", "manual");
6
- try {
7
- return t.showPopover(), "popover";
8
- } catch {
9
- t.removeAttribute("popover");
10
- }
11
- }
12
- return t.style.display = n, "fallback";
13
- }
14
- function n(t, n) {
15
- let r = e.get(t);
16
- if (r !== void 0 && (r === null ? t.removeAttribute("data-rv-ui-surface") : t.setAttribute("data-rv-ui-surface", r), e.delete(t)), n === "popover" && typeof t.hidePopover == "function") try {
17
- t.hidePopover(), t.style.removeProperty("display");
18
- return;
19
- } catch {}
20
- t.style.display = "none";
21
- }
22
- //#endregion
23
- export { n as hideTopLayerPopup, t as showTopLayerPopup };
1
+ export { a as TOOLTIP_STYLES, s as ensureTooltipStyles, t as hideTopLayerPopup, i as ownsPopupTarget, n as popupOwnsTarget, c as prepareTooltipSurface, r as showTopLayerPopup } from "../_chunks/top-layer-popup-CNSDdfJV.js";
@@ -1 +1 @@
1
- export { r as DateTimeField, i as TemporalDraft, a as TemporalPicker, n as attachTemporalPicker, o as defaultTemporalPickerText, t as renderTemporalValue, s as temporalPickerLabel } from "../_chunks/date-time-qIhp5vaX.js";
1
+ export { r as DateTimeField, i as TemporalDraft, a as TemporalPicker, n as attachTemporalPicker, o as defaultTemporalPickerText, t as renderTemporalValue, s as temporalPickerLabel } from "../_chunks/date-time-B8rK5gpC.js";
@@ -25,6 +25,14 @@
25
25
  width: 100%;
26
26
  }
27
27
  }
28
+
29
+ // Validation follows the picker's width without contributing to popup sizing.
30
+ .rv-temporal-picker > .rv-alert,
31
+ .rv-temporal-draft > .rv-alert {
32
+ inline-size: 0;
33
+ min-inline-size: 100%;
34
+ }
35
+
28
36
  .rv-date-time-field {
29
37
  display: inline-flex;
30
38
  align-items: center;
@@ -66,12 +74,13 @@
66
74
  display: flex;
67
75
  align-items: center;
68
76
  gap: 6px;
69
- flex: 0 1 194px;
77
+ flex: 0 1 224px;
70
78
  min-width: 0;
71
- > .rv-control { flex: 0 1 88px; min-width: 0; width: 88px; }
79
+ // Ten date characters plus the control's horizontal padding and borders.
80
+ > .rv-control { flex: 0 0 auto; min-width: 0; width: calc(10ch + 26px); }
72
81
  > .rv-temporal-picker__time { flex: 0 1 100px; min-width: 86px; }
73
82
  }
74
- .rv-temporal-picker__endpoint:not(:has(.rv-temporal-picker__time)) { flex-basis: 110px; }
83
+ .rv-temporal-picker__endpoint:not(:has(.rv-temporal-picker__time)) { flex: 0 0 auto; }
75
84
 
76
85
  .rv-temporal-picker .rv-temporal-picker__endpoint > .rv-temporal-picker__time { flex: 0 1 100px; }
77
86
 
@@ -80,19 +89,25 @@
80
89
  min-width: min(240px, calc(100vw - 16px));
81
90
  width: 240px;
82
91
  }
83
- .rv-editor-popup.rv-editor-popup--datetime { width: min(540px, calc(100vw - 16px)); }
84
92
  .rv-temporal-picker__body { display: flex; align-items: start; flex-wrap: wrap; gap: 16px; }
85
- .rv-temporal-picker--datetime .rv-temporal-picker__body > .rv-time-selection { flex: 1 1 196px; }
93
+ .rv-temporal-picker--datetime .rv-temporal-picker__body { flex-direction: column; align-items: stretch; }
94
+ .rv-temporal-picker--datetime .rv-temporal-picker__body > .rv-time-selection { flex: 0 0 auto; }
86
95
  .rv-temporal-picker--time .rv-temporal-picker__body > .rv-time-selection { flex: 1 1 0; }
87
96
  .rv-temporal-picker--time .rv-temporal-picker__header { margin: 0; }
88
97
  .rv-temporal-picker__times { flex-wrap: wrap; }
89
98
  .rv-temporal-picker__times > .rv-time-selection { flex: 1 1 196px; }
90
99
  .rv-time-selection {
100
+ max-width: 208px;
91
101
  display: grid;
92
102
  gap: 12px;
93
103
  min-width: 0;
94
104
  width: 100%;
95
105
  font-variant-numeric: tabular-nums;
106
+ &__entry-row { display: flex; align-items: end; gap: 4px; min-width: 0; }
107
+ &__entry-row > .rv-time-selection__entry { flex: 1 1 0; }
108
+ &__clock { display: grid; gap: 12px; min-width: 0; }
109
+ &__toggle { flex: 0 0 auto; }
110
+ &__toggle[aria-expanded='true'] .rv-svg-icon { transform: rotate(180deg); }
96
111
  &__entry { display: grid; gap: 6px; min-width: 0; font-size: 12px; font-weight: 500; }
97
112
  &__entry > .rv-control { width: 100%; min-width: 0; height: var(--rv-control-height, 32px); font: inherit; font-size: var(--rv-control-font-size, 0.875rem); font-weight: 400; }
98
113
  &__entry input[type='time']::-webkit-calendar-picker-indicator { display: none; }
@@ -107,9 +122,37 @@
107
122
  &__period .rv-editor-list__item { flex: 1 1 0; }
108
123
  &__empty { margin: 0; color: var(--rv-ui-text-muted); font-size: 12px; }
109
124
  }
125
+ .rv-editor-popup .rv-temporal-draft .rv-editor-actions { position: static; }
110
126
  .rv-temporal-draft--time .rv-editor-actions { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--rv-ui-border); }
111
127
  .rv-temporal-draft--time .rv-editor-actions__clear { margin-inline-end: auto; }
128
+
129
+ // One calendar keeps its clock visible alongside it; multi-month calendars keep
130
+ // the optional clock below the calendar panels.
131
+ .rv-editor-popup:has(.rv-temporal-picker--datetime:not(.rv-temporal-picker--multi-month) .rv-time-selection) {
132
+ width: min(480px, calc(100vw - 16px));
133
+ }
134
+ .rv-temporal-picker--datetime:not(.rv-temporal-picker--multi-month) .rv-temporal-picker__body {
135
+ flex-direction: row;
136
+ }
137
+ .rv-temporal-picker--datetime:not(.rv-temporal-picker--multi-month) .rv-temporal-picker__body > .rv-time-selection {
138
+ flex: 0 1 208px;
139
+ }
112
140
  @media (max-width: 540px) {
113
- .rv-temporal-picker--datetime .rv-temporal-picker__body { flex-direction: column; align-items: stretch; }
114
- .rv-temporal-picker--datetime .rv-temporal-picker__body > .rv-time-selection { flex-basis: auto; }
141
+ .rv-temporal-picker--datetime:not(.rv-temporal-picker--multi-month) .rv-temporal-picker__body { flex-direction: column; }
142
+ .rv-temporal-picker--datetime:not(.rv-temporal-picker--multi-month) .rv-temporal-picker__body > .rv-time-selection { flex-basis: auto; }
143
+ }
144
+
145
+ .rv-editor-popup:has(.rv-temporal-picker--datetime:not(.rv-temporal-picker--multi-month) .revo-calendar--week-numbers):has(.rv-time-selection) {
146
+ width: min(512px, calc(100vw - 16px));
147
+ }
148
+
149
+ // Paired clocks need a wider surface than a single time-only field.
150
+ .rv-editor-popup:has(.rv-temporal-picker--time > .rv-temporal-picker__times) {
151
+ width: min(458px, calc(100vw - 16px));
152
+ }
153
+
154
+ // Grid adapters and standalone fields share the same compact single-clock size.
155
+ .rv-editor-popup:has(.rv-temporal-picker--time):not(:has(.rv-temporal-picker__times)) {
156
+ min-width: min(234px, calc(100vw - 16px));
157
+ width: 234px;
115
158
  }
@@ -10,6 +10,8 @@ export interface TimeSelectionProps {
10
10
  min?: string;
11
11
  max?: string;
12
12
  step?: number;
13
+ /** Calendar compositions keep clock columns behind an explicit toggle. */
14
+ collapsible?: boolean;
13
15
  }
14
16
  /** Shared typed entry and bounded clock columns for time-only and date-time pickers. */
15
- export declare function TimeSelection({ value, label, text, onChange, format, precision, locale, min, max, step }: TimeSelectionProps): import("../_vendor/preact/src/index").JSX.Element;
17
+ export declare function TimeSelection({ value, label, text, onChange, format, precision, locale, min, max, step, collapsible }: TimeSelectionProps): import("../_vendor/preact/src/index").JSX.Element;