UNPKG

@workday/canvas-kit-react

Version:

The parent module that contains all Workday Canvas Kit React components

54 lines (53 loc) 2.58 kB
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime"; import { checkSmallIcon } from '@workday/canvas-system-icons-web'; import { createSubcomponent, composeHooks, createElemPropsHook, createComponent, } from '@workday/canvas-kit-react/common'; import { SystemIcon } from '@workday/canvas-kit-react/icon'; import { OverflowTooltip } from '@workday/canvas-kit-react/tooltip'; import { mergeStyles } from '@workday/canvas-kit-react/layout'; import { isSelected, useListItemActiveDescendant, useListItemRegister, } from '@workday/canvas-kit-react/collection'; import { useMenuModel } from './useMenuModel'; import { menuItemStencil, MenuItem } from './MenuItem'; const MenuOptionText = createComponent('span')({ Component: ({ ...elemProps }, ref, Element) => { return (_jsxs(_Fragment, { children: [_jsx(MenuItem.Text, { ref: ref, as: Element, ...elemProps }), _jsx(SystemIcon, { ...menuItemStencil.parts.selected, icon: checkSmallIcon })] })); }, }); export const StyledMenuOption = createComponent('li')({ displayName: 'MenuOption', Component: ({ children, ...elemProps }, ref, Element) => { return (_jsx(Element, { ref: ref, ...mergeStyles(elemProps, menuItemStencil()), children: typeof children === 'string' ? _jsx(MenuOptionText, { children: children }) : children })); }, }); export const useMenuOption = composeHooks(createElemPropsHook(useMenuModel)((model, _ref, elemProps = {}) => { const id = elemProps['data-id'] || ''; const selected = isSelected(id, model.state); const onMouseDown = (event) => { // Only left mouse button if (event.button === 0) { if (event.currentTarget.getAttribute('aria-disabled') !== 'true') { model.events.select({ id }); if (model.state.mode === 'single') { model.events.hide(event); } } } // prevent focus changes event.preventDefault(); }; return { role: 'option', 'aria-selected': selected, onMouseDown, }; }), useListItemActiveDescendant, useListItemRegister); export const MenuOption = createSubcomponent('li')({ displayName: 'Menu.Item', modelHook: useMenuModel, elemPropsHook: useMenuOption, subComponents: { Icon: MenuItem.Icon, Text: MenuOptionText, }, })(({ children, ...elemProps }, Element) => { return (_jsx(OverflowTooltip, { placement: "left", children: _jsx(StyledMenuOption, { as: Element, ...elemProps, children: children }) })); });