@aurora-ds/components 1.8.6 → 1.9.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/dist/esm/index.js CHANGED
@@ -2623,7 +2623,7 @@ Box.displayName = 'Box';
2623
2623
  * @example <Stack gap='sm'>…</Stack>
2624
2624
  * @example <Stack flexDirection='row' gap='md' alignItems='center' justifyContent='space-between'>…</Stack>
2625
2625
  */
2626
- const Stack = ({ flexDirection = 'row', display = 'flex', gap = 'sm', alignItems = 'center', width = '100%', ...rest }) => (jsx(Box, { display: display, flexDirection: flexDirection, alignItems: alignItems, gap: gap, width: width, ...rest }));
2626
+ const Stack = ({ flexDirection = 'row', display = 'flex', gap = 'sm', alignItems = 'center', ...rest }) => (jsx(Box, { display: display, flexDirection: flexDirection, alignItems: alignItems, gap: gap, ...rest }));
2627
2627
  Stack.displayName = 'Stack';
2628
2628
 
2629
2629
  /**
@@ -4156,10 +4156,27 @@ const MENU_ITEM_STYLES = createStyles((theme) => {
4156
4156
  marginLeft: theme.spacing.sm,
4157
4157
  flexShrink: 0,
4158
4158
  },
4159
+ /**
4160
+ * Full-size transparent `<a>` wrapper used when `href` is provided.
4161
+ * Resets link defaults and mirrors the parent `<li>`'s flex layout so
4162
+ * the icon / label / chevron align correctly.
4163
+ */
4164
+ link: {
4165
+ display: 'flex',
4166
+ alignItems: 'center',
4167
+ gap: theme.spacing.sm,
4168
+ width: '100%',
4169
+ color: 'inherit',
4170
+ textDecoration: 'none',
4171
+ outline: 'none',
4172
+ '&:focus-visible': {
4173
+ outline: 'none',
4174
+ },
4175
+ },
4159
4176
  };
4160
4177
  }, { id: 'menu-item' });
4161
4178
 
4162
- const MenuItem = ({ ref, id, label, icon, iconColor, role = 'menuitem', checked, selected, focused, disabled, size = 'default', closeOnClick, submenu, submenuTrigger = 'click', submenuPlacement = 'right', onClick, ...rest }) => {
4179
+ const MenuItem = ({ ref, id, label, icon, iconColor, role = 'menuitem', checked, selected, focused, disabled, size = 'default', closeOnClick, submenu, submenuTrigger = 'click', submenuPlacement = 'right', href, target, onClick, ...rest }) => {
4163
4180
  const hasSubmenu = submenu !== undefined;
4164
4181
  const isCheckable = role === 'menuitemcheckbox' || role === 'menuitemradio';
4165
4182
  const isOption = role === 'option';
@@ -4174,7 +4191,26 @@ const MenuItem = ({ ref, id, label, icon, iconColor, role = 'menuitem', checked,
4174
4191
  const isFocused = focused || focusedId === itemId;
4175
4192
  const { liRef, mergedRef, submenuOpen, handleClick, scheduleOpen, scheduleClose, clearTimers, closeSubmenu, } = useMenuItem({ ref, role, hasSubmenu, disabled, onClick, closeOnClick, submenuTrigger });
4176
4193
  const isHoverTrigger = submenuTrigger === 'hover';
4177
- return (jsxs(Fragment$1, { children: [jsxs("li", { ref: mergedRef, id: itemId, role: role, "aria-checked": isCheckable ? Boolean(checked) : undefined, "aria-selected": isOption ? Boolean(selected) : undefined, "aria-disabled": disabled, "aria-haspopup": hasSubmenu ? 'menu' : undefined, "aria-expanded": hasSubmenu ? submenuOpen : undefined, "data-selected": isHighlighted || undefined, "data-focused": isFocused || undefined, "data-disabled": disabled || undefined, "data-submenu-open": hasSubmenu && submenuOpen || undefined, className: MENU_ITEM_STYLES.root({ size }), onClick: handleClick, onMouseEnter: hasSubmenu && !disabled && isHoverTrigger ? scheduleOpen : undefined, onMouseLeave: hasSubmenu && isHoverTrigger ? scheduleClose : undefined, ...rest, children: [isCheckable && (jsxs("span", { className: MENU_ITEM_STYLES.indicator, "aria-hidden": true, children: [checked && role === 'menuitemcheckbox' && (jsx(Icon, { icon: CheckIcon, size: size === 'default' ? 'sm' : 'md', strokeColor: 'primaryMain' })), checked && role === 'menuitemradio' && (jsx("span", { className: MENU_ITEM_STYLES.radioDot }))] })), icon !== undefined && (jsx(Icon, { icon: icon, size: 'sm', strokeColor: iconColor ?? (isHighlighted ? 'primaryMain' : 'textSecondary') })), jsx(Text, { variant: 'span', fontSize: 'sm', className: MENU_ITEM_STYLES.label, children: label }), hasSubmenu && (jsx("span", { className: MENU_ITEM_STYLES.submenuChevron, "aria-hidden": true, children: jsx(Icon, { icon: ChevronRightIcon, size: 'sm', strokeColor: 'textTertiary' }) }))] }), hasSubmenu && (jsx(MenuPanel, { open: submenuOpen, onClose: () => closeSubmenu(true), onArrowLeft: () => closeSubmenu(true), anchorEl: liRef.current, placement: submenuPlacement, isSubmenu: true, "aria-label": label, onMouseEnter: isHoverTrigger ? clearTimers : undefined, onMouseLeave: isHoverTrigger ? scheduleClose : undefined, children: submenu }))] }));
4194
+ /**
4195
+ * When `href` is provided, the `<a>` is the browser navigation element.
4196
+ * - If `onClick` is also given (SPA routing): prevent browser navigation,
4197
+ * the click bubbles to `<li>` where `handleClick` calls `onClick` + `closeMenu`.
4198
+ * - If only `href` (plain link): let the browser navigate, `handleClick` on
4199
+ * the `<li>` still fires via bubbling and closes the menu.
4200
+ * - If `disabled`: prevent navigation entirely.
4201
+ */
4202
+ const handleAnchorClick = (e) => {
4203
+ if (disabled) {
4204
+ e.preventDefault();
4205
+ return;
4206
+ }
4207
+ if (onClick) {
4208
+ // Prevent browser follow; SPA handler will be called via bubbling.
4209
+ e.preventDefault();
4210
+ }
4211
+ };
4212
+ const innerContent = (jsxs(Fragment$1, { children: [isCheckable && (jsxs("span", { className: MENU_ITEM_STYLES.indicator, "aria-hidden": true, children: [checked && role === 'menuitemcheckbox' && (jsx(Icon, { icon: CheckIcon, size: size === 'default' ? 'sm' : 'md', strokeColor: 'primaryMain' })), checked && role === 'menuitemradio' && (jsx("span", { className: MENU_ITEM_STYLES.radioDot }))] })), icon !== undefined && (jsx(Icon, { icon: icon, size: 'sm', strokeColor: iconColor ?? (isHighlighted ? 'primaryMain' : 'textSecondary') })), jsx(Text, { variant: 'span', fontSize: 'sm', className: MENU_ITEM_STYLES.label, children: label }), hasSubmenu && (jsx("span", { className: MENU_ITEM_STYLES.submenuChevron, "aria-hidden": true, children: jsx(Icon, { icon: ChevronRightIcon, size: 'sm', strokeColor: 'textTertiary' }) }))] }));
4213
+ return (jsxs(Fragment$1, { children: [jsx("li", { ref: mergedRef, id: itemId, role: role, "aria-checked": isCheckable ? Boolean(checked) : undefined, "aria-selected": isOption ? Boolean(selected) : undefined, "aria-disabled": disabled, "aria-haspopup": hasSubmenu ? 'menu' : undefined, "aria-expanded": hasSubmenu ? submenuOpen : undefined, "data-selected": isHighlighted || undefined, "data-focused": isFocused || undefined, "data-disabled": disabled || undefined, "data-submenu-open": hasSubmenu && submenuOpen || undefined, className: MENU_ITEM_STYLES.root({ size }), onClick: handleClick, onMouseEnter: hasSubmenu && !disabled && isHoverTrigger ? scheduleOpen : undefined, onMouseLeave: hasSubmenu && isHoverTrigger ? scheduleClose : undefined, ...rest, children: href ? (jsx("a", { href: href, target: target, rel: target === '_blank' ? 'noopener noreferrer' : undefined, "aria-disabled": disabled || undefined, className: MENU_ITEM_STYLES.link, tabIndex: -1, onClick: handleAnchorClick, children: innerContent })) : innerContent }), hasSubmenu && (jsx(MenuPanel, { open: submenuOpen, onClose: () => closeSubmenu(true), onArrowLeft: () => closeSubmenu(true), anchorEl: liRef.current, placement: submenuPlacement, isSubmenu: true, "aria-label": label, onMouseEnter: isHoverTrigger ? clearTimers : undefined, onMouseLeave: isHoverTrigger ? scheduleClose : undefined, children: submenu }))] }));
4178
4214
  };
4179
4215
  MenuItem.displayName = 'MenuItem';
4180
4216