@moneyforward/mfui-components 3.34.0 → 3.35.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/src/IconButton/IconButton.d.ts +2 -0
- package/dist/src/IconButton/IconButton.js +2 -2
- package/dist/src/IconButton/IconButton.types.d.ts +7 -0
- package/dist/src/MultipleSelectBox/MultipleSelectBox.types.d.ts +4 -0
- package/dist/src/MultipleSelectBox/hooks/useSearchBox.js +14 -3
- package/dist/src/SelectBox/SelectBox.js +8 -1
- package/dist/src/SelectBox/SelectBox.types.d.ts +7 -0
- package/dist/src/SelectBox/hooks/useSearchBox.d.ts +6 -1
- package/dist/src/SelectBox/hooks/useSearchBox.js +23 -4
- package/dist/src/SplitView/SplitView.js +16 -2
- package/dist/styled-system/recipes/icon-button-slot-recipe.d.ts +2 -1
- package/dist/styled-system/recipes/icon-button-slot-recipe.js +33 -2
- package/dist/styles.css +28 -4
- package/package.json +3 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const InternalIconButton: import("react").ForwardRefExoticComponent<{
|
|
2
2
|
outlined?: import("../../styled-system/recipes").IconButtonSlotRecipeVariant['outlined'];
|
|
3
|
+
destructive?: import("../../styled-system/recipes").IconButtonSlotRecipeVariant['destructive'];
|
|
3
4
|
children: React.ReactNode;
|
|
4
5
|
disabled?: boolean;
|
|
5
6
|
href?: string;
|
|
@@ -9,6 +10,7 @@ export declare const InternalIconButton: import("react").ForwardRefExoticCompone
|
|
|
9
10
|
} & import("react").RefAttributes<HTMLAnchorElement | HTMLButtonElement>>;
|
|
10
11
|
export declare const IconButton: import("react").ForwardRefExoticComponent<{
|
|
11
12
|
outlined?: import("../../styled-system/recipes").IconButtonSlotRecipeVariant['outlined'];
|
|
13
|
+
destructive?: import("../../styled-system/recipes").IconButtonSlotRecipeVariant['destructive'];
|
|
12
14
|
children: React.ReactNode;
|
|
13
15
|
disabled?: boolean;
|
|
14
16
|
href?: string;
|
|
@@ -20,8 +20,8 @@ import { FocusIndicator } from '../FocusIndicator';
|
|
|
20
20
|
*
|
|
21
21
|
* @param ref - Forwarded ref for the rendered button or anchor element.
|
|
22
22
|
*/
|
|
23
|
-
function IconButtonBase({ children, outlined, size = 'default', className, href, customLinkComponent, disabled = false, type = 'button', ...rest }, ref) {
|
|
24
|
-
const classes = iconButtonSlotRecipe({ outlined, size });
|
|
23
|
+
function IconButtonBase({ children, outlined, destructive, size = 'default', className, href, customLinkComponent, disabled = false, type = 'button', ...rest }, ref) {
|
|
24
|
+
const classes = iconButtonSlotRecipe({ outlined, size, destructive });
|
|
25
25
|
const isButton = disabled || href === undefined;
|
|
26
26
|
const Tag = useMemo(() => {
|
|
27
27
|
// If disabled, always render as a button since the link component doesn't support disabled prop
|
|
@@ -7,6 +7,13 @@ type IconButtonCommonProps = {
|
|
|
7
7
|
* @default false
|
|
8
8
|
*/
|
|
9
9
|
outlined?: IconButtonSlotRecipeVariant['outlined'];
|
|
10
|
+
/**
|
|
11
|
+
* Whether the button is destructive.
|
|
12
|
+
* The style of the button will be changed to indicate that the action is destructive.
|
|
13
|
+
*
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
destructive?: IconButtonSlotRecipeVariant['destructive'];
|
|
10
17
|
/**
|
|
11
18
|
* Icon element to be rendered inside the button.
|
|
12
19
|
* Only one element (typically an SVG icon) is expected.
|
|
@@ -446,6 +446,10 @@ export type MultipleSelectBoxProps<T extends AllowedValueTypes = string, Additio
|
|
|
446
446
|
* Handler executed when text is entered in the search box.
|
|
447
447
|
* The handler is debounced by 300ms.
|
|
448
448
|
*
|
|
449
|
+
* If the handler is provided after the user has already typed (e.g.
|
|
450
|
+
* `onSearchOptions={isReady ? handleSearch : undefined}`), it is called
|
|
451
|
+
* once with the current search text so that pending input is not lost.
|
|
452
|
+
*
|
|
449
453
|
* When this prop is provided, client-side filtering is disabled as it's
|
|
450
454
|
* assumed that filtering will be handled by the prop.
|
|
451
455
|
*/
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { useLatest } from '../../utilities/state/useLatest';
|
|
3
4
|
import { normalizeFullWidth } from '../../utilities/string/normalizeFullWidth';
|
|
4
5
|
/**
|
|
5
6
|
* Custom hook to handle search functionality within a SelectBox component.
|
|
@@ -18,6 +19,10 @@ export const useSearchBox = (options, enableSearchOptions, onSearchOptions) => {
|
|
|
18
19
|
const [searchText, setSearchText] = useState('');
|
|
19
20
|
const debounceRef = useRef(null);
|
|
20
21
|
const previousSearchTextRef = useRef('');
|
|
22
|
+
// Keep the latest handler in a ref so that a new handler identity (e.g. an
|
|
23
|
+
// inline function re-created on parent re-render) does not re-run the
|
|
24
|
+
// debounce effect and cancel a pending call.
|
|
25
|
+
const onSearchOptionsRef = useLatest(onSearchOptions);
|
|
21
26
|
const filteredOptions = useMemo(() => {
|
|
22
27
|
if (!enableSearchOptions || onSearchOptions) {
|
|
23
28
|
return options;
|
|
@@ -29,8 +34,14 @@ export const useSearchBox = (options, enableSearchOptions, onSearchOptions) => {
|
|
|
29
34
|
const onSearchTextChange = (event) => {
|
|
30
35
|
setSearchText(event.target.value);
|
|
31
36
|
};
|
|
37
|
+
// Track only the presence of the handler (not its identity) so that an
|
|
38
|
+
// undefined → defined transition re-runs the effect and dispatches the
|
|
39
|
+
// pending search text, while identity changes do not cancel pending calls.
|
|
40
|
+
// This preserves the behavior of the previous implementation, where the
|
|
41
|
+
// handler itself was an effect dependency and the transition dispatched.
|
|
42
|
+
const hasSearchHandler = Boolean(onSearchOptions);
|
|
32
43
|
useEffect(() => {
|
|
33
|
-
if (!enableSearchOptions || !
|
|
44
|
+
if (!enableSearchOptions || !hasSearchHandler)
|
|
34
45
|
return;
|
|
35
46
|
// Skip if searchText hasn't changed (prevents initial mount and unnecessary calls)
|
|
36
47
|
if (searchText === previousSearchTextRef.current) {
|
|
@@ -41,14 +52,14 @@ export const useSearchBox = (options, enableSearchOptions, onSearchOptions) => {
|
|
|
41
52
|
clearTimeout(debounceRef.current);
|
|
42
53
|
}
|
|
43
54
|
debounceRef.current = setTimeout(() => {
|
|
44
|
-
|
|
55
|
+
onSearchOptionsRef.current?.(searchText);
|
|
45
56
|
}, 300);
|
|
46
57
|
return () => {
|
|
47
58
|
if (debounceRef.current) {
|
|
48
59
|
clearTimeout(debounceRef.current);
|
|
49
60
|
}
|
|
50
61
|
};
|
|
51
|
-
}, [searchText,
|
|
62
|
+
}, [searchText, enableSearchOptions, hasSearchHandler, onSearchOptionsRef]);
|
|
52
63
|
return {
|
|
53
64
|
onSearchTextChange,
|
|
54
65
|
filteredOptions,
|
|
@@ -53,7 +53,14 @@ export const SelectBox = forwardRef((props, ref) => {
|
|
|
53
53
|
triggerRef.current?.focus();
|
|
54
54
|
},
|
|
55
55
|
});
|
|
56
|
-
const { searchText, onSearchTextChange, filteredOptions } = useSearchBox(options, enableSearchOptions, onSearchOptions);
|
|
56
|
+
const { searchText, onSearchTextChange, filteredOptions, resetSearchText } = useSearchBox(options, enableSearchOptions, onSearchOptions);
|
|
57
|
+
// Clear the search text whenever the option panel closes so that
|
|
58
|
+
// reopening always starts from an unfiltered option list.
|
|
59
|
+
useUpdateEffect(() => {
|
|
60
|
+
if (!isOptionPanelOpen) {
|
|
61
|
+
resetSearchText();
|
|
62
|
+
}
|
|
63
|
+
}, [isOptionPanelOpen, resetSearchText]);
|
|
57
64
|
const selectedOption = useMemo(() => {
|
|
58
65
|
if (value === undefined)
|
|
59
66
|
return null;
|
|
@@ -361,6 +361,13 @@ export type SelectBoxProps<T extends AllowedValueTypes = string, AdditionalProps
|
|
|
361
361
|
* Handler executed when text is entered in the search box.
|
|
362
362
|
* The handler is debounced by 300ms.
|
|
363
363
|
*
|
|
364
|
+
* Also called with an empty string when the option panel closes, because the
|
|
365
|
+
* search text is reset on close so that reopening shows the full option list.
|
|
366
|
+
*
|
|
367
|
+
* If the handler is provided after the user has already typed (e.g.
|
|
368
|
+
* `onSearchOptions={isReady ? handleSearch : undefined}`), it is called
|
|
369
|
+
* once with the current search text so that pending input is not lost.
|
|
370
|
+
*
|
|
364
371
|
* When this prop is provided, client-side filtering is disabled as it's
|
|
365
372
|
* assumed that filtering will be handled by the prop.
|
|
366
373
|
*/
|
|
@@ -10,7 +10,8 @@ import { type BasedAdditionalProps, type SelectBoxOption } from '../SelectBox.ty
|
|
|
10
10
|
* provided, client-side filtering is disabled as it's assumed that the caller
|
|
11
11
|
* will handle the filtering.
|
|
12
12
|
*
|
|
13
|
-
* @returns Object containing the filtered options, search text,
|
|
13
|
+
* @returns Object containing the filtered options, search text, handler to update search text,
|
|
14
|
+
* and a callback to reset the search text.
|
|
14
15
|
*/
|
|
15
16
|
export declare const useSearchBox: <T extends string | number | undefined = string, AdditionalProps extends BasedAdditionalProps = BasedAdditionalProps>(options: (SelectBoxOption<T, AdditionalProps> | null | undefined)[], enableSearchOptions: boolean, onSearchOptions?: (text: string) => void) => {
|
|
16
17
|
/**
|
|
@@ -25,4 +26,8 @@ export declare const useSearchBox: <T extends string | number | undefined = stri
|
|
|
25
26
|
* Current search text value.
|
|
26
27
|
*/
|
|
27
28
|
searchText: string;
|
|
29
|
+
/**
|
|
30
|
+
* Resets the search text to an empty string.
|
|
31
|
+
*/
|
|
32
|
+
resetSearchText: () => void;
|
|
28
33
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { useLatest } from '../../utilities/state/useLatest';
|
|
3
4
|
import { normalizeFullWidth } from '../../utilities/string/normalizeFullWidth';
|
|
4
5
|
/**
|
|
5
6
|
* Custom hook to handle search functionality within a SelectBox component.
|
|
@@ -12,12 +13,17 @@ import { normalizeFullWidth } from '../../utilities/string/normalizeFullWidth';
|
|
|
12
13
|
* provided, client-side filtering is disabled as it's assumed that the caller
|
|
13
14
|
* will handle the filtering.
|
|
14
15
|
*
|
|
15
|
-
* @returns Object containing the filtered options, search text,
|
|
16
|
+
* @returns Object containing the filtered options, search text, handler to update search text,
|
|
17
|
+
* and a callback to reset the search text.
|
|
16
18
|
*/
|
|
17
19
|
export const useSearchBox = (options, enableSearchOptions, onSearchOptions) => {
|
|
18
20
|
const [searchText, setSearchText] = useState('');
|
|
19
21
|
const debounceRef = useRef(null);
|
|
20
22
|
const previousSearchTextRef = useRef('');
|
|
23
|
+
// Keep the latest handler in a ref so that a new handler identity (e.g. an
|
|
24
|
+
// inline function re-created on parent re-render) does not re-run the
|
|
25
|
+
// debounce effect and cancel a pending call.
|
|
26
|
+
const onSearchOptionsRef = useLatest(onSearchOptions);
|
|
21
27
|
const filteredOptions = useMemo(() => {
|
|
22
28
|
// If not searchable or if onSearchOptions is provided, return all options without filtering
|
|
23
29
|
if (!enableSearchOptions || onSearchOptions) {
|
|
@@ -49,8 +55,17 @@ export const useSearchBox = (options, enableSearchOptions, onSearchOptions) => {
|
|
|
49
55
|
const handleSearchTextChange = useCallback((event) => {
|
|
50
56
|
setSearchText(event.target.value);
|
|
51
57
|
}, []);
|
|
58
|
+
const resetSearchText = useCallback(() => {
|
|
59
|
+
setSearchText('');
|
|
60
|
+
}, []);
|
|
61
|
+
// Track only the presence of the handler (not its identity) so that an
|
|
62
|
+
// undefined → defined transition re-runs the effect and dispatches the
|
|
63
|
+
// pending search text, while identity changes do not cancel pending calls.
|
|
64
|
+
// This preserves the behavior of the previous implementation, where the
|
|
65
|
+
// handler itself was an effect dependency and the transition dispatched.
|
|
66
|
+
const hasSearchHandler = Boolean(onSearchOptions);
|
|
52
67
|
useEffect(() => {
|
|
53
|
-
if (!enableSearchOptions || !
|
|
68
|
+
if (!enableSearchOptions || !hasSearchHandler)
|
|
54
69
|
return;
|
|
55
70
|
// Skip if searchText hasn't changed (prevents initial mount and unnecessary calls)
|
|
56
71
|
if (searchText === previousSearchTextRef.current) {
|
|
@@ -61,14 +76,14 @@ export const useSearchBox = (options, enableSearchOptions, onSearchOptions) => {
|
|
|
61
76
|
clearTimeout(debounceRef.current);
|
|
62
77
|
}
|
|
63
78
|
debounceRef.current = setTimeout(() => {
|
|
64
|
-
|
|
79
|
+
onSearchOptionsRef.current?.(searchText);
|
|
65
80
|
}, 300);
|
|
66
81
|
return () => {
|
|
67
82
|
if (debounceRef.current) {
|
|
68
83
|
clearTimeout(debounceRef.current);
|
|
69
84
|
}
|
|
70
85
|
};
|
|
71
|
-
}, [searchText,
|
|
86
|
+
}, [searchText, enableSearchOptions, hasSearchHandler, onSearchOptionsRef]);
|
|
72
87
|
return {
|
|
73
88
|
/**
|
|
74
89
|
* Handler for search input change events.
|
|
@@ -82,5 +97,9 @@ export const useSearchBox = (options, enableSearchOptions, onSearchOptions) => {
|
|
|
82
97
|
* Current search text value.
|
|
83
98
|
*/
|
|
84
99
|
searchText,
|
|
100
|
+
/**
|
|
101
|
+
* Resets the search text to an empty string.
|
|
102
|
+
*/
|
|
103
|
+
resetSearchText,
|
|
85
104
|
};
|
|
86
105
|
};
|
|
@@ -195,6 +195,20 @@ export const SplitView = forwardRef(({ className, leftPanelSlot, rightPanelSlot,
|
|
|
195
195
|
isDragging,
|
|
196
196
|
dividerPropsStyle: dividerProps?.style,
|
|
197
197
|
});
|
|
198
|
+
// `dividerProps` is spread after the built-in attributes so that consumers can override ARIA
|
|
199
|
+
// attributes (e.g. aria-label, aria-valuenow). These four entries must be excluded from that
|
|
200
|
+
// spread and re-applied afterwards, otherwise they would silently replace internal wiring:
|
|
201
|
+
// the styling classes/styles and the resize event handlers.
|
|
202
|
+
const { className: dividerClassName, style: _dividerPropsStyle, onPointerDown: dividerOnPointerDown, onKeyDown: dividerOnKeyDown, ...restDividerProps } = dividerProps ?? {};
|
|
203
|
+
// Run the internal resize handler first, then forward the event to the consumer's handler.
|
|
204
|
+
const handleDividerPointerDown = (event) => {
|
|
205
|
+
handleMouseDown(event);
|
|
206
|
+
dividerOnPointerDown?.(event);
|
|
207
|
+
};
|
|
208
|
+
const handleDividerKeyDown = (event) => {
|
|
209
|
+
handleKeyDown(event);
|
|
210
|
+
dividerOnKeyDown?.(event);
|
|
211
|
+
};
|
|
198
212
|
// Apply controlled panel style to the correct panel based on targetPanel.
|
|
199
213
|
// When a panel is the main panel (not controlled), flex: 1 ensures it fills remaining space.
|
|
200
214
|
const computedLeftPanelStyle = resolvedTargetPanel === 'left' ? controlledPanelOuterStyle : leftPanelProps?.style;
|
|
@@ -209,7 +223,7 @@ export const SplitView = forwardRef(({ className, leftPanelSlot, rightPanelSlot,
|
|
|
209
223
|
ref.current = node;
|
|
210
224
|
}
|
|
211
225
|
containerRef.current = node;
|
|
212
|
-
}, className: cx(classes.root, 'mfui-SplitView__root', className), ...props, children: [resolvedTargetPanel === 'left' ? (shouldRenderControlledPanel || isSlideOutAnimating ? (_jsx("div", { ...leftPanelProps, className: cx(classes.leftPanel, 'mfui-SplitView__leftPanel', leftPanelProps?.className), style: computedLeftPanelStyle, children: _jsx("div", { style: controlledPanelInnerStyle, children: enableAutoUnmount ? (leftPanelSlot ?? lastRightPanelRef.current) : leftPanelSlot }) })) : null) : (_jsx("div", { ...leftPanelProps, className: cx(classes.leftPanel, 'mfui-SplitView__leftPanel', leftPanelProps?.className), style: computedLeftPanelStyle, children: leftPanelSlot })), isRightPanelVisible || isSlideOutAnimating ? (_jsx("div", {
|
|
226
|
+
}, className: cx(classes.root, 'mfui-SplitView__root', className), ...props, children: [resolvedTargetPanel === 'left' ? (shouldRenderControlledPanel || isSlideOutAnimating ? (_jsx("div", { ...leftPanelProps, className: cx(classes.leftPanel, 'mfui-SplitView__leftPanel', leftPanelProps?.className), style: computedLeftPanelStyle, children: _jsx("div", { style: controlledPanelInnerStyle, children: enableAutoUnmount ? (leftPanelSlot ?? lastRightPanelRef.current) : leftPanelSlot }) })) : null) : (_jsx("div", { ...leftPanelProps, className: cx(classes.leftPanel, 'mfui-SplitView__leftPanel', leftPanelProps?.className), style: computedLeftPanelStyle, children: leftPanelSlot })), isRightPanelVisible || isSlideOutAnimating ? (_jsx("div", { role: "separator", "aria-orientation": "vertical", "aria-label": dividerProps?.['aria-label'] ?? '左右のパネルを調整', "aria-valuenow": currentControlledPanelSize ?? initialPanelSizeNumber, "aria-valuemin": minPanelSizeNumber, "aria-valuemax": maxPanelSizeNumber,
|
|
213
227
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
|
|
214
|
-
tabIndex: 0, style: dividerStyle, onPointerDown:
|
|
228
|
+
tabIndex: 0, ...restDividerProps, className: cx(classes.divider, 'mfui-SplitView__divider', dividerClassName), style: dividerStyle, onPointerDown: handleDividerPointerDown, onKeyDown: handleDividerKeyDown })) : null, resolvedTargetPanel === 'right' ? (shouldRenderControlledPanel || isSlideOutAnimating ? (_jsx("div", { ...rightPanelProps, className: cx(classes.rightPanel, 'mfui-SplitView__rightPanel', rightPanelProps?.className), style: computedRightPanelStyle, children: _jsx("div", { style: controlledPanelInnerStyle, children: enableAutoUnmount ? (rightPanelSlot ?? lastRightPanelRef.current) : rightPanelSlot }) })) : null) : (_jsx("div", { ...rightPanelProps, className: cx(classes.rightPanel, 'mfui-SplitView__rightPanel', rightPanelProps?.className), style: computedRightPanelStyle, children: rightPanelSlot }))] }));
|
|
215
229
|
});
|
|
@@ -8,6 +8,7 @@ interface IconButtonSlotRecipeVariant {
|
|
|
8
8
|
*/
|
|
9
9
|
size: "small" | "default"
|
|
10
10
|
outlined: boolean
|
|
11
|
+
destructive: boolean
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
type IconButtonSlotRecipeVariantMap = {
|
|
@@ -17,7 +18,7 @@ type IconButtonSlotRecipeVariantMap = {
|
|
|
17
18
|
type IconButtonSlotRecipeSlot = "root"
|
|
18
19
|
|
|
19
20
|
export type IconButtonSlotRecipeVariantProps = {
|
|
20
|
-
[key in keyof IconButtonSlotRecipeVariant]?:
|
|
21
|
+
[key in keyof IconButtonSlotRecipeVariant]?: IconButtonSlotRecipeVariant[key] | undefined
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
export interface IconButtonSlotRecipeRecipe {
|
|
@@ -3,7 +3,33 @@ import { createRecipe } from './create-recipe.js';
|
|
|
3
3
|
const iconButtonSlotRecipeDefaultVariants = {
|
|
4
4
|
"size": "default"
|
|
5
5
|
};
|
|
6
|
-
const iconButtonSlotRecipeCompoundVariants = [
|
|
6
|
+
const iconButtonSlotRecipeCompoundVariants = [
|
|
7
|
+
{
|
|
8
|
+
"destructive": true,
|
|
9
|
+
"outlined": true,
|
|
10
|
+
"css": {
|
|
11
|
+
"root": {
|
|
12
|
+
"borderColor": "mfui.color.signal-red.border.none",
|
|
13
|
+
"_hover": {
|
|
14
|
+
"_notDisabled": {
|
|
15
|
+
"borderColor": "mfui.color.signal-red.border.hovered"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"_focusVisible": {
|
|
19
|
+
"borderColor": "mfui.color.signal-red.border.hovered"
|
|
20
|
+
},
|
|
21
|
+
"_active": {
|
|
22
|
+
"_notDisabled": {
|
|
23
|
+
"borderColor": "mfui.color.signal-red.border.pressed"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"_disabled": {
|
|
27
|
+
"borderColor": "mfui.color.disabled.border"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
];
|
|
7
33
|
const iconButtonSlotRecipeSlotNames = [
|
|
8
34
|
[
|
|
9
35
|
"root",
|
|
@@ -16,7 +42,8 @@ const iconButtonSlotRecipeFn = memo((props = {}) => {
|
|
|
16
42
|
});
|
|
17
43
|
const iconButtonSlotRecipeVariantKeys = [
|
|
18
44
|
"size",
|
|
19
|
-
"outlined"
|
|
45
|
+
"outlined",
|
|
46
|
+
"destructive"
|
|
20
47
|
];
|
|
21
48
|
const getVariantProps = (variants) => ({ ...iconButtonSlotRecipeDefaultVariants, ...compact(variants) });
|
|
22
49
|
export const iconButtonSlotRecipe = /* @__PURE__ */ Object.assign(iconButtonSlotRecipeFn, {
|
|
@@ -32,6 +59,10 @@ export const iconButtonSlotRecipe = /* @__PURE__ */ Object.assign(iconButtonSlot
|
|
|
32
59
|
],
|
|
33
60
|
"outlined": [
|
|
34
61
|
"true"
|
|
62
|
+
],
|
|
63
|
+
"destructive": [
|
|
64
|
+
"true",
|
|
65
|
+
"false"
|
|
35
66
|
]
|
|
36
67
|
},
|
|
37
68
|
splitVariantProps(props) {
|
package/dist/styles.css
CHANGED
|
@@ -6466,6 +6466,26 @@ li:last-child > .mfui-cXGJls {
|
|
|
6466
6466
|
border-color: var(--mfui-colors-mfui\.color\.neutral\.border\.hovered);
|
|
6467
6467
|
}
|
|
6468
6468
|
|
|
6469
|
+
.mfui-cpUpeB {
|
|
6470
|
+
color: var(--mfui-colors-mfui\.color\.signal-red\.content\.none);
|
|
6471
|
+
}
|
|
6472
|
+
|
|
6473
|
+
.mfui-cpUpeB:is([aria-expanded=true], [data-expanded], [data-state="expanded"]) {
|
|
6474
|
+
color: var(--mfui-colors-mfui\.color\.signal-red\.content\.pressed);
|
|
6475
|
+
}
|
|
6476
|
+
|
|
6477
|
+
.mfui-cpUpeB:is(:disabled, [disabled], [data-disabled], [aria-disabled=true]) {
|
|
6478
|
+
color: var(--mfui-colors-mfui\.color\.disabled\.content);
|
|
6479
|
+
}
|
|
6480
|
+
|
|
6481
|
+
.mfui-cpUpeB:is(:focus-visible, [data-focus-visible]),.mfui-cpUpeB:is(:hover, [data-hover]):not(:disabled, [disabled], [data-disabled]) {
|
|
6482
|
+
color: var(--mfui-colors-mfui\.color\.signal-red\.content\.hovered);
|
|
6483
|
+
}
|
|
6484
|
+
|
|
6485
|
+
.mfui-cpUpeB:is(:active, [data-active]):not(:disabled, [disabled], [data-disabled]) {
|
|
6486
|
+
color: var(--mfui-colors-mfui\.color\.signal-red\.content\.pressed);
|
|
6487
|
+
}
|
|
6488
|
+
|
|
6469
6489
|
.mfui-bWjutw .mfui-FocusIndicator__root:is(:focus-visible, [data-focus-visible]),.mfui-bWjutw .mfui-FocusIndicator__root:has(input:focus-visible, input[data-focus-visible=true], textarea:focus-visible, textarea[data-focus-visible=true]) {
|
|
6470
6490
|
box-shadow: none;
|
|
6471
6491
|
}
|
|
@@ -8711,6 +8731,10 @@ li:last-child > .mfui-cXGJls {
|
|
|
8711
8731
|
border: none;
|
|
8712
8732
|
}
|
|
8713
8733
|
|
|
8734
|
+
.mfui-gpYLkO:is(:disabled, [disabled], [data-disabled], [aria-disabled=true]) {
|
|
8735
|
+
border-color: var(--mfui-colors-mfui\.color\.disabled\.border);
|
|
8736
|
+
}
|
|
8737
|
+
|
|
8714
8738
|
.mfui-kGMVVf:is(:disabled, [disabled], [data-disabled], [aria-disabled=true]) {
|
|
8715
8739
|
background-color: var(--mfui-colors-mfui\.color\.disabled\.background);
|
|
8716
8740
|
}
|
|
@@ -8727,14 +8751,14 @@ tr:last-child > .mfui-gtOHny::before {
|
|
|
8727
8751
|
height: 100%;
|
|
8728
8752
|
}
|
|
8729
8753
|
|
|
8730
|
-
.mfui-kSeSQV:is(:focus-visible, [data-focus-visible]),.mfui-dqyxbp:has(input:focus-visible, input[data-focus-visible=true], textarea:focus-visible, textarea[data-focus-visible=true]) {
|
|
8731
|
-
outline: 2px solid var(--mfui-colors-mfui\.color\.primary\.border\.none);
|
|
8732
|
-
}
|
|
8733
|
-
|
|
8734
8754
|
.mfui-iHQAZp:is(:focus-visible, [data-focus-visible]) {
|
|
8735
8755
|
border-color: var(--mfui-colors-mfui\.color\.signal-red\.border\.hovered);
|
|
8736
8756
|
}
|
|
8737
8757
|
|
|
8758
|
+
.mfui-kSeSQV:is(:focus-visible, [data-focus-visible]),.mfui-dqyxbp:has(input:focus-visible, input[data-focus-visible=true], textarea:focus-visible, textarea[data-focus-visible=true]) {
|
|
8759
|
+
outline: 2px solid var(--mfui-colors-mfui\.color\.primary\.border\.none);
|
|
8760
|
+
}
|
|
8761
|
+
|
|
8738
8762
|
.group:is(:focus-visible, [data-focus-visible]) .mfui-iYLcWF {
|
|
8739
8763
|
border-color: var(--mfui-colors-mfui\.color\.base\.inverted-border\.hovered);
|
|
8740
8764
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moneyforward/mfui-components",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.35.0",
|
|
4
4
|
"description": "React UI Component Library for all Money Forward products",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
"@floating-ui/react-dom": "^2.1.2",
|
|
64
64
|
"@tanstack/react-virtual": "^3.13.18",
|
|
65
65
|
"dayjs": "^1.11.13",
|
|
66
|
-
"@moneyforward/mfui-
|
|
67
|
-
"@moneyforward/mfui-
|
|
66
|
+
"@moneyforward/mfui-icons-react": "^3.6.0",
|
|
67
|
+
"@moneyforward/mfui-design-tokens": "^3.3.1"
|
|
68
68
|
},
|
|
69
69
|
"scripts": {
|
|
70
70
|
"prepare:panda": "panda codegen",
|