@workday/canvas-kit-react
Version:
The parent module that contains all Workday Canvas Kit React components
54 lines (53 loc) • 2.58 kB
JavaScript
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 }) }));
});