@moneyforward/mfui-components 3.14.1 → 3.16.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.
Files changed (36) hide show
  1. package/dist/src/DateTimeSelection/DatePicker/DatePicker.js +7 -2
  2. package/dist/src/DateTimeSelection/shared/BasePicker/YearSelector/YearSelector.js +19 -5
  3. package/dist/src/DateTimeSelection/shared/CalendarLocale/DisplayJapaneseCalendarContext.d.ts +6 -0
  4. package/dist/src/DateTimeSelection/shared/CalendarLocale/DisplayJapaneseCalendarContext.js +10 -0
  5. package/dist/src/DateTimeSelection/shared/YearSelector/YearSelector.js +17 -4
  6. package/dist/src/DateTimeSelection/shared/utilities/japaneseCalendar.d.ts +28 -0
  7. package/dist/src/DateTimeSelection/shared/utilities/japaneseCalendar.js +55 -0
  8. package/dist/src/FormFooter/FormFooter.types.d.ts +2 -1
  9. package/dist/src/MultipleSelectBox/MultipleSelectBox.d.ts +1 -1
  10. package/dist/src/MultipleSelectBox/MultipleSelectBox.js +16 -5
  11. package/dist/src/MultipleSelectBox/MultipleSelectBox.types.d.ts +60 -1
  12. package/dist/src/MultipleSelectBox/MultipleSelectBoxTrigger/MultipleSelectBoxTrigger.js +1 -1
  13. package/dist/src/MultipleSelectBox/hooks/useApplyControls.d.ts +1 -0
  14. package/dist/src/MultipleSelectBox/hooks/useApplyControls.js +16 -0
  15. package/dist/src/MultipleSelectBox/hooks/useCreateOption.d.ts +23 -0
  16. package/dist/src/MultipleSelectBox/hooks/useCreateOption.js +53 -0
  17. package/dist/src/MultipleSelectBox/index.d.ts +1 -1
  18. package/dist/src/SidePane/SidePane.d.ts +3 -0
  19. package/dist/src/SidePane/SidePane.js +4 -2
  20. package/dist/src/SidePane/SidePane.types.d.ts +14 -0
  21. package/dist/src/SubNavigation/SubNavigation.d.ts +1 -1
  22. package/dist/src/SubNavigation/SubNavigation.js +17 -15
  23. package/dist/src/SubNavigation/SubNavigation.types.d.ts +58 -0
  24. package/dist/src/SubNavigation/index.d.ts +1 -1
  25. package/dist/src/Tag/Tag.types.d.ts +17 -1
  26. package/dist/styled-system/recipes/form-footer-slot-recipe.d.ts +1 -1
  27. package/dist/styled-system/recipes/form-footer-slot-recipe.js +2 -1
  28. package/dist/styled-system/recipes/multiple-select-box-slot-recipe.d.ts +1 -1
  29. package/dist/styled-system/recipes/multiple-select-box-slot-recipe.js +12 -0
  30. package/dist/styled-system/recipes/side-pane-slot-recipe.d.ts +1 -1
  31. package/dist/styled-system/recipes/side-pane-slot-recipe.js +8 -0
  32. package/dist/styled-system/recipes/sub-navigation-slot-recipe.d.ts +1 -1
  33. package/dist/styled-system/recipes/sub-navigation-slot-recipe.js +4 -0
  34. package/dist/styles.css +82 -17
  35. package/dist/tsconfig.build.tsbuildinfo +1 -1
  36. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { DisclosureBasicCollapsed, Lock } from '@moneyforward/mfui-icons-react';
3
3
  import { cx } from '../../styled-system/css';
4
4
  import { subNavigationSlotRecipe } from '../../styled-system/recipes';
@@ -7,10 +7,10 @@ import { Typography } from '../Typography';
7
7
  /**
8
8
  * This component is for the navigation links under the main navigation.
9
9
  */
10
- export function SubNavigation({ orientation = 'vertical', navigationItems, customLinkComponent, className, }) {
10
+ export function SubNavigation({ orientation = 'vertical', navigationItems, customLinkComponent, renderNavigationLabel, headerSlot, className, }) {
11
11
  const hasLabelIcon = navigationItems.some(({ labelIcon }) => !!labelIcon);
12
12
  const classes = subNavigationSlotRecipe({ orientation, hasLabelIcon });
13
- return (_jsx("nav", { className: cx(classes.root, 'mfui-SubNavigation__root', className), children: _jsx("ul", { className: cx(classes.list, 'mfui-SubNavigation__list'), children: navigationItems.map((navigationItem, index) => (_jsx("li", { className: cx(classes.listItem, 'mfui-SubNavigation__listItem'), children: renderNavigationItem(navigationItem, customLinkComponent, classes, 0) }, index))) }) }));
13
+ return (_jsxs("nav", { className: cx(classes.root, 'mfui-SubNavigation__root', className), children: [headerSlot ? (_jsx("div", { className: cx(classes.subNavigationHeader, 'mfui-SubNavigation__subNavigationHeader'), children: headerSlot })) : null, _jsx("ul", { className: cx(classes.list, 'mfui-SubNavigation__list'), children: navigationItems.map((navigationItem, index) => (_jsx("li", { className: cx(classes.listItem, 'mfui-SubNavigation__listItem'), children: renderNavigationItem(navigationItem, customLinkComponent, classes, 0, renderNavigationLabel) }, index))) })] }));
14
14
  }
15
15
  /**
16
16
  * Render a navigation item based on the following conditions:
@@ -28,25 +28,27 @@ export function SubNavigation({ orientation = 'vertical', navigationItems, custo
28
28
  *
29
29
  * @param nestLevel - The nest level of the navigation item.
30
30
  *
31
+ * @param renderNavigationLabel - Custom render function for each navigation item's label.
32
+ *
31
33
  * @returns The rendered navigation item.
32
34
  */
33
- const renderNavigationItem = (navigationItem, customLinkComponent, classes, nestLevel) => {
35
+ const renderNavigationItem = (navigationItem, customLinkComponent, classes, nestLevel, renderNavigationLabel) => {
34
36
  const { label, href, labelIcon, statusSlot, locked, lockIconProps, children } = navigationItem;
35
37
  if (children === undefined) {
36
- return (_jsx(NavigationLink, { navigationItem: navigationItem, customLinkComponent: customLinkComponent, classes: classes }));
38
+ return (_jsx(NavigationLink, { navigationItem: navigationItem, customLinkComponent: customLinkComponent, classes: classes, renderNavigationLabel: renderNavigationLabel }));
37
39
  }
38
40
  if (href) {
39
41
  // The the parent item will be rendered as a link with separated disclosure icon button.
40
- return (_jsxs(_Fragment, { children: [_jsx(NavigationLink, { navigationItem: navigationItem, customLinkComponent: customLinkComponent, classes: classes }), _jsx(NestedNavigationList, { summarySlot: _jsx("div", { "data-mfui-content": "sub-navigation-disclosure-icon", className: cx(classes.disclosureIcon, 'mfui-SubNavigation__disclosureIcon'), children: _jsx(DisclosureBasicCollapsed, { "aria-label": label }) }), nestedNavigationItems: children, customLinkComponent: customLinkComponent, classes: classes, nestLevel: nestLevel + 1 })] }));
42
+ return (_jsxs(_Fragment, { children: [_jsx(NavigationLink, { navigationItem: navigationItem, customLinkComponent: customLinkComponent, classes: classes, renderNavigationLabel: renderNavigationLabel }), _jsx(NestedNavigationList, { summarySlot: _jsx("div", { "data-mfui-content": "sub-navigation-disclosure-icon", className: cx(classes.disclosureIcon, 'mfui-SubNavigation__disclosureIcon'), children: _jsx(DisclosureBasicCollapsed, { "aria-label": label }) }), nestedNavigationItems: children, customLinkComponent: customLinkComponent, classes: classes, nestLevel: nestLevel + 1, renderNavigationLabel: renderNavigationLabel })] }));
41
43
  }
42
44
  // The the parent item will be rendered as a disclosure button with an icon.
43
- return (_jsx(NestedNavigationList, { summarySlot: _jsxs(_Fragment, { children: [_jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes }), _jsx("div", { "data-mfui-content": "sub-navigation-disclosure-icon", className: cx(classes.disclosureIcon, 'mfui-SubNavigation__disclosureIcon'), children: _jsx(DisclosureBasicCollapsed, { "aria-label": "" }) })] }), nestedNavigationItems: children, customLinkComponent: customLinkComponent, classes: classes, nestLevel: nestLevel + 1 }));
45
+ return (_jsx(NestedNavigationList, { summarySlot: _jsxs(_Fragment, { children: [_jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes, renderNavigationLabel }), _jsx("div", { "data-mfui-content": "sub-navigation-disclosure-icon", className: cx(classes.disclosureIcon, 'mfui-SubNavigation__disclosureIcon'), children: _jsx(DisclosureBasicCollapsed, { "aria-label": "" }) })] }), nestedNavigationItems: children, customLinkComponent: customLinkComponent, classes: classes, nestLevel: nestLevel + 1, renderNavigationLabel: renderNavigationLabel }));
44
46
  };
45
47
  /**
46
48
  * This is a group of a text label, an optional icon, and a status.
47
49
  * This is used for all navigation links and parent items for disclosure buttons in SubNavigation.
48
50
  */
49
- function NavigationLabelGroup({ label, labelIcon, locked, lockIconProps, statusSlot, classes, }) {
51
+ function NavigationLabelGroup({ label, labelIcon, locked, lockIconProps, statusSlot, classes, renderNavigationLabel, }) {
50
52
  // If locked=true, display <Lock /> icon in preference to any other status of the statusSlot option.
51
53
  const renderStatus = () => {
52
54
  if (locked) {
@@ -57,31 +59,31 @@ function NavigationLabelGroup({ label, labelIcon, locked, lockIconProps, statusS
57
59
  }
58
60
  return null;
59
61
  };
60
- return (_jsxs(_Fragment, { children: [labelIcon ? _jsx("div", { className: cx(classes.labelIcon, 'mfui-SubNavigation__labelIcon'), children: labelIcon }) : null, _jsx(Typography, { variant: "strongControlLabel", className: cx(classes.label, 'mfui-SubNavigation__label'), children: label }), renderStatus()] }));
62
+ return (_jsxs(_Fragment, { children: [labelIcon ? _jsx("div", { className: cx(classes.labelIcon, 'mfui-SubNavigation__labelIcon'), children: labelIcon }) : null, renderNavigationLabel ? (renderNavigationLabel(label)) : (_jsx(Typography, { variant: "strongControlLabel", className: cx(classes.label, 'mfui-SubNavigation__label'), children: label })), renderStatus()] }));
61
63
  }
62
64
  /**
63
65
  * This is a link that has NavigationLabelGroup.
64
66
  * This is used for all navigation links in SubNavigation.
65
67
  */
66
- function NavigationLink({ navigationItem, customLinkComponent, classes, }) {
68
+ function NavigationLink({ navigationItem, customLinkComponent, classes, renderNavigationLabel, }) {
67
69
  const { label, href, isCurrent, isExternal, labelIcon, statusSlot, locked, lockIconProps } = navigationItem;
68
70
  if (navigationItem.children === undefined && navigationItem.onClick) {
69
71
  const { onClick } = navigationItem;
70
72
  return (_jsx(FocusIndicator, { children: _jsx("button", { type: "button", className: cx(classes.link, 'mfui-SubNavigation__link'), "aria-current": isCurrent ? 'page' : undefined, onClick: () => {
71
73
  onClick(navigationItem.href);
72
- }, children: _jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes }) }) }));
74
+ }, children: _jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes, renderNavigationLabel }) }) }));
73
75
  }
74
76
  if (customLinkComponent && !isExternal) {
75
77
  const Tag = customLinkComponent;
76
- return (_jsx(FocusIndicator, { children: _jsx(Tag, { href: href, className: cx(classes.link, 'mfui-SubNavigation__link'), "aria-current": isCurrent ? 'page' : undefined, children: _jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes }) }) }));
78
+ return (_jsx(FocusIndicator, { children: _jsx(Tag, { href: href, className: cx(classes.link, 'mfui-SubNavigation__link'), "aria-current": isCurrent ? 'page' : undefined, children: _jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes, renderNavigationLabel }) }) }));
77
79
  }
78
- return (_jsx(FocusIndicator, { children: _jsx("a", { href: href, target: isExternal ? '_blank' : undefined, className: cx(classes.link, 'mfui-SubNavigation__link'), "aria-current": isCurrent ? 'page' : undefined, rel: "noreferrer", children: _jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes }) }) }));
80
+ return (_jsx(FocusIndicator, { children: _jsx("a", { href: href, target: isExternal ? '_blank' : undefined, className: cx(classes.link, 'mfui-SubNavigation__link'), "aria-current": isCurrent ? 'page' : undefined, rel: "noreferrer", children: _jsx(NavigationLabelGroup, { label, labelIcon, locked, lockIconProps, statusSlot, classes, renderNavigationLabel }) }) }));
79
81
  }
80
82
  /**
81
83
  * This is a details element that contains a list of nested navigation links.
82
84
  */
83
- function NestedNavigationList({ summarySlot, nestedNavigationItems, customLinkComponent, classes, nestLevel, }) {
85
+ function NestedNavigationList({ summarySlot, nestedNavigationItems, customLinkComponent, classes, nestLevel, renderNavigationLabel, }) {
84
86
  // Check whether all descendants have isCurrent=true by calling itself recursively.
85
87
  const isCurrentPathInChildren = (children) => children?.some(({ isCurrent, children }) => isCurrent || (children && isCurrentPathInChildren(children))) || false;
86
- return (_jsxs("details", { open: isCurrentPathInChildren(nestedNavigationItems), className: cx(classes.details, 'mfui-SubNavigation__details'), children: [_jsx(FocusIndicator, { children: _jsx("summary", { className: cx(classes.summary, 'mfui-SubNavigation__summary'), children: summarySlot }) }), _jsx("ul", { className: cx(classes.list, 'mfui-SubNavigation__list'), children: nestedNavigationItems.map((nestedNavigationItem, index) => (_jsx("li", { className: cx(classes.nestedListItem, 'mfui-SubNavigation__nestedListItem'), "data-mfui-nest-level": nestLevel, children: nestedNavigationItem.children === undefined ? (_jsx(NavigationLink, { navigationItem: nestedNavigationItem, customLinkComponent: customLinkComponent, classes: classes })) : (renderNavigationItem(nestedNavigationItem, customLinkComponent, classes, nestLevel + 1)) }, index))) })] }));
88
+ return (_jsxs("details", { open: isCurrentPathInChildren(nestedNavigationItems), className: cx(classes.details, 'mfui-SubNavigation__details'), children: [_jsx(FocusIndicator, { children: _jsx("summary", { className: cx(classes.summary, 'mfui-SubNavigation__summary'), children: summarySlot }) }), _jsx("ul", { className: cx(classes.list, 'mfui-SubNavigation__list'), children: nestedNavigationItems.map((nestedNavigationItem, index) => (_jsx("li", { className: cx(classes.nestedListItem, 'mfui-SubNavigation__nestedListItem'), "data-mfui-nest-level": nestLevel, children: nestedNavigationItem.children === undefined ? (_jsx(NavigationLink, { navigationItem: nestedNavigationItem, customLinkComponent: customLinkComponent, classes: classes, renderNavigationLabel: renderNavigationLabel })) : (renderNavigationItem(nestedNavigationItem, customLinkComponent, classes, nestLevel + 1, renderNavigationLabel)) }, index))) })] }));
87
89
  }
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode, type ElementType, type ComponentPropsWithoutRef } from 'react';
2
+ export type SubNavigationRenderLabelFunction = (label: string) => ReactNode;
2
3
  export type SubNavigationProps = VerticalSubNavigationProps | HorizontalSubNavigationProps;
3
4
  type VerticalSubNavigationProps = BaseSubNavigationProps & {
4
5
  /**
@@ -47,6 +48,63 @@ type BaseSubNavigationProps = {
47
48
  * e.g. next/link
48
49
  */
49
50
  customLinkComponent?: ElementType;
51
+ /**
52
+ * Custom render function for each navigation item's label.
53
+ * Receives the item's raw `label` string and returns a ReactNode rendered inside
54
+ * the default `<Typography variant="strongControlLabel">` wrapper.
55
+ * When omitted, the label string is rendered directly (default behavior).
56
+ *
57
+ * Use this to truncate long labels or otherwise customize how labels are displayed
58
+ * without losing the built-in semantic markup.
59
+ *
60
+ * To show a tooltip on both hover and focus, wrap the entire link with a `Tooltip`
61
+ * via `customLinkComponent` instead — placing a `Tooltip` inside `renderNavigationLabel`
62
+ * only works for hover because the tooltip trigger ends up inside the focusable `<a>`,
63
+ * and focus events do not propagate inward to child elements.
64
+ *
65
+ * @param label - The label string of the navigation item.
66
+ *
67
+ * @returns ReactNode - Custom content rendered inside the label wrapper.
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * // Truncate labels that exceed 2 lines
72
+ * <SubNavigation
73
+ * navigationItems={items}
74
+ * renderNavigationLabel={(label) => (
75
+ * <span
76
+ * style={{
77
+ * display: '-webkit-box',
78
+ * WebkitLineClamp: 2,
79
+ * WebkitBoxOrient: 'vertical',
80
+ * overflow: 'hidden',
81
+ * }}
82
+ * >
83
+ * {label}
84
+ * </span>
85
+ * )}
86
+ * />
87
+ * ```
88
+ */
89
+ renderNavigationLabel?: SubNavigationRenderLabelFunction;
90
+ /**
91
+ * Content displayed above the navigation list, rendered inside a padded wrapper.
92
+ * Use this to add a feature shortcut, promotional content, or other header-level
93
+ * UI at the top of the navigation.
94
+ *
95
+ * @example
96
+ * ```tsx
97
+ * <SubNavigation
98
+ * navigationItems={items}
99
+ * headerSlot={
100
+ * <Button priority="primary" href="/upgrade">
101
+ * Upgrade plan
102
+ * </Button>
103
+ * }
104
+ * />
105
+ * ```
106
+ */
107
+ headerSlot?: ReactNode;
50
108
  /**
51
109
  * For overriding styles if you need.
52
110
  */
@@ -1,2 +1,2 @@
1
1
  export { SubNavigation } from './SubNavigation';
2
- export type { SubNavigationProps } from './SubNavigation.types';
2
+ export type { SubNavigationProps, SubNavigationRenderLabelFunction } from './SubNavigation.types';
@@ -54,7 +54,23 @@ export type TagProps = {
54
54
  */
55
55
  onClick?: undefined;
56
56
  /**
57
- * This prop is not available when "onClick" is not provided.
57
+ * Optional flag to disable the close button. This option is only available when "onClose" is provided.
58
+ *
59
+ * @default false
60
+ */
61
+ disabled?: boolean;
62
+ /**
63
+ * The handler to close the tag. When this prop is provided, the close button will be shown.
64
+ * Required in this variant to allow the disabled prop.
65
+ */
66
+ onClose: (event: MouseEvent<HTMLButtonElement>) => void;
67
+ } | {
68
+ /**
69
+ * Optional click event handler. If provided, the Tag will be rendered as a button element.
70
+ */
71
+ onClick?: undefined;
72
+ /**
73
+ * This prop is not available when neither "onClick" nor "onClose" is provided.
58
74
  *
59
75
  * @default false
60
76
  */
@@ -3,7 +3,7 @@ import type { ConditionalValue } from '../types/index';
3
3
  import type { DistributiveOmit, Pretty } from '../types/system-types';
4
4
 
5
5
  interface FormFooterSlotRecipeVariant {
6
- position: "stacking" | "fixed"
6
+ position: "stacking" | "fixed" | "sticky"
7
7
  sectionPosition: "center" | "fill"
8
8
  }
9
9
 
@@ -38,7 +38,8 @@ export const formFooterSlotRecipe = /* @__PURE__ */ Object.assign(formFooterSlot
38
38
  variantMap: {
39
39
  "position": [
40
40
  "stacking",
41
- "fixed"
41
+ "fixed",
42
+ "sticky"
42
43
  ],
43
44
  "sectionPosition": [
44
45
  "center",
@@ -10,7 +10,7 @@ type MultipleSelectBoxSlotRecipeVariantMap = {
10
10
  [key in keyof MultipleSelectBoxSlotRecipeVariant]: Array<MultipleSelectBoxSlotRecipeVariant[key]>
11
11
  }
12
12
 
13
- type MultipleSelectBoxSlotRecipeSlot = "popover" | "menuHeader" | "optionPanel" | "listBox" | "listItem" | "skeletonItem" | "emptyMessage" | "menuFooter" | "scrollWrapper" | "infiniteScrollError" | "infiniteScrollErrorMessage" | "infiniteScrollErrorButton" | "infiniteScrollErrorIcon" | "infiniteScrollLoading"
13
+ type MultipleSelectBoxSlotRecipeSlot = "popover" | "menuHeader" | "optionPanel" | "listBox" | "listItem" | "skeletonItem" | "emptyMessage" | "menuFooter" | "scrollWrapper" | "infiniteScrollError" | "infiniteScrollErrorMessage" | "infiniteScrollErrorButton" | "infiniteScrollErrorIcon" | "infiniteScrollLoading" | "createOptionArea" | "createOptionButton" | "createOptionErrorMessage"
14
14
 
15
15
  export type MultipleSelectBoxSlotRecipeVariantProps = {
16
16
  [key in keyof MultipleSelectBoxSlotRecipeVariant]?: ConditionalValue<MultipleSelectBoxSlotRecipeVariant[key]> | undefined
@@ -58,6 +58,18 @@ const multipleSelectBoxSlotRecipeSlotNames = [
58
58
  [
59
59
  "infiniteScrollLoading",
60
60
  "MultipleSelectBox__infiniteScrollLoading"
61
+ ],
62
+ [
63
+ "createOptionArea",
64
+ "MultipleSelectBox__createOptionArea"
65
+ ],
66
+ [
67
+ "createOptionButton",
68
+ "MultipleSelectBox__createOptionButton"
69
+ ],
70
+ [
71
+ "createOptionErrorMessage",
72
+ "MultipleSelectBox__createOptionErrorMessage"
61
73
  ]
62
74
  ];
63
75
  const multipleSelectBoxSlotRecipeSlotFns = /* @__PURE__ */ multipleSelectBoxSlotRecipeSlotNames.map(([slotName, slotKey]) => [slotName, createRecipe(slotKey, multipleSelectBoxSlotRecipeDefaultVariants, getSlotCompoundVariant(multipleSelectBoxSlotRecipeCompoundVariants, slotName))]);
@@ -11,7 +11,7 @@ type SidePaneSlotRecipeVariantMap = {
11
11
  [key in keyof SidePaneSlotRecipeVariant]: Array<SidePaneSlotRecipeVariant[key]>
12
12
  }
13
13
 
14
- type SidePaneSlotRecipeSlot = "root" | "backdrop" | "inside" | "header" | "title" | "actionSlotWrapper" | "actionSlot" | "closeButtonWrapper" | "content"
14
+ type SidePaneSlotRecipeSlot = "root" | "backdrop" | "inside" | "header" | "title" | "actionSlotWrapper" | "actionSlot" | "closeButtonWrapper" | "content" | "contentBody" | "footer"
15
15
 
16
16
  export type SidePaneSlotRecipeVariantProps = {
17
17
  [key in keyof SidePaneSlotRecipeVariant]?: ConditionalValue<SidePaneSlotRecipeVariant[key]> | undefined
@@ -38,6 +38,14 @@ const sidePaneSlotRecipeSlotNames = [
38
38
  [
39
39
  "content",
40
40
  "SidePane__content"
41
+ ],
42
+ [
43
+ "contentBody",
44
+ "SidePane__contentBody"
45
+ ],
46
+ [
47
+ "footer",
48
+ "SidePane__footer"
41
49
  ]
42
50
  ];
43
51
  const sidePaneSlotRecipeSlotFns = /* @__PURE__ */ sidePaneSlotRecipeSlotNames.map(([slotName, slotKey]) => [slotName, createRecipe(slotKey, sidePaneSlotRecipeDefaultVariants, getSlotCompoundVariant(sidePaneSlotRecipeCompoundVariants, slotName))]);
@@ -11,7 +11,7 @@ type SubNavigationSlotRecipeVariantMap = {
11
11
  [key in keyof SubNavigationSlotRecipeVariant]: Array<SubNavigationSlotRecipeVariant[key]>
12
12
  }
13
13
 
14
- type SubNavigationSlotRecipeSlot = "root" | "list" | "listItem" | "link" | "labelIcon" | "label" | "statusSlot" | "details" | "summary" | "disclosureIcon" | "nestedListItem"
14
+ type SubNavigationSlotRecipeSlot = "root" | "subNavigationHeader" | "list" | "listItem" | "link" | "labelIcon" | "label" | "statusSlot" | "details" | "summary" | "disclosureIcon" | "nestedListItem"
15
15
 
16
16
  export type SubNavigationSlotRecipeVariantProps = {
17
17
  [key in keyof SubNavigationSlotRecipeVariant]?: ConditionalValue<SubNavigationSlotRecipeVariant[key]> | undefined
@@ -7,6 +7,10 @@ const subNavigationSlotRecipeSlotNames = [
7
7
  "root",
8
8
  "SubNavigation__root"
9
9
  ],
10
+ [
11
+ "subNavigationHeader",
12
+ "SubNavigation__subNavigationHeader"
13
+ ],
10
14
  [
11
15
  "list",
12
16
  "SubNavigation__list"
package/dist/styles.css CHANGED
@@ -2366,16 +2366,25 @@
2366
2366
  .mfui-hERVbP {
2367
2367
  flex: 1 1 0%;
2368
2368
  overflow: auto;
2369
- padding-inline: var(--mfui-spacing-mfui\.size\.padding\.main-content\.horizontal\.comfort);
2370
2369
  flex-shrink: 0;
2371
- padding-block-start: var(--mfui-spacing-mfui\.size\.padding\.main-content\.top\.comfort);
2372
- padding-block-end: var(--mfui-spacing-mfui\.size\.padding\.main-content\.bottom\.comfort);
2370
+ display: flex;
2371
+ flex-direction: column;
2373
2372
  font-family: var(--mfui-fonts-mfui\.typography\.font-family\.body);
2374
2373
  font-weight: var(--mfui-font-weights-mfui\.typography\.font-weight\.body);
2375
2374
  font-size: var(--mfui-font-sizes-mfui\.typography\.font-size\.body);
2376
2375
  line-height: var(--mfui-line-heights-mfui\.typography\.line-height\.body);
2377
2376
  }
2378
2377
 
2378
+ .mfui-jVWTKD {
2379
+ padding-inline: var(--mfui-spacing-mfui\.size\.padding\.main-content\.horizontal\.comfort);
2380
+ padding-block-start: var(--mfui-spacing-mfui\.size\.padding\.main-content\.top\.comfort);
2381
+ padding-block-end: var(--mfui-spacing-mfui\.size\.padding\.main-content\.bottom\.comfort);
2382
+ }
2383
+
2384
+ .mfui-iAowQz {
2385
+ flex-shrink: 0;
2386
+ }
2387
+
2379
2388
  .mfui-lbCmDn {
2380
2389
  border-style: solid;
2381
2390
  border-color: var(--mfui-colors-mfui\.color\.neutral\.border\.none);
@@ -2964,6 +2973,13 @@
2964
2973
  background-color: var(--mfui-colors-mfui\.color\.base\.background\.none);
2965
2974
  }
2966
2975
 
2976
+ .mfui-XFuwI {
2977
+ padding-block: var(--mfui-spacing-mfui\.size\.padding\.control-container\.vertical\.comfort);
2978
+ padding-inline: var(--mfui-spacing-mfui\.size\.padding\.sub-navigation\.horizontal\.comfort);
2979
+ display: flex;
2980
+ flex-direction: column;
2981
+ }
2982
+
2967
2983
  .mfui-erQjxT {
2968
2984
  list-style: none;
2969
2985
  }
@@ -3348,6 +3364,56 @@
3348
3364
  height: 16px;
3349
3365
  }
3350
3366
 
3367
+ .mfui-bTuopm {
3368
+ gap: 4px;
3369
+ padding-inline: 0px;
3370
+ flex-direction: column;
3371
+ padding-top: calc(var(--mfui-spacing-mfui\.size\.padding\.container\.vertical\.comfort) - 1px);
3372
+ padding-bottom: var(--mfui-spacing-mfui\.size\.padding\.container\.vertical\.comfort);
3373
+ border-top-width: var(--mfui-border-widths-mfui\.size\.border\.base\.width\.comfort);
3374
+ border-top-color: var(--mfui-colors-mfui\.color\.neutral\.sub-border\.none);
3375
+ border-top-style: solid;
3376
+ }
3377
+
3378
+ .mfui-bTuopm,.mfui-fBfmXL {
3379
+ display: flex;
3380
+ background-color: var(--mfui-colors-mfui\.color\.base\.background\.none);
3381
+ }
3382
+
3383
+ .mfui-fBfmXL {
3384
+ border: none;
3385
+ gap: var(--mfui-spacing-mfui\.size\.spacing\.icon-and-text\.horizontal\.comfort);
3386
+ padding-block: 4px;
3387
+ padding-inline: var(--mfui-spacing-mfui\.size\.padding\.control\.horizontal\.comfort);
3388
+ align-items: flex-start;
3389
+ cursor: pointer;
3390
+ width: 100%;
3391
+ min-height: var(--mfui-sizes-mfui\.size\.dimension\.control-component\.height\.comfort);
3392
+ }
3393
+
3394
+ .mfui-fBfmXL > svg {
3395
+ margin-block: 3px;
3396
+ flex-shrink: 0;
3397
+ color: var(--mfui-colors-mfui\.color\.neutral\.content\.none);
3398
+ width: var(--mfui-sizes-mfui\.size\.dimension\.icon\.square\.comfort);
3399
+ height: var(--mfui-sizes-mfui\.size\.dimension\.icon\.square\.comfort);
3400
+ }
3401
+
3402
+ .mfui-fBfmXL:is(:disabled, [disabled], [data-disabled], [aria-disabled=true]) {
3403
+ cursor: not-allowed;
3404
+ opacity: 0.5;
3405
+ }
3406
+
3407
+ .mfui-fBfmXL:is(:hover, [data-hover]) {
3408
+ color: var(--mfui-colors-mfui\.color\.base\.content\.hovered);
3409
+ background-color: var(--mfui-colors-mfui\.color\.base\.background\.hovered);
3410
+ cursor: pointer;
3411
+ }
3412
+
3413
+ .mfui-kQVryS {
3414
+ padding-inline: var(--mfui-spacing-mfui\.size\.padding\.control\.horizontal\.comfort);
3415
+ }
3416
+
3351
3417
  .mfui-frSlYl {
3352
3418
  border: 1px solid;
3353
3419
  gap: var(--mfui-spacing-mfui\.size\.spacing\.inline\.horizontal\.comfort);
@@ -5097,8 +5163,10 @@ li:last-child > .mfui-cXGJls {
5097
5163
  .mfui-iEbmF {
5098
5164
  padding-inline: var(--mfui-spacing-mfui\.size\.padding\.main-content\.horizontal\.comfort);
5099
5165
  display: flex;
5100
- flex-direction: column;
5166
+ flex-direction: row;
5167
+ flex-wrap: wrap;
5101
5168
  align-items: flex-start;
5169
+ column-gap: var(--mfui-spacing-mfui\.size\.spacing\.paragraph\.horizontal\.comfort);
5102
5170
  }
5103
5171
 
5104
5172
  .mfui-fpqRil {
@@ -5107,10 +5175,9 @@ li:last-child > .mfui-cXGJls {
5107
5175
  }
5108
5176
 
5109
5177
  .mfui-fpqRil,.mfui-eTbFbc {
5110
- flex: none;
5178
+ flex: 1 0 auto;
5111
5179
  display: flex;
5112
5180
  align-items: center;
5113
- width: 100%;
5114
5181
  height: var(--mfui-sizes-mfui\.size\.dimension\.control-container\.height\.comfort);
5115
5182
  }
5116
5183
 
@@ -5127,15 +5194,6 @@ li:last-child > .mfui-cXGJls {
5127
5194
  }
5128
5195
  .mfui-jDhUBB,.mfui-ggXIiJ,.mfui-clKroC {
5129
5196
  display: none;
5130
- }
5131
- .mfui-iEbmF {
5132
- gap: var(--mfui-spacing-mfui\.size\.spacing\.paragraph\.horizontal\.comfort);
5133
- flex-direction: row;
5134
- }
5135
- .mfui-fpqRil,.mfui-eTbFbc {
5136
- flex: 1 0 0;
5137
- width: auto;
5138
- min-width: 0;
5139
5197
  }
5140
5198
  }
5141
5199
 
@@ -7074,16 +7132,23 @@ li:last-child > .mfui-cXGJls {
7074
7132
 
7075
7133
  .mfui-jAKHYi {
7076
7134
  position: fixed;
7135
+ left: 0;
7136
+ right: 0;
7137
+ }
7138
+
7139
+ .mfui-jAKHYi,.mfui-erGtCj {
7077
7140
  z-index: 1;
7078
7141
  background-color: var(--mfui-colors-mfui\.color\.base\.background\.none);
7079
7142
  bottom: 0;
7080
- left: 0;
7081
- right: 0;
7082
7143
  border-top-width: var(--mfui-border-widths-mfui\.size\.border\.fixed-cell\.horizontal\.comfort);
7083
7144
  border-top-style: solid;
7084
7145
  border-top-color: var(--mfui-colors-mfui\.color\.neutral\.sub-border\.none);
7085
7146
  }
7086
7147
 
7148
+ .mfui-erGtCj {
7149
+ position: sticky;
7150
+ }
7151
+
7087
7152
  .mfui-hhFgaB {
7088
7153
  max-width: var(--mfui-sizes-mfui\.layout\.area\.horizontal\.fixed);
7089
7154
  width: 100%;