@moldable-ai/ui 0.2.29 → 0.2.32

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 (215) hide show
  1. package/dist/catalog/component-catalog.d.ts +9 -2
  2. package/dist/catalog/component-catalog.d.ts.map +1 -1
  3. package/dist/catalog/component-catalog.js +11 -7
  4. package/dist/catalog/core-control-stories.d.ts.map +1 -1
  5. package/dist/catalog/core-control-stories.js +1 -1
  6. package/dist/catalog/core-foundation-stories.d.ts.map +1 -1
  7. package/dist/catalog/core-foundation-stories.js +5 -5
  8. package/dist/components/app-error-boundary.d.ts +1 -1
  9. package/dist/components/chat/chat-image-lightbox.d.ts +8 -0
  10. package/dist/components/chat/chat-image-lightbox.d.ts.map +1 -1
  11. package/dist/components/chat/chat-image-lightbox.js +24 -2
  12. package/dist/components/chat/chat-input.d.ts +3 -2
  13. package/dist/components/chat/chat-input.d.ts.map +1 -1
  14. package/dist/components/chat/chat-input.js +3 -3
  15. package/dist/components/chat/chat-message.d.ts.map +1 -1
  16. package/dist/components/chat/chat-message.js +3 -1
  17. package/dist/components/chat/chat-panel.d.ts +3 -1
  18. package/dist/components/chat/chat-panel.d.ts.map +1 -1
  19. package/dist/components/chat/chat-panel.js +53 -39
  20. package/dist/components/chat/conversation-history.d.ts +4 -2
  21. package/dist/components/chat/conversation-history.d.ts.map +1 -1
  22. package/dist/components/chat/conversation-history.js +20 -15
  23. package/dist/components/ui/alert.d.ts +1 -1
  24. package/dist/components/ui/app-frame.d.ts +20 -1
  25. package/dist/components/ui/app-frame.d.ts.map +1 -1
  26. package/dist/components/ui/app-frame.js +37 -7
  27. package/dist/components/ui/badge.d.ts +1 -1
  28. package/dist/components/ui/badge.js +1 -1
  29. package/dist/components/ui/button.d.ts +5 -3
  30. package/dist/components/ui/button.d.ts.map +1 -1
  31. package/dist/components/ui/button.js +39 -11
  32. package/dist/components/ui/card.d.ts +12 -2
  33. package/dist/components/ui/card.d.ts.map +1 -1
  34. package/dist/components/ui/card.js +3 -2
  35. package/dist/components/ui/checkbox.d.ts +4 -1
  36. package/dist/components/ui/checkbox.d.ts.map +1 -1
  37. package/dist/components/ui/checkbox.js +4 -4
  38. package/dist/components/ui/context-menu.d.ts.map +1 -1
  39. package/dist/components/ui/context-menu.js +7 -6
  40. package/dist/components/ui/date-field.d.ts +1 -1
  41. package/dist/components/ui/dropdown-menu.d.ts +1 -0
  42. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  43. package/dist/components/ui/dropdown-menu.js +9 -8
  44. package/dist/components/ui/icon-button.d.ts +1 -1
  45. package/dist/components/ui/icon-button.d.ts.map +1 -1
  46. package/dist/components/ui/icon-button.js +1 -0
  47. package/dist/components/ui/input.d.ts +6 -2
  48. package/dist/components/ui/input.d.ts.map +1 -1
  49. package/dist/components/ui/input.js +2 -2
  50. package/dist/components/ui/material.d.ts +8 -3
  51. package/dist/components/ui/material.d.ts.map +1 -1
  52. package/dist/components/ui/material.js +2 -2
  53. package/dist/components/ui/menu-items.d.ts +2 -1
  54. package/dist/components/ui/menu-items.d.ts.map +1 -1
  55. package/dist/components/ui/menu-items.js +3 -2
  56. package/dist/components/ui/message-scroller-controller.d.ts +15 -17
  57. package/dist/components/ui/message-scroller-controller.d.ts.map +1 -1
  58. package/dist/components/ui/message-scroller-controller.js +106 -91
  59. package/dist/components/ui/message-scroller-primitive.d.ts +2 -0
  60. package/dist/components/ui/message-scroller-primitive.d.ts.map +1 -1
  61. package/dist/components/ui/message-scroller-primitive.js +2 -0
  62. package/dist/components/ui/message-scroller.d.ts.map +1 -1
  63. package/dist/components/ui/message-scroller.js +2 -2
  64. package/dist/components/ui/number-input.d.ts +1 -1
  65. package/dist/components/ui/popover.js +1 -1
  66. package/dist/components/ui/search-field.d.ts +4 -2
  67. package/dist/components/ui/search-field.d.ts.map +1 -1
  68. package/dist/components/ui/search-field.js +16 -6
  69. package/dist/components/ui/segmented-control.d.ts +3 -1
  70. package/dist/components/ui/segmented-control.d.ts.map +1 -1
  71. package/dist/components/ui/segmented-control.js +23 -17
  72. package/dist/components/ui/select.js +2 -2
  73. package/dist/components/ui/sidebar.d.ts +10 -4
  74. package/dist/components/ui/sidebar.d.ts.map +1 -1
  75. package/dist/components/ui/sidebar.js +74 -17
  76. package/dist/components/ui/status.d.ts +1 -1
  77. package/dist/components/ui/status.js +1 -1
  78. package/dist/components/ui/switch.d.ts +3 -1
  79. package/dist/components/ui/switch.d.ts.map +1 -1
  80. package/dist/components/ui/switch.js +3 -2
  81. package/dist/components/ui/toolbar-controls.d.ts +13 -3
  82. package/dist/components/ui/toolbar-controls.d.ts.map +1 -1
  83. package/dist/components/ui/toolbar-controls.js +35 -10
  84. package/dist/components/ui/toolbar.d.ts +5 -4
  85. package/dist/components/ui/toolbar.d.ts.map +1 -1
  86. package/dist/components/ui/toolbar.js +3 -3
  87. package/dist/index.d.ts +2 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +3 -1
  90. package/dist/lib/frame-lifecycle.d.ts +1 -0
  91. package/dist/lib/frame-lifecycle.d.ts.map +1 -1
  92. package/dist/lib/frame-lifecycle.js +7 -0
  93. package/dist/lib/theme.d.ts +39 -5
  94. package/dist/lib/theme.d.ts.map +1 -1
  95. package/dist/lib/theme.js +105 -17
  96. package/dist/tokens/contracts.d.ts +79 -0
  97. package/dist/tokens/contracts.d.ts.map +1 -0
  98. package/dist/tokens/contracts.js +57 -0
  99. package/dist/tokens/index.d.ts +2 -0
  100. package/dist/tokens/index.d.ts.map +1 -0
  101. package/dist/tokens/index.js +1 -0
  102. package/docs/README.md +2 -0
  103. package/docs/adaptive-materials.md +14 -9
  104. package/docs/design-tokens.md +10 -6
  105. package/docs/foundations.md +3 -3
  106. package/docs/macos-design-audit.md +144 -0
  107. package/docs/native-integration.md +4 -4
  108. package/docs/platform-architecture.md +189 -0
  109. package/docs/standalone-app-windows.md +37 -0
  110. package/docs/visual-regression.md +6 -8
  111. package/package.json +13 -1
  112. package/src/components/ui/accordion.md +46 -0
  113. package/src/components/ui/alert.md +12 -4
  114. package/src/components/ui/app-frame.md +8 -5
  115. package/src/components/ui/aspect-ratio.md +37 -0
  116. package/src/components/ui/avatar.md +48 -0
  117. package/src/components/ui/breadcrumb.md +52 -0
  118. package/src/components/ui/button-group.md +43 -0
  119. package/src/components/ui/button.md +21 -4
  120. package/src/components/ui/calendar.md +42 -0
  121. package/src/components/ui/card.md +43 -0
  122. package/src/components/ui/carousel.md +47 -0
  123. package/src/components/ui/chart.md +52 -0
  124. package/src/components/ui/checkbox.md +36 -0
  125. package/src/components/ui/collapsible.md +2 -3
  126. package/src/components/ui/color-well.md +14 -4
  127. package/src/components/ui/combobox.md +3 -3
  128. package/src/components/ui/confirm-dialog.md +5 -4
  129. package/src/components/ui/context-menu.md +3 -2
  130. package/src/components/ui/date-field.md +6 -1
  131. package/src/components/ui/date-picker.md +6 -3
  132. package/src/components/ui/dialog.md +14 -12
  133. package/src/components/ui/drawer.md +58 -0
  134. package/src/components/ui/dropdown-menu.md +16 -14
  135. package/src/components/ui/error-boundary-view.md +1 -1
  136. package/src/components/ui/field.md +2 -1
  137. package/src/components/ui/form.md +71 -0
  138. package/src/components/ui/grid.md +4 -3
  139. package/src/components/ui/icon-button.md +4 -1
  140. package/src/components/ui/input-group.md +49 -0
  141. package/src/components/ui/input-otp.md +56 -0
  142. package/src/components/ui/input.md +40 -0
  143. package/src/components/ui/inspector.md +47 -7
  144. package/src/components/ui/item.md +5 -3
  145. package/src/components/ui/kbd.md +30 -0
  146. package/src/components/ui/label.md +29 -0
  147. package/src/components/ui/list.md +2 -2
  148. package/src/components/ui/material.md +25 -12
  149. package/src/components/ui/menu-items.md +62 -0
  150. package/src/components/ui/menubar.md +58 -0
  151. package/src/components/ui/message-scroller-primitive.md +70 -0
  152. package/src/components/ui/message-scroller.md +89 -0
  153. package/src/components/ui/navigation-button-group.md +4 -3
  154. package/src/components/ui/navigation-menu.md +52 -0
  155. package/src/components/ui/number-input.md +8 -0
  156. package/src/components/ui/pagination.md +51 -0
  157. package/src/components/ui/panel.md +6 -0
  158. package/src/components/ui/popover.md +10 -7
  159. package/src/components/ui/progress.md +31 -0
  160. package/src/components/ui/radio-group.md +36 -0
  161. package/src/components/ui/resizable.md +2 -1
  162. package/src/components/ui/scroll-area.md +3 -1
  163. package/src/components/ui/search-field.md +6 -1
  164. package/src/components/ui/segmented-control.md +6 -1
  165. package/src/components/ui/separator.md +35 -0
  166. package/src/components/ui/sidebar.md +29 -6
  167. package/src/components/ui/skeleton.md +36 -0
  168. package/src/components/ui/slider.md +58 -0
  169. package/src/components/ui/spinner.md +41 -0
  170. package/src/components/ui/split-view.md +8 -4
  171. package/src/components/ui/switch.md +44 -0
  172. package/src/components/ui/table.md +7 -7
  173. package/src/components/ui/tabs.md +3 -1
  174. package/src/components/ui/textarea.md +41 -0
  175. package/src/components/ui/toggle-group.md +2 -2
  176. package/src/components/ui/toggle.md +9 -9
  177. package/src/components/ui/toolbar-controls.md +24 -12
  178. package/src/components/ui/toolbar.md +6 -6
  179. package/src/styles/index.css +298 -117
  180. package/src/tokens/contracts.ts +131 -0
  181. package/src/tokens/index.css +6 -0
  182. package/src/tokens/index.ts +23 -0
  183. package/src/tokens/macos-26/README.md +37 -0
  184. package/src/tokens/macos-26/aliases.css +53 -0
  185. package/src/tokens/macos-26/compatibility.css +7 -0
  186. package/src/tokens/macos-26/index.css +3 -0
  187. package/src/tokens/macos-26/source/provenance.generated.json +28 -0
  188. package/src/tokens/macos-26/source/sidebar.generated.css +29 -0
  189. package/src/tokens/macos-26/source.css +7 -0
  190. package/src/tokens/macos-26/web-adaptations.json +25 -0
  191. package/src/tokens/macos-26/web-adaptations.md +15 -0
  192. package/src/tokens/macos-27/accessibility.css +11 -0
  193. package/src/tokens/macos-27/aliases.css +304 -0
  194. package/src/tokens/macos-27/compatibility.css +212 -0
  195. package/src/tokens/macos-27/index.css +15 -0
  196. package/src/tokens/macos-27/recipes.css +23 -0
  197. package/src/tokens/macos-27/source/chrome.generated.css +338 -0
  198. package/src/tokens/macos-27/source/colors.generated.css +140 -0
  199. package/src/tokens/macos-27/source/context.generated.css +18 -0
  200. package/src/tokens/macos-27/source/controls.generated.css +764 -0
  201. package/src/tokens/macos-27/source/effects.generated.css +68 -0
  202. package/src/tokens/macos-27/source/kit.generated.css +50 -0
  203. package/src/tokens/macos-27/source/overlays-status.generated.css +931 -0
  204. package/src/tokens/macos-27/source/paint-styles.generated.css +81 -0
  205. package/src/tokens/macos-27/source/provenance.generated.json +62 -0
  206. package/src/tokens/macos-27/source/sizes.generated.css +385 -0
  207. package/src/tokens/macos-27/source/source.generated.json +554 -0
  208. package/src/tokens/macos-27/source/text-styles.generated.css +116 -0
  209. package/src/tokens/macos-27/source.css +17 -0
  210. package/src/tokens/macos-27/web-adaptations.css +98 -0
  211. package/src/tokens/macos-27/web-adaptations.json +163 -0
  212. package/src/tokens/macos-27/web-adaptations.md +117 -0
  213. package/src/tokens/moldable/brand.css +165 -0
  214. package/src/tokens/moldable/index.css +1 -0
  215. package/src/tokens/platform-contract.test.ts +294 -0
@@ -66,22 +66,21 @@ export declare class MessageScrollerController {
66
66
  private readonly messageElements;
67
67
  private readonly handledTurnAnchors;
68
68
  private readonly visibleMessageIds;
69
- private readonly warmedItems;
70
69
  private lastScrollTop;
71
- private previousFirstItem;
70
+ private previousItems;
72
71
  private previousItemCount;
73
72
  private anchoredElement;
74
73
  private trackedFirstVisible;
75
74
  private readingLeaves;
76
75
  private pendingScrollToMessage;
76
+ private pendingHistoryLoad;
77
77
  private defaultPositionApplied;
78
78
  private spacerHeight;
79
79
  private spacerGap;
80
80
  private programmaticDeadline;
81
81
  private stateFrame;
82
82
  private visibilityFrame;
83
- private warmupHandle;
84
- private warmupUsesIdleCallback;
83
+ private historyLoadFrame;
85
84
  private intersectionObserver;
86
85
  constructor(options: MessageScrollerControllerOptions);
87
86
  get viewportElement(): HTMLElement | null;
@@ -96,14 +95,22 @@ export declare class MessageScrollerController {
96
95
  scrollToElement(element: HTMLElement, options?: MessageScrollerScrollOptions, { keepPreviousPeek }?: {
97
96
  keepPreviousPeek?: boolean;
98
97
  }): boolean;
98
+ /**
99
+ * Capture history position before an asynchronous older-page request.
100
+ * Distance from the bottom remains invariant when rows are inserted above
101
+ * the reader and is also safe when stale history is replaced by a shorter
102
+ * authoritative page.
103
+ */
104
+ beginHistoryLoad: () => void;
105
+ finishHistoryLoad: (changed: boolean) => void;
99
106
  handleScroll(): void;
100
107
  handleWheel(deltaY: number): void;
101
108
  handleTouchMove(): void;
102
109
  handleScrollKey(): void;
103
110
  /**
104
111
  * Content box resized (streaming growth, images decoding, disclosures
105
- * collapsing, `content-visibility` reveals). Which way the viewport moves
106
- * — if at all — is entirely the policy's call.
112
+ * collapsing). Which way the viewport moves — if at all — is entirely the
113
+ * policy's call.
107
114
  */
108
115
  handleResize(): void;
109
116
  /** Children of the content element changed. Runs before the next paint. */
@@ -130,6 +137,8 @@ export declare class MessageScrollerController {
130
137
  */
131
138
  private snapshotReadingLeaves;
132
139
  private restoreReadingPosition;
140
+ private restorePendingHistoryLoad;
141
+ private firstVisibleItem;
133
142
  private trackFirstVisibleItem;
134
143
  private scheduleStateCommit;
135
144
  /**
@@ -143,17 +152,6 @@ export declare class MessageScrollerController {
143
152
  private applyStateAttributes;
144
153
  private scheduleVisibilitySync;
145
154
  private computeVisibility;
146
- /**
147
- * Rows outside the viewport skip rendering via `content-visibility: auto`
148
- * and a placeholder intrinsic size. Their first reveal during an upward
149
- * scroll pays first-time layout of complex markdown — felt as hitches on
150
- * the first pass through history. Rendering each row once at idle records
151
- * its real size (the `auto` keyword keeps last-remembered sizes), so the
152
- * first real scroll finds everything measured and warm.
153
- */
154
- private scheduleWarmup;
155
- private warmupBatch;
156
- private cancelWarmup;
157
155
  private flushPendingScrollToMessage;
158
156
  private setSpacerHeight;
159
157
  private itemChildren;
@@ -1 +1 @@
1
- {"version":3,"file":"message-scroller-controller.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-scroller-controller.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEjE,MAAM,MAAM,oCAAoC,GAC5C,OAAO,GACP,KAAK,GACL,aAAa,CAAA;AACjB,MAAM,MAAM,0BAA0B,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAA;AAE/E,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,CAAC,EAAE,0BAA0B,CAAA;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAA;AAExE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,WAAW,gCAAgC;IAC/C,UAAU,EAAE,OAAO,CAAA;IACnB,qBAAqB,EAAE,oCAAoC,CAAA;IAC3D,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,YAAY,EAAE,MAAM,CAAA;CACrB;AAgBD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC,CAAA;IACpB,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC9B,SAAS,EAAE,CACT,QAAQ,EAAE,MAAM,IAAI,EACpB,OAAO,CAAC,EAAE,MAAM,IAAI,EACpB,MAAM,CAAC,EAAE,MAAM,IAAI,KAChB,MAAM,IAAI,CAAA;CAChB;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,GAC/B,aAAa,CAAC,CAAC,CAAC,CAqBlB;AAoBD,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/E,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,WAAW,EAAE,GACnB,WAAW,EAAE,CAcf;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,OAAO,CAWT;AAcD;;;;;;GAMG;AACH,qBAAa,yBAAyB;IACpC,QAAQ,CAAC,eAAe,2CAGvB;IACD,QAAQ,CAAC,eAAe,gDAGvB;IAED,MAAM,EAAE,qBAAqB,CAAA;IAC7B,OAAO,EAAE,gCAAgC,CAAA;IACzC,uBAAuB,UAAO;IAE9B,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiC;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAEtD,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,mBAAmB,CACrB;IACN,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,sBAAsB,CAAsC;IACpE,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,sBAAsB,CAAQ;IACtC,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,SAAS,CAAI;IAErB,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,oBAAoB,CAAoC;gBAEpD,OAAO,EAAE,gCAAgC;IAKrD,IAAI,eAAe,IAAI,WAAW,GAAG,IAAI,CAExC;IAID,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAK1C,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAQ9C,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAI7C,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAK5C,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,QAAQ,EAAE,WAAW,GAAG,IAAI,GAC3B,IAAI;IAoBP,WAAW,GAAI,UAAS,4BAAiC,KAAG,OAAO,CAUlE;IAED,aAAa,GAAI,UAAS,4BAAiC,KAAG,OAAO,CAUpE;IAED,eAAe,GACb,WAAW,MAAM,EACjB,UAAU,4BAA4B,KACrC,OAAO,CAgBT;IAED,eAAe,CACb,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,4BAAiC,EAC1C,EAAE,gBAAwB,EAAE,GAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAO,GAChE,OAAO;IAyCV;;;;;OAKG;IACH,gBAAgB,QAAO,IAAI,CAU1B;IAED,iBAAiB,GAAI,SAAS,OAAO,KAAG,IAAI,CAU3C;IAID,YAAY,IAAI,IAAI;IAqCpB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOjC,eAAe,IAAI,IAAI;IAOvB,eAAe,IAAI,IAAI;IAOvB;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAqCpB,2EAA2E;IAC3E,qBAAqB,IAAI,IAAI;IAiF7B,iBAAiB,IAAI,IAAI;IAiCzB,mBAAmB,IAAI,IAAI;IAW3B,oBAAoB,IAAI,IAAI;IAI5B,aAAa,CAAC,OAAO,EAAE,gCAAgC,GAAG,IAAI;IAS9D,OAAO,IAAI,IAAI;IAsBf,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,sBAAsB;IAY9B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,aAAa;IAiCrB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,mBAAmB;IAQ3B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,OAAO;CAKhB"}
@@ -1,7 +1,6 @@
1
1
  import { MessageScrollerPolicy } from './message-scroller-policy.js';
2
2
  const READING_LEAF_SELECTOR = '[data-message-scroll-anchor]';
3
3
  const POSITION_EPSILON_PX = 0.5;
4
- const WARMUP_BATCH_SIZE = 3;
5
4
  const PROGRAMMATIC_SCROLL_TIMEOUT_MS = 800;
6
5
  function now() {
7
6
  return typeof performance !== 'undefined' ? performance.now() : Date.now();
@@ -107,22 +106,21 @@ export class MessageScrollerController {
107
106
  messageElements = new Map();
108
107
  handledTurnAnchors = new WeakSet();
109
108
  visibleMessageIds = new Set();
110
- warmedItems = new WeakSet();
111
109
  lastScrollTop = 0;
112
- previousFirstItem = null;
110
+ previousItems = [];
113
111
  previousItemCount = 0;
114
112
  anchoredElement = null;
115
113
  trackedFirstVisible = null;
116
114
  readingLeaves = [];
117
115
  pendingScrollToMessage = null;
116
+ pendingHistoryLoad = null;
118
117
  defaultPositionApplied = false;
119
118
  spacerHeight = 0;
120
119
  spacerGap = 0;
121
120
  programmaticDeadline = 0;
122
121
  stateFrame = null;
123
122
  visibilityFrame = null;
124
- warmupHandle = null;
125
- warmupUsesIdleCallback = false;
123
+ historyLoadFrame = null;
126
124
  intersectionObserver = null;
127
125
  constructor(options) {
128
126
  this.options = options;
@@ -248,6 +246,36 @@ export class MessageScrollerController {
248
246
  this.scheduleVisibilitySync();
249
247
  return true;
250
248
  }
249
+ /**
250
+ * Capture history position before an asynchronous older-page request.
251
+ * Distance from the bottom remains invariant when rows are inserted above
252
+ * the reader and is also safe when stale history is replaced by a shorter
253
+ * authoritative page.
254
+ */
255
+ beginHistoryLoad = () => {
256
+ const viewport = this.viewport;
257
+ if (!viewport || this.pendingHistoryLoad)
258
+ return;
259
+ const anchor = this.firstVisibleItem();
260
+ this.pendingHistoryLoad = {
261
+ anchorElement: anchor?.element ?? null,
262
+ anchorTop: anchor?.top ?? 0,
263
+ distanceFromBottom: distanceFromBottom(viewport),
264
+ scrollHeight: viewport.scrollHeight,
265
+ };
266
+ };
267
+ finishHistoryLoad = (changed) => {
268
+ if (!changed) {
269
+ this.pendingHistoryLoad = null;
270
+ return;
271
+ }
272
+ if (this.historyLoadFrame !== null)
273
+ return;
274
+ this.historyLoadFrame = requestAnimationFrame(() => {
275
+ this.historyLoadFrame = null;
276
+ this.restorePendingHistoryLoad(false);
277
+ });
278
+ };
251
279
  // MARK: - DOM events
252
280
  handleScroll() {
253
281
  const viewport = this.viewport;
@@ -258,6 +286,14 @@ export class MessageScrollerController {
258
286
  this.policy.cancelProgrammaticScroll();
259
287
  }
260
288
  const scrollTop = viewport.scrollTop;
289
+ if (this.pendingHistoryLoad &&
290
+ viewport.scrollHeight === this.pendingHistoryLoad.scrollHeight) {
291
+ const anchor = this.firstVisibleItem();
292
+ this.pendingHistoryLoad.anchorElement = anchor?.element ?? null;
293
+ this.pendingHistoryLoad.anchorTop = anchor?.top ?? 0;
294
+ this.pendingHistoryLoad.distanceFromBottom =
295
+ distanceFromBottom(viewport);
296
+ }
261
297
  const userScrolled = this.policy.handleScrollEvent({
262
298
  scrollTop,
263
299
  lastScrollTop: this.lastScrollTop,
@@ -296,8 +332,8 @@ export class MessageScrollerController {
296
332
  }
297
333
  /**
298
334
  * Content box resized (streaming growth, images decoding, disclosures
299
- * collapsing, `content-visibility` reveals). Which way the viewport moves
300
- * — if at all — is entirely the policy's call.
335
+ * collapsing). Which way the viewport moves — if at all — is entirely the
336
+ * policy's call.
301
337
  */
302
338
  handleResize() {
303
339
  const viewport = this.viewport;
@@ -335,11 +371,15 @@ export class MessageScrollerController {
335
371
  /** Children of the content element changed. Runs before the next paint. */
336
372
  handleContentMutation() {
337
373
  const children = this.itemChildren();
338
- const previousFirst = this.previousFirstItem;
374
+ const previousItems = this.previousItems;
339
375
  const previousCount = this.previousItemCount;
340
- this.previousFirstItem = children[0] ?? null;
376
+ this.previousItems = children;
341
377
  this.previousItemCount = children.length;
342
- this.scheduleWarmup();
378
+ if (this.pendingHistoryLoad && previousCount > 0) {
379
+ this.markTurnAnchorsHandled(children, 0);
380
+ this.restorePendingHistoryLoad(true);
381
+ return;
382
+ }
343
383
  if (this.flushPendingScrollToMessage())
344
384
  return;
345
385
  if (previousCount === 0) {
@@ -354,10 +394,8 @@ export class MessageScrollerController {
354
394
  this.scheduleVisibilitySync();
355
395
  return;
356
396
  }
357
- const previousFirstIndex = previousFirst
358
- ? children.indexOf(previousFirst)
359
- : -1;
360
- if (this.preserveScrollOnPrepend && previousFirstIndex > 0) {
397
+ const retainedShift = firstRetainedItemShift(previousItems, children);
398
+ if (this.preserveScrollOnPrepend && retainedShift > 0) {
361
399
  this.markTurnAnchorsHandled(children, 0);
362
400
  this.preservePrependPosition();
363
401
  return;
@@ -466,7 +504,11 @@ export class MessageScrollerController {
466
504
  cancelAnimationFrame(this.visibilityFrame);
467
505
  this.visibilityFrame = null;
468
506
  }
469
- this.cancelWarmup();
507
+ if (this.historyLoadFrame !== null) {
508
+ cancelAnimationFrame(this.historyLoadFrame);
509
+ this.historyLoadFrame = null;
510
+ }
511
+ this.pendingHistoryLoad = null;
470
512
  this.unobserveVisibility();
471
513
  }
472
514
  // MARK: - Positioning
@@ -583,24 +625,43 @@ export class MessageScrollerController {
583
625
  this.snapshotReadingLeaves();
584
626
  }
585
627
  }
586
- trackFirstVisibleItem() {
628
+ restorePendingHistoryLoad(preferAnchor) {
587
629
  const viewport = this.viewport;
588
- if (!viewport) {
589
- this.trackedFirstVisible = null;
630
+ const pending = this.pendingHistoryLoad;
631
+ if (!viewport || !pending)
590
632
  return;
591
- }
633
+ this.pendingHistoryLoad = null;
634
+ const anchor = pending.anchorElement;
635
+ const target = preferAnchor && anchor?.isConnected
636
+ ? viewport.scrollTop +
637
+ elementViewportTop(anchor, viewport) -
638
+ pending.anchorTop
639
+ : maxScrollTop(viewport) - pending.distanceFromBottom;
640
+ viewport.scrollTop = Math.max(0, target);
641
+ this.lastScrollTop = viewport.scrollTop;
642
+ this.trackFirstVisibleItem();
643
+ this.snapshotReadingLeaves();
644
+ this.scheduleStateCommit();
645
+ this.scheduleVisibilitySync();
646
+ }
647
+ firstVisibleItem() {
648
+ const viewport = this.viewport;
649
+ if (!viewport)
650
+ return null;
592
651
  const viewportRect = viewport.getBoundingClientRect();
593
- for (const child of this.itemChildren()) {
594
- const rect = child.getBoundingClientRect();
652
+ for (const element of this.itemChildren()) {
653
+ const rect = element.getBoundingClientRect();
595
654
  if (rect.bottom > viewportRect.top && rect.top < viewportRect.bottom) {
596
- this.trackedFirstVisible = {
597
- element: child,
655
+ return {
656
+ element,
598
657
  top: rect.top - viewportRect.top,
599
658
  };
600
- return;
601
659
  }
602
660
  }
603
- this.trackedFirstVisible = null;
661
+ return null;
662
+ }
663
+ trackFirstVisibleItem() {
664
+ this.trackedFirstVisible = this.firstVisibleItem();
604
665
  }
605
666
  // MARK: - State stores
606
667
  scheduleStateCommit() {
@@ -700,72 +761,6 @@ export class MessageScrollerController {
700
761
  }
701
762
  return { currentAnchorId, visibleMessageIds: visibleIds };
702
763
  }
703
- // MARK: - Content-visibility warm-up
704
- /**
705
- * Rows outside the viewport skip rendering via `content-visibility: auto`
706
- * and a placeholder intrinsic size. Their first reveal during an upward
707
- * scroll pays first-time layout of complex markdown — felt as hitches on
708
- * the first pass through history. Rendering each row once at idle records
709
- * its real size (the `auto` keyword keeps last-remembered sizes), so the
710
- * first real scroll finds everything measured and warm.
711
- */
712
- scheduleWarmup() {
713
- if (this.warmupHandle !== null)
714
- return;
715
- const run = () => {
716
- this.warmupHandle = null;
717
- this.warmupBatch();
718
- };
719
- if (typeof requestIdleCallback === 'function') {
720
- this.warmupUsesIdleCallback = true;
721
- this.warmupHandle = requestIdleCallback(run, { timeout: 1_000 });
722
- }
723
- else {
724
- this.warmupUsesIdleCallback = false;
725
- this.warmupHandle = window.setTimeout(run, 150);
726
- }
727
- }
728
- warmupBatch() {
729
- if (typeof getComputedStyle !== 'function')
730
- return;
731
- const batch = [];
732
- for (const child of this.itemChildren()) {
733
- if (this.warmedItems.has(child))
734
- continue;
735
- this.warmedItems.add(child);
736
- const style = getComputedStyle(child);
737
- const contentVisibility = style.getPropertyValue('content-visibility').trim() || 'visible';
738
- if (contentVisibility === 'auto')
739
- batch.push(child);
740
- if (batch.length >= WARMUP_BATCH_SIZE)
741
- break;
742
- }
743
- if (batch.length === 0)
744
- return;
745
- for (const element of batch) {
746
- element.style.contentVisibility = 'visible';
747
- }
748
- requestAnimationFrame(() => {
749
- // Back to the stylesheet's `auto`; the rendered pass left a
750
- // remembered intrinsic size behind.
751
- for (const element of batch) {
752
- element.style.contentVisibility = '';
753
- }
754
- this.scheduleWarmup();
755
- });
756
- }
757
- cancelWarmup() {
758
- if (this.warmupHandle === null)
759
- return;
760
- if (this.warmupUsesIdleCallback &&
761
- typeof cancelIdleCallback === 'function') {
762
- cancelIdleCallback(this.warmupHandle);
763
- }
764
- else {
765
- clearTimeout(this.warmupHandle);
766
- }
767
- this.warmupHandle = null;
768
- }
769
764
  // MARK: - Helpers
770
765
  flushPendingScrollToMessage() {
771
766
  const pending = this.pendingScrollToMessage;
@@ -805,6 +800,9 @@ export class MessageScrollerController {
805
800
  function maxScrollTop(viewport) {
806
801
  return Math.max(0, viewport.scrollHeight - viewport.clientHeight);
807
802
  }
803
+ function distanceFromBottom(viewport) {
804
+ return Math.max(0, maxScrollTop(viewport) - viewport.scrollTop);
805
+ }
808
806
  function elementViewportTop(element, viewport) {
809
807
  return (element.getBoundingClientRect().top - viewport.getBoundingClientRect().top);
810
808
  }
@@ -878,6 +876,23 @@ function countTurnAnchorsAt(children, startIndex) {
878
876
  }
879
877
  return count;
880
878
  }
879
+ /**
880
+ * Returns how far the first retained row moved toward the end of the list.
881
+ * Looking beyond the former first child matters when a synthetic row (for
882
+ * example, the compaction divider) is replaced while older messages are
883
+ * inserted above the stable transcript rows.
884
+ */
885
+ function firstRetainedItemShift(previous, current) {
886
+ if (previous.length === 0 || current.length === 0)
887
+ return 0;
888
+ const currentIndexes = new Map(current.map((element, index) => [element, index]));
889
+ for (const [previousIndex, element] of previous.entries()) {
890
+ const currentIndex = currentIndexes.get(element);
891
+ if (currentIndex !== undefined)
892
+ return currentIndex - previousIndex;
893
+ }
894
+ return 0;
895
+ }
881
896
  function readRowGap(element) {
882
897
  if (!element || typeof getComputedStyle !== 'function')
883
898
  return 0;
@@ -37,6 +37,8 @@ type MessageScrollerButtonProps = Omit<React.ComponentProps<'button'>, 'children
37
37
  };
38
38
  declare function MessageScrollerButton({ behavior, children, className, direction, onClick, render, tabIndex, type, ...props }: MessageScrollerButtonProps): React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | null;
39
39
  declare function useMessageScroller(): {
40
+ beginHistoryLoad: () => void;
41
+ finishHistoryLoad: (changed: boolean) => void;
40
42
  scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;
41
43
  scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;
42
44
  scrollToStart: (options?: MessageScrollerScrollOptions) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"message-scroller-primitive.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller-primitive.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-scroller-primitive.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller-primitive.tsx"],"names":[],"mappings":"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"}
@@ -199,6 +199,8 @@ function MessageScrollerButton({ behavior = 'smooth', children, className, direc
199
199
  function useMessageScroller() {
200
200
  const controller = useController();
201
201
  return React.useMemo(() => ({
202
+ beginHistoryLoad: controller.beginHistoryLoad,
203
+ finishHistoryLoad: controller.finishHistoryLoad,
202
204
  scrollToEnd: controller.scrollToEnd,
203
205
  scrollToMessage: controller.scrollToMessage,
204
206
  scrollToStart: controller.scrollToStart,
@@ -1 +1 @@
1
- {"version":3,"file":"message-scroller.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EACL,eAAe,IAAI,wBAAwB,EAC3C,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,8BAA8B,CAAA;AAErC,iBAAS,uBAAuB,CAC9B,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,QAAQ,CAAC,2CAGtE;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,IAAI,CAAC,2CAW5D;AAED,iBAAS,uBAAuB,CAAC,EAC/B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,QAAQ,CAAC,2CAWhE;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,OAAO,CAAC,2CAQ/D;AAED,iBAAS,mBAAmB,CAAC,EAC3B,SAAS,EACT,YAAoB,EACpB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,IAAI,CAAC,2CAY5D;AAED,iBAAS,qBAAqB,CAAC,EAC7B,SAAiB,EACjB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,OAAqB,EACrB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,MAAM,CAAC,GAC7D,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAyB9D;AAED,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAC7B,CAAA"}
1
+ {"version":3,"file":"message-scroller.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EACL,eAAe,IAAI,wBAAwB,EAC3C,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,8BAA8B,CAAA;AAErC,iBAAS,uBAAuB,CAC9B,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,QAAQ,CAAC,2CAGtE;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,IAAI,CAAC,2CAW5D;AAED,iBAAS,uBAAuB,CAAC,EAC/B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,QAAQ,CAAC,2CAWhE;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,OAAO,CAAC,2CAQ/D;AAED,iBAAS,mBAAmB,CAAC,EAC3B,SAAS,EACT,YAAoB,EACpB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,IAAI,CAAC,2CAS5D;AAED,iBAAS,qBAAqB,CAAC,EAC7B,SAAiB,EACjB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,OAAqB,EACrB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,wBAAwB,CAAC,MAAM,CAAC,GAC7D,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAyB9D;AAED,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAC7B,CAAA"}
@@ -11,13 +11,13 @@ function MessageScroller({ className, ...props }) {
11
11
  return (_jsx(MessageScrollerPrimitive.Root, { "data-slot": "message-scroller", className: cn('group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden', className), ...props }));
12
12
  }
13
13
  function MessageScrollerViewport({ className, ...props }) {
14
- return (_jsx(MessageScrollerPrimitive.Viewport, { "data-slot": "message-scroller-viewport", className: cn('message-scroller-viewport size-full min-h-0 min-w-0 overflow-y-auto overscroll-contain [contain:content] [scrollbar-gutter:stable]', className), ...props }));
14
+ return (_jsx(MessageScrollerPrimitive.Viewport, { "data-slot": "message-scroller-viewport", className: cn('message-scroller-viewport size-full min-h-0 min-w-0 overflow-y-auto overscroll-none [contain:content] [scrollbar-gutter:stable]', className), ...props }));
15
15
  }
16
16
  function MessageScrollerContent({ className, ...props }) {
17
17
  return (_jsx(MessageScrollerPrimitive.Content, { "data-slot": "message-scroller-content", className: cn('flex h-max min-h-full flex-col', className), ...props }));
18
18
  }
19
19
  function MessageScrollerItem({ className, scrollAnchor = false, ...props }) {
20
- return (_jsx(MessageScrollerPrimitive.Item, { "data-slot": "message-scroller-item", scrollAnchor: scrollAnchor, className: cn('min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]', className), ...props }));
20
+ return (_jsx(MessageScrollerPrimitive.Item, { "data-slot": "message-scroller-item", scrollAnchor: scrollAnchor, className: cn('min-w-0 shrink-0', className), ...props }));
21
21
  }
22
22
  function MessageScrollerButton({ direction = 'end', className, children, render, variant = 'secondary', size = 'icon-sm', ...props }) {
23
23
  return (_jsx(MessageScrollerPrimitive.Button, { "data-slot": "message-scroller-button", "data-direction": direction, "data-variant": variant, "data-size": size, direction: direction, className: cn('border-border bg-background text-foreground hover:bg-muted hover:text-foreground absolute left-1/2 -translate-x-1/2 cursor-pointer transition-[translate,scale,opacity] duration-200 data-[active=false]:pointer-events-none data-[direction=end]:bottom-4 data-[direction=start]:top-4 data-[active=true]:translate-y-0 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:data-[active=false]:-translate-y-full data-[active=false]:scale-95 data-[active=true]:scale-100 data-[active=false]:opacity-0 data-[active=true]:opacity-100 data-[direction=start]:[&_svg]:rotate-180', className), render: render ?? _jsx(Button, { variant: variant, size: size }), ...props, children: children ?? (_jsxs(_Fragment, { children: [_jsx(ArrowDown, {}), _jsx("span", { className: "sr-only", children: direction === 'end' ? 'Scroll to end' : 'Scroll to start' })] })) }));
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const numberInputVariants: (props?: ({
4
4
  variant?: "default" | "filled" | null | undefined;
5
- size?: "default" | "sm" | "lg" | null | undefined;
5
+ size?: "sm" | "default" | "lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  export interface NumberInputProps extends Omit<React.ComponentProps<'input'>, 'defaultValue' | 'onChange' | 'size' | 'type' | 'value'>, VariantProps<typeof numberInputVariants> {
8
8
  value?: number | null;
@@ -16,7 +16,7 @@ function PopoverClose({ ...props }) {
16
16
  return _jsx(PopoverPrimitive.Close, { "data-slot": "popover-close", ...props });
17
17
  }
18
18
  function PopoverContent({ className, align = 'center', material = 'regular', sideOffset = 4, size = 'default', ...props }) {
19
- return (_jsx(PopoverPortal, { children: _jsx(Material, { variant: material, elevation: "overlay", asChild: true, children: _jsx(PopoverPrimitive.Content, { "data-slot": "popover-content", "data-size": size, align: align, sideOffset: sideOffset, className: cn('text-popover-foreground outline-hidden z-50 max-h-[var(--radix-popover-content-available-height)] max-w-[var(--radix-popover-content-available-width)] overflow-y-auto overscroll-contain p-[var(--density-pane-padding)]', 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95', 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', 'origin-(--radix-popover-content-transform-origin) duration-[var(--motion-duration-normal)]', 'data-[size=content]:w-fit data-[size=default]:w-72 data-[size=lg]:w-96 data-[size=sm]:w-56', className), ...props }) }) }));
19
+ return (_jsx(PopoverPortal, { children: _jsx(Material, { variant: material, elevation: "overlay", asChild: true, children: _jsx(PopoverPrimitive.Content, { "data-slot": "popover-content", "data-size": size, align: align, sideOffset: sideOffset, className: cn('moldable-popover text-popover-foreground outline-hidden z-50 max-h-[var(--radix-popover-content-available-height)] max-w-[var(--radix-popover-content-available-width)] overflow-y-auto overscroll-contain p-[var(--density-pane-padding)]', 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95', 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', 'origin-(--radix-popover-content-transform-origin) duration-[var(--motion-duration-normal)]', 'data-[size=content]:w-fit data-[size=default]:w-72 data-[size=lg]:w-96 data-[size=sm]:w-56', className), ...props }) }) }));
20
20
  }
21
21
  function PopoverAnchor({ ...props }) {
22
22
  return _jsx(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props });
@@ -1,10 +1,12 @@
1
1
  import * as React from 'react';
2
+ import type { ControlSize } from '../../tokens/contracts.js';
2
3
  import { type VariantProps } from 'class-variance-authority';
3
4
  declare const searchFieldVariants: (props?: ({
4
5
  variant?: "default" | "filled" | null | undefined;
5
- density?: "compact" | "default" | "comfortable" | null | undefined;
6
+ density?: "default" | "compact" | "comfortable" | null | undefined;
6
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
8
  interface SearchFieldProps extends Omit<React.ComponentProps<'input'>, 'defaultValue' | 'size' | 'type' | 'value'>, VariantProps<typeof searchFieldVariants> {
9
+ controlSize?: ControlSize;
8
10
  value?: string;
9
11
  defaultValue?: string;
10
12
  onValueChange?: (value: string) => void;
@@ -14,6 +16,6 @@ interface SearchFieldProps extends Omit<React.ComponentProps<'input'>, 'defaultV
14
16
  loading?: boolean;
15
17
  inputClassName?: string;
16
18
  }
17
- declare function SearchField({ className, inputClassName, value, defaultValue, onChange, onValueChange, onClear, onKeyDown, clearable, clearLabel, loading, variant, density, disabled, readOnly, ref, ...props }: SearchFieldProps): import("react/jsx-runtime").JSX.Element;
19
+ declare function SearchField({ className, controlSize, inputClassName, value, defaultValue, onChange, onValueChange, onClear, onKeyDown, clearable, clearLabel, loading, variant, density, disabled, readOnly, ref, ...props }: SearchFieldProps): import("react/jsx-runtime").JSX.Element;
18
20
  export { SearchField, searchFieldVariants, type SearchFieldProps };
19
21
  //# sourceMappingURL=search-field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-field.d.ts","sourceRoot":"","sources":["../../../src/components/ui/search-field.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,mBAAmB;;;8EAmBxB,CAAA;AAED,UAAU,gBACR,SAAQ,IAAI,CACR,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAC7B,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAC3C,EACD,YAAY,CAAC,OAAO,mBAAmB,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,cAAc,EACd,KAAK,EACL,YAAiB,EACjB,QAAQ,EACR,aAAa,EACb,OAAO,EACP,SAAS,EACT,SAAgB,EAChB,UAA2B,EAC3B,OAAe,EACf,OAAmB,EACnB,OAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACT,EAAE,gBAAgB,2CAmGlB;AAED,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"search-field.d.ts","sourceRoot":"","sources":["../../../src/components/ui/search-field.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,mBAAmB;;;8EAmBxB,CAAA;AAED,UAAU,gBACR,SAAQ,IAAI,CACR,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAC7B,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAC3C,EACD,YAAY,CAAC,OAAO,mBAAmB,CAAC;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,WAAW,EACX,cAAc,EACd,KAAK,EACL,YAAiB,EACjB,QAAQ,EACR,aAAa,EACb,OAAO,EACP,SAAS,EACT,SAAgB,EAChB,UAA2B,EAC3B,OAAe,EACf,OAAmB,EACnB,OAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACT,EAAE,gBAAgB,2CAmHlB;AAED,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,CAAA"}
@@ -12,9 +12,9 @@ const searchFieldVariants = cva('group/search-field border-input has-[:focus-vis
12
12
  filled: 'border-transparent bg-muted/70 shadow-none',
13
13
  },
14
14
  density: {
15
- compact: 'h-control-sm',
16
- default: 'h-control-md',
17
- comfortable: 'h-control-md',
15
+ compact: 'h-control-md',
16
+ default: 'h-control-lg',
17
+ comfortable: 'h-control-xl',
18
18
  },
19
19
  },
20
20
  defaultVariants: {
@@ -22,7 +22,13 @@ const searchFieldVariants = cva('group/search-field border-input has-[:focus-vis
22
22
  density: 'default',
23
23
  },
24
24
  });
25
- function SearchField({ className, inputClassName, value, defaultValue = '', onChange, onValueChange, onClear, onKeyDown, clearable = true, clearLabel = 'Clear search', loading = false, variant = 'default', density = 'default', disabled, readOnly, ref, ...props }) {
25
+ function SearchField({ className, controlSize, inputClassName, value, defaultValue = '', onChange, onValueChange, onClear, onKeyDown, clearable = true, clearLabel = 'Clear search', loading = false, variant = 'default', density = 'default', disabled, readOnly, ref, ...props }) {
26
+ const resolvedControlSize = controlSize ??
27
+ {
28
+ compact: 'medium',
29
+ default: 'large',
30
+ comfortable: 'xl',
31
+ }[density ?? 'default'];
26
32
  const controlled = value !== undefined;
27
33
  const [internalValue, setInternalValue] = React.useState(defaultValue);
28
34
  const inputRef = React.useRef(null);
@@ -46,8 +52,12 @@ function SearchField({ className, inputClassName, value, defaultValue = '', onCh
46
52
  onClear?.();
47
53
  inputRef.current?.focus();
48
54
  }, [commitValue, currentValue, onClear]);
49
- const iconSize = density === 'compact' ? 'size-3.5' : 'size-4';
50
- return (_jsxs("div", { "data-slot": "search-field", "data-density": density, "data-variant": variant, "data-disabled": disabled || undefined, "data-readonly": readOnly || undefined, className: cn(searchFieldVariants({ variant, density }), disabled && 'cursor-not-allowed opacity-50', className), children: [_jsx("span", { "aria-hidden": "true", className: "text-muted-foreground pointer-events-none flex shrink-0 items-center pl-2.5", children: loading ? (_jsx(LoaderCircleIcon, { className: cn(iconSize, 'animate-spin') })) : (_jsx(SearchIcon, { className: iconSize })) }), _jsx("input", { ref: setRefs, "data-slot": "search-field-input", type: "search", value: currentValue, disabled: disabled, readOnly: readOnly, className: cn('placeholder:text-muted-foreground text-ui-body min-w-0 flex-1 appearance-none bg-transparent px-2 outline-none [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden', density === 'compact' && 'text-ui-caption', inputClassName), onChange: (event) => {
55
+ const iconSize = density === 'comfortable'
56
+ ? 'size-4.5'
57
+ : density === 'compact'
58
+ ? 'size-3.5'
59
+ : 'size-4';
60
+ return (_jsxs("div", { "data-slot": "search-field", "data-density": density, "data-control-size": resolvedControlSize, "data-variant": variant, "data-disabled": disabled || undefined, "data-readonly": readOnly || undefined, className: cn(searchFieldVariants({ variant, density }), 'h-[var(--m-ui-control-height)] rounded-[var(--m-ui-control-radius)]', disabled && 'cursor-not-allowed opacity-50', className), children: [_jsx("span", { "aria-hidden": "true", className: "text-muted-foreground pointer-events-none flex shrink-0 items-center pl-[var(--m-ui-field-inset-inline)]", children: loading ? (_jsx(LoaderCircleIcon, { className: cn(iconSize, 'animate-spin') })) : (_jsx(SearchIcon, { className: iconSize })) }), _jsx("input", { ref: setRefs, "data-slot": "search-field-input", type: "search", value: currentValue, disabled: disabled, readOnly: readOnly, className: cn('placeholder:text-muted-foreground text-ui-body min-w-0 flex-1 appearance-none bg-transparent px-2 outline-none [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden', density === 'compact' && 'text-ui-body', inputClassName), onChange: (event) => {
51
61
  onChange?.(event);
52
62
  commitValue(event.currentTarget.value);
53
63
  }, onKeyDown: (event) => {
@@ -1,5 +1,6 @@
1
1
  import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
2
2
  import * as React from 'react';
3
+ import type { ControlSize } from '../../tokens/contracts.js';
3
4
  import { type VariantProps } from 'class-variance-authority';
4
5
  declare const segmentedControlVariants: (props?: ({
5
6
  variant?: "outline" | "muted" | null | undefined;
@@ -11,8 +12,9 @@ declare const segmentedControlItemVariants: (props?: ({
11
12
  fullWidth?: boolean | null | undefined;
12
13
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
13
14
  interface SegmentedControlProps extends React.ComponentProps<typeof RadioGroupPrimitive.Root>, VariantProps<typeof segmentedControlVariants> {
15
+ controlSize?: ControlSize;
14
16
  }
15
- declare function SegmentedControl({ className, variant, density, fullWidth, orientation, ...props }: SegmentedControlProps): import("react/jsx-runtime").JSX.Element;
17
+ declare function SegmentedControl({ className, controlSize, variant, density, fullWidth, orientation, ...props }: SegmentedControlProps): import("react/jsx-runtime").JSX.Element;
16
18
  interface SegmentedControlItemProps extends React.ComponentProps<typeof RadioGroupPrimitive.Item> {
17
19
  iconOnly?: boolean;
18
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"segmented-control.d.ts","sourceRoot":"","sources":["../../../src/components/ui/segmented-control.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,mBAAmB,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,wBAAwB;;;;8EAwB7B,CAAA;AAED,QAAA,MAAM,4BAA4B;;;8EAsBjC,CAAA;AAaD,UAAU,qBACR,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,EAC3D,YAAY,CAAC,OAAO,wBAAwB,CAAC;CAAG;AAEpD,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,OAAiB,EACjB,OAAmB,EACnB,SAAiB,EACjB,WAA0B,EAC1B,GAAG,KAAK,EACT,EAAE,qBAAqB,2CAoBvB;AAED,UAAU,yBACR,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,QAAgB,EAChB,GAAG,KAAK,EACT,EAAE,yBAAyB,2CAqB3B;AAED,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,4BAA4B,EAC5B,wBAAwB,GACzB,CAAA"}
1
+ {"version":3,"file":"segmented-control.d.ts","sourceRoot":"","sources":["../../../src/components/ui/segmented-control.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,mBAAmB,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,wBAAwB;;;;8EAwB7B,CAAA;AAED,QAAA,MAAM,4BAA4B;;;8EAsBjC,CAAA;AAeD,UAAU,qBACR,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,EAC3D,YAAY,CAAC,OAAO,wBAAwB,CAAC;IAC/C,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,WAAW,EACX,OAAiB,EACjB,OAAmB,EACnB,SAAiB,EACjB,WAA0B,EAC1B,GAAG,KAAK,EACT,EAAE,qBAAqB,2CAmCvB;AAED,UAAU,yBACR,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,QAAgB,EAChB,GAAG,KAAK,EACT,EAAE,yBAAyB,2CAmB3B;AAED,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,4BAA4B,EAC5B,wBAAwB,GACzB,CAAA"}