@slotted/styles 0.0.0-stage → 0.1.0-beta.1

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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/package.json +276 -3
  4. package/src/accordion/accordion.css +96 -0
  5. package/src/accordion/accordion.tokens.json +14 -0
  6. package/src/action-bar/action-bar.css +455 -0
  7. package/src/action-bar/action-bar.tokens.json +50 -0
  8. package/src/action-sheet/action-sheet.css +462 -0
  9. package/src/action-sheet/action-sheet.tokens.json +59 -0
  10. package/src/alert/alert.css +764 -0
  11. package/src/alert/alert.tokens.json +77 -0
  12. package/src/app-shell/app-shell.css +1899 -0
  13. package/src/app-shell/app-shell.tokens.json +88 -0
  14. package/src/aspect-ratio/aspect-ratio.css +131 -0
  15. package/src/aspect-ratio/aspect-ratio.tokens.json +1 -0
  16. package/src/attachment/attachment.css +906 -0
  17. package/src/attachment/attachment.tokens.json +85 -0
  18. package/src/avatar/avatar.css +598 -0
  19. package/src/avatar/avatar.tokens.json +64 -0
  20. package/src/avatar-group/avatar-group.css +268 -0
  21. package/src/avatar-group/avatar-group.tokens.json +16 -0
  22. package/src/badge/badge.css +462 -0
  23. package/src/badge/badge.tokens.json +58 -0
  24. package/src/breadcrumb/breadcrumb.css +441 -0
  25. package/src/breadcrumb/breadcrumb.tokens.json +50 -0
  26. package/src/button/button.css +754 -0
  27. package/src/button/button.tokens.json +72 -0
  28. package/src/button-group/button-group.css +455 -0
  29. package/src/button-group/button-group.tokens.json +11 -0
  30. package/src/calendar/calendar.css +846 -0
  31. package/src/calendar/calendar.tokens.json +67 -0
  32. package/src/card/card.css +602 -0
  33. package/src/card/card.tokens.json +68 -0
  34. package/src/carousel/carousel.css +860 -0
  35. package/src/carousel/carousel.tokens.json +62 -0
  36. package/src/cascader/cascader.css +1320 -0
  37. package/src/cascader/cascader.tokens.json +103 -0
  38. package/src/chart/chart.css +1473 -0
  39. package/src/chart/chart.tokens.json +107 -0
  40. package/src/checkbox/checkbox.css +1011 -0
  41. package/src/checkbox/checkbox.tokens.json +102 -0
  42. package/src/checkbox-group/checkbox-group.css +70 -0
  43. package/src/checkbox-group/checkbox-group.tokens.json +6 -0
  44. package/src/code-block/code-block.css +555 -0
  45. package/src/code-block/code-block.tokens.json +69 -0
  46. package/src/collapsible/collapsible.css +546 -0
  47. package/src/collapsible/collapsible.tokens.json +55 -0
  48. package/src/color-picker/color-picker.css +607 -0
  49. package/src/color-picker/color-picker.tokens.json +58 -0
  50. package/src/column-manager/column-manager.css +452 -0
  51. package/src/column-manager/column-manager.tokens.json +43 -0
  52. package/src/combobox/combobox.css +1048 -0
  53. package/src/combobox/combobox.tokens.json +112 -0
  54. package/src/command-palette/command-palette.css +1000 -0
  55. package/src/command-palette/command-palette.tokens.json +75 -0
  56. package/src/container/container.css +198 -0
  57. package/src/container/container.tokens.json +18 -0
  58. package/src/context-menu/context-menu.css +104 -0
  59. package/src/context-menu/context-menu.tokens.json +11 -0
  60. package/src/currency-field/currency-field.css +787 -0
  61. package/src/currency-field/currency-field.tokens.json +80 -0
  62. package/src/dashboard-grid/dashboard-grid.css +748 -0
  63. package/src/dashboard-grid/dashboard-grid.tokens.json +67 -0
  64. package/src/data-grid/data-grid.css +2484 -0
  65. package/src/data-grid/data-grid.tokens.json +100 -0
  66. package/src/data-list/data-list.css +455 -0
  67. package/src/data-list/data-list.tokens.json +35 -0
  68. package/src/date-field/date-field.css +560 -0
  69. package/src/date-field/date-field.tokens.json +80 -0
  70. package/src/date-picker/date-picker.css +420 -0
  71. package/src/date-picker/date-picker.tokens.json +49 -0
  72. package/src/date-range-picker/date-range-picker.css +983 -0
  73. package/src/date-range-picker/date-range-picker.tokens.json +109 -0
  74. package/src/datetime-field/datetime-field.css +850 -0
  75. package/src/datetime-field/datetime-field.tokens.json +91 -0
  76. package/src/datetime-picker/datetime-picker.css +843 -0
  77. package/src/datetime-picker/datetime-picker.tokens.json +78 -0
  78. package/src/datetime-range-picker/datetime-range-picker.css +1375 -0
  79. package/src/datetime-range-picker/datetime-range-picker.tokens.json +135 -0
  80. package/src/description-list/description-list.css +675 -0
  81. package/src/description-list/description-list.tokens.json +66 -0
  82. package/src/detail-panel/detail-panel.css +329 -0
  83. package/src/detail-panel/detail-panel.tokens.json +33 -0
  84. package/src/dialog/dialog.css +968 -0
  85. package/src/dialog/dialog.tokens.json +66 -0
  86. package/src/divider/divider.css +131 -0
  87. package/src/divider/divider.tokens.json +18 -0
  88. package/src/drawer/drawer.css +1303 -0
  89. package/src/drawer/drawer.tokens.json +75 -0
  90. package/src/entity-picker/entity-picker.css +1367 -0
  91. package/src/entity-picker/entity-picker.tokens.json +118 -0
  92. package/src/event-calendar/event-calendar.css +2148 -0
  93. package/src/event-calendar/event-calendar.tokens.json +87 -0
  94. package/src/field/field.css +707 -0
  95. package/src/field/field.tokens.json +58 -0
  96. package/src/field-group/field-group.css +226 -0
  97. package/src/field-group/field-group.tokens.json +33 -0
  98. package/src/filter-bar/filter-bar.css +1306 -0
  99. package/src/filter-bar/filter-bar.tokens.json +78 -0
  100. package/src/form/form.css +218 -0
  101. package/src/form/form.tokens.json +32 -0
  102. package/src/fullscreen/fullscreen.css +376 -0
  103. package/src/fullscreen/fullscreen.tokens.json +50 -0
  104. package/src/grid/grid.css +173 -0
  105. package/src/grid/grid.tokens.json +20 -0
  106. package/src/highlight/highlight.css +135 -0
  107. package/src/highlight/highlight.tokens.json +16 -0
  108. package/src/hover-card/hover-card.css +93 -0
  109. package/src/hover-card/hover-card.tokens.json +17 -0
  110. package/src/icon/icon.css +136 -0
  111. package/src/icon/icon.tokens.json +14 -0
  112. package/src/image/image.css +449 -0
  113. package/src/image/image.tokens.json +27 -0
  114. package/src/import-export-center/import-export-center.css +1175 -0
  115. package/src/import-export-center/import-export-center.tokens.json +84 -0
  116. package/src/inline/inline.css +149 -0
  117. package/src/inline/inline.tokens.json +14 -0
  118. package/src/inline-message/inline-message.css +396 -0
  119. package/src/inline-message/inline-message.tokens.json +19 -0
  120. package/src/kbd/kbd.css +490 -0
  121. package/src/kbd/kbd.tokens.json +40 -0
  122. package/src/link/link.css +237 -0
  123. package/src/link/link.tokens.json +25 -0
  124. package/src/list/list.css +240 -0
  125. package/src/list/list.tokens.json +42 -0
  126. package/src/list-item/list-item.css +937 -0
  127. package/src/list-item/list-item.tokens.json +114 -0
  128. package/src/listbox/listbox.css +674 -0
  129. package/src/listbox/listbox.tokens.json +72 -0
  130. package/src/loading-overlay/loading-overlay.css +730 -0
  131. package/src/loading-overlay/loading-overlay.tokens.json +48 -0
  132. package/src/markdown/markdown.css +168 -0
  133. package/src/markdown/markdown.tokens.json +18 -0
  134. package/src/menu/menu.css +817 -0
  135. package/src/menu/menu.tokens.json +78 -0
  136. package/src/menubar/menubar.css +170 -0
  137. package/src/menubar/menubar.tokens.json +32 -0
  138. package/src/message/message.css +1453 -0
  139. package/src/message/message.tokens.json +85 -0
  140. package/src/message-scroller/message-scroller.css +371 -0
  141. package/src/message-scroller/message-scroller.tokens.json +47 -0
  142. package/src/multi-select/multi-select.css +1427 -0
  143. package/src/multi-select/multi-select.tokens.json +114 -0
  144. package/src/navigation-menu/navigation-menu.css +1029 -0
  145. package/src/navigation-menu/navigation-menu.tokens.json +70 -0
  146. package/src/notification-center/notification-center.css +856 -0
  147. package/src/notification-center/notification-center.tokens.json +84 -0
  148. package/src/number-field/number-field.css +794 -0
  149. package/src/number-field/number-field.tokens.json +80 -0
  150. package/src/otp-input/otp-input.css +525 -0
  151. package/src/otp-input/otp-input.tokens.json +69 -0
  152. package/src/page/page.css +179 -0
  153. package/src/page/page.tokens.json +20 -0
  154. package/src/page-header/page-header.css +1181 -0
  155. package/src/page-header/page-header.tokens.json +71 -0
  156. package/src/pagination/pagination.css +500 -0
  157. package/src/pagination/pagination.tokens.json +56 -0
  158. package/src/popover/popover.css +526 -0
  159. package/src/popover/popover.tokens.json +60 -0
  160. package/src/progress-indicator/progress-indicator.css +1584 -0
  161. package/src/progress-indicator/progress-indicator.tokens.json +50 -0
  162. package/src/prompt-composer/prompt-composer.css +680 -0
  163. package/src/prompt-composer/prompt-composer.tokens.json +99 -0
  164. package/src/prose/prose.css +733 -0
  165. package/src/prose/prose.tokens.json +79 -0
  166. package/src/radio-group/radio-group.css +778 -0
  167. package/src/radio-group/radio-group.tokens.json +103 -0
  168. package/src/rating/rating.css +1071 -0
  169. package/src/rating/rating.tokens.json +88 -0
  170. package/src/result-state/result-state.css +980 -0
  171. package/src/result-state/result-state.tokens.json +63 -0
  172. package/src/runtime-properties.mjs +321 -0
  173. package/src/saved-views/saved-views.css +394 -0
  174. package/src/saved-views/saved-views.tokens.json +41 -0
  175. package/src/scroll-area/scroll-area.css +481 -0
  176. package/src/scroll-area/scroll-area.tokens.json +15 -0
  177. package/src/section/section.css +177 -0
  178. package/src/section/section.tokens.json +39 -0
  179. package/src/segmented-control/segmented-control.css +564 -0
  180. package/src/segmented-control/segmented-control.tokens.json +67 -0
  181. package/src/select/select.css +1593 -0
  182. package/src/select/select.tokens.json +110 -0
  183. package/src/side-navigation/side-navigation.css +1096 -0
  184. package/src/side-navigation/side-navigation.tokens.json +87 -0
  185. package/src/skeleton/skeleton.css +431 -0
  186. package/src/skeleton/skeleton.tokens.json +29 -0
  187. package/src/slider/slider.css +792 -0
  188. package/src/slider/slider.tokens.json +75 -0
  189. package/src/sparkline/sparkline.css +282 -0
  190. package/src/sparkline/sparkline.tokens.json +45 -0
  191. package/src/spinner/spinner.css +224 -0
  192. package/src/spinner/spinner.tokens.json +8 -0
  193. package/src/split-button/split-button.css +253 -0
  194. package/src/split-button/split-button.tokens.json +12 -0
  195. package/src/splitter/splitter.css +336 -0
  196. package/src/splitter/splitter.tokens.json +24 -0
  197. package/src/stack/stack.css +128 -0
  198. package/src/stack/stack.tokens.json +14 -0
  199. package/src/stat-card/stat-card.css +641 -0
  200. package/src/stat-card/stat-card.tokens.json +95 -0
  201. package/src/status-indicator/status-indicator.css +481 -0
  202. package/src/status-indicator/status-indicator.tokens.json +38 -0
  203. package/src/stepper/stepper.css +629 -0
  204. package/src/stepper/stepper.tokens.json +72 -0
  205. package/src/switch/switch.css +703 -0
  206. package/src/switch/switch.tokens.json +75 -0
  207. package/src/table/table.css +1482 -0
  208. package/src/table/table.tokens.json +69 -0
  209. package/src/table-of-contents/table-of-contents.css +533 -0
  210. package/src/table-of-contents/table-of-contents.tokens.json +53 -0
  211. package/src/tabs/tabs.css +998 -0
  212. package/src/tabs/tabs.tokens.json +82 -0
  213. package/src/tag/tag.css +768 -0
  214. package/src/tag/tag.tokens.json +85 -0
  215. package/src/tags-input/tags-input.css +757 -0
  216. package/src/tags-input/tags-input.tokens.json +84 -0
  217. package/src/text-field/text-field.css +900 -0
  218. package/src/text-field/text-field.tokens.json +87 -0
  219. package/src/textarea/textarea.css +365 -0
  220. package/src/textarea/textarea.tokens.json +59 -0
  221. package/src/time-field/time-field.css +719 -0
  222. package/src/time-field/time-field.tokens.json +86 -0
  223. package/src/time-picker/time-picker.css +665 -0
  224. package/src/time-picker/time-picker.tokens.json +66 -0
  225. package/src/time-range-picker/time-range-picker.css +1287 -0
  226. package/src/time-range-picker/time-range-picker.tokens.json +134 -0
  227. package/src/timeline/timeline.css +1596 -0
  228. package/src/timeline/timeline.tokens.json +96 -0
  229. package/src/toast/toast.css +943 -0
  230. package/src/toast/toast.tokens.json +90 -0
  231. package/src/toggle/toggle.css +290 -0
  232. package/src/toggle/toggle.tokens.json +54 -0
  233. package/src/toggle-group/toggle-group.css +463 -0
  234. package/src/toggle-group/toggle-group.tokens.json +54 -0
  235. package/src/toolbar/toolbar.css +434 -0
  236. package/src/toolbar/toolbar.tokens.json +49 -0
  237. package/src/tooltip/tooltip.css +368 -0
  238. package/src/tooltip/tooltip.tokens.json +39 -0
  239. package/src/top-navigation/top-navigation.css +1287 -0
  240. package/src/top-navigation/top-navigation.tokens.json +91 -0
  241. package/src/tour/tour.css +680 -0
  242. package/src/tour/tour.tokens.json +67 -0
  243. package/src/transfer/transfer.css +571 -0
  244. package/src/transfer/transfer.tokens.json +49 -0
  245. package/src/tree/tree.css +1000 -0
  246. package/src/tree/tree.tokens.json +80 -0
  247. package/src/typography/typography.css +211 -0
  248. package/src/typography/typography.tokens.json +31 -0
  249. package/src/upload/upload.css +1706 -0
  250. package/src/upload/upload.tokens.json +123 -0
  251. package/src/visually-hidden/visually-hidden.css +52 -0
  252. package/src/visually-hidden/visually-hidden.tokens.json +1 -0
  253. package/src/wizard/wizard.css +740 -0
  254. package/src/wizard/wizard.tokens.json +63 -0
@@ -0,0 +1,85 @@
1
+ [
2
+ "--slotted-avatar-size-md",
3
+ "--slotted-avatar-size-sm",
4
+ "--slotted-border-subtle",
5
+ "--slotted-border-width-thin",
6
+ "--slotted-control-font-size-lg",
7
+ "--slotted-control-font-size-md",
8
+ "--slotted-control-gap-md",
9
+ "--slotted-control-icon-size-sm",
10
+ "--slotted-control-inner-size-md",
11
+ "--slotted-control-radius",
12
+ "--slotted-disabled-foreground",
13
+ "--slotted-duration-long",
14
+ "--slotted-duration-loop",
15
+ "--slotted-duration-loop-slow",
16
+ "--slotted-duration-medium",
17
+ "--slotted-duration-short",
18
+ "--slotted-easing-emphasized",
19
+ "--slotted-easing-enter",
20
+ "--slotted-easing-exit",
21
+ "--slotted-easing-standard",
22
+ "--slotted-focus-ring-color",
23
+ "--slotted-focus-ring-offset",
24
+ "--slotted-focus-ring-width",
25
+ "--slotted-font-family-sans",
26
+ "--slotted-font-size-xs",
27
+ "--slotted-font-weight-medium",
28
+ "--slotted-font-weight-regular",
29
+ "--slotted-font-weight-semibold",
30
+ "--slotted-line-height-md",
31
+ "--slotted-line-height-xs",
32
+ "--slotted-message-avatar-size",
33
+ "--slotted-message-bubble-padding-block",
34
+ "--slotted-message-bubble-padding-inline",
35
+ "--slotted-message-bubble-radius",
36
+ "--slotted-message-bubble-radius-joined",
37
+ "--slotted-message-bubble-share",
38
+ "--slotted-message-column-gap",
39
+ "--slotted-message-retry-state-layer",
40
+ "--slotted-message-run-gap",
41
+ "--slotted-message-stack-gap",
42
+ "--slotted-message-state-layer-active",
43
+ "--slotted-message-state-layer-hover",
44
+ "--slotted-message-thread-avatar-size",
45
+ "--slotted-radius-full",
46
+ "--slotted-radius-md",
47
+ "--slotted-radius-sm",
48
+ "--slotted-shadow-sm",
49
+ "--slotted-shadow-xs",
50
+ "--slotted-space-1",
51
+ "--slotted-space-2",
52
+ "--slotted-space-3",
53
+ "--slotted-space-4",
54
+ "--slotted-surface",
55
+ "--slotted-surface-raised",
56
+ "--slotted-target-min",
57
+ "--slotted-text",
58
+ "--slotted-text-muted",
59
+ "--slotted-tone-accent-border",
60
+ "--slotted-tone-accent-on-solid",
61
+ "--slotted-tone-accent-solid",
62
+ "--slotted-tone-accent-surface",
63
+ "--slotted-tone-accent-text",
64
+ "--slotted-tone-danger-border",
65
+ "--slotted-tone-danger-on-solid",
66
+ "--slotted-tone-danger-solid",
67
+ "--slotted-tone-danger-solid-active",
68
+ "--slotted-tone-danger-surface",
69
+ "--slotted-tone-danger-text",
70
+ "--slotted-tone-secondary-on-solid",
71
+ "--slotted-tone-secondary-solid",
72
+ "--slotted-tone-secondary-subtle-active",
73
+ "--slotted-tone-secondary-subtle-hover",
74
+ "--slotted-tone-secondary-surface",
75
+ "--slotted-tone-success-border",
76
+ "--slotted-tone-success-on-solid",
77
+ "--slotted-tone-success-solid",
78
+ "--slotted-tone-success-surface",
79
+ "--slotted-tone-success-text",
80
+ "--slotted-tone-warning-border",
81
+ "--slotted-tone-warning-on-solid",
82
+ "--slotted-tone-warning-solid",
83
+ "--slotted-tone-warning-surface",
84
+ "--slotted-tone-warning-text"
85
+ ]
@@ -0,0 +1,371 @@
1
+ @layer slotted.components {
2
+ /**
3
+ * ── The region a conversation scrolls in ───────────────────────────────
4
+ *
5
+ * The frame fills a parent whose height is bounded, the viewport scrolls
6
+ * inside it, and the jump control stands over the viewport as a sibling so
7
+ * it does not scroll away with the rows. The behaviour is
8
+ * `@slotted/core/message-scroller`; this sheet reads what it writes —
9
+ * `data-scrollable`, `data-following`, `data-pending` and
10
+ * `--slotted-message-scroller-room` — and draws nothing the engine decides.
11
+ */
12
+ [data-ui='message-scroller'][data-part='root'] {
13
+ --_inset: var(--slotted-message-scroller-padding, var(--slotted-space-6, 1rem));
14
+ /**
15
+ * The gap between two runs of a conversation. Twenty at comfortable, the
16
+ * ReUI thread gap (`c-message-scroller-4`), fifteen and ten at the two
17
+ * tighter densities: the control gap the theme restates, two and a half
18
+ * times. The rows of one run are two pixels apart (`message` › group),
19
+ * and the difference between the two gaps is the whole grouping signal.
20
+ */
21
+ --_gap: var(--slotted-message-scroller-gap, calc(var(--slotted-control-gap-md, 8px) * 2.5));
22
+ --_fade: var(--slotted-message-scroller-fade, var(--slotted-space-6, 1rem));
23
+
24
+ display: flex;
25
+ flex-direction: column;
26
+ position: relative;
27
+ box-sizing: border-box;
28
+ block-size: 100%;
29
+ min-block-size: 0;
30
+ min-inline-size: 0;
31
+ overflow: hidden;
32
+ color: var(--slotted-text);
33
+ font-family: var(--slotted-font-family-sans, sans-serif);
34
+ }
35
+
36
+ [data-ui='message-scroller'] [data-part='viewport'] {
37
+ /* The rows' offset parent, so the engine reads their layout offset rather than a rectangle an entrance has moved. */
38
+ position: relative;
39
+ flex: 1 1 auto;
40
+ box-sizing: border-box;
41
+ min-block-size: 0;
42
+ overflow-x: hidden;
43
+ overflow-y: auto;
44
+ /**
45
+ * The engine keeps the reader's row in place itself; a native correction
46
+ * added to its own would move the reader twice, and Safari has none to
47
+ * rely on (`contract.json` › `engine.overflowAnchorReason`).
48
+ */
49
+ overflow-anchor: none;
50
+ overscroll-behavior: contain;
51
+ scrollbar-color: var(--slotted-border-strong) transparent;
52
+ scrollbar-gutter: stable;
53
+ scrollbar-width: thin;
54
+ }
55
+
56
+ /**
57
+ * An edge the reader can still scroll toward fades the rows into it, so a
58
+ * row cut by the frame reads as continuing rather than as ending there.
59
+ */
60
+ [data-ui='message-scroller'] [data-part='viewport'][data-scrollable~='start'] {
61
+ mask-image: linear-gradient(to bottom, transparent, #000 var(--_fade));
62
+ }
63
+
64
+ [data-ui='message-scroller'] [data-part='viewport'][data-scrollable~='end'] {
65
+ mask-image: linear-gradient(to top, transparent, #000 var(--_fade));
66
+ }
67
+
68
+ [data-ui='message-scroller']
69
+ [data-part='viewport'][data-scrollable~='start'][data-scrollable~='end'] {
70
+ mask-image: linear-gradient(
71
+ to bottom,
72
+ transparent,
73
+ #000 var(--_fade),
74
+ #000 calc(100% - var(--_fade)),
75
+ transparent
76
+ );
77
+ }
78
+
79
+ /**
80
+ * A conversation opened at its end is at its top until script runs, and
81
+ * shows its oldest rows first. The frame stays and the rows wait, laid out,
82
+ * so the engine measures them before the reader sees them.
83
+ */
84
+ [data-ui='message-scroller'] [data-part='viewport'][data-pending] {
85
+ visibility: hidden;
86
+ }
87
+
88
+ [data-ui='message-scroller'] [data-part='viewport']:focus-visible {
89
+ outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
90
+ outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
91
+ }
92
+
93
+ /**
94
+ * The rows stand at the foot of the frame while they are fewer than it
95
+ * holds, where a conversation is read from; the room an anchored turn needs
96
+ * is added under the last one.
97
+ */
98
+ [data-ui='message-scroller'] [data-part='content'] {
99
+ display: flex;
100
+ flex-direction: column;
101
+ justify-content: flex-end;
102
+ gap: var(--_gap);
103
+ box-sizing: border-box;
104
+ min-block-size: 100%;
105
+ padding: var(--_inset);
106
+ padding-block-end: calc(var(--_inset) + var(--slotted-message-scroller-room, 0px));
107
+ }
108
+
109
+ /**
110
+ * ── A row ──────────────────────────────────────────────────────────────
111
+ *
112
+ * A row far from view is not painted (`content-visibility: auto`) and stays
113
+ * in the DOM for selection, finding in the page and assistive technology.
114
+ * A row that arrives rises by a step and fades in; a row the engine lands a
115
+ * jump on glows in the accent's pointer tint and loses it slowly, so the
116
+ * reader sees where the jump ended.
117
+ */
118
+ [data-ui='message-scroller'] [data-part='item'] {
119
+ min-inline-size: 0;
120
+ border-radius: var(--slotted-radius-md, 6px);
121
+ content-visibility: auto;
122
+ contain-intrinsic-size: auto 6rem;
123
+ transition:
124
+ opacity var(--slotted-duration-medium) var(--slotted-easing-enter, ease-out),
125
+ translate var(--slotted-duration-medium) var(--slotted-easing-enter, ease-out),
126
+ background-color var(--slotted-duration-long) var(--slotted-easing-standard, ease),
127
+ box-shadow var(--slotted-duration-long) var(--slotted-easing-standard, ease);
128
+
129
+ @starting-style {
130
+ opacity: 0;
131
+ translate: 0 var(--slotted-space-4, 0.5rem);
132
+ }
133
+ }
134
+
135
+ [data-ui='message-scroller'] [data-part='item'][data-current] {
136
+ background-color: var(--slotted-tone-accent-subtle-hover);
137
+ box-shadow: 0 0 0 var(--slotted-space-3, 0.375rem) var(--slotted-tone-accent-subtle-hover);
138
+ }
139
+
140
+ /* ── Separator and unread line ─────────────────────────────────────────
141
+ *
142
+ * A day, or a line the system writes, between two rules. `sticky` keeps it
143
+ * at the top of the frame while the rows after it are in view, so the day
144
+ * does not leave with its first message; its label carries a ground of its
145
+ * own for the rows passing under it.
146
+ */
147
+ [data-ui='message-scroller'] :is([data-part='separator'], [data-part='unread']) {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: var(--slotted-space-4, 0.5rem);
151
+ color: var(--slotted-text-muted);
152
+ font-size: var(--slotted-font-size-xs, 0.75rem);
153
+ font-weight: var(--slotted-font-weight-medium, 500);
154
+ line-height: round(
155
+ up,
156
+ calc(var(--slotted-font-size-xs, 0.75rem) * var(--slotted-line-height-xs, 1.4)),
157
+ 1px
158
+ );
159
+ }
160
+
161
+ [data-ui='message-scroller'] :is([data-part='separator'], [data-part='unread'])::before,
162
+ [data-ui='message-scroller'] :is([data-part='separator'], [data-part='unread'])::after {
163
+ content: '';
164
+ flex: 1 1 0;
165
+ min-inline-size: var(--slotted-space-6, 1rem);
166
+ border-block-start: var(--slotted-border-width-thin, 1px) solid var(--slotted-border-subtle);
167
+ }
168
+
169
+ /**
170
+ * A sticky box sticks inside its containing block, so it is the row that
171
+ * holds the separator that sticks, not the separator inside it. Each later
172
+ * day stacks over the one before it as it arrives at the top.
173
+ */
174
+ [data-ui='message-scroller'] [data-part='item']:has(> [data-part='separator'][data-sticky]),
175
+ [data-ui='message-scroller'] [data-part='separator'][data-sticky]:not([data-part='item'] > *) {
176
+ position: sticky;
177
+ inset-block-start: var(--_fade);
178
+ z-index: 1;
179
+ content-visibility: visible;
180
+ }
181
+
182
+ /**
183
+ * A day that travels over the rows is its label alone: rules stretched
184
+ * across the frame would strike through the message under them, and the
185
+ * label stands below the faded edge so it is read whole. WhatsApp and
186
+ * Telegram float the same pill.
187
+ */
188
+ [data-ui='message-scroller'] [data-part='separator'][data-sticky]::before,
189
+ [data-ui='message-scroller'] [data-part='separator'][data-sticky]::after {
190
+ content: none;
191
+ }
192
+
193
+ [data-ui='message-scroller'] [data-part='separator'][data-sticky] {
194
+ justify-content: center;
195
+ }
196
+
197
+ [data-ui='message-scroller'] [data-part='separator'][data-sticky] > * {
198
+ box-shadow: var(--slotted-shadow-xs);
199
+ }
200
+
201
+ [data-ui='message-scroller'] [data-part='separator'] > * {
202
+ padding-block: var(--slotted-space-1, 0.125rem);
203
+ padding-inline: var(--slotted-space-4, 0.5rem);
204
+ border: var(--slotted-border-width-thin, 1px) solid var(--slotted-border-subtle);
205
+ border-radius: var(--slotted-radius-full, 9999px);
206
+ background-color: var(--slotted-surface);
207
+ }
208
+
209
+ [data-ui='message-scroller'] [data-part='unread'] {
210
+ color: var(--slotted-tone-accent-text);
211
+ }
212
+
213
+ [data-ui='message-scroller'] [data-part='unread']::before,
214
+ [data-ui='message-scroller'] [data-part='unread']::after {
215
+ border-block-start-color: var(--slotted-tone-accent-border);
216
+ }
217
+
218
+ /* ── Loader ─────────────────────────────────────────────────────────────
219
+ *
220
+ * Older rows on their way: the shared ring and a line of muted text, at the
221
+ * head of the rows. The ring is `spinner`'s.
222
+ */
223
+ [data-ui='message-scroller'] [data-part='loader'] {
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ gap: var(--slotted-space-3, 0.375rem);
228
+ padding-block: var(--slotted-space-2, 0.25rem);
229
+ color: var(--slotted-text-muted);
230
+ font-size: var(--slotted-control-font-size-md, 13px);
231
+ }
232
+
233
+ [data-ui='message-scroller'] [data-part='loader'] > [data-ui='spinner'] {
234
+ --slotted-spinner-size: var(--slotted-control-icon-size-sm, 14px);
235
+ }
236
+
237
+ /**
238
+ * ── Jump ───────────────────────────────────────────────────────────────
239
+ *
240
+ * A raised round control over the foot of the frame, the arrow pointing to
241
+ * where it goes. When rows arrived out of view it widens into a pill that
242
+ * says how many, the answer shadcn's own documentation asks for (its eighth
243
+ * principle) and its control does not give.
244
+ *
245
+ * With nowhere to go it leaves: `inert`, out of the tab order, and drawn
246
+ * out by opacity and a step toward its edge. It arrives on the enter curve
247
+ * in the medium step and leaves on the exit curve in the short one, where
248
+ * ReUI's leaves in twice the time it arrives (dossier §5). It does not
249
+ * scale: it holds text.
250
+ */
251
+ [data-ui='message-scroller'] [data-part='jump'] {
252
+ --_size: var(--slotted-message-scroller-jump-size, var(--slotted-control-height-md, 34px));
253
+ --_ground: var(--slotted-surface-raised);
254
+ --_ink: var(--slotted-text);
255
+ --_shift: var(--slotted-space-4, 0.5rem);
256
+
257
+ display: inline-flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ gap: var(--slotted-space-2, 0.25rem);
261
+ position: absolute;
262
+ inset-block-end: var(--_inset);
263
+ inset-inline-start: 50%;
264
+ z-index: 2;
265
+ box-sizing: border-box;
266
+ min-inline-size: var(--_size);
267
+ block-size: var(--_size);
268
+ margin: 0;
269
+ padding: 0;
270
+ /* A raised surface over the rows, not a field: the rule inside a surface and the lift say so. */
271
+ border: var(--slotted-border-width-thin, 1px) solid var(--slotted-border-subtle);
272
+ border-radius: var(--slotted-radius-full, 9999px);
273
+ background-color: var(--_ground);
274
+ box-shadow: var(--slotted-shadow-md);
275
+ color: var(--_ink);
276
+ font: inherit;
277
+ font-size: var(--slotted-control-font-size-md, 13px);
278
+ font-weight: var(--slotted-font-weight-medium, 500);
279
+ line-height: 1;
280
+ white-space: nowrap;
281
+ cursor: pointer;
282
+ translate: -50% 0;
283
+ transition:
284
+ opacity var(--slotted-duration-medium) var(--slotted-easing-enter, ease-out),
285
+ translate var(--slotted-duration-medium) var(--slotted-easing-enter, ease-out),
286
+ background-color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
287
+ }
288
+
289
+ [data-ui='message-scroller'] [data-part='jump']:dir(rtl) {
290
+ translate: 50% 0;
291
+ }
292
+
293
+ [data-ui='message-scroller'] [data-part='jump'][data-direction='start'] {
294
+ inset-block: var(--_inset) auto;
295
+ --_shift: calc(var(--slotted-space-4, 0.5rem) * -1);
296
+ }
297
+
298
+ [data-ui='message-scroller'] [data-part='jump'] > [data-ui='icon'] {
299
+ --slotted-icon-size: var(--slotted-control-icon-size-md, 16px);
300
+
301
+ rotate: -90deg;
302
+ }
303
+
304
+ [data-ui='message-scroller'] [data-part='jump'][data-direction='start'] > [data-ui='icon'] {
305
+ rotate: 90deg;
306
+ }
307
+
308
+ [data-ui='message-scroller'] [data-part='jump']:has(> [data-part='jump-count']) {
309
+ padding-inline: var(--slotted-space-4, 0.5rem) var(--slotted-space-5, 0.75rem);
310
+ }
311
+
312
+ [data-ui='message-scroller'] [data-part='jump-count'] {
313
+ font-variant-numeric: tabular-nums;
314
+ }
315
+
316
+ [data-ui='message-scroller'] [data-part='jump'][data-active='false'] {
317
+ opacity: 0;
318
+ pointer-events: none;
319
+ translate: -50% var(--_shift);
320
+ transition:
321
+ opacity var(--slotted-duration-short) var(--slotted-easing-exit, ease-in),
322
+ translate var(--slotted-duration-short) var(--slotted-easing-exit, ease-in);
323
+ }
324
+
325
+ [data-ui='message-scroller'] [data-part='jump'][data-active='false']:dir(rtl) {
326
+ translate: 50% var(--_shift);
327
+ }
328
+
329
+ [data-ui='message-scroller'] [data-part='jump']:hover:not(:disabled):not([data-disabled]) {
330
+ background-color: color-mix(
331
+ in oklab,
332
+ var(--_ink) var(--slotted-message-scroller-state-layer-hover, 6%),
333
+ var(--_ground)
334
+ );
335
+ }
336
+
337
+ /**
338
+ * The press answers by the ground and by a pixel toward the edge the
339
+ * control points to, the way a key goes down; a scale would resample the
340
+ * count it carries (R7, `text-scale.test.mjs`).
341
+ */
342
+ [data-ui='message-scroller'] [data-part='jump']:active:not(:disabled):not([data-disabled]) {
343
+ background-color: color-mix(
344
+ in oklab,
345
+ var(--_ink) var(--slotted-message-scroller-state-layer-active, 12%),
346
+ var(--_ground)
347
+ );
348
+ translate: -50% var(--slotted-space-1, 0.125rem);
349
+ }
350
+
351
+ [data-ui='message-scroller']
352
+ [data-part='jump']:active:not(:disabled):not([data-disabled]):dir(rtl) {
353
+ translate: 50% var(--slotted-space-1, 0.125rem);
354
+ }
355
+
356
+ [data-ui='message-scroller'] [data-part='jump']:focus-visible {
357
+ outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
358
+ outline-offset: var(--slotted-focus-ring-offset, 2px);
359
+ }
360
+
361
+ @media (forced-colors: active) {
362
+ [data-ui='message-scroller'] [data-part='item'][data-current] {
363
+ outline: var(--slotted-border-width-thick, 2px) solid Highlight;
364
+ outline-offset: var(--slotted-space-2, 0.25rem);
365
+ }
366
+
367
+ [data-ui='message-scroller'] [data-part='viewport'][data-scrollable] {
368
+ mask-image: none;
369
+ }
370
+ }
371
+ }
@@ -0,0 +1,47 @@
1
+ [
2
+ "--slotted-border-strong",
3
+ "--slotted-border-subtle",
4
+ "--slotted-border-width-thick",
5
+ "--slotted-border-width-thin",
6
+ "--slotted-control-font-size-md",
7
+ "--slotted-control-gap-md",
8
+ "--slotted-control-height-md",
9
+ "--slotted-control-icon-size-md",
10
+ "--slotted-control-icon-size-sm",
11
+ "--slotted-duration-long",
12
+ "--slotted-duration-medium",
13
+ "--slotted-duration-short",
14
+ "--slotted-easing-enter",
15
+ "--slotted-easing-exit",
16
+ "--slotted-easing-standard",
17
+ "--slotted-focus-ring-color",
18
+ "--slotted-focus-ring-offset",
19
+ "--slotted-focus-ring-width",
20
+ "--slotted-font-family-sans",
21
+ "--slotted-font-size-xs",
22
+ "--slotted-font-weight-medium",
23
+ "--slotted-line-height-xs",
24
+ "--slotted-message-scroller-fade",
25
+ "--slotted-message-scroller-gap",
26
+ "--slotted-message-scroller-jump-size",
27
+ "--slotted-message-scroller-padding",
28
+ "--slotted-message-scroller-state-layer-active",
29
+ "--slotted-message-scroller-state-layer-hover",
30
+ "--slotted-radius-full",
31
+ "--slotted-radius-md",
32
+ "--slotted-shadow-md",
33
+ "--slotted-shadow-xs",
34
+ "--slotted-space-1",
35
+ "--slotted-space-2",
36
+ "--slotted-space-3",
37
+ "--slotted-space-4",
38
+ "--slotted-space-5",
39
+ "--slotted-space-6",
40
+ "--slotted-surface",
41
+ "--slotted-surface-raised",
42
+ "--slotted-text",
43
+ "--slotted-text-muted",
44
+ "--slotted-tone-accent-border",
45
+ "--slotted-tone-accent-subtle-hover",
46
+ "--slotted-tone-accent-text"
47
+ ]