@moldable-ai/ui 0.2.20 → 0.2.22
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/catalog-coverage.d.ts +15 -0
- package/dist/catalog/catalog-coverage.d.ts.map +1 -0
- package/dist/catalog/catalog-coverage.js +44 -0
- package/dist/catalog/catalog-manifest.d.ts.map +1 -1
- package/dist/catalog/catalog-manifest.js +35 -23
- package/dist/catalog/catalog-types.d.ts +17 -0
- package/dist/catalog/catalog-types.d.ts.map +1 -1
- package/dist/catalog/catalog-types.js +7 -0
- package/dist/catalog/component-catalog.d.ts.map +1 -1
- package/dist/catalog/component-catalog.js +16 -6
- package/dist/catalog/core-catalog-exclusions.d.ts +8 -0
- package/dist/catalog/core-catalog-exclusions.d.ts.map +1 -0
- package/dist/catalog/core-catalog-exclusions.js +155 -0
- package/dist/catalog/core-catalog.d.ts +0 -4
- package/dist/catalog/core-catalog.d.ts.map +1 -1
- package/dist/catalog/core-catalog.js +12 -98
- package/dist/catalog/core-collection-stories.d.ts +3 -0
- package/dist/catalog/core-collection-stories.d.ts.map +1 -0
- package/dist/catalog/core-collection-stories.js +42 -0
- package/dist/catalog/core-control-stories.d.ts +3 -0
- package/dist/catalog/core-control-stories.d.ts.map +1 -0
- package/dist/catalog/core-control-stories.js +97 -0
- package/dist/catalog/core-feedback-stories.d.ts +3 -0
- package/dist/catalog/core-feedback-stories.d.ts.map +1 -0
- package/dist/catalog/core-feedback-stories.js +50 -0
- package/dist/catalog/core-foundation-stories.d.ts +3 -0
- package/dist/catalog/core-foundation-stories.d.ts.map +1 -0
- package/dist/catalog/core-foundation-stories.js +53 -0
- package/dist/catalog/core-navigation-stories.d.ts +3 -0
- package/dist/catalog/core-navigation-stories.d.ts.map +1 -0
- package/dist/catalog/core-navigation-stories.js +25 -0
- package/dist/catalog/core-overlay-stories.d.ts +3 -0
- package/dist/catalog/core-overlay-stories.d.ts.map +1 -0
- package/dist/catalog/core-overlay-stories.js +20 -0
- package/dist/catalog/index.d.ts +3 -1
- package/dist/catalog/index.d.ts.map +1 -1
- package/dist/catalog/index.js +3 -1
- package/dist/components/app-error-boundary.d.ts.map +1 -1
- package/dist/components/app-error-boundary.js +3 -2
- package/dist/components/chat/chat-panel.d.ts +0 -1
- package/dist/components/chat/chat-panel.d.ts.map +1 -1
- package/dist/components/chat/chat-panel.js +7 -11
- package/dist/components/ui/alert-dialog.d.ts +10 -4
- package/dist/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/alert-dialog.js +14 -6
- package/dist/components/ui/alert.d.ts +19 -3
- package/dist/components/ui/alert.d.ts.map +1 -1
- package/dist/components/ui/alert.js +25 -8
- package/dist/components/ui/app-frame.d.ts +9 -3
- package/dist/components/ui/app-frame.d.ts.map +1 -1
- package/dist/components/ui/app-frame.js +45 -6
- package/dist/components/ui/button.d.ts +6 -4
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +40 -8
- package/dist/components/ui/collapsible.d.ts +9 -1
- package/dist/components/ui/collapsible.d.ts.map +1 -1
- package/dist/components/ui/collapsible.js +13 -2
- package/dist/components/ui/collection-navigation.d.ts +8 -0
- package/dist/components/ui/collection-navigation.d.ts.map +1 -0
- package/dist/components/ui/collection-navigation.js +19 -0
- package/dist/components/ui/command.d.ts +5 -1
- package/dist/components/ui/command.d.ts.map +1 -1
- package/dist/components/ui/command.js +13 -1
- package/dist/components/ui/confirm-dialog.d.ts +19 -0
- package/dist/components/ui/confirm-dialog.d.ts.map +1 -0
- package/dist/components/ui/confirm-dialog.js +45 -0
- package/dist/components/ui/date-picker.d.ts +24 -0
- package/dist/components/ui/date-picker.d.ts.map +1 -0
- package/dist/components/ui/date-picker.js +92 -0
- package/dist/components/ui/dialog-primary-action.d.ts +4 -0
- package/dist/components/ui/dialog-primary-action.d.ts.map +1 -0
- package/dist/components/ui/dialog-primary-action.js +37 -0
- package/dist/components/ui/dialog.d.ts +8 -2
- package/dist/components/ui/dialog.d.ts.map +1 -1
- package/dist/components/ui/dialog.js +15 -5
- package/dist/components/ui/empty.d.ts +7 -2
- package/dist/components/ui/empty.d.ts.map +1 -1
- package/dist/components/ui/empty.js +20 -7
- package/dist/components/ui/error-boundary-view.d.ts +12 -0
- package/dist/components/ui/error-boundary-view.d.ts.map +1 -0
- package/dist/components/ui/error-boundary-view.js +8 -0
- package/dist/components/ui/grid.d.ts.map +1 -1
- package/dist/components/ui/grid.js +70 -46
- package/dist/components/ui/icon-button.d.ts.map +1 -1
- package/dist/components/ui/icon-button.js +1 -2
- package/dist/components/ui/index.d.ts +5 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +5 -0
- package/dist/components/ui/input-group.d.ts +1 -1
- package/dist/components/ui/list.d.ts +5 -1
- package/dist/components/ui/list.d.ts.map +1 -1
- package/dist/components/ui/list.js +27 -16
- package/dist/components/ui/material.d.ts +34 -0
- package/dist/components/ui/material.d.ts.map +1 -0
- package/dist/components/ui/material.js +34 -0
- package/dist/components/ui/message-scroller-controller.d.ts +162 -0
- package/dist/components/ui/message-scroller-controller.d.ts.map +1 -0
- package/dist/components/ui/message-scroller-controller.js +888 -0
- package/dist/components/ui/message-scroller-policy.d.ts +74 -0
- package/dist/components/ui/message-scroller-policy.d.ts.map +1 -0
- package/dist/components/ui/message-scroller-policy.js +129 -0
- package/dist/components/ui/message-scroller-primitive.d.ts +55 -0
- package/dist/components/ui/message-scroller-primitive.d.ts.map +1 -0
- package/dist/components/ui/message-scroller-primitive.js +226 -0
- package/dist/components/ui/message-scroller.d.ts +2 -2
- package/dist/components/ui/message-scroller.d.ts.map +1 -1
- package/dist/components/ui/message-scroller.js +3 -15
- package/dist/components/ui/navigation-button-group.d.ts +16 -0
- package/dist/components/ui/navigation-button-group.d.ts.map +1 -0
- package/dist/components/ui/navigation-button-group.js +9 -0
- package/dist/components/ui/popover.d.ts +9 -2
- package/dist/components/ui/popover.d.ts.map +1 -1
- package/dist/components/ui/popover.js +13 -3
- package/dist/components/ui/scroll-area.d.ts +8 -2
- package/dist/components/ui/scroll-area.d.ts.map +1 -1
- package/dist/components/ui/scroll-area.js +6 -3
- package/dist/components/ui/search-field.d.ts.map +1 -1
- package/dist/components/ui/segmented-control.d.ts.map +1 -1
- package/dist/components/ui/segmented-control.js +6 -5
- package/dist/components/ui/sheet.d.ts +4 -2
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/sheet.js +12 -9
- package/dist/components/ui/sonner.d.ts +1 -1
- package/dist/components/ui/sonner.d.ts.map +1 -1
- package/dist/components/ui/spinner.d.ts.map +1 -1
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/table.d.ts.map +1 -1
- package/dist/components/ui/table.js +7 -2
- package/dist/components/ui/toggle.d.ts +12 -4
- package/dist/components/ui/toggle.d.ts.map +1 -1
- package/dist/components/ui/toggle.js +13 -2
- package/dist/components/ui/toolbar.d.ts +9 -2
- package/dist/components/ui/toolbar.d.ts.map +1 -1
- package/dist/components/ui/toolbar.js +23 -4
- package/dist/components/ui/tooltip.d.ts +8 -3
- package/dist/components/ui/tooltip.d.ts.map +1 -1
- package/dist/components/ui/tooltip.js +11 -6
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/lib/frame-lifecycle.d.ts +23 -0
- package/dist/lib/frame-lifecycle.d.ts.map +1 -1
- package/dist/lib/frame-lifecycle.js +30 -3
- package/dist/lib/host-date-time-picker.d.ts +36 -0
- package/dist/lib/host-date-time-picker.d.ts.map +1 -0
- package/dist/lib/host-date-time-picker.js +162 -0
- package/dist/lib/host-file-dialog.d.ts +66 -0
- package/dist/lib/host-file-dialog.d.ts.map +1 -0
- package/dist/lib/host-file-dialog.js +221 -0
- package/dist/lib/host-native-menu.d.ts +75 -0
- package/dist/lib/host-native-menu.d.ts.map +1 -0
- package/dist/lib/host-native-menu.js +187 -0
- package/dist/lib/host-services.d.ts +13 -0
- package/dist/lib/host-services.d.ts.map +1 -0
- package/dist/lib/host-services.js +161 -0
- package/dist/lib/host-share.d.ts +39 -0
- package/dist/lib/host-share.d.ts.map +1 -0
- package/dist/lib/host-share.js +161 -0
- package/dist/lib/theme.d.ts.map +1 -1
- package/dist/lib/theme.js +2 -1
- package/docs/README.md +4 -1
- package/docs/adaptive-materials.md +79 -0
- package/docs/app-anatomy.md +3 -1
- package/docs/component-catalog.md +26 -3
- package/docs/design-tokens.md +17 -4
- package/docs/foundations.md +5 -3
- package/docs/standalone-app-windows.md +8 -0
- package/docs/visual-regression.md +78 -0
- package/package.json +12 -4
- package/src/components/ui/alert-dialog.md +58 -0
- package/src/components/ui/alert.md +28 -6
- package/src/components/ui/app-frame.md +5 -0
- package/src/components/ui/button.md +10 -3
- package/src/components/ui/collapsible.md +52 -0
- package/src/components/ui/combobox.md +0 -1
- package/src/components/ui/command.md +54 -0
- package/src/components/ui/date-field.md +1 -1
- package/src/components/ui/date-picker.md +55 -0
- package/src/components/ui/dialog.md +59 -0
- package/src/components/ui/empty.md +8 -3
- package/src/components/ui/error-boundary-view.md +98 -0
- package/src/components/ui/grid.md +8 -4
- package/src/components/ui/icon-button.md +2 -2
- package/src/components/ui/list.md +35 -2
- package/src/components/ui/material.md +51 -0
- package/src/components/ui/navigation-button-group.md +46 -0
- package/src/components/ui/popover.md +31 -0
- package/src/components/ui/scroll-area.md +11 -7
- package/src/components/ui/search-field.md +1 -1
- package/src/components/ui/segmented-control.md +2 -5
- package/src/components/ui/sheet.md +30 -0
- package/src/components/ui/table.md +4 -2
- package/src/components/ui/toggle-button.md +48 -0
- package/src/components/ui/toolbar.md +5 -0
- package/src/components/ui/tooltip.md +31 -0
- package/src/styles/index.css +213 -0
|
@@ -7,7 +7,7 @@ declare const inputGroupAddonVariants: (props?: ({
|
|
|
7
7
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
8
|
declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>): import("react/jsx-runtime").JSX.Element;
|
|
9
9
|
declare const inputGroupButtonVariants: (props?: ({
|
|
10
|
-
size?: "
|
|
10
|
+
size?: "sm" | "xs" | "icon-xs" | "icon-sm" | null | undefined;
|
|
11
11
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
12
12
|
declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>): import("react/jsx-runtime").JSX.Element;
|
|
13
13
|
declare function InputGroupText({ className, ...props }: React.ComponentProps<'span'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -11,6 +11,10 @@ type ListProps = Omit<React.ComponentProps<'div'>, 'defaultValue' | 'onChange'>
|
|
|
11
11
|
disabled?: boolean;
|
|
12
12
|
};
|
|
13
13
|
declare function List({ className, children, selectionMode, selectedValues, defaultSelectedValues, onSelectionChange, onAction, orientation, loop, disabled, role, onKeyDown, ref, ...props }: ListProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
type ListSectionProps = Omit<React.ComponentProps<'div'>, 'role'>;
|
|
15
|
+
declare function ListSection({ className, children, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...props }: ListSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
type ListSectionHeaderProps = Omit<React.ComponentProps<'div'>, 'id'>;
|
|
17
|
+
declare function ListSectionHeader({ className, ...props }: ListSectionHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
14
18
|
type ListItemProps = Omit<React.ComponentProps<'div'>, 'value'> & {
|
|
15
19
|
value: string;
|
|
16
20
|
disabled?: boolean;
|
|
@@ -20,5 +24,5 @@ declare function ListItemContent({ className, ...props }: React.ComponentProps<'
|
|
|
20
24
|
declare function ListItemTitle({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
21
25
|
declare function ListItemDescription({ className, ...props }: React.ComponentProps<'p'>): import("react/jsx-runtime").JSX.Element;
|
|
22
26
|
declare function ListItemActions({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
23
|
-
export { List, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemTitle, type ListProps, type ListSelectionMode, };
|
|
27
|
+
export { List, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemTitle, ListSection, ListSectionHeader, type ListProps, type ListSectionHeaderProps, type ListSectionProps, type ListSelectionMode, };
|
|
24
28
|
//# sourceMappingURL=list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/components/ui/list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/components/ui/list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,KAAK,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAA;AA+CvD,KAAK,SAAS,GAAG,IAAI,CACnB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAC3B,cAAc,GAAG,UAAU,CAC5B,GAAG;IACF,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACjC,qBAAqB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACxC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IACzD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,iBAAS,IAAI,CAAC,EACZ,SAAS,EACT,QAAQ,EACR,aAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,QAAQ,EACR,WAAwB,EACxB,IAAY,EACZ,QAAgB,EAChB,IAAI,EACJ,SAAS,EACT,GAAG,EACH,GAAG,KAAK,EACT,EAAE,SAAS,2CAoMX;AAED,KAAK,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;AAEjE,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,GAAG,KAAK,EACT,EAAE,gBAAgB,2CAiBlB;AAED,KAAK,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;AAErE,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,sBAAsB,2CAiBzE;AAED,KAAK,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG;IAChE,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,QAAgB,EAChB,OAAO,EACP,aAAa,EACb,OAAO,EACP,GAAG,EACH,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,aAAa,2CA+Ef;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ5E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ1E;AAED,iBAAS,mBAAmB,CAAC,EAC3B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,2CAQ3B;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ5E;AAED,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,CAAA"}
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { cn } from '../../lib/utils';
|
|
5
|
+
import { getCollectionItemsInDomOrder, isInteractiveDescendant, } from './collection-navigation';
|
|
5
6
|
const ListContext = React.createContext(null);
|
|
7
|
+
const ListSectionContext = React.createContext(null);
|
|
6
8
|
function useListContext(component) {
|
|
7
9
|
const context = React.useContext(ListContext);
|
|
8
10
|
if (!context) {
|
|
@@ -22,11 +24,6 @@ function sameSelection(a, b) {
|
|
|
22
24
|
}
|
|
23
25
|
return true;
|
|
24
26
|
}
|
|
25
|
-
function isInteractiveDescendant(target, currentTarget) {
|
|
26
|
-
if (!(target instanceof HTMLElement) || target === currentTarget)
|
|
27
|
-
return false;
|
|
28
|
-
return Boolean(target.closest('a,button,input,select,textarea,[contenteditable="true"],[role="button"],[role="link"]'));
|
|
29
|
-
}
|
|
30
27
|
function List({ className, children, selectionMode = 'none', selectedValues, defaultSelectedValues, onSelectionChange, onAction, orientation = 'vertical', loop = false, disabled = false, role, onKeyDown, ref, ...props }) {
|
|
31
28
|
const rootRef = React.useRef(null);
|
|
32
29
|
const itemsRef = React.useRef(new Map());
|
|
@@ -45,18 +42,21 @@ function List({ className, children, selectionMode = 'none', selectedValues, def
|
|
|
45
42
|
if (!node)
|
|
46
43
|
return () => undefined;
|
|
47
44
|
itemsRef.current.set(value, { node, disabled: itemDisabled });
|
|
48
|
-
if (!disabled && !itemDisabled) {
|
|
49
|
-
setActiveValueState((current) => current ?? value);
|
|
50
|
-
}
|
|
51
45
|
return () => {
|
|
52
46
|
itemsRef.current.delete(value);
|
|
53
|
-
setActiveValueState((current) =>
|
|
54
|
-
if (current !== value)
|
|
55
|
-
return current;
|
|
56
|
-
return ([...itemsRef.current.entries()].find(([, item]) => !disabled && !item.disabled)?.[0] ?? null);
|
|
57
|
-
});
|
|
47
|
+
setActiveValueState((current) => (current === value ? null : current));
|
|
58
48
|
};
|
|
59
|
-
}, [
|
|
49
|
+
}, []);
|
|
50
|
+
React.useLayoutEffect(() => {
|
|
51
|
+
const items = getCollectionItemsInDomOrder(itemsRef.current).filter(([, item]) => !disabled && !item.disabled);
|
|
52
|
+
setActiveValueState((current) => {
|
|
53
|
+
if (current && items.some(([value]) => value === current))
|
|
54
|
+
return current;
|
|
55
|
+
return (items.find(([value]) => selection.has(value))?.[0] ??
|
|
56
|
+
items[0]?.[0] ??
|
|
57
|
+
null);
|
|
58
|
+
});
|
|
59
|
+
}, [children, disabled, selection]);
|
|
60
60
|
const setActiveValue = React.useCallback((value) => {
|
|
61
61
|
const item = itemsRef.current.get(value);
|
|
62
62
|
if (item && !item.disabled)
|
|
@@ -92,7 +92,7 @@ function List({ className, children, selectionMode = 'none', selectedValues, def
|
|
|
92
92
|
onAction?.(value);
|
|
93
93
|
}, [disabled, onAction]);
|
|
94
94
|
const moveFocus = React.useCallback((direction) => {
|
|
95
|
-
const items =
|
|
95
|
+
const items = getCollectionItemsInDomOrder(itemsRef.current).filter(([, item]) => !disabled && !item.disabled);
|
|
96
96
|
if (items.length === 0)
|
|
97
97
|
return;
|
|
98
98
|
const currentIndex = items.findIndex(([value]) => value === activeValue);
|
|
@@ -168,6 +168,17 @@ function List({ className, children, selectionMode = 'none', selectedValues, def
|
|
|
168
168
|
? 'flex-col gap-0.5'
|
|
169
169
|
: 'flex-row items-center gap-1', className), onKeyDown: handleKeyDown, ...props, children: children }) }));
|
|
170
170
|
}
|
|
171
|
+
function ListSection({ className, children, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...props }) {
|
|
172
|
+
const headerId = React.useId();
|
|
173
|
+
return (_jsx(ListSectionContext.Provider, { value: { headerId }, children: _jsx("div", { role: "group", "aria-label": ariaLabel, "aria-labelledby": ariaLabel ? undefined : (ariaLabelledBy ?? headerId), "data-slot": "list-section", className: cn('flex min-w-0 flex-col gap-0.5', className), ...props, children: children }) }));
|
|
174
|
+
}
|
|
175
|
+
function ListSectionHeader({ className, ...props }) {
|
|
176
|
+
const context = React.useContext(ListSectionContext);
|
|
177
|
+
if (!context) {
|
|
178
|
+
throw new Error('ListSectionHeader must be used inside ListSection');
|
|
179
|
+
}
|
|
180
|
+
return (_jsx("div", { id: context.headerId, "data-slot": "list-section-header", className: cn('text-muted-foreground px-2.5 py-1 text-xs font-medium', className), ...props }));
|
|
181
|
+
}
|
|
171
182
|
function ListItem({ className, children, value, disabled = false, onClick, onDoubleClick, onFocus, ref, role, ...props }) {
|
|
172
183
|
const context = useListContext('ListItem');
|
|
173
184
|
const { registerItem } = context;
|
|
@@ -221,4 +232,4 @@ function ListItemDescription({ className, ...props }) {
|
|
|
221
232
|
function ListItemActions({ className, ...props }) {
|
|
222
233
|
return (_jsx("div", { "data-slot": "list-item-actions", className: cn('ml-auto flex shrink-0 items-center gap-1', className), ...props }));
|
|
223
234
|
}
|
|
224
|
-
export { List, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemTitle, };
|
|
235
|
+
export { List, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemTitle, ListSection, ListSectionHeader, };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
3
|
+
declare const materialVariants: (props?: ({
|
|
4
|
+
shape?: "circle" | "rounded" | "capsule" | null | undefined;
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
+
export type MaterialVariant = 'regular' | 'clear';
|
|
7
|
+
export type MaterialShape = NonNullable<VariantProps<typeof materialVariants>['shape']>;
|
|
8
|
+
export type MaterialElevation = 'none' | 'panel' | 'overlay';
|
|
9
|
+
export interface MaterialProps extends React.ComponentPropsWithoutRef<'div'>, VariantProps<typeof materialVariants> {
|
|
10
|
+
/**
|
|
11
|
+
* `regular` is the default for toolbars and control chrome. Reserve `clear`
|
|
12
|
+
* for compact controls floating above media or a richly colored canvas.
|
|
13
|
+
*/
|
|
14
|
+
variant?: MaterialVariant;
|
|
15
|
+
elevation?: MaterialElevation;
|
|
16
|
+
interactive?: boolean;
|
|
17
|
+
asChild?: boolean;
|
|
18
|
+
}
|
|
19
|
+
declare function Material({ asChild, className, elevation, interactive, shape, variant, ...props }: MaterialProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
declare const materialGroupSpacing: {
|
|
21
|
+
readonly compact: "gap-0.5 p-0.5";
|
|
22
|
+
readonly default: "gap-1 p-1";
|
|
23
|
+
readonly comfortable: "gap-1.5 p-1.5";
|
|
24
|
+
};
|
|
25
|
+
export interface MaterialGroupProps extends Omit<MaterialProps, 'asChild' | 'interactive'> {
|
|
26
|
+
spacing?: keyof typeof materialGroupSpacing;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A single sampled material layer for a related control cluster. Children
|
|
30
|
+
* should be ordinary transparent or ghost controls, not nested Materials.
|
|
31
|
+
*/
|
|
32
|
+
declare function MaterialGroup({ className, spacing, ...props }: MaterialGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export { Material, MaterialGroup, materialVariants };
|
|
34
|
+
//# sourceMappingURL=material.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material.d.ts","sourceRoot":"","sources":["../../../src/components/ui/material.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,gBAAgB;;8EAWpB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,CAAA;AACjD,MAAM,MAAM,aAAa,GAAG,WAAW,CACrC,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAC/C,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;AAE5D,MAAM,WAAW,aACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAC3C,YAAY,CAAC,OAAO,gBAAgB,CAAC;IACvC;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,iBAAiB,CAAA;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,iBAAS,QAAQ,CAAC,EAChB,OAAe,EACf,SAAS,EACT,SAAmB,EACnB,WAAmB,EACnB,KAAK,EACL,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,aAAa,2CAcf;AAED,QAAA,MAAM,oBAAoB;;;;CAIhB,CAAA;AAEV,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,aAAa,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,OAAO,oBAAoB,CAAA;CAC5C;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,kBAAkB,2CAYpB;AAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
4
|
+
import { cn } from '../../lib/utils';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
const materialVariants = cva('moldable-material border text-inherit', {
|
|
7
|
+
variants: {
|
|
8
|
+
shape: {
|
|
9
|
+
rounded: 'rounded-overlay',
|
|
10
|
+
capsule: 'rounded-full',
|
|
11
|
+
circle: 'aspect-square rounded-full',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
defaultVariants: {
|
|
15
|
+
shape: 'rounded',
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
function Material({ asChild = false, className, elevation = 'panel', interactive = false, shape, variant = 'regular', ...props }) {
|
|
19
|
+
const Comp = asChild ? Slot : 'div';
|
|
20
|
+
return (_jsx(Comp, { "data-slot": asChild ? undefined : 'material', "data-material": variant, "data-material-elevation": elevation, "data-material-interactive": interactive || undefined, "data-material-shape": shape ?? 'rounded', className: cn(materialVariants({ shape }), className), ...props }));
|
|
21
|
+
}
|
|
22
|
+
const materialGroupSpacing = {
|
|
23
|
+
compact: 'gap-0.5 p-0.5',
|
|
24
|
+
default: 'gap-1 p-1',
|
|
25
|
+
comfortable: 'gap-1.5 p-1.5',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* A single sampled material layer for a related control cluster. Children
|
|
29
|
+
* should be ordinary transparent or ghost controls, not nested Materials.
|
|
30
|
+
*/
|
|
31
|
+
function MaterialGroup({ className, spacing = 'default', ...props }) {
|
|
32
|
+
return (_jsx(Material, { "data-slot": "material-group", className: cn('inline-flex min-w-0 items-center', materialGroupSpacing[spacing], className), ...props }));
|
|
33
|
+
}
|
|
34
|
+
export { Material, MaterialGroup, materialVariants };
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { MessageScrollerPolicy } from './message-scroller-policy';
|
|
2
|
+
export type MessageScrollerDefaultScrollPosition = 'start' | 'end' | 'last-anchor';
|
|
3
|
+
export type MessageScrollerScrollAlign = 'start' | 'center' | 'end' | 'nearest';
|
|
4
|
+
export type MessageScrollerScrollOptions = {
|
|
5
|
+
align?: MessageScrollerScrollAlign;
|
|
6
|
+
behavior?: ScrollBehavior;
|
|
7
|
+
scrollMargin?: number;
|
|
8
|
+
};
|
|
9
|
+
export type MessageScrollerScrollable = {
|
|
10
|
+
start: boolean;
|
|
11
|
+
end: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type MessageScrollerVisibilityState = {
|
|
14
|
+
currentAnchorId: string | null;
|
|
15
|
+
visibleMessageIds: string[];
|
|
16
|
+
};
|
|
17
|
+
export interface MessageScrollerControllerOptions {
|
|
18
|
+
autoScroll: boolean;
|
|
19
|
+
defaultScrollPosition: MessageScrollerDefaultScrollPosition;
|
|
20
|
+
scrollEdgeThreshold: number;
|
|
21
|
+
scrollPreviousItemPeek: number;
|
|
22
|
+
scrollMargin: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ExternalStore<T> {
|
|
25
|
+
getSnapshot: () => T;
|
|
26
|
+
hasListeners: () => boolean;
|
|
27
|
+
setSnapshot: (next: T) => void;
|
|
28
|
+
subscribe: (listener: () => void, onFirst?: () => void, onLast?: () => void) => () => void;
|
|
29
|
+
}
|
|
30
|
+
export declare function createExternalStore<T>(initial: T, isEqual: (a: T, b: T) => boolean): ExternalStore<T>;
|
|
31
|
+
export type ReadingLeaf = {
|
|
32
|
+
element: HTMLElement;
|
|
33
|
+
top: number;
|
|
34
|
+
bottom: number;
|
|
35
|
+
};
|
|
36
|
+
export declare function isMessageScrollerAtEnd(viewport: HTMLElement, threshold: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Snapshot of the stable leaves the reader can currently see, preferring
|
|
39
|
+
* fine-grained `[data-message-scroll-anchor]` leaves (their tops do not move
|
|
40
|
+
* when a disclosure collapses inside the same message) over whole items.
|
|
41
|
+
*/
|
|
42
|
+
export declare function captureReadingLeaves(viewport: HTMLElement, content: HTMLElement, items: HTMLElement[]): ReadingLeaf[];
|
|
43
|
+
/**
|
|
44
|
+
* Re-pins the first still-visible captured leaf after content above it
|
|
45
|
+
* changed size. Native scroll anchoring may already have compensated; the
|
|
46
|
+
* measured delta is zero then and this is deliberately a no-op.
|
|
47
|
+
*/
|
|
48
|
+
export declare function restoreReadingLeaves(viewport: HTMLElement, leaves: readonly ReadingLeaf[]): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* The single DOM-side owner of transcript scrolling. Every behavior that can
|
|
51
|
+
* move the viewport — follow-the-end, turn anchoring, prepend preservation,
|
|
52
|
+
* reading-position stability while rows above collapse — routes through this
|
|
53
|
+
* controller and its {@link MessageScrollerPolicy}, so nothing here can fight
|
|
54
|
+
* the reader (or another controller) for the scroll position.
|
|
55
|
+
*/
|
|
56
|
+
export declare class MessageScrollerController {
|
|
57
|
+
readonly scrollableStore: ExternalStore<MessageScrollerScrollable>;
|
|
58
|
+
readonly visibilityStore: ExternalStore<MessageScrollerVisibilityState>;
|
|
59
|
+
policy: MessageScrollerPolicy;
|
|
60
|
+
options: MessageScrollerControllerOptions;
|
|
61
|
+
preserveScrollOnPrepend: boolean;
|
|
62
|
+
private root;
|
|
63
|
+
private viewport;
|
|
64
|
+
private content;
|
|
65
|
+
private spacer;
|
|
66
|
+
private readonly messageElements;
|
|
67
|
+
private readonly handledTurnAnchors;
|
|
68
|
+
private readonly visibleMessageIds;
|
|
69
|
+
private readonly warmedItems;
|
|
70
|
+
private lastScrollTop;
|
|
71
|
+
private previousFirstItem;
|
|
72
|
+
private previousItemCount;
|
|
73
|
+
private anchoredElement;
|
|
74
|
+
private trackedFirstVisible;
|
|
75
|
+
private readingLeaves;
|
|
76
|
+
private pendingScrollToMessage;
|
|
77
|
+
private defaultPositionApplied;
|
|
78
|
+
private spacerHeight;
|
|
79
|
+
private spacerGap;
|
|
80
|
+
private programmaticDeadline;
|
|
81
|
+
private stateFrame;
|
|
82
|
+
private visibilityFrame;
|
|
83
|
+
private warmupHandle;
|
|
84
|
+
private warmupUsesIdleCallback;
|
|
85
|
+
private intersectionObserver;
|
|
86
|
+
constructor(options: MessageScrollerControllerOptions);
|
|
87
|
+
get viewportElement(): HTMLElement | null;
|
|
88
|
+
setRoot(element: HTMLElement | null): void;
|
|
89
|
+
setViewport(element: HTMLElement | null): void;
|
|
90
|
+
setContent(element: HTMLElement | null): void;
|
|
91
|
+
setSpacer(element: HTMLElement | null): void;
|
|
92
|
+
registerMessage(messageId: string, element: HTMLElement | null, previous: HTMLElement | null): void;
|
|
93
|
+
scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;
|
|
94
|
+
scrollToStart: (options?: MessageScrollerScrollOptions) => boolean;
|
|
95
|
+
scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;
|
|
96
|
+
scrollToElement(element: HTMLElement, options?: MessageScrollerScrollOptions, { keepPreviousPeek }?: {
|
|
97
|
+
keepPreviousPeek?: boolean;
|
|
98
|
+
}): boolean;
|
|
99
|
+
handleScroll(): void;
|
|
100
|
+
handleWheel(deltaY: number): void;
|
|
101
|
+
handleTouchMove(): void;
|
|
102
|
+
handleScrollKey(): void;
|
|
103
|
+
/**
|
|
104
|
+
* 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.
|
|
107
|
+
*/
|
|
108
|
+
handleResize(): void;
|
|
109
|
+
/** Children of the content element changed. Runs before the next paint. */
|
|
110
|
+
handleContentMutation(): void;
|
|
111
|
+
observeVisibility(): void;
|
|
112
|
+
unobserveVisibility(): void;
|
|
113
|
+
resetDefaultPosition(): void;
|
|
114
|
+
updateOptions(options: MessageScrollerControllerOptions): void;
|
|
115
|
+
destroy(): void;
|
|
116
|
+
private applyDefaultPosition;
|
|
117
|
+
private anchorTurn;
|
|
118
|
+
private markTurnAnchorsHandled;
|
|
119
|
+
/**
|
|
120
|
+
* Older rows were inserted above the reader. Compensate the scroll offset
|
|
121
|
+
* by the tracked first-visible row's displacement in the same mutation
|
|
122
|
+
* pass, before the shifted layout can paint.
|
|
123
|
+
*/
|
|
124
|
+
private preservePrependPosition;
|
|
125
|
+
private performScroll;
|
|
126
|
+
/**
|
|
127
|
+
* Snapshot of stable leaves the reader can see. When a disclosure above
|
|
128
|
+
* them collapses (or a hidden row re-measures), the first still-visible
|
|
129
|
+
* leaf is re-pinned so the text under the reader's eyes never shifts.
|
|
130
|
+
*/
|
|
131
|
+
private snapshotReadingLeaves;
|
|
132
|
+
private restoreReadingPosition;
|
|
133
|
+
private trackFirstVisibleItem;
|
|
134
|
+
private scheduleStateCommit;
|
|
135
|
+
/**
|
|
136
|
+
* Once per frame: publish the scrollable edges and refresh the geometry
|
|
137
|
+
* snapshots (tracked first-visible row, reading leaves) that prepend
|
|
138
|
+
* preservation and reading-position restores compare against. Capturing
|
|
139
|
+
* here — instead of on every scroll event — bounds rect reads to one pass
|
|
140
|
+
* per frame.
|
|
141
|
+
*/
|
|
142
|
+
private commitFrameState;
|
|
143
|
+
private applyStateAttributes;
|
|
144
|
+
private scheduleVisibilitySync;
|
|
145
|
+
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
|
+
private flushPendingScrollToMessage;
|
|
158
|
+
private setSpacerHeight;
|
|
159
|
+
private itemChildren;
|
|
160
|
+
private isAtEnd;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=message-scroller-controller.d.ts.map
|
|
@@ -0,0 +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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"}
|