@oxy.so/bloom 4.5.0 → 4.6.0
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/README.md +1 -1
- package/docs/adoption-matrix.mdx +12 -12
- package/docs/code.mdx +12 -0
- package/docs/context-menu.mdx +2 -0
- package/docs/dropdown-menu.mdx +21 -0
- package/docs/icons.mdx +2 -2
- package/docs/menubar.mdx +6 -2
- package/docs/popover.mdx +4 -2
- package/docs/segmented-control.mdx +12 -0
- package/docs/select.mdx +19 -0
- package/docs/tabs.mdx +12 -0
- package/lib/commonjs/agent-chat/index.web.js.map +1 -1
- package/lib/commonjs/ai-chat/index.web.js.map +1 -1
- package/lib/commonjs/alert-dialog/index.web.js +10 -1
- package/lib/commonjs/alert-dialog/index.web.js.map +1 -1
- package/lib/commonjs/avatar-group/index.web.js.map +1 -1
- package/lib/commonjs/bottom-sheet/index.web.js.map +1 -1
- package/lib/commonjs/code/index.js +13 -0
- package/lib/commonjs/code/index.js.map +1 -1
- package/lib/commonjs/command/index.web.js +5 -0
- package/lib/commonjs/command/index.web.js.map +1 -1
- package/lib/commonjs/composer-loader/ComposerLoader.web.js +9 -0
- package/lib/commonjs/composer-loader/ComposerLoader.web.js.map +1 -1
- package/lib/commonjs/composer-loader/index.web.js.map +1 -1
- package/lib/commonjs/composer-panel/index.web.js.map +1 -1
- package/lib/commonjs/connection-dots/index.web.js.map +1 -1
- package/lib/commonjs/connection-status/index.web.js.map +1 -1
- package/lib/commonjs/content-panel/index.web.js.map +1 -1
- package/lib/commonjs/context-menu/ContextMenu.web.js +22 -4
- package/lib/commonjs/context-menu/ContextMenu.web.js.map +1 -1
- package/lib/commonjs/context-menu/context.js.map +1 -1
- package/lib/commonjs/context-menu/index.web.js.map +1 -1
- package/lib/commonjs/dialog/Dialog.web.js +14 -0
- package/lib/commonjs/dialog/Dialog.web.js.map +1 -1
- package/lib/commonjs/dialog/index.web.js.map +1 -1
- package/lib/commonjs/dropdown-menu/DropdownMenu.web.js +22 -2
- package/lib/commonjs/dropdown-menu/DropdownMenu.web.js.map +1 -1
- package/lib/commonjs/dropdown-menu/index.web.js.map +1 -1
- package/lib/commonjs/floating/FloatingPanel.js +42 -33
- package/lib/commonjs/floating/FloatingPanel.js.map +1 -1
- package/lib/commonjs/floating/escape-stack.js +90 -0
- package/lib/commonjs/floating/escape-stack.js.map +1 -0
- package/lib/commonjs/floating/menu-keyboard.js +238 -0
- package/lib/commonjs/floating/menu-keyboard.js.map +1 -0
- package/lib/commonjs/floating/menu-sub-flyout.js +28 -16
- package/lib/commonjs/floating/menu-sub-flyout.js.map +1 -1
- package/lib/commonjs/fonts/index.web.js.map +1 -1
- package/lib/commonjs/frosted-icon-button/FrostedIconButton.web.js +10 -0
- package/lib/commonjs/frosted-icon-button/FrostedIconButton.web.js.map +1 -1
- package/lib/commonjs/frosted-icon-button/index.web.js.map +1 -1
- package/lib/commonjs/hooks/roving-focus.js +192 -0
- package/lib/commonjs/hooks/roving-focus.js.map +1 -0
- package/lib/commonjs/hover-card/index.web.js.map +1 -1
- package/lib/commonjs/icons/remix/RiBookReadLine.js +12 -0
- package/lib/commonjs/icons/remix/RiBookReadLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiBugLine.js +12 -0
- package/lib/commonjs/icons/remix/RiBugLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiChat1Line.js +12 -0
- package/lib/commonjs/icons/remix/RiChat1Line.js.map +1 -0
- package/lib/commonjs/icons/remix/RiCloudLine.js +12 -0
- package/lib/commonjs/icons/remix/RiCloudLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiCodeLine.js +12 -0
- package/lib/commonjs/icons/remix/RiCodeLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiCpuLine.js +12 -0
- package/lib/commonjs/icons/remix/RiCpuLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiFloodLine.js +12 -0
- package/lib/commonjs/icons/remix/RiFloodLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiLockUnlockLine.js +12 -0
- package/lib/commonjs/icons/remix/RiLockUnlockLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiMoneyDollarCircleLine.js +12 -0
- package/lib/commonjs/icons/remix/RiMoneyDollarCircleLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiPlayCircleLine.js +12 -0
- package/lib/commonjs/icons/remix/RiPlayCircleLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiRocket2Line.js +12 -0
- package/lib/commonjs/icons/remix/RiRocket2Line.js.map +1 -0
- package/lib/commonjs/icons/remix/RiServerLine.js +12 -0
- package/lib/commonjs/icons/remix/RiServerLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiShareBoxLine.js +12 -0
- package/lib/commonjs/icons/remix/RiShareBoxLine.js.map +1 -0
- package/lib/commonjs/icons/remix/RiTv2Line.js +12 -0
- package/lib/commonjs/icons/remix/RiTv2Line.js.map +1 -0
- package/lib/commonjs/icons/remix/index.js +98 -0
- package/lib/commonjs/icons/remix/index.js.map +1 -1
- package/lib/commonjs/list/index.web.js.map +1 -1
- package/lib/commonjs/loading/Loading.js +21 -157
- package/lib/commonjs/loading/Loading.js.map +1 -1
- package/lib/commonjs/loading/Loading.web.js +23 -157
- package/lib/commonjs/loading/Loading.web.js.map +1 -1
- package/lib/commonjs/loading/LoadingBase.js +202 -0
- package/lib/commonjs/loading/LoadingBase.js.map +1 -0
- package/lib/commonjs/loading/index.web.js.map +1 -1
- package/lib/commonjs/media-flight/index.web.js.map +1 -1
- package/lib/commonjs/menubar/Menubar.js +31 -123
- package/lib/commonjs/menubar/Menubar.js.map +1 -1
- package/lib/commonjs/menubar/Menubar.web.js +33 -114
- package/lib/commonjs/menubar/Menubar.web.js.map +1 -1
- package/lib/commonjs/menubar/MenubarBase.js +154 -0
- package/lib/commonjs/menubar/MenubarBase.js.map +1 -0
- package/lib/commonjs/menubar/index.web.js.map +1 -1
- package/lib/commonjs/popover/index.web.js.map +1 -1
- package/lib/commonjs/popover/parts.js +69 -11
- package/lib/commonjs/popover/parts.js.map +1 -1
- package/lib/commonjs/popover/surface.js +39 -13
- package/lib/commonjs/popover/surface.js.map +1 -1
- package/lib/commonjs/portal/index.web.js.map +1 -1
- package/lib/commonjs/progressive-blur/index.web.js.map +1 -1
- package/lib/commonjs/scroll/index.web.js.map +1 -1
- package/lib/commonjs/segmented-control/SegmentedControl.js +36 -1
- package/lib/commonjs/segmented-control/SegmentedControl.js.map +1 -1
- package/lib/commonjs/select/Select.js +6 -81
- package/lib/commonjs/select/Select.js.map +1 -1
- package/lib/commonjs/select/Select.web.js +147 -85
- package/lib/commonjs/select/Select.web.js.map +1 -1
- package/lib/commonjs/select/index.js +4 -4
- package/lib/commonjs/select/index.js.map +1 -1
- package/lib/commonjs/select/index.web.js +4 -4
- package/lib/commonjs/select/index.web.js.map +1 -1
- package/lib/commonjs/select/shared.js +110 -5
- package/lib/commonjs/select/shared.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarTeamMenu.js +1 -1
- package/lib/commonjs/sidebar/SidebarTeamMenu.js.map +1 -1
- package/lib/commonjs/sidebar/SidebarUserMenu.js +1 -1
- package/lib/commonjs/sidebar/SidebarUserMenu.js.map +1 -1
- package/lib/commonjs/sidebar/parts.js +9 -9
- package/lib/commonjs/sidebar/parts.js.map +1 -1
- package/lib/commonjs/surfaces/SurfaceHost.js +6 -0
- package/lib/commonjs/surfaces/SurfaceHost.js.map +1 -1
- package/lib/commonjs/surfaces/index.web.js +14 -4
- package/lib/commonjs/surfaces/index.web.js.map +1 -1
- package/lib/commonjs/tab-bar/index.web.js +13 -10
- package/lib/commonjs/tab-bar/index.web.js.map +1 -1
- package/lib/commonjs/tabs/Tabs.js +49 -2
- package/lib/commonjs/tabs/Tabs.js.map +1 -1
- package/lib/commonjs/theme/color-scope/index.web.js.map +1 -1
- package/lib/commonjs/theme/seed-scope/index.web.js.map +1 -1
- package/lib/commonjs/tooltip/index.web.js.map +1 -1
- package/lib/module/agent-chat/index.web.js +5 -3
- package/lib/module/agent-chat/index.web.js.map +1 -1
- package/lib/module/ai-chat/index.web.js +5 -2
- package/lib/module/ai-chat/index.web.js.map +1 -1
- package/lib/module/alert-dialog/index.web.js +10 -1
- package/lib/module/alert-dialog/index.web.js.map +1 -1
- package/lib/module/avatar-group/index.web.js +5 -0
- package/lib/module/avatar-group/index.web.js.map +1 -1
- package/lib/module/bottom-sheet/index.web.js +5 -0
- package/lib/module/bottom-sheet/index.web.js.map +1 -1
- package/lib/module/code/index.js +1 -0
- package/lib/module/code/index.js.map +1 -1
- package/lib/module/command/index.web.js +5 -0
- package/lib/module/command/index.web.js.map +1 -1
- package/lib/module/composer-loader/ComposerLoader.web.js +8 -0
- package/lib/module/composer-loader/ComposerLoader.web.js.map +1 -1
- package/lib/module/composer-loader/index.web.js +5 -2
- package/lib/module/composer-loader/index.web.js.map +1 -1
- package/lib/module/composer-panel/index.web.js +5 -3
- package/lib/module/composer-panel/index.web.js.map +1 -1
- package/lib/module/connection-dots/index.web.js +5 -0
- package/lib/module/connection-dots/index.web.js.map +1 -1
- package/lib/module/connection-status/index.web.js +5 -0
- package/lib/module/connection-status/index.web.js.map +1 -1
- package/lib/module/content-panel/index.web.js +5 -0
- package/lib/module/content-panel/index.web.js.map +1 -1
- package/lib/module/context-menu/ContextMenu.web.js +22 -4
- package/lib/module/context-menu/ContextMenu.web.js.map +1 -1
- package/lib/module/context-menu/context.js.map +1 -1
- package/lib/module/context-menu/index.web.js +5 -0
- package/lib/module/context-menu/index.web.js.map +1 -1
- package/lib/module/dialog/Dialog.web.js +13 -0
- package/lib/module/dialog/Dialog.web.js.map +1 -1
- package/lib/module/dialog/index.web.js +7 -11
- package/lib/module/dialog/index.web.js.map +1 -1
- package/lib/module/dropdown-menu/DropdownMenu.web.js +23 -3
- package/lib/module/dropdown-menu/DropdownMenu.web.js.map +1 -1
- package/lib/module/dropdown-menu/index.web.js +5 -0
- package/lib/module/dropdown-menu/index.web.js.map +1 -1
- package/lib/module/floating/FloatingPanel.js +42 -33
- package/lib/module/floating/FloatingPanel.js.map +1 -1
- package/lib/module/floating/escape-stack.js +85 -0
- package/lib/module/floating/escape-stack.js.map +1 -0
- package/lib/module/floating/menu-keyboard.js +227 -0
- package/lib/module/floating/menu-keyboard.js.map +1 -0
- package/lib/module/floating/menu-sub-flyout.js +28 -16
- package/lib/module/floating/menu-sub-flyout.js.map +1 -1
- package/lib/module/fonts/index.web.js +5 -20
- package/lib/module/fonts/index.web.js.map +1 -1
- package/lib/module/frosted-icon-button/FrostedIconButton.web.js +9 -0
- package/lib/module/frosted-icon-button/FrostedIconButton.web.js.map +1 -1
- package/lib/module/frosted-icon-button/index.web.js +5 -7
- package/lib/module/frosted-icon-button/index.web.js.map +1 -1
- package/lib/module/hooks/roving-focus.js +181 -0
- package/lib/module/hooks/roving-focus.js.map +1 -0
- package/lib/module/hover-card/index.web.js +5 -0
- package/lib/module/hover-card/index.web.js.map +1 -1
- package/lib/module/icons/remix/RiBookReadLine.js +9 -0
- package/lib/module/icons/remix/RiBookReadLine.js.map +1 -0
- package/lib/module/icons/remix/RiBugLine.js +9 -0
- package/lib/module/icons/remix/RiBugLine.js.map +1 -0
- package/lib/module/icons/remix/RiChat1Line.js +9 -0
- package/lib/module/icons/remix/RiChat1Line.js.map +1 -0
- package/lib/module/icons/remix/RiCloudLine.js +9 -0
- package/lib/module/icons/remix/RiCloudLine.js.map +1 -0
- package/lib/module/icons/remix/RiCodeLine.js +9 -0
- package/lib/module/icons/remix/RiCodeLine.js.map +1 -0
- package/lib/module/icons/remix/RiCpuLine.js +9 -0
- package/lib/module/icons/remix/RiCpuLine.js.map +1 -0
- package/lib/module/icons/remix/RiFloodLine.js +9 -0
- package/lib/module/icons/remix/RiFloodLine.js.map +1 -0
- package/lib/module/icons/remix/RiLockUnlockLine.js +9 -0
- package/lib/module/icons/remix/RiLockUnlockLine.js.map +1 -0
- package/lib/module/icons/remix/RiMoneyDollarCircleLine.js +9 -0
- package/lib/module/icons/remix/RiMoneyDollarCircleLine.js.map +1 -0
- package/lib/module/icons/remix/RiPlayCircleLine.js +9 -0
- package/lib/module/icons/remix/RiPlayCircleLine.js.map +1 -0
- package/lib/module/icons/remix/RiRocket2Line.js +9 -0
- package/lib/module/icons/remix/RiRocket2Line.js.map +1 -0
- package/lib/module/icons/remix/RiServerLine.js +9 -0
- package/lib/module/icons/remix/RiServerLine.js.map +1 -0
- package/lib/module/icons/remix/RiShareBoxLine.js +9 -0
- package/lib/module/icons/remix/RiShareBoxLine.js.map +1 -0
- package/lib/module/icons/remix/RiTv2Line.js +9 -0
- package/lib/module/icons/remix/RiTv2Line.js.map +1 -0
- package/lib/module/icons/remix/index.js +14 -0
- package/lib/module/icons/remix/index.js.map +1 -1
- package/lib/module/list/index.web.js +5 -0
- package/lib/module/list/index.web.js.map +1 -1
- package/lib/module/loading/Loading.js +17 -155
- package/lib/module/loading/Loading.js.map +1 -1
- package/lib/module/loading/Loading.web.js +19 -155
- package/lib/module/loading/Loading.web.js.map +1 -1
- package/lib/module/loading/LoadingBase.js +194 -0
- package/lib/module/loading/LoadingBase.js.map +1 -0
- package/lib/module/loading/index.web.js +5 -13
- package/lib/module/loading/index.web.js.map +1 -1
- package/lib/module/media-flight/index.web.js +5 -9
- package/lib/module/media-flight/index.web.js.map +1 -1
- package/lib/module/menubar/Menubar.js +15 -122
- package/lib/module/menubar/Menubar.js.map +1 -1
- package/lib/module/menubar/Menubar.web.js +18 -114
- package/lib/module/menubar/Menubar.web.js.map +1 -1
- package/lib/module/menubar/MenubarBase.js +146 -0
- package/lib/module/menubar/MenubarBase.js.map +1 -0
- package/lib/module/menubar/index.web.js +5 -0
- package/lib/module/menubar/index.web.js.map +1 -1
- package/lib/module/motion/index.web.js +5 -5
- package/lib/module/motion/index.web.js.map +1 -1
- package/lib/module/popover/index.web.js +5 -0
- package/lib/module/popover/index.web.js.map +1 -1
- package/lib/module/popover/parts.js +70 -12
- package/lib/module/popover/parts.js.map +1 -1
- package/lib/module/popover/surface.js +39 -13
- package/lib/module/popover/surface.js.map +1 -1
- package/lib/module/portal/index.web.js +6 -1
- package/lib/module/portal/index.web.js.map +1 -1
- package/lib/module/progressive-blur/index.web.js +5 -0
- package/lib/module/progressive-blur/index.web.js.map +1 -1
- package/lib/module/scroll/index.web.js +5 -0
- package/lib/module/scroll/index.web.js.map +1 -1
- package/lib/module/segmented-control/SegmentedControl.js +36 -1
- package/lib/module/segmented-control/SegmentedControl.js.map +1 -1
- package/lib/module/select/Select.js +5 -77
- package/lib/module/select/Select.js.map +1 -1
- package/lib/module/select/Select.web.js +147 -82
- package/lib/module/select/Select.web.js.map +1 -1
- package/lib/module/select/index.js +2 -2
- package/lib/module/select/index.js.map +1 -1
- package/lib/module/select/index.web.js +7 -2
- package/lib/module/select/index.web.js.map +1 -1
- package/lib/module/select/shared.js +106 -6
- package/lib/module/select/shared.js.map +1 -1
- package/lib/module/sidebar/SidebarTeamMenu.js +2 -2
- package/lib/module/sidebar/SidebarTeamMenu.js.map +1 -1
- package/lib/module/sidebar/SidebarUserMenu.js +2 -2
- package/lib/module/sidebar/SidebarUserMenu.js.map +1 -1
- package/lib/module/sidebar/parts.js +8 -8
- package/lib/module/sidebar/parts.js.map +1 -1
- package/lib/module/surfaces/SurfaceHost.js +6 -0
- package/lib/module/surfaces/SurfaceHost.js.map +1 -1
- package/lib/module/surfaces/index.web.js +14 -4
- package/lib/module/surfaces/index.web.js.map +1 -1
- package/lib/module/tab-bar/index.web.js +13 -10
- package/lib/module/tab-bar/index.web.js.map +1 -1
- package/lib/module/tabs/Tabs.js +49 -2
- package/lib/module/tabs/Tabs.js.map +1 -1
- package/lib/module/theme/color-scope/index.web.js +5 -0
- package/lib/module/theme/color-scope/index.web.js.map +1 -1
- package/lib/module/theme/seed-scope/index.web.js +5 -0
- package/lib/module/theme/seed-scope/index.web.js.map +1 -1
- package/lib/module/tooltip/index.web.js +5 -0
- package/lib/module/tooltip/index.web.js.map +1 -1
- package/lib/typescript/commonjs/agent-chat/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/ai-chat/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/alert-dialog/index.web.d.ts +5 -1
- package/lib/typescript/commonjs/alert-dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/avatar-group/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/bottom-sheet/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/code/index.d.ts +2 -0
- package/lib/typescript/commonjs/code/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/command/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/composer-loader/ComposerLoader.web.d.ts +8 -0
- package/lib/typescript/commonjs/composer-loader/ComposerLoader.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/composer-loader/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/composer-panel/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/connection-dots/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/connection-status/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/content-panel/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/context-menu/ContextMenu.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/context-menu/context.d.ts +3 -0
- package/lib/typescript/commonjs/context-menu/context.d.ts.map +1 -1
- package/lib/typescript/commonjs/context-menu/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/index.web.d.ts +2 -1
- package/lib/typescript/commonjs/dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dropdown-menu/DropdownMenu.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dropdown-menu/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/FloatingPanel.d.ts +1 -1
- package/lib/typescript/commonjs/floating/FloatingPanel.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/escape-stack.d.ts +55 -0
- package/lib/typescript/commonjs/floating/escape-stack.d.ts.map +1 -0
- package/lib/typescript/commonjs/floating/menu-keyboard.d.ts +57 -0
- package/lib/typescript/commonjs/floating/menu-keyboard.d.ts.map +1 -0
- package/lib/typescript/commonjs/floating/menu-sub-flyout.d.ts.map +1 -1
- package/lib/typescript/commonjs/floating/types.d.ts +11 -0
- package/lib/typescript/commonjs/floating/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/fonts/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/frosted-icon-button/FrostedIconButton.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/frosted-icon-button/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/roving-focus.d.ts +66 -0
- package/lib/typescript/commonjs/hooks/roving-focus.d.ts.map +1 -0
- package/lib/typescript/commonjs/hover-card/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/icons/remix/RiBookReadLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiBookReadLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiBugLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiBugLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiChat1Line.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiChat1Line.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiCloudLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiCloudLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiCodeLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiCodeLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiCpuLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiCpuLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiFloodLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiFloodLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiLockUnlockLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiLockUnlockLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiMoneyDollarCircleLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiMoneyDollarCircleLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiPlayCircleLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiPlayCircleLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiRocket2Line.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiRocket2Line.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiServerLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiServerLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiShareBoxLine.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiShareBoxLine.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/RiTv2Line.d.ts +8 -0
- package/lib/typescript/commonjs/icons/remix/RiTv2Line.d.ts.map +1 -0
- package/lib/typescript/commonjs/icons/remix/index.d.ts +14 -0
- package/lib/typescript/commonjs/icons/remix/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/list/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/loading/Loading.d.ts +8 -2
- package/lib/typescript/commonjs/loading/Loading.d.ts.map +1 -1
- package/lib/typescript/commonjs/loading/Loading.web.d.ts +10 -2
- package/lib/typescript/commonjs/loading/Loading.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/loading/LoadingBase.d.ts +64 -0
- package/lib/typescript/commonjs/loading/LoadingBase.d.ts.map +1 -0
- package/lib/typescript/commonjs/loading/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/media-flight/index.web.d.ts +0 -9
- package/lib/typescript/commonjs/media-flight/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/menubar/Menubar.d.ts +14 -9
- package/lib/typescript/commonjs/menubar/Menubar.d.ts.map +1 -1
- package/lib/typescript/commonjs/menubar/Menubar.web.d.ts +8 -6
- package/lib/typescript/commonjs/menubar/Menubar.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/menubar/MenubarBase.d.ts +5 -0
- package/lib/typescript/commonjs/menubar/MenubarBase.d.ts.map +1 -0
- package/lib/typescript/commonjs/menubar/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/motion/index.web.d.ts +0 -5
- package/lib/typescript/commonjs/motion/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/popover/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/popover/parts.d.ts.map +1 -1
- package/lib/typescript/commonjs/popover/surface.d.ts +15 -5
- package/lib/typescript/commonjs/popover/surface.d.ts.map +1 -1
- package/lib/typescript/commonjs/portal/index.web.d.ts +1 -1
- package/lib/typescript/commonjs/portal/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/progressive-blur/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/scroll/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/segmented-control/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/commonjs/select/Select.d.ts +2 -4
- package/lib/typescript/commonjs/select/Select.d.ts.map +1 -1
- package/lib/typescript/commonjs/select/Select.web.d.ts +2 -4
- package/lib/typescript/commonjs/select/Select.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/select/index.d.ts +2 -2
- package/lib/typescript/commonjs/select/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/select/index.web.d.ts +2 -2
- package/lib/typescript/commonjs/select/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/select/shared.d.ts +52 -5
- package/lib/typescript/commonjs/select/shared.d.ts.map +1 -1
- package/lib/typescript/commonjs/select/types.d.ts +6 -0
- package/lib/typescript/commonjs/select/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/sidebar/parts.d.ts +8 -2
- package/lib/typescript/commonjs/sidebar/parts.d.ts.map +1 -1
- package/lib/typescript/commonjs/surfaces/SurfaceHost.d.ts.map +1 -1
- package/lib/typescript/commonjs/surfaces/index.web.d.ts +9 -4
- package/lib/typescript/commonjs/surfaces/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/tab-bar/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/tabs/Tabs.d.ts.map +1 -1
- package/lib/typescript/commonjs/tabs/types.d.ts +6 -0
- package/lib/typescript/commonjs/tabs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/color-scope/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/seed-scope/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/tooltip/index.web.d.ts.map +1 -1
- package/lib/typescript/module/agent-chat/index.web.d.ts.map +1 -1
- package/lib/typescript/module/ai-chat/index.web.d.ts.map +1 -1
- package/lib/typescript/module/alert-dialog/index.web.d.ts +5 -1
- package/lib/typescript/module/alert-dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/module/avatar-group/index.web.d.ts.map +1 -1
- package/lib/typescript/module/bottom-sheet/index.web.d.ts.map +1 -1
- package/lib/typescript/module/code/index.d.ts +2 -0
- package/lib/typescript/module/code/index.d.ts.map +1 -1
- package/lib/typescript/module/command/index.web.d.ts.map +1 -1
- package/lib/typescript/module/composer-loader/ComposerLoader.web.d.ts +8 -0
- package/lib/typescript/module/composer-loader/ComposerLoader.web.d.ts.map +1 -1
- package/lib/typescript/module/composer-loader/index.web.d.ts.map +1 -1
- package/lib/typescript/module/composer-panel/index.web.d.ts.map +1 -1
- package/lib/typescript/module/connection-dots/index.web.d.ts.map +1 -1
- package/lib/typescript/module/connection-status/index.web.d.ts.map +1 -1
- package/lib/typescript/module/content-panel/index.web.d.ts.map +1 -1
- package/lib/typescript/module/context-menu/ContextMenu.web.d.ts.map +1 -1
- package/lib/typescript/module/context-menu/context.d.ts +3 -0
- package/lib/typescript/module/context-menu/context.d.ts.map +1 -1
- package/lib/typescript/module/context-menu/index.web.d.ts.map +1 -1
- package/lib/typescript/module/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/module/dialog/index.web.d.ts +2 -1
- package/lib/typescript/module/dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/module/dropdown-menu/DropdownMenu.web.d.ts.map +1 -1
- package/lib/typescript/module/dropdown-menu/index.web.d.ts.map +1 -1
- package/lib/typescript/module/floating/FloatingPanel.d.ts +1 -1
- package/lib/typescript/module/floating/FloatingPanel.d.ts.map +1 -1
- package/lib/typescript/module/floating/escape-stack.d.ts +55 -0
- package/lib/typescript/module/floating/escape-stack.d.ts.map +1 -0
- package/lib/typescript/module/floating/menu-keyboard.d.ts +57 -0
- package/lib/typescript/module/floating/menu-keyboard.d.ts.map +1 -0
- package/lib/typescript/module/floating/menu-sub-flyout.d.ts.map +1 -1
- package/lib/typescript/module/floating/types.d.ts +11 -0
- package/lib/typescript/module/floating/types.d.ts.map +1 -1
- package/lib/typescript/module/fonts/index.web.d.ts.map +1 -1
- package/lib/typescript/module/frosted-icon-button/FrostedIconButton.web.d.ts.map +1 -1
- package/lib/typescript/module/frosted-icon-button/index.web.d.ts.map +1 -1
- package/lib/typescript/module/hooks/roving-focus.d.ts +66 -0
- package/lib/typescript/module/hooks/roving-focus.d.ts.map +1 -0
- package/lib/typescript/module/hover-card/index.web.d.ts.map +1 -1
- package/lib/typescript/module/icons/remix/RiBookReadLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiBookReadLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiBugLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiBugLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiChat1Line.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiChat1Line.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiCloudLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiCloudLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiCodeLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiCodeLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiCpuLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiCpuLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiFloodLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiFloodLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiLockUnlockLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiLockUnlockLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiMoneyDollarCircleLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiMoneyDollarCircleLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiPlayCircleLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiPlayCircleLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiRocket2Line.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiRocket2Line.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiServerLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiServerLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiShareBoxLine.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiShareBoxLine.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/RiTv2Line.d.ts +8 -0
- package/lib/typescript/module/icons/remix/RiTv2Line.d.ts.map +1 -0
- package/lib/typescript/module/icons/remix/index.d.ts +14 -0
- package/lib/typescript/module/icons/remix/index.d.ts.map +1 -1
- package/lib/typescript/module/list/index.web.d.ts.map +1 -1
- package/lib/typescript/module/loading/Loading.d.ts +8 -2
- package/lib/typescript/module/loading/Loading.d.ts.map +1 -1
- package/lib/typescript/module/loading/Loading.web.d.ts +10 -2
- package/lib/typescript/module/loading/Loading.web.d.ts.map +1 -1
- package/lib/typescript/module/loading/LoadingBase.d.ts +64 -0
- package/lib/typescript/module/loading/LoadingBase.d.ts.map +1 -0
- package/lib/typescript/module/loading/index.web.d.ts.map +1 -1
- package/lib/typescript/module/media-flight/index.web.d.ts +0 -9
- package/lib/typescript/module/media-flight/index.web.d.ts.map +1 -1
- package/lib/typescript/module/menubar/Menubar.d.ts +14 -9
- package/lib/typescript/module/menubar/Menubar.d.ts.map +1 -1
- package/lib/typescript/module/menubar/Menubar.web.d.ts +8 -6
- package/lib/typescript/module/menubar/Menubar.web.d.ts.map +1 -1
- package/lib/typescript/module/menubar/MenubarBase.d.ts +5 -0
- package/lib/typescript/module/menubar/MenubarBase.d.ts.map +1 -0
- package/lib/typescript/module/menubar/index.web.d.ts.map +1 -1
- package/lib/typescript/module/motion/index.web.d.ts +0 -5
- package/lib/typescript/module/motion/index.web.d.ts.map +1 -1
- package/lib/typescript/module/popover/index.web.d.ts.map +1 -1
- package/lib/typescript/module/popover/parts.d.ts.map +1 -1
- package/lib/typescript/module/popover/surface.d.ts +15 -5
- package/lib/typescript/module/popover/surface.d.ts.map +1 -1
- package/lib/typescript/module/portal/index.web.d.ts +1 -1
- package/lib/typescript/module/portal/index.web.d.ts.map +1 -1
- package/lib/typescript/module/progressive-blur/index.web.d.ts.map +1 -1
- package/lib/typescript/module/scroll/index.web.d.ts.map +1 -1
- package/lib/typescript/module/segmented-control/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/module/select/Select.d.ts +2 -4
- package/lib/typescript/module/select/Select.d.ts.map +1 -1
- package/lib/typescript/module/select/Select.web.d.ts +2 -4
- package/lib/typescript/module/select/Select.web.d.ts.map +1 -1
- package/lib/typescript/module/select/index.d.ts +2 -2
- package/lib/typescript/module/select/index.d.ts.map +1 -1
- package/lib/typescript/module/select/index.web.d.ts +2 -2
- package/lib/typescript/module/select/index.web.d.ts.map +1 -1
- package/lib/typescript/module/select/shared.d.ts +52 -5
- package/lib/typescript/module/select/shared.d.ts.map +1 -1
- package/lib/typescript/module/select/types.d.ts +6 -0
- package/lib/typescript/module/select/types.d.ts.map +1 -1
- package/lib/typescript/module/sidebar/parts.d.ts +8 -2
- package/lib/typescript/module/sidebar/parts.d.ts.map +1 -1
- package/lib/typescript/module/surfaces/SurfaceHost.d.ts.map +1 -1
- package/lib/typescript/module/surfaces/index.web.d.ts +9 -4
- package/lib/typescript/module/surfaces/index.web.d.ts.map +1 -1
- package/lib/typescript/module/tab-bar/index.web.d.ts.map +1 -1
- package/lib/typescript/module/tabs/Tabs.d.ts.map +1 -1
- package/lib/typescript/module/tabs/types.d.ts +6 -0
- package/lib/typescript/module/tabs/types.d.ts.map +1 -1
- package/lib/typescript/module/theme/color-scope/index.web.d.ts.map +1 -1
- package/lib/typescript/module/theme/seed-scope/index.web.d.ts.map +1 -1
- package/lib/typescript/module/tooltip/index.web.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agent-chat/index.web.ts +5 -3
- package/src/ai-chat/index.web.ts +5 -2
- package/src/alert-dialog/index.web.ts +10 -1
- package/src/avatar-group/index.web.ts +5 -0
- package/src/bottom-sheet/index.web.ts +5 -0
- package/src/code/index.ts +2 -0
- package/src/command/index.web.ts +5 -0
- package/src/composer-loader/ComposerLoader.web.tsx +8 -0
- package/src/composer-loader/index.web.ts +5 -2
- package/src/composer-panel/index.web.ts +5 -3
- package/src/connection-dots/index.web.ts +5 -0
- package/src/connection-status/index.web.ts +5 -0
- package/src/content-panel/index.web.ts +5 -0
- package/src/context-menu/ContextMenu.web.tsx +26 -3
- package/src/context-menu/context.ts +3 -0
- package/src/context-menu/index.web.ts +5 -0
- package/src/dialog/Dialog.web.tsx +13 -0
- package/src/dialog/index.web.ts +7 -11
- package/src/dropdown-menu/DropdownMenu.web.tsx +25 -2
- package/src/dropdown-menu/index.web.ts +5 -0
- package/src/floating/FloatingPanel.tsx +37 -38
- package/src/floating/escape-stack.ts +92 -0
- package/src/floating/menu-keyboard.ts +242 -0
- package/src/floating/menu-sub-flyout.tsx +22 -17
- package/src/floating/types.ts +11 -0
- package/src/fonts/index.web.ts +5 -20
- package/src/frosted-icon-button/FrostedIconButton.web.tsx +9 -0
- package/src/frosted-icon-button/index.web.ts +5 -7
- package/src/hooks/roving-focus.ts +204 -0
- package/src/hover-card/index.web.ts +5 -0
- package/src/icons/remix/RiBookReadLine.tsx +6 -0
- package/src/icons/remix/RiBugLine.tsx +6 -0
- package/src/icons/remix/RiChat1Line.tsx +6 -0
- package/src/icons/remix/RiCloudLine.tsx +6 -0
- package/src/icons/remix/RiCodeLine.tsx +6 -0
- package/src/icons/remix/RiCpuLine.tsx +6 -0
- package/src/icons/remix/RiFloodLine.tsx +6 -0
- package/src/icons/remix/RiLockUnlockLine.tsx +6 -0
- package/src/icons/remix/RiMoneyDollarCircleLine.tsx +6 -0
- package/src/icons/remix/RiPlayCircleLine.tsx +6 -0
- package/src/icons/remix/RiRocket2Line.tsx +6 -0
- package/src/icons/remix/RiServerLine.tsx +6 -0
- package/src/icons/remix/RiShareBoxLine.tsx +6 -0
- package/src/icons/remix/RiTv2Line.tsx +6 -0
- package/src/icons/remix/index.ts +14 -0
- package/src/list/index.web.ts +5 -0
- package/src/loading/Loading.tsx +15 -135
- package/src/loading/Loading.web.tsx +16 -134
- package/src/loading/LoadingBase.tsx +170 -0
- package/src/loading/index.web.ts +5 -13
- package/src/media-flight/index.web.ts +5 -9
- package/src/menubar/Menubar.tsx +16 -147
- package/src/menubar/Menubar.web.tsx +15 -138
- package/src/menubar/MenubarBase.tsx +170 -0
- package/src/menubar/index.web.ts +5 -0
- package/src/motion/index.web.ts +5 -5
- package/src/popover/index.web.ts +5 -0
- package/src/popover/parts.tsx +76 -12
- package/src/popover/surface.ts +68 -15
- package/src/portal/index.web.ts +6 -1
- package/src/progressive-blur/index.web.ts +5 -0
- package/src/scroll/index.web.ts +5 -0
- package/src/segmented-control/SegmentedControl.tsx +45 -1
- package/src/select/Select.tsx +4 -67
- package/src/select/Select.web.tsx +133 -69
- package/src/select/index.ts +3 -3
- package/src/select/index.web.ts +8 -3
- package/src/select/shared.tsx +107 -5
- package/src/select/types.ts +6 -0
- package/src/sidebar/SidebarTeamMenu.tsx +2 -2
- package/src/sidebar/SidebarUserMenu.tsx +2 -2
- package/src/sidebar/parts.tsx +8 -9
- package/src/surfaces/SurfaceHost.tsx +6 -0
- package/src/surfaces/index.web.ts +14 -4
- package/src/tab-bar/index.web.ts +13 -10
- package/src/tabs/Tabs.tsx +65 -1
- package/src/tabs/types.ts +6 -0
- package/src/theme/color-scope/index.web.ts +5 -0
- package/src/theme/seed-scope/index.web.ts +5 -0
- package/src/tooltip/index.web.ts +5 -0
package/src/portal/index.web.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-platform-exports.mjs — DO NOT EDIT.
|
|
2
|
+
// Source of truth: src/portal/index.ts.
|
|
3
|
+
// Re-run `bun run generate:exports` (or any `bun run build`) after
|
|
4
|
+
// changing that barrel or the set of web-forked subpaths.
|
|
5
|
+
|
|
1
6
|
export {
|
|
2
|
-
Portal,
|
|
3
7
|
PortalProvider,
|
|
4
8
|
PortalOutlet,
|
|
9
|
+
Portal,
|
|
5
10
|
} from './Portal.web';
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-platform-exports.mjs — DO NOT EDIT.
|
|
2
|
+
// Source of truth: src/progressive-blur/index.ts.
|
|
3
|
+
// Re-run `bun run generate:exports` (or any `bun run build`) after
|
|
4
|
+
// changing that barrel or the set of web-forked subpaths.
|
|
5
|
+
|
|
1
6
|
export type { ProgressiveBlurProps } from './types';
|
|
2
7
|
export {
|
|
3
8
|
ProgressiveBlur,
|
package/src/scroll/index.web.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-platform-exports.mjs — DO NOT EDIT.
|
|
2
|
+
// Source of truth: src/scroll/index.ts.
|
|
3
|
+
// Re-run `bun run generate:exports` (or any `bun run build`) after
|
|
4
|
+
// changing that barrel or the set of web-forked subpaths.
|
|
5
|
+
|
|
1
6
|
export { ScrollRestorationProvider } from './context';
|
|
2
7
|
export { useScrollRestoration } from './use-scroll-restoration.web';
|
|
3
8
|
|
|
@@ -32,6 +32,8 @@ import { NOT_DISABLED, interactiveWebCss, useInteractiveWebCss } from '../styles
|
|
|
32
32
|
import type { WebCssStyle } from '../styles/web-view-style';
|
|
33
33
|
import { mixColor, resolveButtonRamps } from '../button/shared';
|
|
34
34
|
import { useFieldMembership } from '../field/membership';
|
|
35
|
+
import { handleRovingKeyDown, useRovingTabIndex } from '../hooks/roving-focus';
|
|
36
|
+
import { webDataSet } from '../styles/web-data';
|
|
35
37
|
|
|
36
38
|
/**
|
|
37
39
|
* A segmented control using Bloom's canonical surface and text roles.
|
|
@@ -104,6 +106,16 @@ function resolveSegmentedPalette(theme: Theme): SegmentedPalette {
|
|
|
104
106
|
|
|
105
107
|
const STYLE_ID = 'bloom-segmented-control-web-css';
|
|
106
108
|
const SEGMENT = '[data-bloom-segmented-item]';
|
|
109
|
+
/** The group node — the owner a segment's keyboard walks within. */
|
|
110
|
+
const GROUP = '[data-bloom-segmented-group]';
|
|
111
|
+
|
|
112
|
+
/** The attribute that says a segment is the chosen one, per role. */
|
|
113
|
+
function isChosenSegment(element: HTMLElement): boolean {
|
|
114
|
+
return (
|
|
115
|
+
element.getAttribute('aria-checked') === 'true' ||
|
|
116
|
+
element.getAttribute('aria-selected') === 'true'
|
|
117
|
+
);
|
|
118
|
+
}
|
|
107
119
|
|
|
108
120
|
const SEGMENTED_CSS = interactiveWebCss({
|
|
109
121
|
selector: SEGMENT,
|
|
@@ -230,6 +242,15 @@ export function SegmentedControl<T extends string>({
|
|
|
230
242
|
const candidate = useSharedValue('');
|
|
231
243
|
const suppressUntil = useRef(0);
|
|
232
244
|
const [release, setRelease] = useState(0);
|
|
245
|
+
// Web: ONE tab stop for the whole group — the chosen segment — as the ARIA
|
|
246
|
+
// radio-group and tab patterns require (`hooks/roving-focus.ts`).
|
|
247
|
+
const groupRef = useRef<View | null>(null);
|
|
248
|
+
useRovingTabIndex(
|
|
249
|
+
() => groupRef.current as unknown as Element | null,
|
|
250
|
+
SEGMENT,
|
|
251
|
+
isChosenSegment,
|
|
252
|
+
GROUP,
|
|
253
|
+
);
|
|
233
254
|
const register = useCallback((segment: SegmentPosition) => {
|
|
234
255
|
segments.value = [...segments.value.filter(item => item.value !== segment.value), segment].sort((a, b) => a.x - b.x);
|
|
235
256
|
return () => { segments.value = segments.value.filter(item => item.value !== segment.value); };
|
|
@@ -335,6 +356,8 @@ export function SegmentedControl<T extends string>({
|
|
|
335
356
|
return (
|
|
336
357
|
<GestureDetector gesture={gesture} touchAction="pan-y">
|
|
337
358
|
<View
|
|
359
|
+
ref={groupRef}
|
|
360
|
+
{...webDataSet({ bloomSegmentedGroup: '' })}
|
|
338
361
|
testID={testID}
|
|
339
362
|
nativeID={field.nativeID}
|
|
340
363
|
accessibilityLabel={field.accessibilityLabel}
|
|
@@ -456,6 +479,27 @@ export function SegmentedControlItem({
|
|
|
456
479
|
const itemRole = ctx.type === 'tabs' ? 'tab' : 'radio';
|
|
457
480
|
const geometry = GEOMETRY[ctx.size];
|
|
458
481
|
|
|
482
|
+
// Web keyboard, per the ARIA pattern the group's role names. A radio group
|
|
483
|
+
// answers all four arrows and has no Home/End; a tab strip answers
|
|
484
|
+
// Left/Right plus Home/End. Both select as focus moves — the control is a
|
|
485
|
+
// controlled value with nothing expensive behind a change — and both take
|
|
486
|
+
// Space, which react-native-web only synthesises for `role="button"`. Enter
|
|
487
|
+
// stays with react-native-web's own press. `allowKeyboardPress` first, so a
|
|
488
|
+
// drag's click suppression can never swallow a key.
|
|
489
|
+
const onKeyDown = useCallback(
|
|
490
|
+
(event: { key: string; currentTarget: unknown; preventDefault: () => void }) => {
|
|
491
|
+
ctx.allowKeyboardPress();
|
|
492
|
+
handleRovingKeyDown(event, {
|
|
493
|
+
selector: SEGMENT,
|
|
494
|
+
owner: GROUP,
|
|
495
|
+
orientation: ctx.type === 'tabs' ? 'horizontal' : 'both',
|
|
496
|
+
homeEnd: ctx.type === 'tabs',
|
|
497
|
+
activate: 'follow',
|
|
498
|
+
});
|
|
499
|
+
},
|
|
500
|
+
[ctx],
|
|
501
|
+
);
|
|
502
|
+
|
|
459
503
|
const itemStyle: WebCssStyle = {
|
|
460
504
|
flexGrow: 1,
|
|
461
505
|
flexDirection: 'row',
|
|
@@ -488,7 +532,7 @@ export function SegmentedControlItem({
|
|
|
488
532
|
setPosition(measuredPosition);
|
|
489
533
|
}}>
|
|
490
534
|
<Pressable
|
|
491
|
-
{...(IS_WEB ? ({ dataSet: { bloomSegmentedItem: '' }, onKeyDown
|
|
535
|
+
{...(IS_WEB ? ({ dataSet: { bloomSegmentedItem: '' }, onKeyDown } as Record<string, unknown>) : {})}
|
|
492
536
|
onPress={onPress}
|
|
493
537
|
onHoverIn={onHoverIn}
|
|
494
538
|
onHoverOut={onHoverOut}
|
package/src/select/Select.tsx
CHANGED
|
@@ -40,12 +40,14 @@ import {
|
|
|
40
40
|
} from '../styles/styled-primitives';
|
|
41
41
|
import { borderRadius } from '../styles/tokens';
|
|
42
42
|
import {
|
|
43
|
+
defaultExtractLabel,
|
|
43
44
|
defaultItemValueExtractor,
|
|
44
45
|
ItemContext,
|
|
45
46
|
SelectChevron,
|
|
46
47
|
SelectTriggerStateContext,
|
|
47
48
|
SelectValueRow,
|
|
48
49
|
useSelectItemContext,
|
|
50
|
+
VALUE_TYPE,
|
|
49
51
|
} from './shared';
|
|
50
52
|
import type {
|
|
51
53
|
SelectContentProps,
|
|
@@ -244,15 +246,6 @@ export function SelectValue({
|
|
|
244
246
|
}
|
|
245
247
|
|
|
246
248
|
/** `text-body-medium` on `md`, `text-body-2-medium` on `sm` — trigger value and option label alike. */
|
|
247
|
-
const VALUE_TYPE = { md: 'body-medium', sm: 'body-2-medium' } as const;
|
|
248
|
-
|
|
249
|
-
function defaultExtractLabel(item: unknown): React.ReactNode {
|
|
250
|
-
if (item != null && typeof item === 'object' && 'label' in item) {
|
|
251
|
-
return (item as { label: React.ReactNode }).label;
|
|
252
|
-
}
|
|
253
|
-
return String(item);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
249
|
// ---------------------------------------------------------------------------
|
|
257
250
|
// SelectIcon
|
|
258
251
|
// ---------------------------------------------------------------------------
|
|
@@ -399,8 +392,8 @@ export function SelectItem({
|
|
|
399
392
|
}, [close, onValueChange, value]);
|
|
400
393
|
|
|
401
394
|
const itemCtx = useMemo<SelectItemContextValue>(
|
|
402
|
-
() => ({ selected: isSelected, disabled }),
|
|
403
|
-
[isSelected, disabled],
|
|
395
|
+
() => ({ selected: isSelected, disabled, size }),
|
|
396
|
+
[isSelected, disabled, size],
|
|
404
397
|
);
|
|
405
398
|
// Press, focus and the chosen option share the row highlight.
|
|
406
399
|
const highlighted = !disabled && (focused || pressed || isSelected);
|
|
@@ -434,70 +427,14 @@ export function SelectItem({
|
|
|
434
427
|
// SelectItemText
|
|
435
428
|
// ---------------------------------------------------------------------------
|
|
436
429
|
|
|
437
|
-
export function SelectItemText({ children, className, style }: SelectItemTextProps) {
|
|
438
|
-
const { size } = useSelectContext();
|
|
439
|
-
const { disabled } = useSelectItemContext();
|
|
440
|
-
const palette = useMenuPalette();
|
|
441
|
-
// The selected option is marked with the check and the row highlight: its
|
|
442
|
-
// label stays at the same weight as every other row's, which is what the
|
|
443
|
-
// target does.
|
|
444
|
-
return (
|
|
445
|
-
<StyledText
|
|
446
|
-
numberOfLines={1}
|
|
447
|
-
className={cx(
|
|
448
|
-
SELECT_ITEM_TEXT_CLASS[size],
|
|
449
|
-
menuTypeClass(VALUE_TYPE[size], className),
|
|
450
|
-
className && 'text-foreground',
|
|
451
|
-
className,
|
|
452
|
-
)}
|
|
453
|
-
style={[
|
|
454
|
-
menuType(VALUE_TYPE[size], className),
|
|
455
|
-
className ? null : { color: disabled ? palette.textDisabled : palette.text },
|
|
456
|
-
style,
|
|
457
|
-
]}>
|
|
458
|
-
{children}
|
|
459
|
-
</StyledText>
|
|
460
|
-
);
|
|
461
|
-
}
|
|
462
|
-
|
|
463
430
|
// ---------------------------------------------------------------------------
|
|
464
431
|
// SelectItemIndicator
|
|
465
432
|
// ---------------------------------------------------------------------------
|
|
466
433
|
|
|
467
|
-
export function SelectItemIndicator({ icon: IconComponent = CheckIcon }: SelectItemIndicatorProps) {
|
|
468
|
-
const palette = useMenuPalette();
|
|
469
|
-
const { selected } = useSelectItemContext();
|
|
470
|
-
|
|
471
|
-
// The same right-hand gutter the web fork draws: `absolute right-2 size-3.5`
|
|
472
|
-
// holding a `text-muted-foreground size-4` check. It used to default to
|
|
473
|
-
// `RadioIndicator` in the row's FLOW on the left, so a select on native and
|
|
474
|
-
// the same select on web disagreed about both the mark and the side it is on.
|
|
475
|
-
if (!selected) return null;
|
|
476
|
-
|
|
477
|
-
return (
|
|
478
|
-
<StyledView className={ROW_INDICATOR_END_CLASS} pointerEvents="none">
|
|
479
|
-
<IconComponent
|
|
480
|
-
width={ROW_ICON_SIZE}
|
|
481
|
-
height={ROW_ICON_SIZE}
|
|
482
|
-
fill={palette.textSecondary}
|
|
483
|
-
/>
|
|
484
|
-
</StyledView>
|
|
485
|
-
);
|
|
486
|
-
}
|
|
487
|
-
|
|
488
434
|
// ---------------------------------------------------------------------------
|
|
489
435
|
// SelectSeparator
|
|
490
436
|
// ---------------------------------------------------------------------------
|
|
491
437
|
|
|
492
|
-
export function SelectSeparator() {
|
|
493
|
-
const palette = useMenuPalette();
|
|
494
|
-
// `-mx-2 my-1.5 h-px bg-border-button-default` — a filled 1px rule, not a
|
|
495
|
-
// bottom border on a stretched box.
|
|
496
|
-
return (
|
|
497
|
-
<StyledView className={SELECT_SEPARATOR_CLASS} style={{ backgroundColor: palette.border }} />
|
|
498
|
-
);
|
|
499
|
-
}
|
|
500
|
-
|
|
501
438
|
// ---------------------------------------------------------------------------
|
|
502
439
|
// Styles
|
|
503
440
|
// ---------------------------------------------------------------------------
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useBloomAppearance } from '../appearance';
|
|
2
2
|
import React, {
|
|
3
3
|
createContext,
|
|
4
|
+
useCallback,
|
|
4
5
|
useContext,
|
|
5
6
|
useEffect,
|
|
6
7
|
useLayoutEffect,
|
|
@@ -42,12 +43,14 @@ import { adoptStyleSheet } from '../styles/adopt-style-sheet';
|
|
|
42
43
|
import { borderRadius } from '../styles/tokens';
|
|
43
44
|
import type { WebCssStyle } from '../styles/web-view-style';
|
|
44
45
|
import {
|
|
46
|
+
defaultExtractLabel,
|
|
45
47
|
defaultItemValueExtractor,
|
|
46
48
|
ItemContext,
|
|
47
49
|
SelectChevron,
|
|
48
50
|
SelectTriggerStateContext,
|
|
49
51
|
SelectValueRow,
|
|
50
52
|
useSelectItemContext,
|
|
53
|
+
VALUE_TYPE,
|
|
51
54
|
} from './shared';
|
|
52
55
|
import type {
|
|
53
56
|
SelectContentProps,
|
|
@@ -61,10 +64,17 @@ import type {
|
|
|
61
64
|
SelectValueProps,
|
|
62
65
|
} from './types';
|
|
63
66
|
import { useFieldMembership } from '../field/membership';
|
|
67
|
+
import { isSpaceKey, rovingItems, rovingMove, rovingTarget } from '../hooks/roving-focus';
|
|
68
|
+
import { hostElement, useReturnFocusOnClose } from '../floating/menu-keyboard';
|
|
64
69
|
|
|
65
70
|
/** The trigger's `offset={4}`. */
|
|
66
71
|
const SELECT_OFFSET = 4;
|
|
67
72
|
|
|
73
|
+
/** An option row, marked through `dataSet` — a class never reaches the DOM. */
|
|
74
|
+
const OPTION = '[data-bloom-select-option]';
|
|
75
|
+
/** The option list, so a nested list's rows are never counted as this one's. */
|
|
76
|
+
const LIST = '[data-bloom-select-list]';
|
|
77
|
+
|
|
68
78
|
/**
|
|
69
79
|
* The trigger's interactive states — `hover:bg-background-primary-hover
|
|
70
80
|
* hover:border-border-button-hover` and `focus-visible:ring-2 ring-offset-2
|
|
@@ -129,6 +139,15 @@ type SelectContextValue = Pick<SelectProps, 'value' | 'onValueChange' | 'disable
|
|
|
129
139
|
close: () => void;
|
|
130
140
|
/** The trigger box, so `SelectContent` can anchor itself against it. */
|
|
131
141
|
triggerRef: React.RefObject<View | null>;
|
|
142
|
+
/**
|
|
143
|
+
* Set by a key on the trigger (Enter, Space, ArrowDown, ArrowUp) and consumed
|
|
144
|
+
* by `SelectContent`, which moves focus into the list only when the key asked
|
|
145
|
+
* for it. A pointer open leaves focus where the pointer put it.
|
|
146
|
+
*/
|
|
147
|
+
keyboardIntent: React.MutableRefObject<boolean>;
|
|
148
|
+
/** Bumped to ask an ALREADY-open list to take focus (an arrow on its trigger). */
|
|
149
|
+
focusRequest: number;
|
|
150
|
+
requestListFocus: () => void;
|
|
132
151
|
};
|
|
133
152
|
|
|
134
153
|
const SelectContext = createContext<SelectContextValue | null>(null);
|
|
@@ -166,6 +185,8 @@ export function Select({ children, value, onValueChange, disabled, size: sizePro
|
|
|
166
185
|
const [isOpen, setIsOpen] = useState(false);
|
|
167
186
|
const triggerRef = useRef<View | null>(null);
|
|
168
187
|
const valueStoreState = useState<unknown>(undefined);
|
|
188
|
+
const keyboardIntent = useRef(false);
|
|
189
|
+
const [focusRequest, setFocusRequest] = useState(0);
|
|
169
190
|
|
|
170
191
|
const ctx = useMemo<SelectContextValue>(
|
|
171
192
|
() => ({
|
|
@@ -177,8 +198,14 @@ export function Select({ children, value, onValueChange, disabled, size: sizePro
|
|
|
177
198
|
open: () => setIsOpen(true),
|
|
178
199
|
close: () => setIsOpen(false),
|
|
179
200
|
triggerRef,
|
|
201
|
+
keyboardIntent,
|
|
202
|
+
focusRequest,
|
|
203
|
+
requestListFocus: () => {
|
|
204
|
+
keyboardIntent.current = true;
|
|
205
|
+
setFocusRequest((count) => count + 1);
|
|
206
|
+
},
|
|
180
207
|
}),
|
|
181
|
-
[value, onValueChange, disabled, size, isOpen],
|
|
208
|
+
[value, onValueChange, disabled, size, isOpen, focusRequest],
|
|
182
209
|
);
|
|
183
210
|
|
|
184
211
|
return (
|
|
@@ -258,6 +285,35 @@ export function SelectTrigger({
|
|
|
258
285
|
[isDisabled, ctx.isOpen, ctx.size],
|
|
259
286
|
);
|
|
260
287
|
|
|
288
|
+
// The keyboard's way INTO the list (ARIA select-only combobox). Enter and
|
|
289
|
+
// Space already press the trigger through react-native-web; they only mark
|
|
290
|
+
// the open as a keyboard one here, so the list takes focus when it arrives.
|
|
291
|
+
// ArrowDown/ArrowUp open it too — and on a list the pointer already opened,
|
|
292
|
+
// they move focus into it.
|
|
293
|
+
//
|
|
294
|
+
// A DOM listener on the anchor wrapper rather than an `onKeyDown` prop: under
|
|
295
|
+
// `asChild` the control is the caller's element, whose props this family does
|
|
296
|
+
// not own. The wrapper holds only the trigger, and its bubble listener runs
|
|
297
|
+
// before React's root-level handlers.
|
|
298
|
+
const { isOpen, open, keyboardIntent, requestListFocus, triggerRef } = ctx;
|
|
299
|
+
useEffect(() => {
|
|
300
|
+
const wrapper = hostElement(triggerRef.current);
|
|
301
|
+
if (!wrapper || isDisabled) return undefined;
|
|
302
|
+
const onKeyDown = (event: KeyboardEvent) => {
|
|
303
|
+
if (event.defaultPrevented) return;
|
|
304
|
+
if (event.key === 'Enter' || isSpaceKey(event.key)) {
|
|
305
|
+
if (!isOpen) keyboardIntent.current = true;
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;
|
|
309
|
+
event.preventDefault();
|
|
310
|
+
if (!isOpen) open();
|
|
311
|
+
requestListFocus();
|
|
312
|
+
};
|
|
313
|
+
wrapper.addEventListener('keydown', onKeyDown);
|
|
314
|
+
return () => wrapper.removeEventListener('keydown', onKeyDown);
|
|
315
|
+
}, [triggerRef, isDisabled, isOpen, open, keyboardIntent, requestListFocus]);
|
|
316
|
+
|
|
261
317
|
return (
|
|
262
318
|
<SelectTriggerStateContext.Provider value={triggerState}>
|
|
263
319
|
<TriggerSlot
|
|
@@ -338,15 +394,6 @@ export function SelectValue({
|
|
|
338
394
|
}
|
|
339
395
|
|
|
340
396
|
/** `text-body-medium` on `md`, `text-body-2-medium` on `sm` — trigger value and option label alike. */
|
|
341
|
-
const VALUE_TYPE = { md: 'body-medium', sm: 'body-2-medium' } as const;
|
|
342
|
-
|
|
343
|
-
function defaultExtractLabel(item: unknown): React.ReactNode {
|
|
344
|
-
if (item != null && typeof item === 'object' && 'label' in item) {
|
|
345
|
-
return (item as { label: React.ReactNode }).label;
|
|
346
|
-
}
|
|
347
|
-
return String(item);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
397
|
// ---------------------------------------------------------------------------
|
|
351
398
|
// SelectIcon
|
|
352
399
|
// ---------------------------------------------------------------------------
|
|
@@ -393,6 +440,76 @@ export function SelectContent<T>({
|
|
|
393
440
|
}, [items, ctx.value, valueExtractor, setStoredItem]);
|
|
394
441
|
const anchor = useAnchorRect(ctx.triggerRef, ctx.isOpen);
|
|
395
442
|
const listRef = useRef<ScrollView | null>(null);
|
|
443
|
+
// The list's DOM node as STATE as well: the panel portals in a render after it
|
|
444
|
+
// opens, and the keyboard listener and the initial focus both need the node.
|
|
445
|
+
const [listNode, setListNode] = useState<HTMLElement | null>(null);
|
|
446
|
+
const listNodeRef = useRef<HTMLElement | null>(null);
|
|
447
|
+
const attachList = useCallback((scrollView: ScrollView | null) => {
|
|
448
|
+
listRef.current = scrollView;
|
|
449
|
+
const node = hostElement(scrollView);
|
|
450
|
+
listNodeRef.current = node;
|
|
451
|
+
setListNode(node);
|
|
452
|
+
}, []);
|
|
453
|
+
|
|
454
|
+
const { isOpen, close, keyboardIntent, focusRequest, triggerRef } = ctx;
|
|
455
|
+
|
|
456
|
+
// A keyboard open lands focus on the chosen option, or the first enabled one
|
|
457
|
+
// — the ARIA listbox contract. Without it the list opened and focus stayed on
|
|
458
|
+
// the trigger, where the arrows did nothing: a keyboard user could open the
|
|
459
|
+
// select and never choose.
|
|
460
|
+
useEffect(() => {
|
|
461
|
+
if (!isOpen || !listNode || !keyboardIntent.current) return;
|
|
462
|
+
keyboardIntent.current = false;
|
|
463
|
+
const options = rovingItems(listNode, OPTION, { owner: LIST });
|
|
464
|
+
const chosen =
|
|
465
|
+
options.find((option) => option.getAttribute('aria-checked') === 'true') ?? options[0];
|
|
466
|
+
chosen?.focus({ preventScroll: true });
|
|
467
|
+
}, [isOpen, listNode, focusRequest, keyboardIntent]);
|
|
468
|
+
|
|
469
|
+
// Keys inside the open list. ArrowDown/ArrowUp step between enabled options
|
|
470
|
+
// and stop at the ends; Home/End jump to them; Space chooses — react-native-web
|
|
471
|
+
// presses a `radio` on Enter only, so Enter is already the option's own; Tab
|
|
472
|
+
// closes the list and hands focus back to the trigger, the way a native
|
|
473
|
+
// select does. Escape is `FloatingPanel`'s (it closes the innermost surface
|
|
474
|
+
// only), and the close below returns focus.
|
|
475
|
+
useEffect(() => {
|
|
476
|
+
if (!listNode) return undefined;
|
|
477
|
+
const onKeyDown = (event: KeyboardEvent) => {
|
|
478
|
+
if (event.defaultPrevented) return;
|
|
479
|
+
const active =
|
|
480
|
+
typeof document !== 'undefined' ? (document.activeElement as HTMLElement | null) : null;
|
|
481
|
+
const current = active?.closest?.(OPTION) ?? null;
|
|
482
|
+
if (event.key === 'Tab') {
|
|
483
|
+
event.preventDefault();
|
|
484
|
+
close();
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
if (isSpaceKey(event.key)) {
|
|
488
|
+
if (!current || current.getAttribute('aria-disabled') === 'true') return;
|
|
489
|
+
event.preventDefault();
|
|
490
|
+
(current as HTMLElement).click();
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
const move = rovingMove(event.key, { orientation: 'vertical', homeEnd: true });
|
|
494
|
+
if (move === null) return;
|
|
495
|
+
event.preventDefault();
|
|
496
|
+
rovingTarget(rovingItems(listNode, OPTION, { owner: LIST }), current, move, false)?.focus();
|
|
497
|
+
};
|
|
498
|
+
listNode.addEventListener('keydown', onKeyDown);
|
|
499
|
+
return () => listNode.removeEventListener('keydown', onKeyDown);
|
|
500
|
+
}, [listNode, close]);
|
|
501
|
+
|
|
502
|
+
// Closing hands focus back to the trigger when it was inside the list — a
|
|
503
|
+
// choice, Escape, Tab — so the next Tab continues from the select instead of
|
|
504
|
+
// from the top of the document (`floating/menu-keyboard.ts`).
|
|
505
|
+
useEffect(() => {
|
|
506
|
+
if (!isOpen) keyboardIntent.current = false;
|
|
507
|
+
}, [isOpen, keyboardIntent]);
|
|
508
|
+
useReturnFocusOnClose(
|
|
509
|
+
triggerRef,
|
|
510
|
+
isOpen,
|
|
511
|
+
useCallback((element: Element) => listNodeRef.current?.contains(element) === true, []),
|
|
512
|
+
);
|
|
396
513
|
|
|
397
514
|
// The list is a plain `max-h-[240px] overflow-auto` box: the native
|
|
398
515
|
// scrollbar and nothing else. It used to carry shadcn's scroll-up/down
|
|
@@ -447,7 +564,8 @@ export function SelectContent<T>({
|
|
|
447
564
|
className={className}
|
|
448
565
|
>
|
|
449
566
|
<ScrollView
|
|
450
|
-
ref={
|
|
567
|
+
ref={attachList}
|
|
568
|
+
{...({ dataSet: { bloomSelectList: '' } } as Record<string, unknown>)}
|
|
451
569
|
style={{ maxHeight }}
|
|
452
570
|
// `flex flex-col gap-1` — the rows sit 4px apart.
|
|
453
571
|
contentContainerStyle={styles.list}
|
|
@@ -477,6 +595,7 @@ export function SelectItem({
|
|
|
477
595
|
style,
|
|
478
596
|
}: SelectItemProps) {
|
|
479
597
|
const ctx = useSelectContext();
|
|
598
|
+
const { size } = ctx;
|
|
480
599
|
const palette = useMenuPalette();
|
|
481
600
|
const {
|
|
482
601
|
state: hovered,
|
|
@@ -491,8 +610,8 @@ export function SelectItem({
|
|
|
491
610
|
// background below, but they are no longer PUBLISHED — nothing ever read
|
|
492
611
|
// them, and `pressed` was published as a literal `false`.
|
|
493
612
|
const itemCtx = useMemo<SelectItemContextValue>(
|
|
494
|
-
() => ({ selected: isSelected, disabled }),
|
|
495
|
-
[isSelected, disabled],
|
|
613
|
+
() => ({ selected: isSelected, disabled, size }),
|
|
614
|
+
[isSelected, disabled, size],
|
|
496
615
|
);
|
|
497
616
|
// `(isFocused || isSelected) && MENU_ITEM_ACTIVE`: hover, keyboard
|
|
498
617
|
// focus and the chosen option share one `dropdown-item-hover-background`.
|
|
@@ -502,6 +621,7 @@ export function SelectItem({
|
|
|
502
621
|
<StyledPressable
|
|
503
622
|
ref={ref}
|
|
504
623
|
accessibilityRole="radio"
|
|
624
|
+
{...({ dataSet: { bloomSelectOption: '' } } as Record<string, unknown>)}
|
|
505
625
|
// The native fork has always applied this; web declared `label` and then
|
|
506
626
|
// dropped it, leaving every option a `role="radio"` with no accessible
|
|
507
627
|
// name for a screen reader to announce.
|
|
@@ -549,70 +669,14 @@ export function SelectItem({
|
|
|
549
669
|
// SelectItemText
|
|
550
670
|
// ---------------------------------------------------------------------------
|
|
551
671
|
|
|
552
|
-
export function SelectItemText({ children, className, style }: SelectItemTextProps) {
|
|
553
|
-
const { size } = useSelectContext();
|
|
554
|
-
const { disabled } = useSelectItemContext();
|
|
555
|
-
const palette = useMenuPalette();
|
|
556
|
-
// `text-text-primary`, or `text-text-disabled` on a disabled option. Inline
|
|
557
|
-
// only without a caller `className` (see `SelectValue`).
|
|
558
|
-
return (
|
|
559
|
-
<StyledText
|
|
560
|
-
numberOfLines={1}
|
|
561
|
-
className={cx(
|
|
562
|
-
SELECT_ITEM_TEXT_CLASS[size],
|
|
563
|
-
menuTypeClass(VALUE_TYPE[size], className),
|
|
564
|
-
className && 'text-foreground',
|
|
565
|
-
className,
|
|
566
|
-
)}
|
|
567
|
-
style={[
|
|
568
|
-
menuType(VALUE_TYPE[size], className),
|
|
569
|
-
className ? null : { color: disabled ? palette.textDisabled : palette.text },
|
|
570
|
-
style,
|
|
571
|
-
]}>
|
|
572
|
-
{children}
|
|
573
|
-
</StyledText>
|
|
574
|
-
);
|
|
575
|
-
}
|
|
576
|
-
|
|
577
672
|
// ---------------------------------------------------------------------------
|
|
578
673
|
// SelectItemIndicator
|
|
579
674
|
// ---------------------------------------------------------------------------
|
|
580
675
|
|
|
581
|
-
export function SelectItemIndicator({ icon: IconComponent = CheckIcon }: SelectItemIndicatorProps) {
|
|
582
|
-
const palette = useMenuPalette();
|
|
583
|
-
const { selected } = useSelectItemContext();
|
|
584
|
-
|
|
585
|
-
// `absolute right-2 flex size-3.5 items-center justify-center` holding
|
|
586
|
-
// a `size-4 text-text-secondary` check. A select's tick sits on the RIGHT — the
|
|
587
|
-
// opposite side from a menu's — which is what leaves the option's own text
|
|
588
|
-
// starting flush at `pl-2` like every other line in the panel. Bloom drew it in
|
|
589
|
-
// a 30px LEFT gutter, so a select and a dropdown menu disagreed about which
|
|
590
|
-
// edge a selection mark belongs on.
|
|
591
|
-
if (!selected) return null;
|
|
592
|
-
|
|
593
|
-
return (
|
|
594
|
-
<StyledView className={ROW_INDICATOR_END_CLASS} pointerEvents="none">
|
|
595
|
-
<IconComponent
|
|
596
|
-
width={ROW_ICON_SIZE}
|
|
597
|
-
height={ROW_ICON_SIZE}
|
|
598
|
-
fill={palette.textSecondary}
|
|
599
|
-
/>
|
|
600
|
-
</StyledView>
|
|
601
|
-
);
|
|
602
|
-
}
|
|
603
|
-
|
|
604
676
|
// ---------------------------------------------------------------------------
|
|
605
677
|
// SelectSeparator
|
|
606
678
|
// ---------------------------------------------------------------------------
|
|
607
679
|
|
|
608
|
-
export function SelectSeparator() {
|
|
609
|
-
const palette = useMenuPalette();
|
|
610
|
-
// `-mx-2 my-1.5 h-px bg-border-button-default`, bleeding through the listbox's `p-2`.
|
|
611
|
-
return (
|
|
612
|
-
<StyledView className={SELECT_SEPARATOR_CLASS} style={{ backgroundColor: palette.border }} />
|
|
613
|
-
);
|
|
614
|
-
}
|
|
615
|
-
|
|
616
680
|
const styles = StyleSheet.create({
|
|
617
681
|
// `TriggerSlot`'s wrapper is `alignSelf: 'flex-start'` so an anchored surface
|
|
618
682
|
// lines up with the CONTROL. A select trigger is a full-width field, so it
|
package/src/select/index.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export {
|
|
2
|
-
useSelectItemContext,
|
|
3
2
|
Select,
|
|
4
3
|
SelectTrigger,
|
|
5
4
|
SelectValue,
|
|
6
5
|
SelectIcon,
|
|
7
6
|
SelectContent,
|
|
8
7
|
SelectItem,
|
|
8
|
+
} from './Select';
|
|
9
|
+
export {
|
|
10
|
+
useSelectItemContext,
|
|
9
11
|
SelectItemText,
|
|
10
12
|
SelectItemIndicator,
|
|
11
13
|
SelectSeparator,
|
|
12
|
-
} from './Select';
|
|
13
|
-
export {
|
|
14
14
|
SelectGroup,
|
|
15
15
|
SelectLabel,
|
|
16
16
|
SelectScrollProvider,
|
package/src/select/index.web.ts
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-platform-exports.mjs — DO NOT EDIT.
|
|
2
|
+
// Source of truth: src/select/index.ts.
|
|
3
|
+
// Re-run `bun run generate:exports` (or any `bun run build`) after
|
|
4
|
+
// changing that barrel or the set of web-forked subpaths.
|
|
5
|
+
|
|
1
6
|
export {
|
|
2
|
-
useSelectItemContext,
|
|
3
7
|
Select,
|
|
4
8
|
SelectTrigger,
|
|
5
9
|
SelectValue,
|
|
6
10
|
SelectIcon,
|
|
7
11
|
SelectContent,
|
|
8
12
|
SelectItem,
|
|
13
|
+
} from './Select.web';
|
|
14
|
+
export {
|
|
15
|
+
useSelectItemContext,
|
|
9
16
|
SelectItemText,
|
|
10
17
|
SelectItemIndicator,
|
|
11
18
|
SelectSeparator,
|
|
12
|
-
} from './Select.web';
|
|
13
|
-
export {
|
|
14
19
|
SelectGroup,
|
|
15
20
|
SelectLabel,
|
|
16
21
|
SelectScrollProvider,
|