@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.
- package/dist/catalog/component-catalog.d.ts +9 -2
- package/dist/catalog/component-catalog.d.ts.map +1 -1
- package/dist/catalog/component-catalog.js +11 -7
- package/dist/catalog/core-control-stories.d.ts.map +1 -1
- package/dist/catalog/core-control-stories.js +1 -1
- package/dist/catalog/core-foundation-stories.d.ts.map +1 -1
- package/dist/catalog/core-foundation-stories.js +5 -5
- package/dist/components/app-error-boundary.d.ts +1 -1
- package/dist/components/chat/chat-image-lightbox.d.ts +8 -0
- package/dist/components/chat/chat-image-lightbox.d.ts.map +1 -1
- package/dist/components/chat/chat-image-lightbox.js +24 -2
- package/dist/components/chat/chat-input.d.ts +3 -2
- package/dist/components/chat/chat-input.d.ts.map +1 -1
- package/dist/components/chat/chat-input.js +3 -3
- package/dist/components/chat/chat-message.d.ts.map +1 -1
- package/dist/components/chat/chat-message.js +3 -1
- package/dist/components/chat/chat-panel.d.ts +3 -1
- package/dist/components/chat/chat-panel.d.ts.map +1 -1
- package/dist/components/chat/chat-panel.js +53 -39
- package/dist/components/chat/conversation-history.d.ts +4 -2
- package/dist/components/chat/conversation-history.d.ts.map +1 -1
- package/dist/components/chat/conversation-history.js +20 -15
- package/dist/components/ui/alert.d.ts +1 -1
- package/dist/components/ui/app-frame.d.ts +20 -1
- package/dist/components/ui/app-frame.d.ts.map +1 -1
- package/dist/components/ui/app-frame.js +37 -7
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/badge.js +1 -1
- package/dist/components/ui/button.d.ts +5 -3
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +39 -11
- package/dist/components/ui/card.d.ts +12 -2
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +3 -2
- package/dist/components/ui/checkbox.d.ts +4 -1
- package/dist/components/ui/checkbox.d.ts.map +1 -1
- package/dist/components/ui/checkbox.js +4 -4
- package/dist/components/ui/context-menu.d.ts.map +1 -1
- package/dist/components/ui/context-menu.js +7 -6
- package/dist/components/ui/date-field.d.ts +1 -1
- package/dist/components/ui/dropdown-menu.d.ts +1 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu.js +9 -8
- package/dist/components/ui/icon-button.d.ts +1 -1
- package/dist/components/ui/icon-button.d.ts.map +1 -1
- package/dist/components/ui/icon-button.js +1 -0
- package/dist/components/ui/input.d.ts +6 -2
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/input.js +2 -2
- package/dist/components/ui/material.d.ts +8 -3
- package/dist/components/ui/material.d.ts.map +1 -1
- package/dist/components/ui/material.js +2 -2
- package/dist/components/ui/menu-items.d.ts +2 -1
- package/dist/components/ui/menu-items.d.ts.map +1 -1
- package/dist/components/ui/menu-items.js +3 -2
- package/dist/components/ui/message-scroller-controller.d.ts +15 -17
- package/dist/components/ui/message-scroller-controller.d.ts.map +1 -1
- package/dist/components/ui/message-scroller-controller.js +106 -91
- package/dist/components/ui/message-scroller-primitive.d.ts +2 -0
- package/dist/components/ui/message-scroller-primitive.d.ts.map +1 -1
- package/dist/components/ui/message-scroller-primitive.js +2 -0
- package/dist/components/ui/message-scroller.d.ts.map +1 -1
- package/dist/components/ui/message-scroller.js +2 -2
- package/dist/components/ui/number-input.d.ts +1 -1
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/search-field.d.ts +4 -2
- package/dist/components/ui/search-field.d.ts.map +1 -1
- package/dist/components/ui/search-field.js +16 -6
- package/dist/components/ui/segmented-control.d.ts +3 -1
- package/dist/components/ui/segmented-control.d.ts.map +1 -1
- package/dist/components/ui/segmented-control.js +23 -17
- package/dist/components/ui/select.js +2 -2
- package/dist/components/ui/sidebar.d.ts +10 -4
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/sidebar.js +74 -17
- package/dist/components/ui/status.d.ts +1 -1
- package/dist/components/ui/status.js +1 -1
- package/dist/components/ui/switch.d.ts +3 -1
- package/dist/components/ui/switch.d.ts.map +1 -1
- package/dist/components/ui/switch.js +3 -2
- package/dist/components/ui/toolbar-controls.d.ts +13 -3
- package/dist/components/ui/toolbar-controls.d.ts.map +1 -1
- package/dist/components/ui/toolbar-controls.js +35 -10
- package/dist/components/ui/toolbar.d.ts +5 -4
- package/dist/components/ui/toolbar.d.ts.map +1 -1
- package/dist/components/ui/toolbar.js +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/frame-lifecycle.d.ts +1 -0
- package/dist/lib/frame-lifecycle.d.ts.map +1 -1
- package/dist/lib/frame-lifecycle.js +7 -0
- package/dist/lib/theme.d.ts +39 -5
- package/dist/lib/theme.d.ts.map +1 -1
- package/dist/lib/theme.js +105 -17
- package/dist/tokens/contracts.d.ts +79 -0
- package/dist/tokens/contracts.d.ts.map +1 -0
- package/dist/tokens/contracts.js +57 -0
- package/dist/tokens/index.d.ts +2 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +1 -0
- package/docs/README.md +2 -0
- package/docs/adaptive-materials.md +14 -9
- package/docs/design-tokens.md +10 -6
- package/docs/foundations.md +3 -3
- package/docs/macos-design-audit.md +144 -0
- package/docs/native-integration.md +4 -4
- package/docs/platform-architecture.md +189 -0
- package/docs/standalone-app-windows.md +37 -0
- package/docs/visual-regression.md +6 -8
- package/package.json +13 -1
- package/src/components/ui/accordion.md +46 -0
- package/src/components/ui/alert.md +12 -4
- package/src/components/ui/app-frame.md +8 -5
- package/src/components/ui/aspect-ratio.md +37 -0
- package/src/components/ui/avatar.md +48 -0
- package/src/components/ui/breadcrumb.md +52 -0
- package/src/components/ui/button-group.md +43 -0
- package/src/components/ui/button.md +21 -4
- package/src/components/ui/calendar.md +42 -0
- package/src/components/ui/card.md +43 -0
- package/src/components/ui/carousel.md +47 -0
- package/src/components/ui/chart.md +52 -0
- package/src/components/ui/checkbox.md +36 -0
- package/src/components/ui/collapsible.md +2 -3
- package/src/components/ui/color-well.md +14 -4
- package/src/components/ui/combobox.md +3 -3
- package/src/components/ui/confirm-dialog.md +5 -4
- package/src/components/ui/context-menu.md +3 -2
- package/src/components/ui/date-field.md +6 -1
- package/src/components/ui/date-picker.md +6 -3
- package/src/components/ui/dialog.md +14 -12
- package/src/components/ui/drawer.md +58 -0
- package/src/components/ui/dropdown-menu.md +16 -14
- package/src/components/ui/error-boundary-view.md +1 -1
- package/src/components/ui/field.md +2 -1
- package/src/components/ui/form.md +71 -0
- package/src/components/ui/grid.md +4 -3
- package/src/components/ui/icon-button.md +4 -1
- package/src/components/ui/input-group.md +49 -0
- package/src/components/ui/input-otp.md +56 -0
- package/src/components/ui/input.md +40 -0
- package/src/components/ui/inspector.md +47 -7
- package/src/components/ui/item.md +5 -3
- package/src/components/ui/kbd.md +30 -0
- package/src/components/ui/label.md +29 -0
- package/src/components/ui/list.md +2 -2
- package/src/components/ui/material.md +25 -12
- package/src/components/ui/menu-items.md +62 -0
- package/src/components/ui/menubar.md +58 -0
- package/src/components/ui/message-scroller-primitive.md +70 -0
- package/src/components/ui/message-scroller.md +89 -0
- package/src/components/ui/navigation-button-group.md +4 -3
- package/src/components/ui/navigation-menu.md +52 -0
- package/src/components/ui/number-input.md +8 -0
- package/src/components/ui/pagination.md +51 -0
- package/src/components/ui/panel.md +6 -0
- package/src/components/ui/popover.md +10 -7
- package/src/components/ui/progress.md +31 -0
- package/src/components/ui/radio-group.md +36 -0
- package/src/components/ui/resizable.md +2 -1
- package/src/components/ui/scroll-area.md +3 -1
- package/src/components/ui/search-field.md +6 -1
- package/src/components/ui/segmented-control.md +6 -1
- package/src/components/ui/separator.md +35 -0
- package/src/components/ui/sidebar.md +29 -6
- package/src/components/ui/skeleton.md +36 -0
- package/src/components/ui/slider.md +58 -0
- package/src/components/ui/spinner.md +41 -0
- package/src/components/ui/split-view.md +8 -4
- package/src/components/ui/switch.md +44 -0
- package/src/components/ui/table.md +7 -7
- package/src/components/ui/tabs.md +3 -1
- package/src/components/ui/textarea.md +41 -0
- package/src/components/ui/toggle-group.md +2 -2
- package/src/components/ui/toggle.md +9 -9
- package/src/components/ui/toolbar-controls.md +24 -12
- package/src/components/ui/toolbar.md +6 -6
- package/src/styles/index.css +298 -117
- package/src/tokens/contracts.ts +131 -0
- package/src/tokens/index.css +6 -0
- package/src/tokens/index.ts +23 -0
- package/src/tokens/macos-26/README.md +37 -0
- package/src/tokens/macos-26/aliases.css +53 -0
- package/src/tokens/macos-26/compatibility.css +7 -0
- package/src/tokens/macos-26/index.css +3 -0
- package/src/tokens/macos-26/source/provenance.generated.json +28 -0
- package/src/tokens/macos-26/source/sidebar.generated.css +29 -0
- package/src/tokens/macos-26/source.css +7 -0
- package/src/tokens/macos-26/web-adaptations.json +25 -0
- package/src/tokens/macos-26/web-adaptations.md +15 -0
- package/src/tokens/macos-27/accessibility.css +11 -0
- package/src/tokens/macos-27/aliases.css +304 -0
- package/src/tokens/macos-27/compatibility.css +212 -0
- package/src/tokens/macos-27/index.css +15 -0
- package/src/tokens/macos-27/recipes.css +23 -0
- package/src/tokens/macos-27/source/chrome.generated.css +338 -0
- package/src/tokens/macos-27/source/colors.generated.css +140 -0
- package/src/tokens/macos-27/source/context.generated.css +18 -0
- package/src/tokens/macos-27/source/controls.generated.css +764 -0
- package/src/tokens/macos-27/source/effects.generated.css +68 -0
- package/src/tokens/macos-27/source/kit.generated.css +50 -0
- package/src/tokens/macos-27/source/overlays-status.generated.css +931 -0
- package/src/tokens/macos-27/source/paint-styles.generated.css +81 -0
- package/src/tokens/macos-27/source/provenance.generated.json +62 -0
- package/src/tokens/macos-27/source/sizes.generated.css +385 -0
- package/src/tokens/macos-27/source/source.generated.json +554 -0
- package/src/tokens/macos-27/source/text-styles.generated.css +116 -0
- package/src/tokens/macos-27/source.css +17 -0
- package/src/tokens/macos-27/web-adaptations.css +98 -0
- package/src/tokens/macos-27/web-adaptations.json +163 -0
- package/src/tokens/macos-27/web-adaptations.md +117 -0
- package/src/tokens/moldable/brand.css +165 -0
- package/src/tokens/moldable/index.css +1 -0
- 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
|
|
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
|
|
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
|
|
106
|
-
*
|
|
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":"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;
|
|
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,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
|
-
|
|
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
|
-
|
|
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
|
|
300
|
-
*
|
|
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
|
|
374
|
+
const previousItems = this.previousItems;
|
|
339
375
|
const previousCount = this.previousItemCount;
|
|
340
|
-
this.
|
|
376
|
+
this.previousItems = children;
|
|
341
377
|
this.previousItemCount = children.length;
|
|
342
|
-
this.
|
|
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
|
|
358
|
-
|
|
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.
|
|
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
|
-
|
|
628
|
+
restorePendingHistoryLoad(preferAnchor) {
|
|
587
629
|
const viewport = this.viewport;
|
|
588
|
-
|
|
589
|
-
|
|
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
|
|
594
|
-
const rect =
|
|
652
|
+
for (const element of this.itemChildren()) {
|
|
653
|
+
const rect = element.getBoundingClientRect();
|
|
595
654
|
if (rect.bottom > viewportRect.top && rect.top < viewportRect.bottom) {
|
|
596
|
-
|
|
597
|
-
element
|
|
655
|
+
return {
|
|
656
|
+
element,
|
|
598
657
|
top: rect.top - viewportRect.top,
|
|
599
658
|
};
|
|
600
|
-
return;
|
|
601
659
|
}
|
|
602
660
|
}
|
|
603
|
-
|
|
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":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAGL,KAAK,oCAAoC,EACzC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACpC,MAAM,+BAA+B,CAAA;AAoBtC,KAAK,4BAA4B,GAAG;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,qBAAqB,CAAC,EAAE,oCAAoC,CAAA;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAqBD,iBAAS,uBAAuB,CAAC,EAC/B,UAAkB,EAClB,QAAQ,EACR,qBAA6B,EAC7B,mBAAuB,EACvB,sBAA2B,EAC3B,YAAgB,GACjB,EAAE,4BAA4B,2CAkC9B;AAED,KAAK,oBAAoB,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;AAEvD,iBAAS,mBAAmB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,2CAWxE;AAED,KAAK,4BAA4B,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAChE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC,CAAA;AAED,iBAAS,uBAAuB,CAAC,EAC/B,YAAY,EAAE,SAAS,EACvB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,WAAW,EACX,OAAO,EACP,uBAA8B,EAC9B,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,4BAA4B,2CAuD9B;AAED,KAAK,2BAA2B,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,iBAAS,sBAAsB,CAAC,EAC9B,eAAe,EAAE,YAAY,EAC7B,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,eAAe,EACf,GAAG,KAAK,EACT,EAAE,2BAA2B,2CA8D7B;AAED,KAAK,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,iBAAS,mBAAmB,CAAC,EAC3B,SAAS,EACT,GAAG,EACH,YAAoB,EACpB,GAAG,KAAK,EACT,EAAE,wBAAwB,2CA0B1B;AAED,KAAK,8BAA8B,GAAG,OAAO,GAAG,KAAK,CAAA;AAErD,KAAK,gCAAgC,GAAG;IACtC,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,8BAA8B,CAAA;CAC1C,CAAA;AAED,KAAK,0BAA0B,GAAG,IAAI,CACpC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAC9B,UAAU,CACX,GAAG;IACF,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,SAAS,CAAC,EAAE,8BAA8B,CAAA;IAC1C,MAAM,CAAC,EACH,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC3C,CAAC,CACC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,gCAAgC,KACpC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;CACpC,CAAA;AAED,iBAAS,qBAAqB,CAAC,EAC7B,QAAmB,EACnB,QAAQ,EACR,SAAS,EACT,SAAiB,EACjB,OAAO,EACP,MAAM,EACN,QAAQ,EACR,IAAe,EACf,GAAG,KAAK,EACT,EAAE,0BAA0B,iFA2C5B;AAED,iBAAS,kBAAkB
|
|
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,
|
|
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-
|
|
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
|
|
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?: "
|
|
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?: "
|
|
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;
|
|
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-
|
|
16
|
-
default: 'h-control-
|
|
17
|
-
comfortable: 'h-control-
|
|
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 === '
|
|
50
|
-
|
|
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;
|
|
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"}
|