@revolist/ui 4.0.2-rc → 4.0.2

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 (343) hide show
  1. package/LICENSE +21 -0
  2. package/MIGRATION.md +36 -0
  3. package/OWNERSHIP.md +32 -32
  4. package/README.md +405 -265
  5. package/_button.scss +6 -2
  6. package/_chunks/arrow-up-Cw8hW9vp.js +4 -0
  7. package/_chunks/calculator-CDWOuAcp.js +4 -0
  8. package/_chunks/{calendar-CpaUK7w1.js → calendar-CgXQgkga.js} +28 -18
  9. package/_chunks/chart-frame-hcOlnQ1K.js +145 -0
  10. package/_chunks/{chevron-right-sxHQMSkq.js → check-BwI7iCAm.js} +2 -2
  11. package/_chunks/{chevron-left-D0nc4Z5S.js → chevron-right-CM3ljziP.js} +2 -2
  12. package/_chunks/choice-chips-SkllS5Kl.js +126 -0
  13. package/_chunks/clock-BOhPNlW3.js +4 -0
  14. package/_chunks/{color-palette-BBMFmUNA.js → color-palette-DMJUChWC.js} +20 -22
  15. package/_chunks/{color-picker-D90Jg-M8.js → color-picker-BpCTuIdm.js} +77 -72
  16. package/_chunks/{component-YDcfoOLz.js → component-CfeHXgIw.js} +301 -282
  17. package/_chunks/{component-metadata-BENbgTjU.js → component-metadata-BKd7U8OW.js} +0 -12
  18. package/_chunks/configurator-actions-DnStE6Yl.js +155 -0
  19. package/_chunks/configurator-field-icon-CmcM_sPs.js +53 -0
  20. package/_chunks/control-Dcrjsunl.js +118 -0
  21. package/_chunks/{controls-DIum-E66.js → controls-B_6NJarZ.js} +217 -182
  22. package/_chunks/{date-control-BJSzu79z.js → date-control-C4h4m75W.js} +1 -1
  23. package/_chunks/{date-time-BxPJusp9.js → date-time-CTOSbzb0.js} +344 -307
  24. package/_chunks/{delete-button-Bblyah10.js → delete-button-CW9vjLnk.js} +6 -6
  25. package/_chunks/dialog.parts-3w5FR06n.js +131 -0
  26. package/_chunks/{duration-87U2EoMS.js → duration-Bf2OS1V5.js} +19 -18
  27. package/_chunks/editor-popup-ByU7qiub.js +82 -0
  28. package/_chunks/field-configurator-D5dZRhDe.js +288 -0
  29. package/_chunks/field-context-D57PnBbH.js +5 -0
  30. package/_chunks/{framework-mount-C-Zwm44H.js → framework-mount-Bk4O_T7T.js} +1 -1
  31. package/_chunks/icon-toolbar-DSjOdwM7.js +134 -0
  32. package/_chunks/magnifying-glass-CvrTDSkB.js +4 -0
  33. package/_chunks/minus-BOAR3A1C.js +4 -0
  34. package/_chunks/mount-BRdcG60g.js +267 -0
  35. package/_chunks/{native.view-ByyZ1CT5.js → native-Blr3byjO.js} +1 -1
  36. package/_chunks/native-control-B_fVA5bL.js +649 -0
  37. package/_chunks/{number-input-BeIadZuL.js → number-input-CmM6_2vR.js} +7 -7
  38. package/_chunks/{picker-DpP7iQLA.js → picker-DTqET-2W.js} +2 -2
  39. package/_chunks/plus-CbGRkIGl.js +4 -0
  40. package/_chunks/popover-controller-D-AvKQ7B.js +102 -0
  41. package/_chunks/popup-C35Isk7p.js +378 -0
  42. package/_chunks/{rating-choice-Ca8ZBty3.js → rating-choice-C-6wcb9U.js} +1 -1
  43. package/_chunks/render-m5eMMwFR.js +83 -0
  44. package/_chunks/{reorder-list-Cc3KmfAN.js → reorder-list-DIl1gkV6.js} +1 -1
  45. package/_chunks/request-trail-DrhdpWiH.js +762 -0
  46. package/_chunks/rich-text-BnilBbhU.js +842 -0
  47. package/_chunks/rotate-left-BF6G883o.js +4 -0
  48. package/_chunks/rotate-right-Iha5ScJ1.js +4 -0
  49. package/_chunks/selection-list-tooltips-C5oMJe26.js +42 -0
  50. package/_chunks/title-tooltip-Cw6LOZhb.js +11 -0
  51. package/_chunks/tooltip-D4xkio5G.js +54 -0
  52. package/_chunks/tooltip-owner-DjdvqKzz.js +19 -0
  53. package/_chunks/tooltip-session-B6X6x8G_.js +110 -0
  54. package/_chunks/tooltip-text-BXsUEmBH.js +12 -0
  55. package/_chunks/top-layer-popup-CNSDdfJV.js +59 -0
  56. package/_dialog.scss +55 -21
  57. package/_form.scss +71 -21
  58. package/_legend.scss +25 -7
  59. package/_shared/data-query/index.d.ts +2 -2
  60. package/_shared/data-query/load-options.d.ts +2 -2
  61. package/_variables.scss +34 -32
  62. package/_view-switcher.scss +6 -0
  63. package/activity-message.d.ts +1 -1
  64. package/ai/_chat.scss +227 -0
  65. package/ai/_style.scss +170 -39
  66. package/ai/chat.d.ts +65 -0
  67. package/ai/components.d.ts +34 -5
  68. package/ai/index.d.ts +3 -0
  69. package/ai/index.js +3 -3
  70. package/ai/mount.d.ts +59 -6
  71. package/ai/prompt-history.d.ts +13 -0
  72. package/ai/request-trail.d.ts +9 -3
  73. package/ai/results/_style.scss +83 -0
  74. package/ai/results/index.d.ts +11 -0
  75. package/ai/results/metrics.d.ts +5 -0
  76. package/ai/results/table.d.ts +5 -0
  77. package/ai/results/text.d.ts +5 -0
  78. package/ai/results/types.d.ts +29 -0
  79. package/ai/transcript.d.ts +27 -0
  80. package/ai/translations.d.ts +1 -1
  81. package/angular/angular.d.ts +1 -1
  82. package/angular/angular.js +13 -10
  83. package/assignee/assignee.scss +28 -6
  84. package/assignee/index.js +34 -35
  85. package/avatar/avatar.style.scss +23 -6
  86. package/avatar/index.d.ts +25 -2
  87. package/avatar/index.js +33 -32
  88. package/badge.d.ts +1 -1
  89. package/badge.view.d.ts +8 -0
  90. package/brush-range/_brush-range.scss +55 -49
  91. package/brush-range/component.d.ts +1 -3
  92. package/brush-range/component.js +27 -27
  93. package/buttons/delete-button.d.ts +2 -1
  94. package/buttons/delete-button.js +1 -1
  95. package/buttons/delete-button.style.scss +6 -2
  96. package/buttons/remove-button.d.ts +1 -1
  97. package/buttons/remove-button.js +1 -1
  98. package/buttons/remove-button.style.scss +1 -1
  99. package/buttons/svg-button.d.ts +2 -1
  100. package/buttons/svg-button.js +19 -19
  101. package/calendar/_calendar.scss +27 -26
  102. package/calendar/calendar.js +1 -1
  103. package/calendar/header.js +1 -2
  104. package/calendar/index.js +2 -2
  105. package/cell-input.scss +3 -7
  106. package/cell-visuals/badge.style.scss +6 -3
  107. package/cell-visuals/bar-chart.style.scss +2 -1
  108. package/cell-visuals/column-type.style.css +12 -0
  109. package/cell-visuals/progress-line-value.renderer.style.scss +4 -2
  110. package/cell-visuals/progress-line.style.scss +1 -4
  111. package/cell-visuals/sparkline.style.scss +2 -1
  112. package/cell-visuals/timeline.style.css +4 -2
  113. package/checkbox/checkbox.scss +6 -24
  114. package/choice-chips/index.d.ts +3 -1
  115. package/choice-chips/index.js +1 -1
  116. package/color-palette/color-palette.js +1 -1
  117. package/color-palette/color-palette.style.scss +88 -25
  118. package/color-palette/color-picker.js +2 -2
  119. package/color-palette/color-picker.style.scss +23 -10
  120. package/color-palette/common-palettes.d.ts +1 -1
  121. package/color-palette/common-palettes.js +1 -1
  122. package/color-palette/native.d.ts +15 -2
  123. package/component-catalog.d.ts +24 -11
  124. package/configurator-actions.d.ts +67 -0
  125. package/configurator-actions.js +1 -0
  126. package/configurator-aggregation-list.d.ts +14 -0
  127. package/configurator-aggregation-list.js +63 -0
  128. package/configurator-drop-zone.d.ts +39 -0
  129. package/configurator-drop-zone.js +66 -0
  130. package/configurator-field-icon.d.ts +10 -0
  131. package/configurator-field-icon.js +1 -0
  132. package/configurator-focus.d.ts +4 -0
  133. package/configurator-focus.js +39 -0
  134. package/configurator-sections.d.ts +42 -0
  135. package/configurator-sections.js +71 -0
  136. package/control-attributes.js +7 -7
  137. package/control-presentation.d.ts +8 -2
  138. package/control-presentation.js +25 -20
  139. package/controls.d.ts +19 -7
  140. package/controls.js +4 -3
  141. package/core/editor-popup-position.d.ts +6 -2
  142. package/core/editor-popup.d.ts +4 -0
  143. package/core/editor-popup.js +1 -1
  144. package/core/popover-controller.d.ts +35 -0
  145. package/core/popup-ownership.d.ts +2 -0
  146. package/core/selection-list-tooltips.d.ts +2 -0
  147. package/core/title-tooltip.d.ts +2 -0
  148. package/core/tooltip-session.d.ts +29 -0
  149. package/core/tooltip-surface.d.ts +13 -0
  150. package/core/tooltip-text.d.ts +6 -0
  151. package/core/tooltip.d.ts +35 -0
  152. package/core/top-layer-popup.d.ts +4 -0
  153. package/core/top-layer-popup.js +1 -23
  154. package/date-time/attach.d.ts +1 -1
  155. package/date-time/date-control.d.ts +1 -1
  156. package/date-time/field.d.ts +3 -2
  157. package/date-time/index.js +1 -1
  158. package/date-time/style.scss +242 -39
  159. package/date-time/time-selection.d.ts +3 -1
  160. package/date-time/types.d.ts +5 -1
  161. package/dialog/dialog-action-footer.d.ts +17 -2
  162. package/dialog/dialog.dom.d.ts +15 -2
  163. package/dialog/dialog.dom.js +3 -3
  164. package/dialog/dialog.parts.d.ts +1 -1
  165. package/dialog/dialog.parts.js +1 -1
  166. package/distribution-chart/_distribution-chart.scss +113 -77
  167. package/distribution-chart/area-chart.js +1 -1
  168. package/distribution-chart/bar-chart.d.ts +5 -2
  169. package/distribution-chart/bar-chart.js +7 -3
  170. package/distribution-chart/chart-frame.d.ts +2 -1
  171. package/distribution-chart/index.d.ts +1 -1
  172. package/distribution-chart/line-chart.js +1 -1
  173. package/dropdown/content.d.ts +2 -1
  174. package/dropdown/content.js +1 -142
  175. package/dropdown/control.d.ts +14 -0
  176. package/dropdown/control.js +1 -0
  177. package/dropdown/control.view.d.ts +6 -0
  178. package/dropdown/dropdown.types.d.ts +5 -1
  179. package/dropdown/editor-dropdown.style.scss +54 -16
  180. package/dropdown/index.d.ts +1 -1
  181. package/dropdown/index.js +3 -4
  182. package/dropdown/lookup-field.d.ts +5 -0
  183. package/dropdown/lookup-field.js +2 -1
  184. package/dropdown/popup.d.ts +2 -2
  185. package/dropdown/popup.js +1 -141
  186. package/duration/index.js +1 -1
  187. package/duration/style.scss +1 -1
  188. package/editor-actions.js +1 -1
  189. package/editor-layout/index.d.ts +4 -4
  190. package/editor-layout/index.js +39 -34
  191. package/editor-layout/style.scss +82 -18
  192. package/field-configurator.d.ts +39 -1
  193. package/field-configurator.js +4 -170
  194. package/field-expansion.d.ts +9 -0
  195. package/fieldset.d.ts +3 -0
  196. package/filter/filters/slider/_single-slider.scss +57 -38
  197. package/filter/filters/slider/_slider.scss +41 -33
  198. package/filter/filters/slider/control.js +2 -0
  199. package/filter/filters/slider/runtime.js +49 -22
  200. package/filter/filters/slider/single.js +1 -1
  201. package/filter-badge.js +1 -1
  202. package/filter-controls.d.ts +0 -1
  203. package/filter-controls.js +9 -10
  204. package/form-controls/field-context.d.ts +5 -0
  205. package/form-controls/index.d.ts +10 -2
  206. package/form-controls/index.js +4 -9
  207. package/form-controls/presentation.d.ts +1 -1
  208. package/form-controls/presentation.js +53 -45
  209. package/formatting/index.d.ts +1 -1
  210. package/formatting/index.js +40 -35
  211. package/formatting/styles.scss +14 -57
  212. package/framework.js +237 -226
  213. package/history-controls.d.ts +14 -0
  214. package/history-controls.js +27 -0
  215. package/icon-toolbar.d.ts +62 -0
  216. package/icon-toolbar.js +1 -0
  217. package/icons/icon.d.ts +1 -1
  218. package/legend.d.ts +1 -1
  219. package/masked-input/index.js +1 -1
  220. package/native-control.d.ts +6 -5
  221. package/native-control.js +3 -26
  222. package/native-controls.d.ts +54 -2
  223. package/native-styles.css +1 -1
  224. package/native-styles.scss +6 -2
  225. package/native.d.ts +3 -3
  226. package/native.js +41 -37
  227. package/number-input/index.d.ts +1 -1
  228. package/number-input/index.js +1 -1
  229. package/package.json +88 -14
  230. package/pagination.d.ts +3 -0
  231. package/pagination.js +50 -40
  232. package/pdf-viewer/header.d.ts +1 -1
  233. package/pdf-viewer/index.d.ts +2 -2
  234. package/pdf-viewer/index.js +1 -1
  235. package/pdf-viewer/search-bar.d.ts +1 -1
  236. package/pdf-viewer/status.d.ts +1 -1
  237. package/pdf-viewer/style.scss +205 -45
  238. package/pickers.d.ts +5 -1
  239. package/preact-mount.js +1 -1
  240. package/preact.d.ts +15 -10
  241. package/preact.js +109 -64
  242. package/progress/_bar.scss +9 -3
  243. package/progress/_circular.scss +2 -1
  244. package/rating-choice.js +1 -1
  245. package/react-adapter.d.ts +4 -2
  246. package/react-control.d.ts +1 -0
  247. package/react.d.ts +20 -11
  248. package/react.js +72 -88
  249. package/reorder-list.d.ts +1 -1
  250. package/reorder-list.js +1 -1
  251. package/reorder-list.scss +59 -17
  252. package/resource-picker/resource-picker-popup.js +1 -1
  253. package/resource-picker/resource-picker.js +73 -71
  254. package/resource-picker/resource-picker.scss +66 -35
  255. package/rich-text/engine.d.ts +17 -19
  256. package/rich-text/format-html.d.ts +2 -0
  257. package/rich-text/index.d.ts +11 -7
  258. package/rich-text/index.js +1 -1
  259. package/rich-text/model.d.ts +6 -3
  260. package/rich-text/render-model.d.ts +4 -5
  261. package/rich-text/style.scss +295 -55
  262. package/rich-text/syntax.d.ts +5 -2
  263. package/rich-text/toolbar.d.ts +6 -6
  264. package/rich-text/translations.d.ts +5 -15
  265. package/search-input/index.js +1 -1
  266. package/search-input/native.d.ts +21 -2
  267. package/select.d.ts +22 -0
  268. package/select.js +1 -0
  269. package/selection-list.d.ts +1 -0
  270. package/selection-list.js +3 -1
  271. package/status-feedback/exit-snapshot.js +1 -1
  272. package/status-feedback/index.js +2 -2
  273. package/status-feedback/popover.js +9 -9
  274. package/status-feedback/render.js +3 -44
  275. package/status-feedback/status-feedback.scss +130 -34
  276. package/status-feedback/types.d.ts +4 -0
  277. package/status-feedback/use-auto-dismiss.d.ts +3 -0
  278. package/styles/_activity-message.scss +24 -7
  279. package/styles/_alert.scss +78 -17
  280. package/styles/_cell-editor-frame.scss +11 -0
  281. package/styles/_compositions.scss +404 -82
  282. package/styles/_control.scss +42 -12
  283. package/styles/_disclosure.scss +15 -5
  284. package/styles/_editor-counter.scss +16 -6
  285. package/styles/_editor-slider.scss +8 -4
  286. package/styles/_field-configurator.scss +321 -23
  287. package/styles/_fields-grid.scss +49 -0
  288. package/styles/_filter-controls.scss +10 -2
  289. package/styles/_icon-action.scss +48 -15
  290. package/styles/_loading.scss +12 -3
  291. package/styles/_motion.scss +32 -9
  292. package/styles/_palette.scss +0 -24
  293. package/styles/_primitives.scss +376 -116
  294. package/styles/_theme.scss +130 -86
  295. package/styles/_thresholds.scss +28 -25
  296. package/styles/_time-grid.scss +8 -3
  297. package/styles/_tokens.scss +6 -1
  298. package/styles/configurator-actions.scss +241 -0
  299. package/styles/pagination.css +213 -0
  300. package/styles/{legacy-rating.css → rating.css} +8 -3
  301. package/styles.css +1 -1
  302. package/styles.scss +3 -5
  303. package/surfaces.d.ts +38 -2
  304. package/surfaces.js +37 -134
  305. package/svelte/UiComponent.server.js +1 -48
  306. package/svelte/UiComponent.svelte +44 -32
  307. package/svelte.d.ts +1 -1
  308. package/svelte.js +33 -68
  309. package/switch/index.js +15 -14
  310. package/time-grid.d.ts +0 -1
  311. package/time-grid.js +38 -37
  312. package/timeline-track/_style.scss +96 -24
  313. package/timeline-track/component.d.ts +5 -1
  314. package/timeline-track/index.js +71 -54
  315. package/timeline-track/model.d.ts +9 -0
  316. package/timeline-track/model.js +10 -1
  317. package/ui.css +1 -1
  318. package/view-switcher.d.ts +23 -0
  319. package/vue.d.ts +51 -35
  320. package/vue.js +149 -178
  321. package/_chunks/chart-frame-BC99KjGa.js +0 -127
  322. package/_chunks/choice-chips-Cs4D-3nH.js +0 -110
  323. package/_chunks/compat.module-DDB2pm9O.js +0 -229
  324. package/_chunks/control-tooltip-ztgmsG7H.js +0 -100
  325. package/_chunks/dialog.parts-DBqo3Qwb.js +0 -134
  326. package/_chunks/dropdown-voWqmwAe.js +0 -357
  327. package/_chunks/editor-popup-D3JdS8l3.js +0 -81
  328. package/_chunks/mount-DZe_6VtR.js +0 -90
  329. package/_chunks/request-trail-IdNiFvKH.js +0 -347
  330. package/_chunks/rich-text-BzI1DyfF.js +0 -477
  331. package/avatar/index.view.d.ts +0 -25
  332. package/color-palette/native.view.d.ts +0 -15
  333. package/control-presentation.view.d.ts +0 -8
  334. package/dialog/dialog-action-footer.view.d.ts +0 -20
  335. package/dialog/dialog.dom.view.d.ts +0 -15
  336. package/form-controls/index.view.d.ts +0 -12
  337. package/formatting/control-tooltip.d.ts +0 -27
  338. package/native-controls.view.d.ts +0 -54
  339. package/react-native-select.d.ts +0 -6
  340. package/search-input/native.view.d.ts +0 -21
  341. package/styles/legacy-pagination.css +0 -112
  342. package/surfaces.view.d.ts +0 -63
  343. package/vue-native-select.d.ts +0 -9
@@ -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,20 +8,17 @@
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;
20
17
  text-decoration: none;
21
18
  white-space: nowrap;
22
19
  transition:
23
- background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
20
+ background-color var(--rv-ui-motion-fast, 120ms)
21
+ var(--rv-ui-motion-ease, ease),
24
22
  color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
25
23
  border-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
26
24
  opacity var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
@@ -44,25 +42,46 @@
44
42
  @extend %rv-btn-base;
45
43
  // Transparent adapters add the base class even when a variant is supplied.
46
44
  // Default colors must never override a variant's hover or active state.
47
- &:where(:not(.rv-btn-solid, .rv-btn-primary, .rv-btn-danger, .rv-btn-danger-outline, .rv-btn-danger-ghost, .rv-btn-secondary, .rv-btn-ghost, .rv-btn-link, .rv-btn-tab)) {
45
+ &:where(
46
+ :not(
47
+ .rv-btn-solid,
48
+ .rv-btn-primary,
49
+ .rv-btn-danger,
50
+ .rv-btn-danger-outline,
51
+ .rv-btn-danger-ghost,
52
+ .rv-btn-secondary,
53
+ .rv-btn-ghost,
54
+ .rv-btn-link,
55
+ .rv-btn-tab
56
+ )
57
+ ) {
48
58
  background: var(--rv-ui-btn-outline-bg);
49
59
  border-color: var(--rv-ui-btn-outline-border);
50
60
  color: var(--rv-ui-btn-outline-fg);
51
- &:hover, &:active {
61
+ &:hover,
62
+ &:active {
52
63
  background: var(--rv-ui-btn-outline-bg-hover);
53
64
  border-color: var(--rv-ui-btn-outline-border-hover);
54
65
  }
55
66
  }
56
67
  }
57
68
 
69
+ .rv-btn[hidden]:not([hidden='until-found']) {
70
+ display: none;
71
+ }
72
+
58
73
  /* Explicit filled neutral variant (use when outline is not desired). */
59
74
  .rv-btn-solid {
60
75
  @extend %rv-btn-base;
61
76
  background: var(--rv-ui-btn-bg);
62
77
  color: var(--rv-ui-btn-fg);
63
78
 
64
- &:hover { background: var(--rv-ui-btn-bg-hover); }
65
- &:active { background: var(--rv-ui-btn-bg-hover); }
79
+ &:hover {
80
+ background: var(--rv-ui-btn-bg-hover);
81
+ }
82
+ &:active {
83
+ background: var(--rv-ui-btn-bg-hover);
84
+ }
66
85
  }
67
86
 
68
87
  .rv-btn-primary {
@@ -70,8 +89,12 @@
70
89
  background: var(--rv-ui-accent);
71
90
  color: var(--rv-ui-accent-fg);
72
91
 
73
- &:hover { background: var(--rv-ui-accent-hover); }
74
- &:active { background: var(--rv-ui-accent-hover); }
92
+ &:hover {
93
+ background: var(--rv-ui-accent-hover);
94
+ }
95
+ &:active {
96
+ background: var(--rv-ui-accent-hover);
97
+ }
75
98
  }
76
99
 
77
100
  .rv-btn-danger,
@@ -94,7 +117,9 @@
94
117
  color: var(--rv-ui-btn-danger-fg);
95
118
 
96
119
  &:hover,
97
- &:active { background: var(--rv-ui-btn-danger-bg-hover); }
120
+ &:active {
121
+ background: var(--rv-ui-btn-danger-bg-hover);
122
+ }
98
123
  }
99
124
 
100
125
  .rv-btn-secondary {
@@ -102,8 +127,12 @@
102
127
  background: var(--rv-ui-btn-secondary-bg);
103
128
  color: var(--rv-ui-btn-secondary-fg);
104
129
 
105
- &:hover { background: var(--rv-ui-btn-secondary-bg-hover); }
106
- &:active { background: var(--rv-ui-btn-secondary-bg-hover); }
130
+ &:hover {
131
+ background: var(--rv-ui-btn-secondary-bg-hover);
132
+ }
133
+ &:active {
134
+ background: var(--rv-ui-btn-secondary-bg-hover);
135
+ }
107
136
  }
108
137
 
109
138
  .rv-btn-ghost {
@@ -111,8 +140,12 @@
111
140
  background: transparent;
112
141
  color: inherit;
113
142
 
114
- &:hover { background: var(--rv-ui-btn-ghost-hover-bg); }
115
- &:active { background: var(--rv-ui-btn-ghost-active-bg); }
143
+ &:hover {
144
+ background: var(--rv-ui-btn-ghost-hover-bg);
145
+ }
146
+ &:active {
147
+ background: var(--rv-ui-btn-ghost-active-bg);
148
+ }
116
149
  }
117
150
 
118
151
  /* ─── Toggle switch ───────────────────────────────────────────────────────── */
@@ -166,8 +199,12 @@ label.rv-switch-label {
166
199
  overflow: hidden;
167
200
  clip: rect(0 0 0 0);
168
201
 
169
- &:checked + .rv-switch-track { background: var(--rv-ui-accent); }
170
- &:checked + .rv-switch-track .rv-switch-thumb { inset-inline-start: 15px; }
202
+ &:checked + .rv-switch-track {
203
+ background: var(--rv-ui-accent);
204
+ }
205
+ &:checked + .rv-switch-track .rv-switch-thumb {
206
+ inset-inline-start: 15px;
207
+ }
171
208
  &:focus-visible + .rv-switch-track {
172
209
  outline: 2px solid var(--rv-ui-accent);
173
210
  outline-offset: 3px;
@@ -185,7 +222,8 @@ label.rv-switch-label {
185
222
  box-sizing: border-box;
186
223
  border-radius: 999px;
187
224
  background: var(--rv-ui-switch-track-off);
188
- transition: background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
225
+ transition: background-color var(--rv-ui-motion-fast, 120ms)
226
+ var(--rv-ui-motion-ease, ease);
189
227
  }
190
228
 
191
229
  .rv-switch-thumb {
@@ -196,7 +234,8 @@ label.rv-switch-label {
196
234
  border-radius: 50%;
197
235
  background: var(--rv-ui-switch-thumb);
198
236
  box-shadow: 0 1px 3px var(--rv-ui-shadow);
199
- transition: inset-inline-start var(--rv-ui-motion-normal, 160ms) var(--rv-ui-motion-ease, ease);
237
+ transition: inset-inline-start var(--rv-ui-motion-normal, 160ms)
238
+ var(--rv-ui-motion-ease, ease);
200
239
  }
201
240
 
202
241
  .rv-switch[aria-checked='true'] .rv-switch-track {
@@ -248,6 +287,14 @@ label.rv-switch-label {
248
287
  .rv-btn-group > .rv-btn:focus-visible {
249
288
  z-index: 1;
250
289
  }
290
+ .rv-btn-group > .rv-btn-group-item:first-child > span {
291
+ border-start-start-radius: calc(var(--rv-ui-radius) - 1px);
292
+ border-end-start-radius: calc(var(--rv-ui-radius) - 1px);
293
+ }
294
+ .rv-btn-group > .rv-btn-group-item:last-child > span {
295
+ border-start-end-radius: calc(var(--rv-ui-radius) - 1px);
296
+ border-end-end-radius: calc(var(--rv-ui-radius) - 1px);
297
+ }
251
298
 
252
299
  .rv-btn-group-item {
253
300
  position: relative;
@@ -273,7 +320,10 @@ label.rv-switch-label {
273
320
  cursor: pointer;
274
321
  user-select: none;
275
322
  color: inherit;
276
- transition: background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease), color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
323
+ transition:
324
+ background-color var(--rv-ui-motion-fast, 120ms)
325
+ var(--rv-ui-motion-ease, ease),
326
+ color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
277
327
  }
278
328
 
279
329
  & + & span {
@@ -304,7 +354,10 @@ label.rv-switch-label {
304
354
  line-height: 1;
305
355
  opacity: 0.5;
306
356
  padding: 0 2px;
307
- transition: opacity var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease), background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
357
+ transition:
358
+ opacity var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
359
+ background-color var(--rv-ui-motion-fast, 120ms)
360
+ var(--rv-ui-motion-ease, ease);
308
361
 
309
362
  &:hover:not(:disabled) {
310
363
  opacity: 1;
@@ -336,17 +389,26 @@ label.rv-switch-label {
336
389
  cursor: pointer;
337
390
  white-space: nowrap;
338
391
  line-height: 1.4;
339
- transition: background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
392
+ transition: background-color var(--rv-ui-motion-fast, 120ms)
393
+ var(--rv-ui-motion-ease, ease);
340
394
 
341
- &:hover { background: var(--rv-ui-btn-secondary-bg-hover); }
342
- &:active { opacity: 0.75; }
343
- &:disabled, &[disabled] { pointer-events: none; opacity: 0.5; }
395
+ &:hover {
396
+ background: var(--rv-ui-btn-secondary-bg-hover);
397
+ }
398
+ &:active {
399
+ opacity: 0.75;
400
+ }
401
+ &:disabled,
402
+ &[disabled] {
403
+ pointer-events: none;
404
+ opacity: 0.5;
405
+ }
344
406
  }
345
407
 
346
408
  /* ─── Small toggle switch (.rv-switch-sm) ─────────────────────────────────── */
347
409
  /*
348
410
  * Compact variant of .rv-switch for dense toolbars (28×16, 12px knob).
349
- * Supports both the shared button component and the legacy native-input markup.
411
+ * Supports both the shared button component and the native input adapters.
350
412
  *
351
413
  * <label class="rv-switch-label rv-switch-sm">
352
414
  * <input class="rv-switch-input" type="checkbox">
@@ -377,7 +439,9 @@ label.rv-switch-label {
377
439
 
378
440
  @media (prefers-reduced-motion: reduce) {
379
441
  .rv-switch-track,
380
- .rv-switch-thumb { transition: none; }
442
+ .rv-switch-thumb {
443
+ transition: none;
444
+ }
381
445
  }
382
446
 
383
447
  /* ─── Compact choice chips ───────────────────────────────────────────────── */
@@ -388,6 +452,37 @@ label.rv-switch-label {
388
452
  gap: 6px;
389
453
  }
390
454
 
455
+ .rv-choice-chips--scrollable {
456
+ display: flex;
457
+ flex-wrap: nowrap;
458
+ min-width: 0;
459
+ max-width: 100%;
460
+ overflow-x: auto;
461
+ scrollbar-width: none;
462
+ padding-block: 3px;
463
+ --rv-choice-chips-fade-left: 0px;
464
+ --rv-choice-chips-fade-right: 0px;
465
+ mask-image: linear-gradient(
466
+ to right,
467
+ transparent,
468
+ #000 var(--rv-choice-chips-fade-left),
469
+ #000 calc(100% - var(--rv-choice-chips-fade-right)),
470
+ transparent
471
+ );
472
+ &[data-scroll-edges~='left'] {
473
+ --rv-choice-chips-fade-left: 12px;
474
+ }
475
+ &[data-scroll-edges~='right'] {
476
+ --rv-choice-chips-fade-right: 36px;
477
+ }
478
+ &::-webkit-scrollbar {
479
+ display: none;
480
+ }
481
+ > .rv-choice-chip {
482
+ flex: none;
483
+ }
484
+ }
485
+
391
486
  .rv-choice-chip {
392
487
  appearance: none;
393
488
  min-height: 29px;
@@ -403,14 +498,18 @@ label.rv-switch-label {
403
498
  line-height: 1;
404
499
  white-space: nowrap;
405
500
  transition:
406
- background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
501
+ background-color var(--rv-ui-motion-fast, 120ms)
502
+ var(--rv-ui-motion-ease, ease),
407
503
  border-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
408
504
  color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
409
505
  opacity var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
410
506
 
411
- &:hover:not(:disabled) { background: var(--rv-ui-surface-hover); }
507
+ &:hover:not(:disabled) {
508
+ background: var(--rv-ui-surface-hover);
509
+ }
412
510
 
413
- &[aria-pressed='true'], &[data-selected='true'] {
511
+ &[aria-pressed='true'],
512
+ &[data-selected='true'] {
414
513
  border-color: transparent;
415
514
  background: var(--rv-ui-choice-chip-selected-bg, var(--rv-ui-selected-bg));
416
515
  color: var(--rv-ui-selected-fg);
@@ -432,7 +531,8 @@ label.rv-switch-label {
432
531
  border-color: var(--rv-ui-border);
433
532
  background: var(--rv-ui-surface);
434
533
 
435
- &[aria-pressed='true'], &[data-selected='true'] {
534
+ &[aria-pressed='true'],
535
+ &[data-selected='true'] {
436
536
  border-color: transparent;
437
537
  background: var(--rv-ui-choice-chip-selected-bg, var(--rv-ui-selected-bg));
438
538
  }
@@ -475,8 +575,8 @@ label.rv-switch-label {
475
575
  line-height: 1;
476
576
  cursor: pointer;
477
577
  padding: 0;
478
- transition:
479
- background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
578
+ transition: background-color var(--rv-ui-motion-fast, 120ms)
579
+ var(--rv-ui-motion-ease, ease);
480
580
 
481
581
  &:hover {
482
582
  background: var(--rv-ui-btn-ghost-hover-bg);
@@ -487,24 +587,39 @@ label.rv-switch-label {
487
587
 
488
588
  .rv-segmented-switch,
489
589
  .rv-value-selection-editor {
490
- --rv-ui-accent-text: color-mix(in srgb, var(--rv-ui-accent) var(--rv-ui-accent-text-weight, 90%), var(--rv-ui-accent-text-base, black));
590
+ --rv-ui-accent-text: color-mix(
591
+ in srgb,
592
+ var(--rv-ui-accent) var(--rv-ui-accent-text-weight, 90%),
593
+ var(--rv-ui-accent-text-base, black)
594
+ );
491
595
  }
492
596
 
493
597
  .rv-segmented-switch {
494
- --rv-segmented-theme-item-hover-bg: color-mix(in srgb, var(--rv-ui-text) 8%, var(--rv-ui-surface-sunken));
598
+ --rv-segmented-theme-item-hover-bg: color-mix(
599
+ in srgb,
600
+ var(--rv-ui-text) 8%,
601
+ var(--rv-ui-surface-sunken)
602
+ );
495
603
  display: inline-flex;
496
604
  box-sizing: border-box;
497
605
  height: 37px;
498
606
  align-items: center;
499
607
  gap: 2px;
500
- background: var(--rv-segmented-bg, var(--rv-ah-bg-up, var(--rv-segmented-theme-bg, var(--rv-ui-surface-sunken))));
608
+ background: var(
609
+ --rv-segmented-bg,
610
+ var(
611
+ --rv-ah-bg-up,
612
+ var(--rv-segmented-theme-bg, var(--rv-ui-surface-sunken))
613
+ )
614
+ );
501
615
  border: 1px solid var(--rv-segmented-border, var(--rv-ah-border, transparent));
502
616
  border-radius: 10px;
503
617
  padding: 2px;
504
618
  box-shadow: none;
505
619
  }
506
620
 
507
- :where(.dark, [data-theme^='dark'], revo-grid[theme^='dark']) .rv-segmented-switch,
621
+ :where(.dark, [data-theme^='dark'], revo-grid[theme^='dark'])
622
+ .rv-segmented-switch,
508
623
  .rv-segmented-switch[data-theme^='dark'] {
509
624
  --rv-segmented-theme-bg: var(--rv-ui-surface-sunken);
510
625
  --rv-segmented-theme-border: var(--rv-ui-border);
@@ -530,14 +645,18 @@ label.rv-switch-label {
530
645
  border-radius: 7px;
531
646
  padding: 0 14px;
532
647
  background: transparent;
533
- color: var(--rv-segmented-item-color, var(--rv-ah-text-2, var(--rv-segmented-theme-item-color, var(--rv-ui-text))));
648
+ color: var(
649
+ --rv-segmented-item-color,
650
+ var(--rv-ah-text-2, var(--rv-segmented-theme-item-color, var(--rv-ui-text)))
651
+ );
534
652
  cursor: pointer;
535
653
  font: inherit;
536
654
  font-size: 13px;
537
655
  font-weight: 400;
538
656
  line-height: 1;
539
657
  transition:
540
- background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
658
+ background-color var(--rv-ui-motion-fast, 120ms)
659
+ var(--rv-ui-motion-ease, ease),
541
660
  color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
542
661
  opacity var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
543
662
  }
@@ -556,21 +675,50 @@ label.rv-switch-label {
556
675
  }
557
676
 
558
677
  .rv-segmented-switch-item:where(:not(.on)):hover:not(:disabled) {
559
- background: var(--rv-segmented-item-hover-bg, var(--rv-segmented-theme-item-hover-bg, var(--rv-ui-surface-hover)));
560
- color: var(--rv-segmented-item-hover-color, var(--rv-ah-text-2, var(--rv-segmented-theme-item-hover-color, var(--rv-ui-text))));
678
+ background: var(
679
+ --rv-segmented-item-hover-bg,
680
+ var(--rv-segmented-theme-item-hover-bg, var(--rv-ui-surface-hover))
681
+ );
682
+ color: var(
683
+ --rv-segmented-item-hover-color,
684
+ var(
685
+ --rv-ah-text-2,
686
+ var(--rv-segmented-theme-item-hover-color, var(--rv-ui-text))
687
+ )
688
+ );
561
689
  }
562
690
 
563
691
  .rv-segmented-switch-item.on {
564
- background: var(--rv-segmented-active-bg, var(--rv-ah-bg, var(--rv-segmented-theme-active-bg, var(--rv-ui-surface))));
565
- color: var(--rv-segmented-active-color, var(--rv-ui-selected-accent-fg, var(--rv-ui-accent-text)));
692
+ background: var(
693
+ --rv-segmented-active-bg,
694
+ var(--rv-ah-bg, var(--rv-segmented-theme-active-bg, var(--rv-ui-surface)))
695
+ );
696
+ color: var(
697
+ --rv-segmented-active-color,
698
+ var(--rv-ui-selected-accent-fg, var(--rv-ui-accent-text))
699
+ );
566
700
  font-weight: 500;
567
- border-color: var(--rv-segmented-active-border, var(--rv-segmented-theme-active-border, var(--rv-ui-border)));
701
+ border-color: var(
702
+ --rv-segmented-active-border,
703
+ var(--rv-segmented-theme-active-border, var(--rv-ui-border))
704
+ );
568
705
  box-shadow: none;
569
706
  }
570
707
 
571
708
  .rv-segmented-switch-item:focus-visible {
572
- outline: 2px solid var(--rv-segmented-focus-outline, var(--rv-ah-bg, var(--rv-segmented-theme-focus-outline, var(--rv-ui-text-muted))));
573
- box-shadow: 0 0 0 4px var(--rv-segmented-focus-ring, color-mix(in srgb, var(--rv-ui-accent) 28%, transparent));
709
+ outline: 2px solid
710
+ var(
711
+ --rv-segmented-focus-outline,
712
+ var(
713
+ --rv-ah-bg,
714
+ var(--rv-segmented-theme-focus-outline, var(--rv-ui-text-muted))
715
+ )
716
+ );
717
+ box-shadow: 0 0 0 4px
718
+ var(
719
+ --rv-segmented-focus-ring,
720
+ color-mix(in srgb, var(--rv-ui-accent) 28%, transparent)
721
+ );
574
722
  }
575
723
 
576
724
  .rv-segmented-switch-item:disabled {
@@ -584,14 +732,27 @@ label.rv-switch-label {
584
732
  font-size: 9.5px;
585
733
  padding: 1px 5px;
586
734
  border-radius: 4px;
587
- background: var(--rv-segmented-count-bg, var(--rv-ah-bg-up, var(--rv-ui-surface-sunken)));
588
- color: var(--rv-segmented-count-color, var(--rv-ah-text-2, var(--rv-ui-text-muted)));
589
- border: 1px solid var(--rv-segmented-count-border, var(--rv-ah-border, var(--rv-ui-border)));
735
+ background: var(
736
+ --rv-segmented-count-bg,
737
+ var(--rv-ah-bg-up, var(--rv-ui-surface-sunken))
738
+ );
739
+ color: var(
740
+ --rv-segmented-count-color,
741
+ var(--rv-ah-text-2, var(--rv-ui-text-muted))
742
+ );
743
+ border: 1px solid
744
+ var(--rv-segmented-count-border, var(--rv-ah-border, var(--rv-ui-border)));
590
745
  }
591
746
 
592
747
  .rv-segmented-switch-item.on .rv-segmented-switch-count {
593
- background: var(--rv-segmented-active-count-bg, var(--rv-ah-bg-hover, var(--rv-ui-surface-sunken)));
594
- color: var(--rv-segmented-active-count-color, var(--rv-ah-text-2, var(--rv-ui-text-muted)));
748
+ background: var(
749
+ --rv-segmented-active-count-bg,
750
+ var(--rv-ah-bg-hover, var(--rv-ui-surface-sunken))
751
+ );
752
+ color: var(
753
+ --rv-segmented-active-count-color,
754
+ var(--rv-ah-text-2, var(--rv-ui-text-muted))
755
+ );
595
756
  }
596
757
 
597
758
  .rv-search-input {
@@ -607,28 +768,36 @@ label.rv-switch-label {
607
768
  align-items: center;
608
769
  justify-content: center;
609
770
  transform: translateY(-50%);
610
- color: var(--rv-search-input-icon-color, var(--rv-ah-text-2, var(--rv-ui-text-muted)));
771
+ color: var(
772
+ --rv-search-input-icon-color,
773
+ var(--rv-ah-text-2, var(--rv-ui-text-muted))
774
+ );
611
775
  pointer-events: none;
612
776
  }
613
777
 
614
778
  .rv-search-input > input:is([type='search'], [type='text']) {
615
779
  box-sizing: border-box;
616
780
  width: 100%;
617
- height: var(--rv-search-input-height, 32px);
618
- min-height: var(--rv-search-input-height, 32px);
781
+ height: var(--rv-search-input-height, var(--rv-control-height, 32px));
782
+ min-height: var(--rv-search-input-height, var(--rv-control-height, 32px));
619
783
  appearance: none;
620
- background: var(--rv-search-input-bg, var(--rv-ah-bg-input, var(--rv-ui-surface-sunken)));
621
- border: 1px solid var(--rv-search-input-border, var(--rv-ah-border, var(--rv-ui-border)));
784
+ background: var(
785
+ --rv-search-input-bg,
786
+ var(--rv-ah-bg-input, var(--rv-ui-surface-sunken))
787
+ );
788
+ border: 1px solid
789
+ var(--rv-search-input-border, var(--rv-ah-border, var(--rv-ui-border)));
622
790
  border-radius: 8px;
623
791
  padding-block: 0;
624
792
  padding-inline: 32px 38px;
625
793
  color: var(--rv-search-input-color, var(--rv-ah-text, var(--rv-ui-text)));
626
794
  outline: none;
627
795
  font: inherit;
628
- font-size: 12px;
796
+ font-size: var(--rv-control-font-size, 0.875rem);
629
797
  transition:
630
798
  border-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
631
- background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
799
+ background-color var(--rv-ui-motion-fast, 120ms)
800
+ var(--rv-ui-motion-ease, ease);
632
801
  }
633
802
 
634
803
  .rv-search-input > input[type='search']::-webkit-search-cancel-button {
@@ -636,13 +805,22 @@ label.rv-switch-label {
636
805
  }
637
806
 
638
807
  .rv-search-input > input:is([type='search'], [type='text'])::placeholder {
639
- color: var(--rv-search-input-placeholder-color, var(--rv-ah-text-2, var(--rv-ui-text-muted)));
808
+ color: var(
809
+ --rv-search-input-placeholder-color,
810
+ var(--rv-ah-text-2, var(--rv-ui-text-muted))
811
+ );
640
812
  }
641
813
 
642
814
  .rv-search-input > input:is([type='search'], [type='text']):focus {
643
815
  transition: none;
644
- border-color: var(--rv-search-input-focus-border, var(--rv-ah-border-strong, var(--rv-ui-border-strong)));
645
- background: var(--rv-search-input-focus-bg, var(--rv-ah-bg, var(--rv-ui-surface)));
816
+ border-color: var(
817
+ --rv-search-input-focus-border,
818
+ var(--rv-ah-border-strong, var(--rv-ui-border-strong))
819
+ );
820
+ background: var(
821
+ --rv-search-input-focus-bg,
822
+ var(--rv-ah-bg, var(--rv-ui-surface))
823
+ );
646
824
  }
647
825
 
648
826
  .rv-search-input--no-icon > input:is([type='search'], [type='text']) {
@@ -659,9 +837,19 @@ label.rv-switch-label {
659
837
  top: 50%;
660
838
  transform: translateY(-50%);
661
839
  font-size: 10px;
662
- color: var(--rv-search-input-shortcut-color, var(--rv-ah-text-2, var(--rv-ui-text-muted)));
663
- background: var(--rv-search-input-shortcut-bg, var(--rv-ah-canvas, var(--rv-ui-surface-elevated)));
664
- border: 1px solid var(--rv-search-input-shortcut-border, var(--rv-ah-border, var(--rv-ui-border)));
840
+ color: var(
841
+ --rv-search-input-shortcut-color,
842
+ var(--rv-ah-text-2, var(--rv-ui-text-muted))
843
+ );
844
+ background: var(
845
+ --rv-search-input-shortcut-bg,
846
+ var(--rv-ah-canvas, var(--rv-ui-surface-elevated))
847
+ );
848
+ border: 1px solid
849
+ var(
850
+ --rv-search-input-shortcut-border,
851
+ var(--rv-ah-border, var(--rv-ui-border))
852
+ );
665
853
  padding: 1px 5px;
666
854
  border-radius: 3px;
667
855
  }
@@ -752,7 +940,9 @@ button.rv-badge--inline {
752
940
  color: var(--rv-ui-selected-accent-fg, var(--rv-ui-accent-text));
753
941
  }
754
942
 
755
- .rv-badge--rounded { border-radius: 4px; }
943
+ .rv-badge--rounded {
944
+ border-radius: 4px;
945
+ }
756
946
 
757
947
  .rv-btn:disabled .rv-badge,
758
948
  .rv-btn[disabled] .rv-badge {
@@ -778,35 +968,47 @@ button.rv-badge--inline {
778
968
  }
779
969
 
780
970
  // Square icon controls and their native hover/focus tooltips share one owner.
781
- .rv-btn-icon { box-sizing: border-box; flex: none; width: var(--rv-icon-button-size, 32px); height: var(--rv-icon-button-size, 32px); padding: 6px; }
782
- .rv-btn-icon[aria-pressed='true'], .rv-btn-icon[data-active='true'] { background: var(--rv-ui-selected-bg); color: var(--rv-ui-selected-fg); }
783
- .rv-control-tooltip { display: none; border: 0; position: absolute; bottom: calc(100% + 8px); inset-inline-start: 50%; transform: translateX(-50%); padding: 6px 9px; border-radius: 6px; white-space: nowrap; font: 12px sans-serif; color: var(--rv-ui-surface); background: var(--rv-ui-text); box-shadow: 0 3px 10px var(--rv-ui-shadow); pointer-events: none; visibility: hidden; z-index: 20; }
784
- .rv-icon-action:hover .rv-control-tooltip:not([data-visible]), .rv-icon-action:focus .rv-control-tooltip:not([data-visible]), .rv-btn-icon:hover .rv-control-tooltip:not([data-visible]), .rv-btn-icon:focus .rv-control-tooltip:not([data-visible]) { display: block; visibility: visible; }
785
- // Anchored tooltips stay outside scrollable surface geometry, including while visible.
786
- @supports (anchor-scope: --rv-control-action) {
787
- .rv-icon-action, .rv-btn-icon {
788
- anchor-name: --rv-control-action;
789
- anchor-scope: --rv-control-action;
790
- }
791
- .rv-control-tooltip {
792
- position: fixed;
793
- position-anchor: --rv-control-action;
794
- inset: auto;
795
- position-area: top;
796
- position-try-fallbacks: top span-left, top span-right;
797
- margin-bottom: 8px;
798
- transform: none;
799
- }
800
- }
801
-
802
-
803
- .rv-btn-icon { position: relative; overflow: visible; }
804
- .rv-btn-icon .rv-badge { position: absolute; inset-block-start: -5px; inset-inline-end: -6px; min-width: 16px; height: 16px; padding: 0 4px; font-size: 10px; line-height: 16px; pointer-events: none; }
971
+ .rv-btn-icon {
972
+ box-sizing: border-box;
973
+ flex: none;
974
+ width: var(--rv-icon-button-size, 32px);
975
+ height: var(--rv-icon-button-size, 32px);
976
+ padding: 6px;
977
+ }
978
+ .rv-btn-icon[aria-pressed='true'],
979
+ .rv-btn-icon[data-active='true'] {
980
+ background: var(--rv-ui-selected-bg);
981
+ color: var(--rv-ui-selected-fg);
982
+ }
983
+
984
+ .rv-btn-icon {
985
+ position: relative;
986
+ overflow: visible;
987
+ }
988
+ .rv-btn-icon .rv-badge {
989
+ position: absolute;
990
+ inset-block-start: -5px;
991
+ inset-inline-end: -6px;
992
+ min-width: 16px;
993
+ height: 16px;
994
+ padding: 0 4px;
995
+ font-size: 10px;
996
+ line-height: 16px;
997
+ pointer-events: none;
998
+ }
805
999
  // Reserve the icon badges' overhang so toolbars can center controls without clipping them.
806
- .rv-history-controls { display: flex; align-items: center; gap: 12px; padding-block: 5px; padding-inline-end: 6px; }
1000
+ .rv-history-controls {
1001
+ display: flex;
1002
+ align-items: center;
1003
+ gap: 12px;
1004
+ padding-block: 5px;
1005
+ padding-inline-end: 6px;
1006
+ }
807
1007
 
808
1008
  // Native disabled buttons still expose their explanation on pointer hover.
809
- .rv-btn-icon:disabled { pointer-events: auto; }
1009
+ .rv-btn-icon:disabled {
1010
+ pointer-events: auto;
1011
+ }
810
1012
 
811
1013
  // Contained tool strips share geometry across native Charts and Preact hosts.
812
1014
  .rv-toolbar--surface {
@@ -830,8 +1032,9 @@ button.rv-badge--inline {
830
1032
  .rv-toolbar--surface > .rv-btn-icon[aria-pressed='true']:hover:not(:disabled) {
831
1033
  background: var(--rv-ui-selected-bg);
832
1034
  }
833
- .rv-svg-icon > svg[fill='none'] { fill: none; }
834
-
1035
+ .rv-svg-icon > svg[fill='none'] {
1036
+ fill: none;
1037
+ }
835
1038
 
836
1039
  .rv-choice-chip--composite {
837
1040
  position: relative;
@@ -839,13 +1042,26 @@ button.rv-badge--inline {
839
1042
  align-items: center;
840
1043
  gap: 4px;
841
1044
  cursor: default;
842
- .rv-choice-chip-label { min-width: 0; }
1045
+ .rv-choice-chip-label {
1046
+ min-width: 0;
1047
+ }
843
1048
  button.rv-choice-chip-label {
844
- appearance: none; border: 0; padding: 0; margin: 0;
845
- background: transparent; color: inherit; font: inherit; cursor: pointer;
846
- &:focus-visible { outline: 2px solid var(--rv-ui-accent); outline-offset: 2px; }
1049
+ appearance: none;
1050
+ border: 0;
1051
+ padding: 0;
1052
+ margin: 0;
1053
+ background: transparent;
1054
+ color: inherit;
1055
+ font: inherit;
1056
+ cursor: pointer;
1057
+ &:focus-visible {
1058
+ outline: 2px solid var(--rv-ui-accent);
1059
+ outline-offset: 2px;
1060
+ }
1061
+ }
1062
+ &[aria-disabled='true'] {
1063
+ opacity: 0.5;
847
1064
  }
848
- &[aria-disabled='true'] { opacity: .5; }
849
1065
  }
850
1066
  button.rv-choice-chip-info {
851
1067
  box-sizing: border-box;
@@ -862,10 +1078,13 @@ button.rv-choice-chip-info {
862
1078
  border-radius: 50%;
863
1079
  background: transparent;
864
1080
  color: var(--rv-ui-text-muted);
865
- font: 600 13px/1 system-ui, sans-serif;
1081
+ font:
1082
+ 600 13px/1 system-ui,
1083
+ sans-serif;
866
1084
  cursor: pointer;
867
1085
  transition:
868
- background-color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease),
1086
+ background-color var(--rv-ui-motion-fast, 120ms)
1087
+ var(--rv-ui-motion-ease, ease),
869
1088
  color var(--rv-ui-motion-fast, 120ms) var(--rv-ui-motion-ease, ease);
870
1089
  }
871
1090
 
@@ -881,15 +1100,19 @@ button.rv-choice-chip-info:focus-visible,
881
1100
  outline-offset: 1px;
882
1101
  }
883
1102
 
884
-
885
-
886
- .rv-choice-chip[data-color='true']:is([aria-pressed='true'], [data-selected='true']) {
1103
+ .rv-choice-chip[data-color='true']:is(
1104
+ [aria-pressed='true'],
1105
+ [data-selected='true']
1106
+ ) {
887
1107
  border-color: transparent;
888
- background: color-mix(in srgb, var(--rv-choice-chip-color) 9%, var(--rv-ui-surface));
1108
+ background: color-mix(
1109
+ in srgb,
1110
+ var(--rv-choice-chip-color) 9%,
1111
+ var(--rv-ui-surface)
1112
+ );
889
1113
  color: var(--rv-ui-text);
890
1114
  }
891
1115
 
892
-
893
1116
  .rv-btn-tab {
894
1117
  @extend %rv-btn-base;
895
1118
  min-height: 40px;
@@ -911,7 +1134,8 @@ button.rv-choice-chip-info:focus-visible,
911
1134
  content: '';
912
1135
  }
913
1136
 
914
- &:hover:not(:disabled), &[aria-selected='true'] {
1137
+ &:hover:not(:disabled),
1138
+ &[aria-selected='true'] {
915
1139
  color: var(--rv-tab-accent, var(--rv-ui-accent-text));
916
1140
  }
917
1141
  &[aria-selected='true']::after {
@@ -937,27 +1161,63 @@ button.rv-choice-chip-info:focus-visible,
937
1161
  color: var(--rv-ui-accent-text);
938
1162
  font-weight: 400;
939
1163
  text-decoration: none;
940
- svg { width: 12px; height: 12px; fill: currentColor; }
941
- &:hover:not(:disabled) { background: transparent; text-decoration: underline; }
942
- &:focus-visible { outline: 2px solid var(--rv-ui-accent); outline-offset: 2px; box-shadow: none; }
1164
+ svg {
1165
+ width: 12px;
1166
+ height: 12px;
1167
+ fill: currentColor;
1168
+ }
1169
+ &:hover:not(:disabled) {
1170
+ background: transparent;
1171
+ text-decoration: underline;
1172
+ }
1173
+ &:focus-visible {
1174
+ outline: 2px solid var(--rv-ui-accent);
1175
+ outline-offset: 2px;
1176
+ box-shadow: none;
1177
+ }
943
1178
  }
944
1179
 
945
1180
  // Forced colors suppress box shadows; focus must remain a visible outline.
946
1181
  @media (forced-colors: active) {
947
- :is(.rv-btn, .rv-btn-solid, .rv-btn-primary, .rv-btn-ghost, .rv-btn-link,
948
- .rv-control, .rv-choice-chip, .rv-segmented-switch-item, .rv-rating-choice):focus-visible {
1182
+ :is(
1183
+ .rv-btn,
1184
+ .rv-btn-solid,
1185
+ .rv-btn-primary,
1186
+ .rv-btn-ghost,
1187
+ .rv-btn-link,
1188
+ .rv-control,
1189
+ .rv-choice-chip,
1190
+ .rv-segmented-switch-item,
1191
+ .rv-rating-choice
1192
+ ):focus-visible {
949
1193
  outline: 2px solid Highlight;
950
1194
  outline-offset: 2px;
951
1195
  }
952
1196
  }
953
1197
 
954
1198
  // Busy is unavailable for interaction but retains its enabled variant paint.
955
- .rv-btn.rv-btn-busy:disabled { pointer-events: auto; cursor: progress; }
956
- .rv-btn.rv-btn-busy:not(.rv-btn-busy-disabled):disabled { opacity: 1; }
1199
+ .rv-btn.rv-btn-busy:disabled {
1200
+ pointer-events: auto;
1201
+ cursor: progress;
1202
+ }
1203
+ .rv-btn.rv-btn-busy:not(.rv-btn-busy-disabled):disabled {
1204
+ opacity: 1;
1205
+ }
957
1206
  .rv-button-spinner {
958
1207
  @include loading.ring(1em, 2px);
959
1208
  flex: 0 0 auto;
960
1209
  border-color: color-mix(in srgb, currentColor 30%, transparent);
961
1210
  border-block-start-color: currentColor;
962
1211
  }
963
- .rv-btn-busy.rv-btn-icon > :not(.rv-button-spinner) { display: none; }
1212
+ .rv-btn-busy.rv-btn-icon > :not(.rv-button-spinner) {
1213
+ display: none;
1214
+ }
1215
+
1216
+ // Applies uniformly to action variants, icon controls and navigation buttons.
1217
+ .rv-btn-rounded.rv-btn-rounded {
1218
+ border-radius: 9999px;
1219
+ }
1220
+ .rv-btn-rounded[aria-disabled='true'] {
1221
+ opacity: 0.5;
1222
+ pointer-events: none;
1223
+ }