@astryxdesign/core 0.7.6-canary.d18fdaa → 0.7.6-canary.d29d841
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/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +6 -2
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +36 -9
- package/dist/BottomSheet/useSheetGestures.d.ts +36 -6
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +67 -10
- package/dist/Breadcrumbs/BreadcrumbItem.js +4 -2
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +10 -5
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +1 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +3 -1
- package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
- package/dist/Chat/ChatPastedTextToken.js +15 -4
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +2 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +5 -2
- package/dist/CheckboxList/CheckboxListContext.d.ts +8 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +5 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +8 -5
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +10 -15
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +19 -8
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +9 -3
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +5 -13
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +10 -5
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +27 -2
- package/dist/Item/Item.js +5 -5
- package/dist/Item/ItemSwipeLayer.d.ts.map +1 -1
- package/dist/Item/ItemSwipeLayer.js +8 -2
- package/dist/Layer/useTouchTrigger.d.ts +26 -3
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +79 -10
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +1 -0
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +2 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +2 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +15 -14
- package/dist/Popover/Popover.js +2 -2
- package/dist/Popover/usePopover.d.ts +7 -1
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +8 -2
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +7 -2
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +8 -2
- package/dist/RadioList/RadioListReasonContext.d.ts +2 -0
- package/dist/RadioList/RadioListReasonContext.d.ts.map +1 -0
- package/dist/RadioList/RadioListReasonContext.js +22 -0
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +53 -10
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +22 -5
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +16 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +4 -1
- package/dist/Selector/useSelectorPresentation.d.ts +7 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +2 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +18 -7
- package/dist/Table/glidingDivider.d.ts +8 -1
- package/dist/Table/glidingDivider.d.ts.map +1 -1
- package/dist/Table/glidingDivider.js +8 -3
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -2
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +8 -2
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +8 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +57 -49
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +8 -14
- package/dist/Typeahead/BaseTypeahead.d.ts +4 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +253 -41
- package/dist/Typeahead/index.d.ts +1 -1
- package/dist/Typeahead/index.d.ts.map +1 -1
- package/dist/Typeahead/types.d.ts +26 -3
- package/dist/Typeahead/types.d.ts.map +1 -1
- package/dist/astryx.css +0 -1
- package/dist/gestures/haptics.d.ts.map +1 -1
- package/dist/gestures/haptics.js +1 -5
- package/dist/hooks/menuPressMarker.d.ts +13 -0
- package/dist/hooks/menuPressMarker.d.ts.map +1 -0
- package/dist/hooks/menuPressMarker.js +15 -0
- package/dist/hooks/useClickableContainer.d.ts +24 -4
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +41 -14
- package/dist/hooks/useFocusReturnVisibility.d.ts +8 -1
- package/dist/hooks/useFocusReturnVisibility.d.ts.map +1 -1
- package/dist/hooks/useFocusReturnVisibility.js +14 -8
- package/dist/hooks/useListFocus.d.ts +19 -0
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +26 -1
- package/dist/hooks/useMenuPress.d.ts +2 -2
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +5 -6
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +38 -2
- package/dist/privateAttributes/segmentDisabled.stylex.d.ts +5 -0
- package/dist/privateAttributes/segmentDisabled.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/segmentDisabled.stylex.js +28 -0
- package/dist/theme/Theme.d.ts +10 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +8 -4
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +7 -1
- package/dist/utils/focusReturn.d.ts +5 -3
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +6 -4
- package/dist/utils/interactionModality.d.ts +78 -7
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +125 -42
- package/dist/utils/pressDisabled.d.ts +21 -0
- package/dist/utils/pressDisabled.d.ts.map +1 -0
- package/dist/utils/pressDisabled.js +32 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +5 -3
- package/package.json +5 -4
- package/src/BottomSheet/BottomSheet.tsx +4 -2
- package/src/BottomSheet/BottomSheetPanel.tsx +39 -8
- package/src/BottomSheet/useSheetGestures.ts +92 -15
- package/src/Breadcrumbs/BreadcrumbItem.tsx +2 -1
- package/src/Chat/ChatComposer.tsx +7 -10
- package/src/Chat/ChatLayout.tsx +1 -6
- package/src/Chat/ChatMessageList.tsx +1 -0
- package/src/Chat/ChatPastedTextToken.tsx +14 -4
- package/src/Chat/ChatSystemMessage.tsx +4 -1
- package/src/Chat/ChatToolCalls.tsx +5 -0
- package/src/CheckboxList/CheckboxList.tsx +7 -1
- package/src/CheckboxList/CheckboxListContext.tsx +8 -0
- package/src/CheckboxList/CheckboxListItem.tsx +8 -2
- package/src/CommandPalette/CommandPaletteInput.tsx +5 -8
- package/src/Dialog/Dialog.tsx +9 -25
- package/src/DropdownMenu/DropdownMenu.tsx +24 -9
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +3 -1
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -3
- package/src/Field/FieldLabel.spec.md +68 -60
- package/src/Field/FieldLabel.tsx +4 -22
- package/src/Field/PanelSearchInput.tsx +7 -8
- package/src/FileInput/FileInput.tsx +29 -1
- package/src/HoverCard/HoverCard.doc.mjs +3 -3
- package/src/HoverCard/HoverCard.spec.md +98 -39
- package/src/HoverCard/useHoverCard.doc.mjs +1 -1
- package/src/InfoTip/InfoTip.spec.md +193 -0
- package/src/Item/Item.tsx +5 -5
- package/src/Item/ItemSwipeLayer.tsx +8 -1
- package/src/Layer/useTouchTrigger.ts +106 -17
- package/src/Layout/LayoutPanel.spec.md +60 -38
- package/src/Markdown/Markdown.tsx +1 -0
- package/src/MetadataList/MetadataList.tsx +4 -2
- package/src/MetadataList/MetadataListItem.tsx +2 -1
- package/src/MultiSelector/MultiSelector.tsx +36 -29
- package/src/Popover/Popover.tsx +2 -2
- package/src/Popover/usePopover.tsx +7 -2
- package/src/RadioList/RadioList.tsx +13 -2
- package/src/RadioList/RadioListItem.tsx +9 -1
- package/src/RadioList/RadioListReasonContext.ts +25 -0
- package/src/Resizable/Resizable.spec.md +41 -33
- package/src/Resizable/useResizable.ts +50 -7
- package/src/SegmentedControl/SegmentedControl.spec.md +36 -39
- package/src/SegmentedControl/SegmentedControl.tsx +43 -8
- package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
- package/src/SegmentedControl/SegmentedControlItem.spec.md +1 -1
- package/src/SegmentedControl/SegmentedControlItem.tsx +12 -1
- package/src/Selector/Selector.tsx +4 -0
- package/src/Selector/useSelectorPresentation.ts +8 -1
- package/src/SideNav/SideNav.spec.md +8 -8
- package/src/Slider/Slider.spec.md +18 -18
- package/src/Slider/Slider.tsx +15 -10
- package/src/StatusDot/StatusDot.spec.md +77 -54
- package/src/Table/glidingDivider.ts +8 -3
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Toast/useToast.tsx +8 -3
- package/src/ToggleButton/ToggleButton.tsx +9 -3
- package/src/Tokenizer/Tokenizer.doc.mjs +12 -8
- package/src/Tokenizer/Tokenizer.tsx +69 -51
- package/src/Tokenizer/TokenizerBottomSheet.tsx +8 -14
- package/src/Tooltip/Tooltip.doc.mjs +3 -3
- package/src/Tooltip/Tooltip.spec.md +139 -41
- package/src/Tooltip/useTooltip.doc.mjs +1 -1
- package/src/Typeahead/BaseTypeahead.doc.mjs +7 -4
- package/src/Typeahead/BaseTypeahead.tsx +296 -38
- package/src/Typeahead/Typeahead.doc.mjs +21 -4
- package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
- package/src/Typeahead/index.ts +1 -1
- package/src/Typeahead/types.ts +27 -3
- package/src/gestures/haptics.ts +1 -8
- package/src/hooks/menuPressMarker.ts +15 -0
- package/src/hooks/useClickableContainer.ts +48 -17
- package/src/hooks/useFocusReturnVisibility.ts +15 -12
- package/src/hooks/useListFocus.ts +38 -1
- package/src/hooks/useMenuPress.ts +5 -5
- package/src/motion/animator.ts +55 -2
- package/src/privateAttributes/segmentDisabled.stylex.ts +28 -0
- package/src/theme/Theme.tsx +8 -4
- package/src/theme/useTheme.ts +6 -1
- package/src/utils/focusReturn.ts +6 -4
- package/src/utils/interactionModality.ts +165 -44
- package/src/utils/pressDisabled.ts +32 -0
- package/src/utils/pressFeedback.ts +5 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AAEH,OAAO,EAOL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AAEH,OAAO,EAOL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAuDhD,YAAY,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAsJhF,UAAU,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB,wGAAwG;IACxG,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,sBAAsB;IAC/D;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAC1B,0BAA0B,GAAG,wBAAwB,CAAC;AAo0BxD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA6BlD;yBA7Be,WAAW"}
|
|
@@ -82,6 +82,7 @@ import "../theme/tokens.stylex.js";
|
|
|
82
82
|
import { colorVars, durationVars, easeVars, spacingVars } from "../theme/tokens.stylex.js";
|
|
83
83
|
import { useDevWarning } from "../hooks/useDevWarning.js";
|
|
84
84
|
import { useScrollLock } from "../hooks/useScrollLock.js";
|
|
85
|
+
import { useMergedRefs } from "../hooks/useMergedRefs.js";
|
|
85
86
|
import { mergeProps } from "../utils/mergeProps.js";
|
|
86
87
|
import { LayerDepthProvider } from "../Layer/LayerDepthContext.js";
|
|
87
88
|
import { ModalAnnounceProvider } from "../hooks/ModalAnnounceProvider.js";
|
|
@@ -523,7 +524,10 @@ function StandaloneBottomSheet({
|
|
|
523
524
|
}
|
|
524
525
|
triggerRef.current = null;
|
|
525
526
|
}, [finalFocusRef, hasScrim, isOpen]);
|
|
526
|
-
|
|
527
|
+
const {
|
|
528
|
+
ref: modalityRef
|
|
529
|
+
} = useInteractionModalityTracking();
|
|
530
|
+
const dialogComposedRef = useMergedRefs(dialogRef, modalityRef);
|
|
527
531
|
useScrollLock(shouldPresent && hasScrim);
|
|
528
532
|
useDevWarning('BottomSheet', 'requires a non-empty `label` for an accessible name; the open sheet ' + 'has no built-in heading to derive one from.', isOpen && !label);
|
|
529
533
|
|
|
@@ -586,7 +590,7 @@ function StandaloneBottomSheet({
|
|
|
586
590
|
// transforms the dialog: panel, grabber and all shrink and lift as
|
|
587
591
|
// one. The backdrop is not a descendant and stays put.
|
|
588
592
|
...stackPositionerStyles(stackView), hasScrim && styles.scrim, hasScrim && isExiting && styles.scrimClosing, !hasScrim && styles.dialogNonModal),
|
|
589
|
-
ref:
|
|
593
|
+
ref: dialogComposedRef
|
|
590
594
|
// A non-modal sheet is hosted in the top layer as a manual popover
|
|
591
595
|
// (no light dismiss, no backdrop), so sheets order by presentation
|
|
592
596
|
// without a page-level z-index. Below the Popover API floor the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheetPanel.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA+B5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"BottomSheetPanel.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA+B5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAQvB,QAAA,MAAM,cAAc;;;;CAIV,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,cAAc,CAAC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,CAAC;AA+CnC,eAAO,MAAM,2BAA2B,2DACkB,CAAC;AAiN3D,MAAM,MAAM,sBAAsB,GAChC,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAC7B;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,GAChB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GACjC;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;CACzB,GACD;IAAC,IAAI,EAAE,SAAS,CAAA;CAAC,CAAC;AAEtB,UAAU,qBAAsB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAC/D,+CAA+C;IAC/C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACjD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC7D;AA4HD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,KAAK,EACL,eAAe,EACf,MAAM,EACN,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,qBAA4B,EAC5B,kBAA0B,EAC1B,SAAS,EACT,cAAc,EACd,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,qBAAqB,+BAoZvB;yBAzae,gBAAgB"}
|
|
@@ -39,7 +39,7 @@ import { container } from "../Layout/container.stylex.js";
|
|
|
39
39
|
import { containerPaddingBlockEndVarStyles, containerPaddingBlockStartVarStyles, containerPaddingInlineVarStyles, overlayPaddingReset, paddingStyles, spacingStepToToken } from "../Layout/padding.stylex.js";
|
|
40
40
|
import { isValidSnapPoint, resolveSnapPoints } from "./snapOffsets.js";
|
|
41
41
|
import { useMobileKeyboard } from "./useMobileKeyboard.js";
|
|
42
|
-
import { useSheetGestures } from "./useSheetGestures.js";
|
|
42
|
+
import { scrollPreservationPadding, sheetLayoutHeight, useSheetGestures } from "./useSheetGestures.js";
|
|
43
43
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
44
44
|
const HEIGHT_BUDGETS = {
|
|
45
45
|
hug: '92dvh',
|
|
@@ -359,6 +359,9 @@ export function BottomSheetPanel({
|
|
|
359
359
|
};
|
|
360
360
|
}, [snapPointsKey]);
|
|
361
361
|
useDevWarning('BottomSheet', ignoredSnapPointsMessage, ignoredSnapPointsMessage !== '');
|
|
362
|
+
|
|
363
|
+
// A caller's height owns the element's height: the drag never writes it.
|
|
364
|
+
const consumerHeight = style?.height;
|
|
362
365
|
const {
|
|
363
366
|
contentProps,
|
|
364
367
|
handleProps,
|
|
@@ -382,7 +385,8 @@ export function BottomSheetPanel({
|
|
|
382
385
|
offscreenBlockEndInset: OVERSCROLL_PADDING,
|
|
383
386
|
onDismiss,
|
|
384
387
|
snapHeights,
|
|
385
|
-
onScrimOpacity
|
|
388
|
+
onScrimOpacity,
|
|
389
|
+
hasFixedHeight: consumerHeight != null
|
|
386
390
|
});
|
|
387
391
|
const {
|
|
388
392
|
getViewportProps,
|
|
@@ -512,6 +516,8 @@ export function BottomSheetPanel({
|
|
|
512
516
|
// transform — the layout height changes at rest, in one reconciling render
|
|
513
517
|
// whose visible geometry is identical (see useSheetGestures).
|
|
514
518
|
// - dragging above the base restores the full height below the viewport
|
|
519
|
+
// (the move that crosses writes that height to the element itself,
|
|
520
|
+
// so this render only catches up to it)
|
|
515
521
|
// - a peek settles with layout 0, so it slides rather than reflowing
|
|
516
522
|
const layoutOffset = isDragging ? dragOffset < settledOffset ? 0 : settledLayoutOffset : settlingLayoutOffset ?? settledLayoutOffset;
|
|
517
523
|
const activeOffset = isDragging ? dragOffset : settledOffset;
|
|
@@ -522,12 +528,14 @@ export function BottomSheetPanel({
|
|
|
522
528
|
// pinned in px instead: content reflowing mid-gesture would move the
|
|
523
529
|
// surface out from under the finger, or under the snap.
|
|
524
530
|
const isTraveling = isDragging || settlingLayoutOffset != null;
|
|
525
|
-
resizedHeight = layoutOffset > 0 || isTraveling ?
|
|
531
|
+
resizedHeight = layoutOffset > 0 || isTraveling ? sheetLayoutHeight(sheetHeight, layoutOffset) : undefined;
|
|
526
532
|
gestureTransform = translation !== 0 ? `translateY(${translation}px)` : undefined;
|
|
527
533
|
}
|
|
528
534
|
const retainedTransform = alignmentOffset > 0 ? [gestureTransform, `translateY(${alignmentOffset}px)`].filter(Boolean).join(' ') : gestureTransform;
|
|
529
535
|
const sheetTransform = isInteractive ? gestureTransform : isRetained ? retainedTransform : undefined;
|
|
530
536
|
const consumerTransform = style?.transform;
|
|
537
|
+
const hostHeight = isInteractive || isRetained || isClosing ? resizedHeight : undefined;
|
|
538
|
+
const bodyEndPadding = scrollPreservationPadding(scrollPreservationInset);
|
|
531
539
|
// The transform is written to the element here, not rendered through the
|
|
532
540
|
// style prop. A drag writes it straight to the element once per input
|
|
533
541
|
// sample (useSheetGestures) and renders nothing in between, so React never
|
|
@@ -536,20 +544,39 @@ export function BottomSheetPanel({
|
|
|
536
544
|
// the finger left it. Written after every commit instead, outside a drag,
|
|
537
545
|
// the resting value lands in the same style update as the restored
|
|
538
546
|
// transition, so a settle or a dismissal animates from the live position.
|
|
547
|
+
//
|
|
548
|
+
// The height and the scrolling area's end inset are rendered through props,
|
|
549
|
+
// but a drag that crosses its base detent writes them to the elements too.
|
|
550
|
+
// When the release is processed before that move's render commits, React
|
|
551
|
+
// compares the resting values with the ones it committed before the drag,
|
|
552
|
+
// finds them unchanged and writes nothing, so the sheet would stay drawn at
|
|
553
|
+
// the drag's height. They are written here after every commit, outside a
|
|
554
|
+
// drag, for the same reason as the transform. A caller's height is left to
|
|
555
|
+
// the style prop: the drag does not write over it, so there is nothing to
|
|
556
|
+
// restore.
|
|
539
557
|
useLayoutEffect(() => {
|
|
540
|
-
if (isDragging
|
|
558
|
+
if (isDragging) {
|
|
541
559
|
return;
|
|
542
560
|
}
|
|
543
561
|
const element = elementRef.current;
|
|
544
562
|
if (element != null) {
|
|
545
|
-
|
|
563
|
+
if (consumerTransform == null) {
|
|
564
|
+
element.style.transform = sheetTransform ?? '';
|
|
565
|
+
}
|
|
566
|
+
if (consumerHeight == null) {
|
|
567
|
+
element.style.height = hostHeight ?? '';
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
const body = bodyElementRef.current;
|
|
571
|
+
if (body != null) {
|
|
572
|
+
body.style.paddingBlockEnd = bodyEndPadding ?? '';
|
|
546
573
|
}
|
|
547
574
|
});
|
|
548
575
|
const gestureStyle = {
|
|
549
576
|
transition: contentProps.style.transition,
|
|
550
577
|
touchAction: contentProps.style.touchAction,
|
|
551
578
|
overscrollBehavior: contentProps.style.overscrollBehavior,
|
|
552
|
-
height:
|
|
579
|
+
height: hostHeight
|
|
553
580
|
};
|
|
554
581
|
return /*#__PURE__*/_jsxs("div", {
|
|
555
582
|
...props,
|
|
@@ -558,7 +585,7 @@ export function BottomSheetPanel({
|
|
|
558
585
|
...mergeProps(themeProps('bottom-sheet'), stylex.props(layerTextReset.reset, layerStructureReset.reset, styles.sheet, overlayPaddingReset.reset, height === 'hug' ? styles.hugHeight : styles.budget, isClosing && styles.sheetClosing, isClosing && isCrossFade && styles.sheetClosingCrossFade, isFading && styles.sheetFading, isInactive && styles.sheetInactive, xstyle), className, {
|
|
559
586
|
['--_sheet-budget']: budget,
|
|
560
587
|
...(isInteractive ? gestureStyle : isRetained || isClosing ? {
|
|
561
|
-
height:
|
|
588
|
+
height: hostHeight
|
|
562
589
|
} : {}),
|
|
563
590
|
...style
|
|
564
591
|
}),
|
|
@@ -571,9 +598,9 @@ export function BottomSheetPanel({
|
|
|
571
598
|
}), /*#__PURE__*/_jsx("div", {
|
|
572
599
|
...whilePresented(isPresented, getViewportProps({
|
|
573
600
|
...bodyProps,
|
|
574
|
-
...mergeProps(stylex.props(focusOutlineStyles.focusVisible, styles.body, height === 'tall' && styles.tallKeyboardBody),
|
|
601
|
+
...mergeProps(stylex.props(focusOutlineStyles.focusVisible, styles.body, height === 'tall' && styles.tallKeyboardBody), bodyEndPadding != null ? {
|
|
575
602
|
style: {
|
|
576
|
-
paddingBlockEnd:
|
|
603
|
+
paddingBlockEnd: bodyEndPadding
|
|
577
604
|
}
|
|
578
605
|
} : {})
|
|
579
606
|
})),
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file useSheetGestures.ts
|
|
3
3
|
* @input Uses React (useCallback, useEffect, useMemo, useRef, useState)
|
|
4
|
-
* @output Exports useSheetGestures hook
|
|
4
|
+
* @output Exports useSheetGestures hook, its option/result types, and the
|
|
5
|
+
* height and end-inset formats a host renders for the layout split
|
|
5
6
|
* @position Internal to BottomSheet; not exported from the core entry point
|
|
6
7
|
*
|
|
7
8
|
* Drag + snap machinery for the bottom sheet. Tracks a pointer drag down the
|
|
@@ -22,10 +23,18 @@
|
|
|
22
23
|
* A live drag writes that transform straight to the sheet element, once per
|
|
23
24
|
* input sample, and renders nothing: React state changes when the drag begins
|
|
24
25
|
* and ends, and in between only when the layout split changes (a drag that
|
|
25
|
-
* crosses above its base detent restores the full height).
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* crosses above its base detent restores the full height). That crossing
|
|
27
|
+
* changes three things that only look right together: the transform, the
|
|
28
|
+
* sheet's height and the scrolling area's end inset. The move writes all
|
|
29
|
+
* three to the elements in the same task, so the browser paints them in one
|
|
30
|
+
* frame, and the render it schedules catches the host up to the same values
|
|
31
|
+
* whenever it commits; it never decides what the next frame shows. The live
|
|
32
|
+
* offset is readable through `activeOffsetRef`. The host owns the element's
|
|
33
|
+
* transform, height and end inset outside a drag and writes their resting
|
|
34
|
+
* values after each commit (a host with a fixed height of its own keeps that
|
|
35
|
+
* height, and the drag never writes it), so a settle animates from wherever the finger
|
|
36
|
+
* left the sheet, and a release processed before the crossing move's render
|
|
37
|
+
* commits still leaves the sheet drawn at its resting detent.
|
|
29
38
|
*
|
|
30
39
|
* Those are pixels, and the stops behind them are relative to the viewport, so
|
|
31
40
|
* a sheet at rest re-resolves its detent on `resize` / `orientationchange`,
|
|
@@ -66,6 +75,19 @@
|
|
|
66
75
|
* - /packages/core/src/BottomSheet/useSheetGestures.test.ts
|
|
67
76
|
*/
|
|
68
77
|
import { type CSSProperties, type MouseEvent as ReactMouseEvent, type PointerEvent as ReactPointerEvent, type RefObject, type TouchEvent as ReactTouchEvent, type UIEvent as ReactUIEvent } from 'react';
|
|
78
|
+
/**
|
|
79
|
+
* The sheet's height, in px, while it is in motion or rests with a layout
|
|
80
|
+
* split: the fully open height less the part the scrolling area gives up.
|
|
81
|
+
* The host renders it and a live drag writes it; one format keeps the two
|
|
82
|
+
* identical, so the render that follows a written value changes nothing.
|
|
83
|
+
*/
|
|
84
|
+
export declare function sheetLayoutHeight(sheetHeight: number, layoutOffset: number): string;
|
|
85
|
+
/**
|
|
86
|
+
* The scrolling area's end padding that preserves its scroll position across
|
|
87
|
+
* a height change, or nothing when there is none to add. Shared by the host's
|
|
88
|
+
* render and a live drag's write for the same reason as sheetLayoutHeight.
|
|
89
|
+
*/
|
|
90
|
+
export declare function scrollPreservationPadding(inset: number): string | undefined;
|
|
69
91
|
/**
|
|
70
92
|
* Whether a gesture that lands on `target` began inside another layer
|
|
71
93
|
* rendered in this sheet's content — a `<dialog>` between the target and the
|
|
@@ -141,6 +163,14 @@ export interface UseSheetGesturesOptions {
|
|
|
141
163
|
* on the dismiss overshoot. Lets the owner mirror it onto the scrim.
|
|
142
164
|
*/
|
|
143
165
|
onScrimOpacity?: (opacity: number) => void;
|
|
166
|
+
/**
|
|
167
|
+
* Whether the host draws the sheet at a fixed height of its own (a caller's
|
|
168
|
+
* height) rather than the layout-split height. A drag across the base
|
|
169
|
+
* detent then writes only the transform and the end inset, and leaves the
|
|
170
|
+
* element's height to the host.
|
|
171
|
+
* @default false
|
|
172
|
+
*/
|
|
173
|
+
hasFixedHeight?: boolean;
|
|
144
174
|
}
|
|
145
175
|
export interface SheetContentProps {
|
|
146
176
|
style: CSSProperties;
|
|
@@ -260,5 +290,5 @@ export interface UseSheetGesturesResult {
|
|
|
260
290
|
* </div>
|
|
261
291
|
* ```
|
|
262
292
|
*/
|
|
263
|
-
export declare function useSheetGestures({ isOpen, isOpenRequested, canDismiss, offscreenBlockEndInset, onDismiss, snapHeights, onSnap, onScrimOpacity, }: UseSheetGesturesOptions): UseSheetGesturesResult;
|
|
293
|
+
export declare function useSheetGestures({ isOpen, isOpenRequested, canDismiss, offscreenBlockEndInset, onDismiss, snapHeights, onSnap, onScrimOpacity, hasFixedHeight, }: UseSheetGesturesOptions): UseSheetGesturesResult;
|
|
264
294
|
//# sourceMappingURL=useSheetGestures.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSheetGestures.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/useSheetGestures.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"useSheetGestures.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/useSheetGestures.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useSheetGestures.ts
|
|
7
7
|
* @input Uses React (useCallback, useEffect, useMemo, useRef, useState)
|
|
8
|
-
* @output Exports useSheetGestures hook
|
|
8
|
+
* @output Exports useSheetGestures hook, its option/result types, and the
|
|
9
|
+
* height and end-inset formats a host renders for the layout split
|
|
9
10
|
* @position Internal to BottomSheet; not exported from the core entry point
|
|
10
11
|
*
|
|
11
12
|
* Drag + snap machinery for the bottom sheet. Tracks a pointer drag down the
|
|
@@ -26,10 +27,18 @@
|
|
|
26
27
|
* A live drag writes that transform straight to the sheet element, once per
|
|
27
28
|
* input sample, and renders nothing: React state changes when the drag begins
|
|
28
29
|
* and ends, and in between only when the layout split changes (a drag that
|
|
29
|
-
* crosses above its base detent restores the full height).
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* crosses above its base detent restores the full height). That crossing
|
|
31
|
+
* changes three things that only look right together: the transform, the
|
|
32
|
+
* sheet's height and the scrolling area's end inset. The move writes all
|
|
33
|
+
* three to the elements in the same task, so the browser paints them in one
|
|
34
|
+
* frame, and the render it schedules catches the host up to the same values
|
|
35
|
+
* whenever it commits; it never decides what the next frame shows. The live
|
|
36
|
+
* offset is readable through `activeOffsetRef`. The host owns the element's
|
|
37
|
+
* transform, height and end inset outside a drag and writes their resting
|
|
38
|
+
* values after each commit (a host with a fixed height of its own keeps that
|
|
39
|
+
* height, and the drag never writes it), so a settle animates from wherever the finger
|
|
40
|
+
* left the sheet, and a release processed before the crossing move's render
|
|
41
|
+
* commits still leaves the sheet drawn at its resting detent.
|
|
33
42
|
*
|
|
34
43
|
* Those are pixels, and the stops behind them are relative to the viewport, so
|
|
35
44
|
* a sheet at rest re-resolves its detent on `resize` / `orientationchange`,
|
|
@@ -172,6 +181,25 @@ function magnetize(value, targets) {
|
|
|
172
181
|
function preservationInsetForOffset(baseOffset, targetOffset, naturalEndGap) {
|
|
173
182
|
return Math.max(0, baseOffset - targetOffset - naturalEndGap);
|
|
174
183
|
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The sheet's height, in px, while it is in motion or rests with a layout
|
|
187
|
+
* split: the fully open height less the part the scrolling area gives up.
|
|
188
|
+
* The host renders it and a live drag writes it; one format keeps the two
|
|
189
|
+
* identical, so the render that follows a written value changes nothing.
|
|
190
|
+
*/
|
|
191
|
+
export function sheetLayoutHeight(sheetHeight, layoutOffset) {
|
|
192
|
+
return `${Math.max(0, sheetHeight - Math.max(0, layoutOffset))}px`;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* The scrolling area's end padding that preserves its scroll position across
|
|
197
|
+
* a height change, or nothing when there is none to add. Shared by the host's
|
|
198
|
+
* render and a live drag's write for the same reason as sheetLayoutHeight.
|
|
199
|
+
*/
|
|
200
|
+
export function scrollPreservationPadding(inset) {
|
|
201
|
+
return inset > 0 ? `${inset}px` : undefined;
|
|
202
|
+
}
|
|
175
203
|
function renderedBlockEndPadding(element) {
|
|
176
204
|
const value = Number.parseFloat(getComputedStyle(element).paddingBlockEnd);
|
|
177
205
|
return Number.isFinite(value) ? value : 0;
|
|
@@ -299,7 +327,8 @@ export function useSheetGestures({
|
|
|
299
327
|
onDismiss,
|
|
300
328
|
snapHeights,
|
|
301
329
|
onSnap,
|
|
302
|
-
onScrimOpacity
|
|
330
|
+
onScrimOpacity,
|
|
331
|
+
hasFixedHeight = false
|
|
303
332
|
}) {
|
|
304
333
|
const [dragOffset, setDragOffset] = useState(0);
|
|
305
334
|
const [settledOffset, setSettledOffset] = useState(0);
|
|
@@ -416,11 +445,13 @@ export function useSheetGestures({
|
|
|
416
445
|
const canDismissRef = useRef(canDismiss);
|
|
417
446
|
const onSnapRef = useRef(onSnap);
|
|
418
447
|
const onScrimOpacityRef = useRef(onScrimOpacity);
|
|
448
|
+
const hasFixedHeightRef = useRef(hasFixedHeight);
|
|
419
449
|
useEffect(() => {
|
|
420
450
|
onDismissRef.current = onDismiss;
|
|
421
451
|
canDismissRef.current = canDismiss;
|
|
422
452
|
onSnapRef.current = onSnap;
|
|
423
453
|
onScrimOpacityRef.current = onScrimOpacity;
|
|
454
|
+
hasFixedHeightRef.current = hasFixedHeight;
|
|
424
455
|
});
|
|
425
456
|
|
|
426
457
|
// Live drag bookkeeping (refs so pointermove doesn't churn renders).
|
|
@@ -642,6 +673,27 @@ export function useSheetGestures({
|
|
|
642
673
|
const translation = offset - layoutOffset;
|
|
643
674
|
element.style.transform = translation !== 0 ? `translateY(${translation}px)` : '';
|
|
644
675
|
}, []);
|
|
676
|
+
|
|
677
|
+
// A live drag's layout split moved. The transform written beside this call
|
|
678
|
+
// is only correct on the new split, so the height and end inset that pair
|
|
679
|
+
// with it go to the elements in the same task. They are the values the host
|
|
680
|
+
// renders from the state this move also sets, in the same format, so its
|
|
681
|
+
// commit, whenever it lands, leaves them as they are. If the drag ends
|
|
682
|
+
// before that commit, the host's post-commit write puts the resting values
|
|
683
|
+
// back, since React sees no change from what it committed before the drag.
|
|
684
|
+
// A host with a fixed height of its own renders that height throughout and
|
|
685
|
+
// never restores a written one, so its height is not written.
|
|
686
|
+
const writeLiveLayout = useCallback((sheetHeight, layoutOffset) => {
|
|
687
|
+
const element = sheetElRef.current;
|
|
688
|
+
// Unmeasured, the host renders no height to pair with.
|
|
689
|
+
if (element != null && sheetHeight > 0 && !hasFixedHeightRef.current) {
|
|
690
|
+
element.style.height = sheetLayoutHeight(sheetHeight, layoutOffset);
|
|
691
|
+
}
|
|
692
|
+
const body = bodyNodeRef.current;
|
|
693
|
+
if (body != null) {
|
|
694
|
+
body.style.paddingBlockEnd = scrollPreservationPadding(scrollPreservationInsetRef.current) ?? '';
|
|
695
|
+
}
|
|
696
|
+
}, []);
|
|
645
697
|
const cancelDrag = useCallback(target => {
|
|
646
698
|
const state = dragStateRef.current;
|
|
647
699
|
if (state == null) {
|
|
@@ -863,17 +915,22 @@ export function useSheetGestures({
|
|
|
863
915
|
state.renderedOffset = next;
|
|
864
916
|
state.layoutOffset = layoutOffset;
|
|
865
917
|
activeOffsetRef.current = next;
|
|
918
|
+
updateScrollPreservationInset(preservationInsetForOffset(state.baseLayoutOffset, layoutOffset, state.naturalEndGap));
|
|
866
919
|
writeLiveTransform(next, layoutOffset);
|
|
867
920
|
if (hasLayoutChanged) {
|
|
868
|
-
// The layout split moved
|
|
869
|
-
// the
|
|
921
|
+
// The layout split moved. The new height and end inset are written
|
|
922
|
+
// with the transform, in this task: a render scheduled normally can
|
|
923
|
+
// commit after the next paint, and the transform alone on the old
|
|
924
|
+
// height would put the sheet the whole split away from the finger
|
|
925
|
+
// for that frame. The host still renders them from state, reading
|
|
926
|
+
// the offset it has to pair with the height from here.
|
|
927
|
+
writeLiveLayout(state.height, layoutOffset);
|
|
870
928
|
setDragOffset(next);
|
|
871
929
|
}
|
|
872
930
|
if (!state.hasTraveled && next !== state.baseOffset) {
|
|
873
931
|
state.hasTraveled = true;
|
|
874
932
|
setIsTraveling(true);
|
|
875
933
|
}
|
|
876
|
-
updateScrollPreservationInset(preservationInsetForOffset(state.baseLayoutOffset, layoutOffset, state.naturalEndGap));
|
|
877
934
|
|
|
878
935
|
// Mirror the scrim to the live drag: full at/above the mid detent,
|
|
879
936
|
// fading to hidden as it collapses onto the peek detent and through the
|
|
@@ -882,7 +939,7 @@ export function useSheetGestures({
|
|
|
882
939
|
const shortestDetentHeight = visibleHeightForOffset(state.height, floorOffset, offscreenBlockEndInsetRef.current);
|
|
883
940
|
const dismissOffset = floorOffset + shortestDetentHeight * DISMISS_OVERSHOOT_RATIO;
|
|
884
941
|
onScrimOpacityRef.current?.(scrimOpacityForOffset(next, offsets, dismissOffset, peekOffset));
|
|
885
|
-
}, [resolveDetents, updateScrollPreservationInset, writeLiveTransform]);
|
|
942
|
+
}, [resolveDetents, updateScrollPreservationInset, writeLiveLayout, writeLiveTransform]);
|
|
886
943
|
const endDrag = useCallback(event => {
|
|
887
944
|
const state = dragStateRef.current;
|
|
888
945
|
if (!state || state.pointerId !== event.pointerId) {
|
|
@@ -356,7 +356,9 @@ function BreadcrumbMenuTrigger({
|
|
|
356
356
|
// The menu's rows move focus with the last input
|
|
357
357
|
// (`architecture:interaction-modality` INV1); this menu has no press model
|
|
358
358
|
// to activate the tracking they read, so it activates it itself.
|
|
359
|
-
|
|
359
|
+
const {
|
|
360
|
+
ref: modalityRef
|
|
361
|
+
} = useInteractionModalityTracking();
|
|
360
362
|
const popover = usePopover({
|
|
361
363
|
hasLightDismiss: true,
|
|
362
364
|
hasCloseButton: false,
|
|
@@ -447,7 +449,7 @@ function BreadcrumbMenuTrigger({
|
|
|
447
449
|
const hasOverflow = useMenuOverflow(listRef, menuContent, popover.isOpen);
|
|
448
450
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
449
451
|
children: [/*#__PURE__*/_jsxs("button", {
|
|
450
|
-
ref: useMergedRefs(ref, buttonRef, popover.triggerRef),
|
|
452
|
+
ref: useMergedRefs(ref, buttonRef, modalityRef, popover.triggerRef),
|
|
451
453
|
type: "button",
|
|
452
454
|
onClick: handleClick,
|
|
453
455
|
onKeyDown: handleKeyDown,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposer.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposer.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA8B5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAC7C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,GAAG,UAAU,CACxB;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAI3B,6GAA6G;IAC7G,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yHAAyH;IACzH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,yGAAyG;IACzG,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gHAAgH;IAChH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,gHAAgH;IAChH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,iEAAiE;IACjE,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,oDAAoD;IACpD,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CACnC;AAoOD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,qBAoOpD;yBApOe,YAAY"}
|
|
@@ -34,8 +34,9 @@ import { ChatSendButton } from "./ChatSendButton.js";
|
|
|
34
34
|
import { themeProps } from "../utils/themeProps.js";
|
|
35
35
|
import { useTranslator } from "../i18n/index.js";
|
|
36
36
|
import { useAnnounceRenderedText } from "../hooks/useAnnounceRenderedText.js";
|
|
37
|
+
import { useMergedRefs } from "../hooks/useMergedRefs.js";
|
|
37
38
|
import { focusOutlineStyles } from "../utils/focusOutline.stylex.js";
|
|
38
|
-
import {
|
|
39
|
+
import { useInteractionModalityTracking } from "../utils/interactionModality.js";
|
|
39
40
|
|
|
40
41
|
// =============================================================================
|
|
41
42
|
// Types
|
|
@@ -142,7 +143,6 @@ export function ChatComposer(props) {
|
|
|
142
143
|
const placeholder = placeholderFromProps ?? t('@astryx.chat.composer.placeholder');
|
|
143
144
|
const [internalValue, setInternalValue] = useState('');
|
|
144
145
|
const [hasKeyboardEditorFocus, setHasKeyboardEditorFocus] = useState(false);
|
|
145
|
-
useInteractionModalityTracking();
|
|
146
146
|
const isControlled = controlledValue !== undefined;
|
|
147
147
|
const currentValue = isControlled ? controlledValue : internalValue;
|
|
148
148
|
const updateValue = useCallback(newValue => {
|
|
@@ -161,6 +161,11 @@ export function ChatComposer(props) {
|
|
|
161
161
|
}, [isDisabled, onSubmit, updateValue]);
|
|
162
162
|
const canSend = currentValue.trim().length > 0 && !isDisabled;
|
|
163
163
|
const bodyRef = useRef(null);
|
|
164
|
+
const {
|
|
165
|
+
ref: modalityRef,
|
|
166
|
+
readModality
|
|
167
|
+
} = useInteractionModalityTracking();
|
|
168
|
+
const bodyComposedRef = useMergedRefs(bodyRef, modalityRef);
|
|
164
169
|
|
|
165
170
|
// Input slot registers its focus (and future) control here so the shell can
|
|
166
171
|
// drive it without knowing its DOM shape. Stable ref — safe in the memoized
|
|
@@ -185,8 +190,8 @@ export function ChatComposer(props) {
|
|
|
185
190
|
editable?.focus();
|
|
186
191
|
}, []);
|
|
187
192
|
const handleBodyFocusCapture = useCallback(event => {
|
|
188
|
-
setHasKeyboardEditorFocus(isComposerEditor(event.target) &&
|
|
189
|
-
}, []);
|
|
193
|
+
setHasKeyboardEditorFocus(isComposerEditor(event.target) && readModality() === 'keyboard');
|
|
194
|
+
}, [readModality]);
|
|
190
195
|
const handleBodyBlurCapture = useCallback(event => {
|
|
191
196
|
if (!event.currentTarget.contains(event.relatedTarget)) {
|
|
192
197
|
setHasKeyboardEditorFocus(false);
|
|
@@ -268,7 +273,7 @@ export function ChatComposer(props) {
|
|
|
268
273
|
}[!!isDisabled << 0], className, style),
|
|
269
274
|
...rest,
|
|
270
275
|
children: [statusPosition === 'top' && statusEl, drawer, /*#__PURE__*/_jsxs("div", {
|
|
271
|
-
ref:
|
|
276
|
+
ref: bodyComposedRef,
|
|
272
277
|
onClick: handleBodyClick,
|
|
273
278
|
onPointerDownCapture: () => setHasKeyboardEditorFocus(false),
|
|
274
279
|
onFocusCapture: handleBodyFocusCapture,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatLayout.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatLayout.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAC,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAc5C,KAAK,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,yCAAyC;IACzC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAEhC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAEhD;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"ChatLayout.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatLayout.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAC,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAc5C,KAAK,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,yCAAyC;IACzC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAEhC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAEhD;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuKD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,QAAQ,EACR,OAAoB,EACpB,UAAU,EACV,YAAY,EACZ,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,eAAe,+BA4GjB;yBAzHe,UAAU"}
|
package/dist/Chat/ChatLayout.js
CHANGED
|
@@ -61,7 +61,6 @@ const styles = {
|
|
|
61
61
|
rootScrollable: {
|
|
62
62
|
kORKVm: "x1odjw0f",
|
|
63
63
|
kXHlph: "x6ikm8r",
|
|
64
|
-
k5wCbM: "x1mqgsch",
|
|
65
64
|
$$css: true
|
|
66
65
|
},
|
|
67
66
|
messageArea: {
|
|
@@ -171,6 +170,7 @@ const styles = {
|
|
|
171
170
|
// =============================================================================
|
|
172
171
|
|
|
173
172
|
function hasVisibleContent(children) {
|
|
173
|
+
// eslint-disable-next-line @astryx/no-nullish-jsx-guard -- component:ChatLayout FR5 names exactly null, undefined, false and an empty array as empty children; '' and true are not
|
|
174
174
|
if (children == null || children === false) {
|
|
175
175
|
return false;
|
|
176
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessageList.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatMessageList.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAC,KAAK,SAAS,EAA4C,MAAM,OAAO,CAAC;AAGhF,OAAO,EAEL,KAAK,WAAW,EAEjB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAKhD,MAAM,WAAW,oBAAqB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACrE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC;IAElB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEzB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA4FD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,OAAoB,EACpB,GAAG,EACH,KAAgB,EAChB,WAAmB,EACnB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,oBAAoB,+
|
|
1
|
+
{"version":3,"file":"ChatMessageList.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatMessageList.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAC,KAAK,SAAS,EAA4C,MAAM,OAAO,CAAC;AAGhF,OAAO,EAEL,KAAK,WAAW,EAEjB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAKhD,MAAM,WAAW,oBAAqB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACrE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC;IAElB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEzB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA4FD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,OAAoB,EACpB,GAAG,EACH,KAAgB,EAChB,WAAmB,EACnB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,oBAAoB,+BAqGtB;yBAnHe,eAAe"}
|
|
@@ -175,7 +175,9 @@ export function ChatMessageList({
|
|
|
175
175
|
return () => layoutContext.contentRef(null);
|
|
176
176
|
}
|
|
177
177
|
}, [layoutContext]);
|
|
178
|
-
const hasChildren =
|
|
178
|
+
const hasChildren =
|
|
179
|
+
// eslint-disable-next-line @astryx/no-nullish-jsx-guard -- component:ChatMessageList FR4 shows the empty state only for nullish, false or an empty top-level array children
|
|
180
|
+
children != null && children !== false && !(Array.isArray(children) && children.length === 0);
|
|
179
181
|
|
|
180
182
|
// IntersectionObserver for scroll-to-top infinite scroll
|
|
181
183
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPastedTextToken.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatPastedTextToken.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatPastedTextToken.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatPastedTextToken.tsx"],"names":[],"mappings":"AAoCA,MAAM,WAAW,wBAAwB;IACvC,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAkDD,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,QAAQ,GACT,EAAE,wBAAwB,+BAqC1B;yBAxCe,mBAAmB"}
|
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file ChatPastedTextToken.tsx
|
|
7
|
-
* @input Uses React, StyleX, Badge, HoverCard, Button, provider-bound translator
|
|
7
|
+
* @input Uses React, StyleX, Badge, HoverCard, Button, provider-bound translator,
|
|
8
|
+
* the shared tap stop (`useTapStop`)
|
|
8
9
|
* @output Exports ChatPastedTextToken component
|
|
9
10
|
* @position Inline token for pasted text with hover card preview + expand
|
|
10
11
|
*
|
|
11
|
-
* Hover: card with truncated text preview and
|
|
12
|
-
* Expand replaces the token with the full text in the
|
|
12
|
+
* Hover, or a tap by finger or pen: card with truncated text preview and
|
|
13
|
+
* "Expand" button. Expand replaces the token with the full text in the
|
|
14
|
+
* contentEditable.
|
|
13
15
|
*
|
|
14
16
|
* SYNC: When modified, update:
|
|
15
17
|
* - /packages/core/src/Chat/index.ts (exports)
|
|
@@ -21,6 +23,7 @@ import { Badge } from "../Badge/index.js";
|
|
|
21
23
|
import { Button } from "../Button/index.js";
|
|
22
24
|
import { HoverCard } from "../HoverCard/index.js";
|
|
23
25
|
import { useTranslator } from "../i18n/index.js";
|
|
26
|
+
import { useTapStop } from "../Layer/useTouchTrigger.js";
|
|
24
27
|
|
|
25
28
|
// =============================================================================
|
|
26
29
|
// Types
|
|
@@ -49,6 +52,13 @@ export function ChatPastedTextToken({
|
|
|
49
52
|
}) {
|
|
50
53
|
const t = useTranslator();
|
|
51
54
|
const label = formatLabel(text, t);
|
|
55
|
+
// A tap on the token, by finger or pen, asks for its preview, so it stops
|
|
56
|
+
// there: cancelling the mouse press the browser makes of it keeps the
|
|
57
|
+
// composer around the token from taking focus and the caret, which on a
|
|
58
|
+
// touch device raises the keyboard over the preview. The tap's click still
|
|
59
|
+
// reaches the card's trigger. A mouse press still places the caret, and
|
|
60
|
+
// hover opens the preview.
|
|
61
|
+
const tapStop = useTapStop('mousedown');
|
|
52
62
|
const cardContent = /*#__PURE__*/_jsxs("div", {
|
|
53
63
|
...{
|
|
54
64
|
className: "x78zum5 xdt5ytf x1txdalj x17fpy1y"
|
|
@@ -82,7 +92,8 @@ export function ChatPastedTextToken({
|
|
|
82
92
|
hasHoverIndication: false,
|
|
83
93
|
children: /*#__PURE__*/_jsx(Badge, {
|
|
84
94
|
label: label,
|
|
85
|
-
variant: "neutral"
|
|
95
|
+
variant: "neutral",
|
|
96
|
+
...tapStop
|
|
86
97
|
})
|
|
87
98
|
});
|
|
88
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatSystemMessage.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatSystemMessage.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatSystemMessage.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatSystemMessage.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAYrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACvE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAEnC;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAwCD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,OAAmB,EACnB,IAAI,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EAAE,SAAS,EAChB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,sBAAsB,+BAmCxB;yBA5Ce,iBAAiB"}
|
|
@@ -22,6 +22,7 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
22
22
|
import "../theme/tokens.stylex.js";
|
|
23
23
|
import { colorVars, spacingVars, typeScaleVars, fontWeightVars, typographyVars } from "../theme/tokens.stylex.js";
|
|
24
24
|
import { mergeProps } from "../utils/index.js";
|
|
25
|
+
import { isRenderable } from "../utils/isRenderable.js";
|
|
25
26
|
import { Divider } from "../Divider/index.js";
|
|
26
27
|
import { themeProps } from "../utils/themeProps.js";
|
|
27
28
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
@@ -103,7 +104,7 @@ export function ChatSystemMessage({
|
|
|
103
104
|
...{
|
|
104
105
|
className: "x3nfvp2 x6s0dn4 x1s4dlld"
|
|
105
106
|
},
|
|
106
|
-
children: [icon
|
|
107
|
+
children: [isRenderable(icon) && /*#__PURE__*/_jsx("span", {
|
|
107
108
|
...{
|
|
108
109
|
className: "x3nfvp2 x6s0dn4 x2lah0s"
|
|
109
110
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatToolCalls.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatToolCalls.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,EAA+B,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA0B5C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6FAA6F;IAC7F,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,+BAA+B;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;
|
|
1
|
+
{"version":3,"file":"ChatToolCalls.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatToolCalls.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,EAA+B,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA0B5C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6FAA6F;IAC7F,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,+BAA+B;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAsbD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,4BAqKtD;yBArKe,aAAa"}
|