@revolist/ui 4.0.2-rc → 4.0.3-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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +345 -263
  3. package/_chunks/{calendar-CpaUK7w1.js → calendar-xpZ0v3xf.js} +39 -29
  4. package/_chunks/{chart-frame-BC99KjGa.js → chart-frame-Cmc7xU1i.js} +16 -13
  5. package/_chunks/{choice-chips-Cs4D-3nH.js → choice-chips-CHQTUdLs.js} +10 -10
  6. package/_chunks/clock-BOhPNlW3.js +4 -0
  7. package/_chunks/{color-palette-BBMFmUNA.js → color-palette-D8vyPfld.js} +1 -1
  8. package/_chunks/{color-picker-D90Jg-M8.js → color-picker-CudqPYZo.js} +10 -10
  9. package/_chunks/{component-YDcfoOLz.js → component-C_T2VN5u.js} +182 -178
  10. package/_chunks/{component-metadata-BENbgTjU.js → component-metadata-BMOOmqx5.js} +0 -4
  11. package/_chunks/control-AHKXD5Eu.js +93 -0
  12. package/_chunks/{control-tooltip-ztgmsG7H.js → control-tooltip-uscKfAnV.js} +15 -15
  13. package/_chunks/{controls-DIum-E66.js → controls-DsNi8V8I.js} +144 -129
  14. package/_chunks/{date-control-BJSzu79z.js → date-control-DrVFX13g.js} +1 -1
  15. package/_chunks/{date-time-BxPJusp9.js → date-time-qIhp5vaX.js} +143 -145
  16. package/_chunks/{delete-button-Bblyah10.js → delete-button-CW9vjLnk.js} +6 -6
  17. package/_chunks/{dialog.parts-DBqo3Qwb.js → dialog.parts-CKGkC5zP.js} +20 -20
  18. package/_chunks/{duration-87U2EoMS.js → duration-CL68Em0o.js} +16 -15
  19. package/_chunks/{editor-popup-D3JdS8l3.js → editor-popup-WDdtVDNA.js} +5 -5
  20. package/_chunks/field-context-D57PnBbH.js +5 -0
  21. package/_chunks/{framework-mount-C-Zwm44H.js → framework-mount--RTLIqE-.js} +1 -1
  22. package/_chunks/history-controls-B3u3INEK.js +27 -0
  23. package/_chunks/mount-DQ1cpppK.js +257 -0
  24. package/_chunks/native-control-C_yok8_-.js +605 -0
  25. package/_chunks/{number-input-BeIadZuL.js → number-input-BKwA5FnM.js} +2 -2
  26. package/_chunks/{picker-DpP7iQLA.js → picker-h1P5RUgp.js} +2 -2
  27. package/_chunks/popup-CT2uD3go.js +367 -0
  28. package/_chunks/{rating-choice-Ca8ZBty3.js → rating-choice-DZgmaic0.js} +1 -1
  29. package/_chunks/render-m5eMMwFR.js +83 -0
  30. package/_chunks/{reorder-list-Cc3KmfAN.js → reorder-list-CSlqAGHw.js} +1 -1
  31. package/_chunks/request-trail-DSlFix6i.js +618 -0
  32. package/_chunks/rich-text-CH7gIqOS.js +636 -0
  33. package/_chunks/rotate-right-Iha5ScJ1.js +4 -0
  34. package/_form.scss +1 -1
  35. package/ai/_chat.scss +195 -0
  36. package/ai/_style.scss +105 -34
  37. package/ai/chat.d.ts +63 -0
  38. package/ai/components.d.ts +19 -3
  39. package/ai/index.d.ts +2 -0
  40. package/ai/index.js +3 -3
  41. package/ai/mount.d.ts +30 -1
  42. package/ai/prompt-history.d.ts +13 -0
  43. package/ai/transcript.d.ts +25 -0
  44. package/ai/translations.d.ts +1 -1
  45. package/angular/angular.js +0 -3
  46. package/assignee/index.js +34 -35
  47. package/buttons/delete-button.d.ts +2 -1
  48. package/buttons/delete-button.js +1 -1
  49. package/buttons/remove-button.js +1 -1
  50. package/buttons/svg-button.d.ts +1 -0
  51. package/buttons/svg-button.js +5 -5
  52. package/calendar/_calendar.scss +7 -2
  53. package/calendar/calendar.js +1 -1
  54. package/calendar/index.js +2 -2
  55. package/choice-chips/index.js +1 -1
  56. package/color-palette/color-palette.js +1 -1
  57. package/color-palette/color-picker.js +2 -2
  58. package/component-catalog.d.ts +16 -5
  59. package/control-attributes.js +7 -7
  60. package/controls.d.ts +8 -6
  61. package/controls.js +3 -3
  62. package/core/editor-popup.js +1 -1
  63. package/date-time/index.js +1 -1
  64. package/date-time/style.scss +4 -4
  65. package/dialog/dialog.dom.js +8 -8
  66. package/dialog/dialog.parts.js +1 -1
  67. package/distribution-chart/area-chart.js +1 -1
  68. package/distribution-chart/bar-chart.d.ts +5 -2
  69. package/distribution-chart/bar-chart.js +7 -3
  70. package/distribution-chart/chart-frame.d.ts +2 -1
  71. package/distribution-chart/line-chart.js +1 -1
  72. package/dropdown/content.d.ts +2 -1
  73. package/dropdown/content.js +1 -142
  74. package/dropdown/control.d.ts +14 -0
  75. package/dropdown/control.js +1 -0
  76. package/dropdown/control.view.d.ts +6 -0
  77. package/dropdown/dropdown.types.d.ts +4 -0
  78. package/dropdown/editor-dropdown.style.scss +37 -9
  79. package/dropdown/index.d.ts +1 -1
  80. package/dropdown/index.js +3 -4
  81. package/dropdown/lookup-field.js +1 -1
  82. package/dropdown/popup.js +1 -141
  83. package/duration/index.js +1 -1
  84. package/duration/style.scss +1 -1
  85. package/editor-actions.js +1 -1
  86. package/field-configurator.js +6 -6
  87. package/fieldset.d.ts +3 -0
  88. package/filter/filters/slider/single.js +1 -1
  89. package/filter-badge.js +1 -1
  90. package/filter-controls.js +7 -7
  91. package/form-controls/field-context.d.ts +5 -0
  92. package/form-controls/index.js +7 -12
  93. package/form-controls/index.view.d.ts +2 -4
  94. package/form-controls/presentation.js +51 -43
  95. package/formatting/index.js +25 -21
  96. package/framework.js +215 -207
  97. package/history-controls.d.ts +14 -0
  98. package/history-controls.js +1 -0
  99. package/masked-input/index.js +1 -1
  100. package/native-control.d.ts +6 -4
  101. package/native-control.js +3 -26
  102. package/native-styles.css +1 -1
  103. package/native.js +31 -30
  104. package/number-input/index.js +1 -1
  105. package/package.json +18 -13
  106. package/pagination.d.ts +3 -0
  107. package/pagination.js +43 -33
  108. package/pdf-viewer/index.js +1 -1
  109. package/pdf-viewer/style.scss +3 -4
  110. package/preact.d.ts +2 -0
  111. package/preact.js +62 -62
  112. package/rating-choice.js +1 -1
  113. package/react-control.d.ts +0 -1
  114. package/react-control.js +2 -2
  115. package/react.d.ts +13 -3
  116. package/react.js +71 -88
  117. package/reorder-list.js +1 -1
  118. package/resource-picker/resource-picker-popup.js +1 -1
  119. package/resource-picker/resource-picker.js +4 -4
  120. package/resource-picker/resource-picker.scss +6 -3
  121. package/rich-text/engine.d.ts +16 -19
  122. package/rich-text/index.d.ts +7 -7
  123. package/rich-text/index.js +1 -1
  124. package/rich-text/model.d.ts +4 -3
  125. package/rich-text/render-model.d.ts +4 -5
  126. package/rich-text/style.scss +3 -12
  127. package/rich-text/toolbar.d.ts +6 -6
  128. package/rich-text/translations.d.ts +3 -15
  129. package/select.d.ts +20 -0
  130. package/select.js +1 -0
  131. package/status-feedback/exit-snapshot.js +4 -4
  132. package/status-feedback/index.js +2 -2
  133. package/status-feedback/popover.js +10 -10
  134. package/status-feedback/render.js +3 -44
  135. package/status-feedback/status-feedback.scss +7 -0
  136. package/status-feedback/types.d.ts +4 -0
  137. package/status-feedback/use-auto-dismiss.d.ts +3 -0
  138. package/styles/_compositions.scss +3 -1
  139. package/styles/_control.scss +12 -4
  140. package/styles/_primitives.scss +9 -8
  141. package/styles.css +1 -1
  142. package/surfaces.js +45 -45
  143. package/svelte/UiComponent.server.js +1 -48
  144. package/svelte/UiComponent.svelte +0 -21
  145. package/svelte.js +33 -68
  146. package/time-grid.js +1 -1
  147. package/timeline-track/component.d.ts +5 -1
  148. package/timeline-track/index.js +71 -54
  149. package/timeline-track/model.d.ts +9 -0
  150. package/timeline-track/model.js +10 -1
  151. package/ui.css +1 -1
  152. package/vue.d.ts +24 -5
  153. package/vue.js +140 -164
  154. package/_chunks/compat.module-DDB2pm9O.js +0 -229
  155. package/_chunks/dropdown-voWqmwAe.js +0 -357
  156. package/_chunks/mount-DZe_6VtR.js +0 -90
  157. package/_chunks/request-trail-IdNiFvKH.js +0 -347
  158. package/_chunks/rich-text-BzI1DyfF.js +0 -477
  159. package/react-native-select.d.ts +0 -6
  160. package/rich-text/syntax.d.ts +0 -2
  161. package/vue-native-select.d.ts +0 -9
@@ -1,7 +1,7 @@
1
1
  import { c as e, i as t, n, o as r, t as i } from "../_chunks/hooks.module-CG3gN83z.js";
2
2
  import { t as a } from "../_chunks/jsxRuntime.module-F6UFnpT-.js";
3
- import { createControlId as o } from "../core/control-id.js";
4
- import { t as s } from "../_chunks/chevron-down-GbplLa6s.js";
3
+ import { t as o } from "../_chunks/chevron-down-GbplLa6s.js";
4
+ import { createControlId as s } from "../core/control-id.js";
5
5
  import { t as ee } from "../_chunks/xmark-DD_PBvZI.js";
6
6
  import { SearchInput as c } from "../search-input/index.js";
7
7
  import { resourcePickerClasses as l, resourcePickerDataAttribute as u, resourcePickerIdKey as d } from "./resource-picker.utils.js";
@@ -10,7 +10,7 @@ import { ResourcePickerOption as p } from "./resource-picker-option.js";
10
10
  import { ResourcePickerPopup as m } from "./resource-picker-popup.js";
11
11
  //#region src/resource-picker/resource-picker.tsx
12
12
  function h({ resources: h, selectedResourceIds: v, text: y, onChange: b, classNames: x, disabled: S = !1, readOnly: C = !1, presentation: w = "inline", multiple: T = !0, preserveOrder: E = !1, unassigned: D, resourceDataAttribute: O, isResourceDisabled: k, getAvatarColor: A }) {
13
- let j = i(null), M = i(null), N = i(null), P = i(null), F = i(!1), [I] = t(() => o("rv-resource-list")), L = `${I}-popup`, R = w === "dropdown", [z, B] = t(!1), [V, H] = t(""), [U, W] = t(0), G = r(() => {
13
+ let j = i(null), M = i(null), N = i(null), P = i(null), F = i(!1), [I] = t(() => s("rv-resource-list")), L = `${I}-popup`, R = w === "dropdown", [z, B] = t(!1), [V, H] = t(""), [U, W] = t(0), G = r(() => {
14
14
  B(!1), H("");
15
15
  }, []), K = new Set(v.map(d)), q = n(() => E ? [...h] : [...h].sort((e, t) => e.name.localeCompare(t.name, void 0, {
16
16
  numeric: !0,
@@ -178,7 +178,7 @@ function h({ resources: h, selectedResourceIds: v, text: y, onChange: b, classNa
178
178
  }), /* @__PURE__ */ a("span", {
179
179
  class: "rv-resource-picker__chevron",
180
180
  "aria-hidden": "true",
181
- dangerouslySetInnerHTML: { __html: s }
181
+ dangerouslySetInnerHTML: { __html: o }
182
182
  })]
183
183
  }) : null, R ? z && Q ? /* @__PURE__ */ a(m, {
184
184
  triggerRef: M,
@@ -18,7 +18,7 @@
18
18
  --rv-control-border: var(--rv-resource-picker-border, var(--rv-ui-border));
19
19
  }
20
20
  .rv-resource-picker__search-control input {
21
- min-height: var(--rv-resource-picker-search-height, 36px);
21
+ min-height: var(--rv-resource-picker-search-height, var(--rv-control-height, 32px));
22
22
  }
23
23
 
24
24
  .rv-resource-picker__list {
@@ -133,13 +133,16 @@
133
133
  }
134
134
 
135
135
  .rv-resource-picker__control {
136
+ font-family: inherit;
137
+ font-size: var(--rv-control-font-size, 0.875rem);
138
+ line-height: 1;
136
139
  display: flex;
137
140
  box-sizing: border-box;
138
141
  width: 100%;
139
- min-height: var(--rv-resource-picker-control-height, 42px);
142
+ min-height: var(--rv-resource-picker-control-height, var(--rv-control-height, 32px));
140
143
  align-items: center;
141
144
  gap: 8px;
142
- padding: var(--rv-resource-picker-control-padding, 5px 10px);
145
+ padding: var(--rv-resource-picker-control-padding, 1px 10px);
143
146
  border: 1px solid var(
144
147
  --rv-resource-picker-border,
145
148
  color-mix(in srgb, currentColor 14%, transparent)
@@ -1,21 +1,18 @@
1
- import { LexicalEditor, TextFormatType } from 'lexical';
2
- export type MarkdownBlock = 'paragraph' | 'h1' | 'h2' | 'quote' | 'code' | 'bullet' | 'ordered';
3
- export interface MarkdownSelection {
4
- formats: TextFormatType[];
5
- block: MarkdownBlock | null;
1
+ export type HtmlFormat = 'bold' | 'italic' | 'strikethrough' | 'code';
2
+ export type HtmlBlock = 'paragraph' | 'h1' | 'h2' | 'quote' | 'code' | 'bullet' | 'ordered';
3
+ export interface HtmlSelection {
4
+ formats: HtmlFormat[];
5
+ block: HtmlBlock | null;
6
6
  link: boolean;
7
7
  }
8
- export declare const emptyMarkdownSelection: MarkdownSelection;
9
- export interface MarkdownEngine {
10
- editor: LexicalEditor;
11
- setMarkdown(value: string): void;
12
- format(mark: TextFormatType): void;
13
- block(value: MarkdownBlock): void;
14
- captureSelection(): void;
15
- link(value: string): boolean;
16
- destroy(): void;
17
- }
18
- /** Framework-independent Lexical adapter; consumers own toolbar and mode presentation. */
19
- export declare function createMarkdownEngine(root: HTMLElement, markdown: string, onChange: (value: string, unsafe: boolean) => void, onSelectionChange?: (selection: MarkdownSelection) => void): MarkdownEngine;
20
- /** Parse through Lexical so escaped/entity-encoded Markdown link URLs are checked after decoding. */
21
- export declare function hasUnsafeMarkdownLinks(markdown: string): boolean;
8
+ export declare const emptyHtmlSelection: HtmlSelection;
9
+ /** Native Range editing and bounded local history. No browser execCommand or editor library. */
10
+ export declare function createHtmlEngine(root: HTMLElement, html: string, onChange: (html: string) => void, onSelectionChange?: (selection: HtmlSelection) => void): {
11
+ setHtml: (value: string) => void;
12
+ format: (mark: HtmlFormat) => void;
13
+ block: (value: HtmlBlock) => void;
14
+ captureSelection: () => void;
15
+ link: (value: string) => boolean;
16
+ destroy: () => void;
17
+ };
18
+ export type HtmlEngine = ReturnType<typeof createHtmlEngine>;
@@ -1,15 +1,15 @@
1
1
  import { EditorActionText, EditorCommitOptions } from '../editor-actions';
2
- import { MarkdownEditorText } from './translations';
3
- export { defaultMarkdownEditorText, type MarkdownEditorText, } from './translations';
4
- export interface MarkdownEditorProps extends EditorCommitOptions {
2
+ import { HtmlEditorText } from './translations';
3
+ export { defaultHtmlEditorText, type HtmlEditorText } from './translations';
4
+ export interface HtmlEditorProps extends EditorCommitOptions {
5
5
  value: string;
6
6
  onApply: (value: string) => void;
7
7
  onCancel: () => void;
8
8
  required?: boolean;
9
9
  maxLength?: number;
10
- text?: Partial<MarkdownEditorText>;
10
+ text?: Partial<HtmlEditorText>;
11
11
  actions?: Partial<EditorActionText>;
12
12
  }
13
- export declare function MarkdownEditor(props: MarkdownEditorProps): import("../_vendor/preact/src/index").JSX.Element;
14
- export { markdownVisualIssues, isSafeMarkdownLink } from './model';
15
- export { markdownRenderNodes, type MarkdownRenderNode } from './render-model';
13
+ export declare function HtmlEditor(props: HtmlEditorProps): import("../_vendor/preact/src/index").JSX.Element;
14
+ export { sanitizeRichTextHtml, isSafeRichTextLink } from './model';
15
+ export { htmlRenderNodes, type HtmlRenderNode } from './render-model';
@@ -1 +1 @@
1
- export { t as MarkdownEditor, r as defaultMarkdownEditorText, i as isSafeMarkdownLink, n as markdownRenderNodes, a as markdownVisualIssues } from "../_chunks/rich-text-BzI1DyfF.js";
1
+ export { t as HtmlEditor, r as defaultHtmlEditorText, n as htmlRenderNodes, i as isSafeRichTextLink, a as sanitizeRichTextHtml } from "../_chunks/rich-text-CH7gIqOS.js";
@@ -1,3 +1,4 @@
1
- /** Supported Markdown boundaries: unsupported syntax remains editable as lossless source. */
2
- export declare function markdownVisualIssues(markdown: string): string[];
3
- export declare function isSafeMarkdownLink(value: string): boolean;
1
+ export declare function isSafeRichTextLink(value: string): boolean;
2
+ /** Parse inertly, then rebuild nodes; never mount user-provided HTML or attributes. */
3
+ export declare function richTextFragment(html: string, doc?: Document): DocumentFragment;
4
+ export declare function sanitizeRichTextHtml(html: string, doc?: Document): string;
@@ -1,9 +1,8 @@
1
- /** Framework-neutral, allowlisted content. Text is always rendered as text, never HTML. */
2
- export interface MarkdownRenderNode {
1
+ export interface HtmlRenderNode {
3
2
  tag?: string;
4
3
  text?: string;
5
4
  attrs?: Record<string, string | number>;
6
- children?: readonly MarkdownRenderNode[];
5
+ children?: readonly HtmlRenderNode[];
7
6
  }
8
- /** The renderer accepts exactly the same Markdown subset as the Visual editor. */
9
- export declare function markdownRenderNodes(markdown: string): readonly MarkdownRenderNode[];
7
+ /** Only allowlisted nodes reach a framework renderer; fresh VNodes are created per cell. */
8
+ export declare function htmlRenderNodes(html: string): readonly HtmlRenderNode[];
@@ -1,4 +1,4 @@
1
- .rv-markdown-editor {
1
+ .rv-rich-text-editor {
2
2
  width: min(560px, calc(100vw - 48px));
3
3
  &__toolbar {
4
4
  display: flex;
@@ -60,22 +60,13 @@
60
60
  padding-inline-start: 12px;
61
61
  margin-inline: 0;
62
62
  }
63
- .rv-markdown-bold {
64
- font-weight: 700;
65
- }
66
- .rv-markdown-italic {
67
- font-style: italic;
68
- }
69
- .rv-markdown-strike {
70
- text-decoration: line-through;
71
- }
72
- .rv-markdown-inline-code {
63
+ &__visual code {
73
64
  font-family: ui-monospace, monospace;
74
65
  background: var(--rv-ui-surface-sunken);
75
66
  }
76
67
  }
77
68
 
78
- .rv-markdown-cell {
69
+ .rv-rich-text-cell {
79
70
  color: inherit;
80
71
  font: inherit;
81
72
  white-space: pre-wrap;
@@ -1,9 +1,9 @@
1
- import { MarkdownEngine, MarkdownSelection } from './engine';
2
- import { MarkdownEditorText } from './translations';
3
- export declare function MarkdownToolbar({ engine, selection, text, showLink, onLink }: {
4
- engine: () => MarkdownEngine | undefined;
5
- selection: MarkdownSelection;
6
- text: Required<MarkdownEditorText>;
1
+ import { HtmlEngine, HtmlSelection } from './engine';
2
+ import { HtmlEditorText } from './translations';
3
+ export declare function HtmlToolbar({ engine, selection, text, showLink, onLink }: {
4
+ engine: () => HtmlEngine | undefined;
5
+ selection: HtmlSelection;
6
+ text: Required<HtmlEditorText>;
7
7
  showLink: boolean;
8
8
  onLink: () => void;
9
9
  }): import("../_vendor/preact/src/index").JSX.Element;
@@ -1,9 +1,8 @@
1
- /** All visible and accessible copy for the deliberately small Markdown editor. */
2
- export interface MarkdownEditorText {
1
+ /** Visible and accessible labels for the shared HTML editor. */
2
+ export interface HtmlEditorText {
3
3
  visual: string;
4
4
  source: string;
5
5
  label: string;
6
- unsupported: string;
7
6
  unsafeLink: string;
8
7
  requiredValue?: string;
9
8
  tooLong?: string;
@@ -25,16 +24,5 @@ export interface MarkdownEditorText {
25
24
  numberedList?: string;
26
25
  quote?: string;
27
26
  codeBlock?: string;
28
- images?: string;
29
- tables?: string;
30
- html?: string;
31
- referenceLinks?: string;
32
- taskLists?: string;
33
- horizontalRules?: string;
34
- alternateHeadings?: string;
35
- highlight?: string;
36
- extensions?: string;
37
- indentedCode?: string;
38
27
  }
39
- export declare const defaultMarkdownEditorText: Required<MarkdownEditorText>;
40
- export declare function markdownIssueLabels(issues: string[], text: Required<MarkdownEditorText>): string;
28
+ export declare const defaultHtmlEditorText: Required<HtmlEditorText>;
package/select.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { ComponentChildren, JSX } from './_vendor/preact/src/index';
2
+ import { DropdownOption } from './dropdown/dropdown.types';
3
+ export type SelectOptionProps = JSX.IntrinsicElements['option'];
4
+ type Attributes = Omit<JSX.IntrinsicElements['select'], 'value' | 'defaultValue' | 'onChange' | 'onInput' | 'multiple' | 'ref'>;
5
+ export type SelectProps = Attributes & {
6
+ value?: string | number | readonly string[];
7
+ defaultValue?: string | number | readonly string[];
8
+ /** Optional domain policy for option descriptors; no native option nodes are mounted. */
9
+ optionPolicy?: (props: SelectOptionProps) => SelectOptionProps;
10
+ } & ({
11
+ multiple?: false;
12
+ onValueChange?: (value: string) => void;
13
+ } | {
14
+ multiple: true;
15
+ onValueChange?: (value: string[]) => void;
16
+ });
17
+ /** JSX options are data descriptors for Dropdown, never browser-native controls. */
18
+ export declare function selectOptions(children: ComponentChildren, policy?: SelectProps['optionPolicy'], group?: string, disabled?: boolean): DropdownOption<string>[];
19
+ export declare function Select(props: SelectProps): JSX.Element;
20
+ export {};
package/select.js ADDED
@@ -0,0 +1 @@
1
+ export { s as Select, c as selectOptions } from "./_chunks/native-control-C_yok8_-.js";
@@ -1,10 +1,10 @@
1
- import { showTopLayerPopup as e } from "../core/top-layer-popup.js";
2
- import { isUiMotionEnabled as t } from "../core/motion.js";
1
+ import { isUiMotionEnabled as e } from "../core/motion.js";
2
+ import { showTopLayerPopup as t } from "../core/top-layer-popup.js";
3
3
  import { animateStatusFeedback as n } from "./motion.js";
4
4
  //#region src/status-feedback/exit-snapshot.ts
5
5
  function r(r) {
6
6
  let i = r.ownerDocument.defaultView;
7
- if (!i || typeof r.animate != "function" || !t(r)) return;
7
+ if (!i || typeof r.animate != "function" || !e(r)) return;
8
8
  let a = r.getBoundingClientRect(), o = r.cloneNode(!0), s = [r, ...r.querySelectorAll("*")], c = [o, ...o.querySelectorAll("*")];
9
9
  o.removeAttribute("popover"), o.removeAttribute("id"), o.querySelectorAll("[id]").forEach((e) => e.removeAttribute("id")), o.querySelectorAll("[role], [aria-live]").forEach((e) => {
10
10
  e.removeAttribute("role"), e.removeAttribute("aria-live");
@@ -24,7 +24,7 @@ function r(r) {
24
24
  borderColor: l.borderColor,
25
25
  fontFamily: l.fontFamily,
26
26
  boxShadow: l.boxShadow
27
- }), r.ownerDocument.body.append(o), e(o), s.forEach((e, t) => {
27
+ }), r.ownerDocument.body.append(o), t(o), s.forEach((e, t) => {
28
28
  e.scrollTop && (c[t].scrollTop = e.scrollTop), e.scrollLeft && (c[t].scrollLeft = e.scrollLeft);
29
29
  });
30
30
  let u = () => {
@@ -1,4 +1,4 @@
1
1
  import { renderStatusBadge as e } from "./badge.js";
2
- import { StatusBadge as t, StatusFeedbackPanel as n, renderStatusFeedbackPanel as r } from "./render.js";
2
+ import { n as t, r as n, t as r } from "../_chunks/render-m5eMMwFR.js";
3
3
  import { StatusFeedbackPopoverController as i } from "./popover.js";
4
- export { t as StatusBadge, n as StatusFeedbackPanel, i as StatusFeedbackPopoverController, e as renderStatusBadge, r as renderStatusFeedbackPanel };
4
+ export { r as StatusBadge, t as StatusFeedbackPanel, i as StatusFeedbackPopoverController, e as renderStatusBadge, n as renderStatusFeedbackPanel };
@@ -1,6 +1,6 @@
1
1
  import { calculateAnchoredPopoverPosition as e } from "../core/anchored-popover.js";
2
- import { hideTopLayerPopup as t, showTopLayerPopup as n } from "../core/top-layer-popup.js";
3
- import { inheritUiMotion as r } from "../core/motion.js";
2
+ import { inheritUiMotion as t } from "../core/motion.js";
3
+ import { hideTopLayerPopup as n, showTopLayerPopup as r } from "../core/top-layer-popup.js";
4
4
  import { statusFeedbackSize as i } from "./placement.js";
5
5
  import { animateStatusFeedback as a } from "./motion.js";
6
6
  import { statusFeedbackExit as o } from "./exit-snapshot.js";
@@ -46,34 +46,34 @@ var s = 0, c = class {
46
46
  })));
47
47
  };
48
48
  hide(e = !1) {
49
- (!e || this.mode) && (this.removeExit?.(), this.removeExit = void 0), e && this.panel?.isConnected && this.mode && (this.removeExit = o(this.panel)), this.animation?.cancel(), this.animation = void 0, this.releaseMotion?.(), this.releaseMotion = void 0, this.panel && this.mode && t(this.panel, this.mode), this.mode = void 0, this.stopWatching();
49
+ (!e || this.mode) && (this.removeExit?.(), this.removeExit = void 0), e && this.panel?.isConnected && this.mode && (this.removeExit = o(this.panel)), this.animation?.cancel(), this.animation = void 0, this.releaseMotion?.(), this.releaseMotion = void 0, this.panel && this.mode && n(this.panel, this.mode), this.mode = void 0, this.stopWatching();
50
50
  }
51
51
  destroy() {
52
52
  this.hide(), this.disposed = !0, this.panel = null, this.anchor = null;
53
53
  }
54
54
  position() {
55
- let t = this.panel, o = this.anchor, s = this.window;
56
- if (!t?.isConnected || !o?.isConnected || !s || this.disposed) return;
55
+ let n = this.panel, o = this.anchor, s = this.window;
56
+ if (!n?.isConnected || !o?.isConnected || !s || this.disposed) return;
57
57
  let c = this.options.boundary?.getBoundingClientRect(), l = i({
58
58
  width: s.innerWidth,
59
59
  height: s.innerHeight
60
60
  }, c, this.collapsed, this.options), u = l.width;
61
- t.style.width = `${u}px`, t.style.maxHeight = `${l.maxHeight}px`, this.releaseMotion ??= r(o, t);
61
+ n.style.width = `${u}px`, n.style.maxHeight = `${l.maxHeight}px`, this.releaseMotion ??= t(o, n);
62
62
  let d = !this.mode;
63
- d && (this.removeExit?.(), this.removeExit = void 0, this.mode = n(t));
63
+ d && (this.removeExit?.(), this.removeExit = void 0, this.mode = r(n));
64
64
  let f = o.getBoundingClientRect(), p = e({
65
65
  left: f.right - u,
66
66
  right: f.right,
67
67
  top: f.bottom,
68
68
  bottom: f.bottom
69
69
  }, {
70
- width: t.offsetWidth,
71
- height: t.offsetHeight
70
+ width: n.offsetWidth,
71
+ height: n.offsetHeight
72
72
  }, {
73
73
  width: s.innerWidth,
74
74
  height: s.innerHeight
75
75
  }, 0);
76
- t.style.left = `${p.left}px`, t.style.top = `${p.top}px`, d && (this.animation?.cancel(), this.animation = a(t, [{ opacity: 0 }, { opacity: 1 }], "rv-status-enter"));
76
+ n.style.left = `${p.left}px`, n.style.top = `${p.top}px`, d && (this.animation?.cancel(), this.animation = a(n, [{ opacity: 0 }, { opacity: 1 }], "rv-status-enter"));
77
77
  }
78
78
  stopWatching() {
79
79
  this.frame !== void 0 && this.window?.cancelAnimationFrame(this.frame), this.frame = void 0, this.observer?.disconnect(), this.observer = void 0, this.window?.removeEventListener("resize", this.refresh), this.window?.removeEventListener("scroll", this.refresh, !0), this.window = null;
@@ -1,44 +1,3 @@
1
- import { c as e } from "../_chunks/preact.module-BBM36DnO.js";
2
- import { renderHeader as t } from "./header.js";
3
- import { renderItem as n } from "./item.js";
4
- import { renderStatusBadge as r } from "./badge.js";
5
- //#region src/status-feedback/render.ts
6
- function i(e, r) {
7
- let { title: i, items: a, ariaLabel: o, className: s, popover: c, onCollapsedChange: l } = r;
8
- if (!a.length) return c?.hide(!0), null;
9
- let u = c?.collapsed ?? r.collapsed ?? !1, d = !!(c || l), f = (e, t) => {
10
- if (e && !c) {
11
- let e = t.currentTarget.closest(".rv-status-feedback"), n = e?.ownerDocument.activeElement;
12
- n && e?.contains(n) && e.querySelector(".rv-status-feedback__toggle")?.focus({ preventScroll: !0 });
13
- }
14
- c?.setCollapsed(e), l?.(e);
15
- };
16
- return c?.refresh(), e("section", {
17
- onKeyDown: (e) => {
18
- e.key === "Escape" && d && !u && (e.preventDefault(), e.stopPropagation(), f(!0, e));
19
- },
20
- ref: c?.panelRef,
21
- id: c?.id,
22
- class: [
23
- "rv-status-feedback",
24
- s,
25
- r.compact ? "rv-status-feedback--compact" : "",
26
- c ? "rv-status-feedback--popover" : "",
27
- u ? "rv-status-feedback--collapsed" : ""
28
- ].filter(Boolean).join(" "),
29
- "aria-label": o ?? i,
30
- "data-collapsed": String(u)
31
- }, [t(e, r, u, d, f), e("div", {
32
- id: c ? `${c.id}-items` : void 0,
33
- class: "rv-status-feedback__items",
34
- hidden: u
35
- }, a.map((t) => n(e, t)))]);
36
- }
37
- function a(t) {
38
- return i(e, t);
39
- }
40
- function o(t) {
41
- return r(e, t);
42
- }
43
- //#endregion
44
- export { o as StatusBadge, a as StatusFeedbackPanel, r as renderStatusBadge, i as renderStatusFeedbackPanel };
1
+ import { renderStatusBadge as e } from "./badge.js";
2
+ import { n as t, r as n, t as r } from "../_chunks/render-m5eMMwFR.js";
3
+ export { r as StatusBadge, t as StatusFeedbackPanel, e as renderStatusBadge, n as renderStatusFeedbackPanel };
@@ -1,4 +1,11 @@
1
1
  @use '../styles/motion';
2
+ @keyframes rv-status-item-exit {
3
+ to { opacity: 0; transform: translateY(4px); }
4
+ }
5
+ .rv-status-feedback__item[data-exiting='true'] {
6
+ animation: rv-status-item-exit 160ms ease-in both;
7
+ pointer-events: none;
8
+ }
2
9
  .rv-status-feedback,
3
10
  .rv-status-badge {
4
11
  --rv-status-warning: var(--rv-ui-warning);
@@ -29,6 +29,10 @@ export interface StatusFeedbackLocaleText {
29
29
  readonly formatCount: (count: number) => string;
30
30
  }
31
31
  export interface StatusFeedbackPanelProps {
32
+ /** Component adapters only: dismiss settled neutral/success items after this delay. Disabled by default. */
33
+ readonly autoDismissMs?: number;
34
+ /** The owner removes the item after its exit animation. */
35
+ readonly onDismissItem?: (id: string) => void;
32
36
  readonly compact?: boolean;
33
37
  readonly onClose?: () => void;
34
38
  readonly closeLabel?: string;
@@ -0,0 +1,3 @@
1
+ import { StatusFeedbackItem } from './types';
2
+ /** Timers follow individual items; the consumer remains the owner of removal. */
3
+ export declare function useAutoDismiss(items: readonly StatusFeedbackItem[], duration?: number, onDismiss?: (id: string) => void): StatusFeedbackItem[];
@@ -2,6 +2,7 @@
2
2
  @use './disclosure';
3
3
  @use './alert';
4
4
  @use './loading';
5
+ @use './control';
5
6
 
6
7
  .rv-example-card {
7
8
  box-sizing: border-box;
@@ -52,7 +53,8 @@
52
53
 
53
54
  .rv-control { color-scheme: var(--rv-ui-color-scheme, normal); }
54
55
  .rv-combobox .dropdown-trigger, .rv-multi-select .dropdown-trigger {
55
- min-height: 38px; padding: 8px 24px 8px 10px;
56
+ @include control.action-size;
57
+ padding-inline-end: 24px;
56
58
  border: 1px solid var(--rv-ui-border); border-radius: 8px;
57
59
  background: var(--rv-ui-surface-sunken); color: var(--rv-ui-text);
58
60
  }
@@ -1,18 +1,26 @@
1
1
  @use './motion';
2
+ // Standalone actions and dropdowns share dimensions and typography across adapters.
3
+ @mixin action-size {
4
+ box-sizing: border-box;
5
+ min-height: var(--rv-control-height, 32px);
6
+ padding: var(--rv-control-padding, 6px 12px);
7
+ font-family: inherit;
8
+ font-size: var(--rv-control-font-size, 0.875rem);
9
+ line-height: 1;
10
+ }
11
+
2
12
  // One native field presentation, also available to legacy consumer selectors.
3
13
  @mixin field {
4
14
  appearance: none;
5
15
  box-sizing: border-box;
6
16
  width: 100%;
7
17
  min-width: 0;
8
- min-height: var(--rv-control-height, 38px);
9
- padding: var(--rv-control-padding, 8px 10px);
18
+ @include action-size;
10
19
  border: 1px solid var(--rv-control-border, var(--rv-ui-border));
11
20
  border-radius: var(--rv-control-radius, 8px);
12
21
  background-color: var(--rv-control-bg, var(--rv-ui-surface-sunken));
13
22
  color: var(--rv-control-color, inherit);
14
- font: inherit;
15
- line-height: 1.25;
23
+
16
24
  color-scheme: var(--rv-ui-color-scheme, normal);
17
25
  transition:
18
26
  border-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
@@ -1,5 +1,6 @@
1
1
  @use './motion';
2
2
  @use './loading';
3
+ @use './control';
3
4
  %rv-btn-base {
4
5
  position: relative;
5
6
  display: inline-flex;
@@ -7,13 +8,9 @@
7
8
  justify-content: center;
8
9
  gap: 4px;
9
10
  border-radius: var(--rv-ui-radius);
10
- min-height: 32px;
11
- padding: 6px 12px;
11
+ @include control.action-size;
12
12
  border: 1px solid transparent;
13
- font-family: inherit;
14
- font-size: 0.875rem;
15
13
  font-weight: var(--rv-ui-button-font-weight, 500);
16
- line-height: 1;
17
14
  cursor: pointer;
18
15
  user-select: none;
19
16
  box-shadow: none;
@@ -614,8 +611,8 @@ label.rv-switch-label {
614
611
  .rv-search-input > input:is([type='search'], [type='text']) {
615
612
  box-sizing: border-box;
616
613
  width: 100%;
617
- height: var(--rv-search-input-height, 32px);
618
- min-height: var(--rv-search-input-height, 32px);
614
+ height: var(--rv-search-input-height, var(--rv-control-height, 32px));
615
+ min-height: var(--rv-search-input-height, var(--rv-control-height, 32px));
619
616
  appearance: none;
620
617
  background: var(--rv-search-input-bg, var(--rv-ah-bg-input, var(--rv-ui-surface-sunken)));
621
618
  border: 1px solid var(--rv-search-input-border, var(--rv-ah-border, var(--rv-ui-border)));
@@ -625,7 +622,7 @@ label.rv-switch-label {
625
622
  color: var(--rv-search-input-color, var(--rv-ah-text, var(--rv-ui-text)));
626
623
  outline: none;
627
624
  font: inherit;
628
- font-size: 12px;
625
+ font-size: var(--rv-control-font-size, 0.875rem);
629
626
  transition:
630
627
  border-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
631
628
  background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
@@ -961,3 +958,7 @@ button.rv-choice-chip-info:focus-visible,
961
958
  border-block-start-color: currentColor;
962
959
  }
963
960
  .rv-btn-busy.rv-btn-icon > :not(.rv-button-spinner) { display: none; }
961
+
962
+ // Applies uniformly to action variants, icon controls and navigation buttons.
963
+ .rv-btn-rounded.rv-btn-rounded { border-radius: 9999px; }
964
+ .rv-btn-rounded[aria-disabled='true'] { opacity: .5; pointer-events: none; }