From 3daadff9813173493a354c2925dd1a0a6afc0a45 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Wed, 29 Jan 2025 07:24:33 +0900 Subject: [PATCH 01/22] =?UTF-8?q?chore:=20ModelessDialog=E3=81=AE=E5=86=85?= =?UTF-8?q?=E9=83=A8=E5=87=A6=E7=90=86=E3=82=92=E6=95=B4=E7=90=86=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#5317)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/Dialog/ModelessDialog.tsx | 160 ++++++++++-------- 1 file changed, 90 insertions(+), 70 deletions(-) diff --git a/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx b/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx index accdb8c481..17598023ef 100644 --- a/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx @@ -18,7 +18,6 @@ import Draggable from 'react-draggable' import { VariantProps, tv } from 'tailwind-variants' import { useHandleEscape } from '../../hooks/useHandleEscape' -import { spacing } from '../../themes' import { Base, BaseElementProps } from '../Base' import { Button } from '../Button' import { FaGripIcon, FaXmarkIcon } from '../Icon' @@ -89,6 +88,8 @@ type Props = PropsWithChildren<{ const DIALOG_HANDLER_ARIA_LABEL = 'ダイアログの位置' const CLOSE_BUTTON_ICON_ALT = '閉じる' +const DEFAULT_DIALOG_HANDLER_ARIA_VALUETEXT = (def: string, _data: DOMRect | undefined) => def + const modelessDialog = tv({ slots: { overlap: 'shr-inset-[unset]', @@ -139,6 +140,7 @@ export const ModelessDialog: FC { const labelId = useId() @@ -156,6 +158,7 @@ export const ModelessDialog: FC { const { overlap, wrapper, headerEl, title, dialogHandler, closeButtonLayout, footerEl } = modelessDialog() + return { overlapStyle: overlap({ className }), wrapperStyle: wrapper({ resizable }), @@ -166,23 +169,6 @@ export const ModelessDialog: FC { - const leftMargin = typeof left === 'number' ? `${left}px` : left - const rightMargin = typeof right === 'number' ? `${right}px` : right - /* TODO: 幅の定数指定は、トークンが決まり theme に入ったら差し替える */ - const style = - width === undefined - ? { - maxWidth: `min(calc(100vw - max(${leftMargin || 0}, ${spacing[0.5]}) - max(${ - rightMargin || 0 - }, ${spacing[0.5]})), 800px)`, - } - : undefined - return { - className: wrapperStyle, - style, - } - }, [wrapperStyle, left, right, width]) const wrapperRef = useRef(null) const focusTargetRef = useRef(null) @@ -199,11 +185,6 @@ export const ModelessDialog: FC['bounds']>() - const dialogHandlerAriaLabel = useMemo( - () => - decorators?.dialogHandlerAriaLabel?.(DIALOG_HANDLER_ARIA_LABEL) || DIALOG_HANDLER_ARIA_LABEL, - [decorators], - ) const defaultAriaValuetext = useMemo( () => wrapperPosition @@ -211,17 +192,31 @@ export const ModelessDialog: FC { + if (!decorators) { + return { + dialogHandlerAriaLabel: DIALOG_HANDLER_ARIA_LABEL, + closeButtonIconAlt: CLOSE_BUTTON_ICON_ALT, + dialogHandlerAriaValuetext: DEFAULT_DIALOG_HANDLER_ARIA_VALUETEXT, + } + } + + return { + dialogHandlerAriaLabel: + decorators.dialogHandlerAriaLabel?.(DIALOG_HANDLER_ARIA_LABEL) || DIALOG_HANDLER_ARIA_LABEL, + closeButtonIconAlt: + decorators.closeButtonIconAlt?.(CLOSE_BUTTON_ICON_ALT) || CLOSE_BUTTON_ICON_ALT, + dialogHandlerAriaValuetext: + decorators.dialogHandlerAriaValuetext || DEFAULT_DIALOG_HANDLER_ARIA_VALUETEXT, + } + }, [decorators]) const dialogHandlerAriaValuetext = useMemo( () => defaultAriaValuetext - ? decorators?.dialogHandlerAriaValuetext?.(defaultAriaValuetext, wrapperPosition) || + ? decorated.dialogHandlerAriaValuetext(defaultAriaValuetext, wrapperPosition) || defaultAriaValuetext : undefined, - [defaultAriaValuetext, wrapperPosition, decorators], - ) - const closeButtonIconAlt = useMemo( - () => decorators?.closeButtonIconAlt?.(CLOSE_BUTTON_ICON_ALT) || CLOSE_BUTTON_ICON_ALT, - [decorators], + [defaultAriaValuetext, wrapperPosition, decorated.dialogHandlerAriaValuetext], ) const topStyle = centering.top !== undefined ? centering.top : top @@ -232,7 +227,9 @@ export const ModelessDialog: FC ({ @@ -278,10 +275,13 @@ export const ModelessDialog: FC) => { lastFocusElementRef.current?.focus() - props.onClickClose?.(e) + onClickClose?.(e) }, - [props], + [onClickClose], ) useHandleEscape( @@ -329,38 +331,37 @@ export const ModelessDialog: FC { const focusHandler = (e: FocusEvent) => { - if (!(e.target instanceof HTMLElement)) return - - // e.target(現在フォーカスがあたっている要素)がModeless dialogの中の要素であれば、lastFocusElementRefに代入しない - if (wrapperRef?.current?.contains(e.target)) { - return + // e.target(現在フォーカスがあたっている要素)がModeless dialog外の要素であれば、lastFocusElementRefに代入する + if (e.target instanceof HTMLElement && !wrapperRef?.current?.contains(e.target)) { + lastFocusElementRef.current = e.target } - - lastFocusElementRef.current = e.target } document.addEventListener('focus', focusHandler, true) + return () => document.removeEventListener('focus', focusHandler, true) }, []) + const onDragStart = useCallback((_: any, data: { x: number; y: number }) => setPosition(data), []) + const onDrag = useCallback((_: any, data: { deltaX: number; deltaY: number }) => { + setPosition((prev) => ({ + x: prev.x + data.deltaX, + y: prev.y + data.deltaY, + })) + }, []) + return createPortal( setPosition({ x: data.x, y: data.y })} - onDrag={(_, data) => { - setPosition((prev) => ({ - x: prev.x + data.deltaX, - y: prev.y + data.deltaY, - })) - }} + onStart={onDragStart} + onDrag={onDrag} position={position} bounds={draggableBounds} nodeRef={wrapperRef} > -
- {/* dummy element for focus management. */} -
+ {/* dummy element for focus management. */} +
-
- -
+ onArrowKeyDown={handleArrowKey} + className={dialogHandlerStyle} + />
{header}
-
- -
+
, ) } + +const Handler = React.memo<{ + 'aria-label': string + 'aria-valuetext': string | undefined + className: string + onArrowKeyDown: (e: React.KeyboardEvent) => void +}>(({ onArrowKeyDown, ...rest }) => ( +
+ +
+)) + +const CloseButton = React.memo<{ + className: string + iconAlt: ReactNode + onClick: (e: MouseEvent) => void +}>(({ onClick, iconAlt, className }) => ( +
+ +
+)) From 58295f3946caed7356a8f6b94d1791d119f8fc48 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Wed, 29 Jan 2025 07:28:40 +0900 Subject: [PATCH 02/22] =?UTF-8?q?chore:=20FormDialog=E3=81=AE=E5=86=85?= =?UTF-8?q?=E9=83=A8=E5=87=A6=E7=90=86=E3=82=92=E6=95=B4=E7=90=86=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#5321)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dialog/FormDialog/FormDialog.tsx | 13 +- .../Dialog/FormDialog/FormDialogContent.tsx | 13 +- .../FormDialog/FormDialogContentInner.tsx | 160 ++++++++++++++---- 3 files changed, 139 insertions(+), 47 deletions(-) diff --git a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialog.tsx b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialog.tsx index 68628667ef..e177f3473c 100644 --- a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialog.tsx +++ b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialog.tsx @@ -24,7 +24,7 @@ export const FormDialog: React.FC = ({ onClickClose, onPressEscape = onClickClose, responseMessage, - actionDisabled = false, + actionDisabled, closeDisabled, subActionArea, className, @@ -37,19 +37,16 @@ export const FormDialog: React.FC = ({ const titleId = useId() const handleClickClose = useCallback(() => { - if (!props.isOpen) { - return + if (props.isOpen) { + onClickClose() } - onClickClose() }, [onClickClose, props.isOpen]) const handleSubmitAction = useCallback( (close: () => void, e: FormEvent) => { - if (!props.isOpen) { - return + if (props.isOpen) { + onSubmit(close, e) } - - onSubmit(close, e) }, [onSubmit, props.isOpen], ) diff --git a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContent.tsx b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContent.tsx index 919de7466a..9ed3845fb2 100644 --- a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContent.tsx +++ b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContent.tsx @@ -20,7 +20,7 @@ export const FormDialogContent: React.FC = ({ actionText, actionTheme, onSubmit, - actionDisabled = false, + actionDisabled, portalParent, className = '', decorators, @@ -30,19 +30,16 @@ export const FormDialogContent: React.FC = ({ const { createPortal } = useDialogPortal(portalParent) const handleClickClose = useCallback(() => { - if (!active) { - return + if (active) { + onClickClose() } - onClickClose() }, [active, onClickClose]) const handleSubmitAction = useCallback( (close: () => void, e: FormEvent) => { - if (!active) { - return + if (active) { + onSubmit(close, e) } - - onSubmit(close, e) }, [active, onSubmit], ) diff --git a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx index 026820f29c..be9ba580da 100644 --- a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx @@ -4,6 +4,7 @@ import React, { type PropsWithChildren, type ReactNode, useCallback, + useMemo, } from 'react' import { tv } from 'tailwind-variants' @@ -46,6 +47,7 @@ export type FormDialogContentInnerProps = BaseProps & { } const CLOSE_BUTTON_LABEL = 'キャンセル' +const ACTION_AREA_CLUSTER_GAP = { row: 0.5, column: 1 } as const const formDialogContentInner = tv({ extend: dialogContentInner, @@ -63,11 +65,11 @@ export const FormDialogContentInner: FC = ({ contentBgColor, contentPadding, actionText, - actionTheme = 'primary', + actionTheme, onSubmit, onClickClose, responseMessage, - actionDisabled = false, + actionDisabled, closeDisabled, subActionArea, decorators, @@ -82,49 +84,145 @@ export const FormDialogContentInner: FC = ({ }, [onSubmit, onClickClose], ) - const isRequestProcessing = responseMessage && responseMessage.status === 'processing' - const { form, wrapper, actionArea, buttonArea, message } = formDialogContentInner() + const calculatedResponseStatus = useMemo(() => { + if (!responseMessage) { + return { + isProcessing: false, + visibleMessage: false, + } + } + + if (responseMessage.status === 'processing') { + return { + isProcessing: true, + visibleMessage: false, + } + } + + return { + isProcessing: false, + visibleMessage: true, + // HINT: statusがprocessingではない === success or errorであることが確定する + // success or error の場合、text属性も必ず存在する + status: responseMessage.status as 'success' | 'error', + message: (responseMessage as { text: string }).text, + } + }, [responseMessage]) + + const styles = useMemo(() => { + const { form, wrapper, actionArea, buttonArea, message } = formDialogContentInner() + + return { + form: form(), + wrapper: wrapper(), + actionArea: actionArea(), + buttonArea: buttonArea(), + message: message(), + } + }, []) return ( - // eslint-disable-next-line smarthr/best-practice-for-layouts, smarthr/a11y-heading-in-sectioning-content - + // eslint-disable-next-line smarthr/a11y-prohibit-sectioning-content-in-form, smarthr/a11y-heading-in-sectioning-content +
-
+ {children} - + {subActionArea} - - - - + - {(responseMessage?.status === 'success' || responseMessage?.status === 'error') && ( -
- - {responseMessage.text} + {calculatedResponseStatus.visibleMessage && ( +
+ + {calculatedResponseStatus.message}
)} - +
) } + +const ActionAreaCluster = React.memo< + Pick< + FormDialogContentInnerProps, + | 'onClickClose' + | 'closeDisabled' + | 'actionDisabled' + | 'actionTheme' + | 'decorators' + | 'actionText' + > & { loading: boolean; className: string } +>( + ({ + onClickClose, + closeDisabled, + actionDisabled, + loading, + actionTheme, + decorators, + actionText, + className, + }) => ( + + + + {actionText} + + + ), +) + +const ActionButton = React.memo< + PropsWithChildren<{ + variant: FormDialogContentInnerProps['actionTheme'] + disabled: FormDialogContentInnerProps['actionDisabled'] + loading: boolean + }> +>(({ variant = 'primary', disabled, loading, children }) => ( + +)) + +const CloseButton = React.memo< + Pick & { + onClick: FormDialogContentInnerProps['onClickClose'] + disabled: boolean + } +>(({ onClick, disabled, decorators }) => { + const children = useMemo( + () => decorators?.closeButtonLabel?.(CLOSE_BUTTON_LABEL) || CLOSE_BUTTON_LABEL, + [decorators], + ) + + return ( + + ) +}) From 212e19b05fe0ab3d3c9bb6a8bbc29d8d6ef8f680 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Wed, 29 Jan 2025 07:31:42 +0900 Subject: [PATCH 03/22] =?UTF-8?q?chore:=20ComboBox=E3=81=AEusePartialRende?= =?UTF-8?q?ring=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92=E6=9C=80=E9=81=A9?= =?UTF-8?q?=E5=8C=96=E3=81=99=E3=82=8B=20(#5331)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComboBox/usePartialRendering.tsx | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/packages/smarthr-ui/src/components/ComboBox/usePartialRendering.tsx b/packages/smarthr-ui/src/components/ComboBox/usePartialRendering.tsx index 449d0e6402..9f9530dd5d 100644 --- a/packages/smarthr-ui/src/components/ComboBox/usePartialRendering.tsx +++ b/packages/smarthr-ui/src/components/ComboBox/usePartialRendering.tsx @@ -1,6 +1,7 @@ import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' const OPTION_INCREMENT_AMOUNT = 100 +const RETURN_NULL = () => null export function usePartialRendering({ items, @@ -9,37 +10,31 @@ export function usePartialRendering({ items: T[] minLength?: number }) { - const [currentItemLength, setCurrentItemLength] = useState( - Math.max(OPTION_INCREMENT_AMOUNT, minLength), - ) - // minLength も考慮した実際のアイテム数を算出 - const actualLength = useMemo( - () => Math.max(currentItemLength, minLength), - [currentItemLength, minLength], - ) - const partialItems = useMemo(() => items.slice(0, actualLength), [actualLength, items]) + const limiter = useCallback((length: number) => Math.max(length, minLength), [minLength]) - useEffect(() => { - // currentItemLength を実際の値に補正 - setCurrentItemLength(actualLength) - }, [actualLength]) + const [currentItemLength, setCurrentItemLength] = useState(limiter(OPTION_INCREMENT_AMOUNT)) - const isAllItemsShown = useMemo(() => actualLength >= items.length, [actualLength, items.length]) + useEffect(() => { + setCurrentItemLength((current) => limiter(current)) + }, [limiter]) - const handleIntersect = useCallback(() => { - setCurrentItemLength((current) => current + OPTION_INCREMENT_AMOUNT) - }, []) + // minLength も考慮した実際のアイテム数を算出 + const partialItems = useMemo(() => items.slice(0, currentItemLength), [currentItemLength, items]) - const renderIntersection = useCallback(() => { - if (isAllItemsShown) { - return null - } - return - }, [handleIntersect, isAllItemsShown]) + const renderIntersection = useCallback( + () => ( + { + setCurrentItemLength((current) => limiter(current + OPTION_INCREMENT_AMOUNT)) + }} + /> + ), + [limiter], + ) return { items: partialItems, - renderIntersection, + renderIntersection: currentItemLength >= items.length ? RETURN_NULL : renderIntersection, } } @@ -48,9 +43,11 @@ const Intersection: FC<{ onIntersect: () => void }> = ({ onIntersect }) => { useEffect(() => { const target = ref.current + if (target === null) { return } + // スクロール最下部に到達する度に表示するアイテム数を増加させるための IntersectionObserver const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { @@ -59,8 +56,9 @@ const Intersection: FC<{ onIntersect: () => void }> = ({ onIntersect }) => { }) observer.observe(target) + return () => observer.disconnect() }, [onIntersect]) - return
+ return
} From 3c636f109f9a93ba3e02663442a065d749473e2f Mon Sep 17 00:00:00 2001 From: misako tateiwa Date: Wed, 29 Jan 2025 09:05:32 +0900 Subject: [PATCH 04/22] =?UTF-8?q?fix:=20aria-describedby=E3=81=8Cinput?= =?UTF-8?q?=E3=81=AB=E7=B4=90=E3=81=A5=E3=81=84=E3=81=A6=E3=81=84=E3=82=8B?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=82=82FormControl=E3=81=AEaria-describedby?= =?UTF-8?q?=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=99=E3=82=8B=20(#5344)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smarthr-ui/src/components/FormControl/FormControl.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/smarthr-ui/src/components/FormControl/FormControl.tsx b/packages/smarthr-ui/src/components/FormControl/FormControl.tsx index d8ed33514c..8c3bf6e8c4 100644 --- a/packages/smarthr-ui/src/components/FormControl/FormControl.tsx +++ b/packages/smarthr-ui/src/components/FormControl/FormControl.tsx @@ -252,8 +252,9 @@ export const ActualFormControl: React.FC = ({ const input = inputWrapper.querySelector(SMARTHR_UI_INPUT_SELECTOR) - if (input && !input.getAttribute(attrName)) { - input.setAttribute(attrName, describedbyIds) + if (input) { + const attribute = input.getAttribute(attrName) + input.setAttribute(attrName, attribute ? `${attribute} ${describedbyIds}` : describedbyIds) } }, [describedbyIds]) useEffect(() => { From cbc2bfbdf54728f6f5b21cbea322c090b777c3f9 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Mon, 3 Feb 2025 06:53:50 +0900 Subject: [PATCH 05/22] =?UTF-8?q?chore:=20Header=E3=81=AE=E5=86=85?= =?UTF-8?q?=E9=83=A8=E5=87=A6=E7=90=86=E3=82=92=E6=9C=80=E9=81=A9=E5=8C=96?= =?UTF-8?q?=E3=81=99=E3=82=8B=20(#5292)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Header/AppLauncher/AppLauncher.tsx | 164 +++++++++++------ .../src/components/Header/Header.tsx | 168 +++++++++++------ .../src/components/Header/HeaderLink.tsx | 1 + .../LanguageSwitcher/LanguageSwitcher.tsx | 174 +++++++++++------- 4 files changed, 333 insertions(+), 174 deletions(-) diff --git a/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx b/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx index 12b702552b..b144fc5703 100644 --- a/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx +++ b/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx @@ -6,7 +6,6 @@ import { Dropdown, DropdownContent, DropdownTrigger } from '../../Dropdown' import { Heading } from '../../Heading' import { FaCaretDownIcon, FaToolboxIcon } from '../../Icon' import { Cluster, Stack } from '../../Layout' -import { Section } from '../../SectioningContent' import { TextLink } from '../../TextLink' import type { DecoratorsType } from '../../../types' @@ -69,75 +68,134 @@ export const AppLauncher: React.FC = ({ enableNew, ...props }) => { - const triggerLabel = useMemo( - () => decorators?.triggerLabel?.(TRIGGER_LABEL) || TRIGGER_LABEL, - [decorators], - ) + const calculatedApps = useMemo(() => { + const result: { + base: Props['apps'][number] | undefined + others: Props['apps'] + } = { base: undefined, others: [] } + + apps.forEach((app) => { + if (app.type === 'base') { + result.base = app + } else { + result.others.push(app) + } + }) - const baseApps = apps.find(({ type }) => type === 'base') - const others = apps.filter((category) => category !== baseApps) + return result + }, [apps]) - const { appsButton, contentWrapper, category, appList, link, footer } = appLauncher({ enableNew }) + const styles = useMemo(() => { + const { appsButton, contentWrapper, category, appList, link, footer } = appLauncher({ + enableNew, + }) + + return { + appsButton: appsButton(), + contentWrapper: contentWrapper(), + category: category(), + appList: appList(), + link: link(), + footer: footer(), + } + }, [enableNew]) return ( - - - + {/* eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content */} - + - {baseApps && ( -
- - {baseApps.heading} - {/* eslint-disable-next-line smarthr/best-practice-for-layouts */} - - {appItems(baseApps.items, link())} - - -
+ {calculatedApps.base && ( + + {calculatedApps.base.heading} + + {calculatedApps.base.items.map((item, index) => ( + + {item.label} + + ))} + + )} - {others.map(({ heading, items }, i) => ( -
- - {heading} - {/* eslint-disable-next-line smarthr/best-practice-for-layouts */} - - {appItems(items, link())} - + {calculatedApps.others.map(({ heading, items }, i) => ( + + {heading} + + {items.map((item, index) => ( + + {item.label} + + ))} -
+
))}
- - {urlToShowAll && ( -
- - すべて見る - -
- )} +
) } -const appItems = (items: AppItem[], linkStyle: string) => - items.map((item, index) => ( -
  • - - {item.label} - -
  • - )) +const MemoizedDropdownTrigger = React.memo< + Pick & { className: string } +>(({ enableNew, className, decorators }) => { + const triggerLabel = useMemo( + () => decorators?.triggerLabel?.(TRIGGER_LABEL) || TRIGGER_LABEL, + [decorators], + ) + + return ( + + + + ) +}) + +const TextLinkToShowAll = React.memo<{ href: Props['urlToShowAll']; className: string }>( + ({ href, className }) => + href && ( +
    + + すべて見る + +
    + ), +) + +const LinkListItem = React.memo<{ + href: AppItem['url'] + target: AppItem['target'] + children: AppItem['label'] + className: string +}>(({ href, target, children, className }) => ( +
  • + + {children} + +
  • +)) diff --git a/packages/smarthr-ui/src/components/Header/Header.tsx b/packages/smarthr-ui/src/components/Header/Header.tsx index 3539de4a98..a021f8f4e0 100644 --- a/packages/smarthr-ui/src/components/Header/Header.tsx +++ b/packages/smarthr-ui/src/components/Header/Header.tsx @@ -62,25 +62,90 @@ type Props = { type ElementProps = Omit, keyof Props> +const COMMON_GAP = { column: 0.25, row: 0 } as const +const CHILDREN_GAP = { column: 0.5, row: 0.25 } as const + export const Header: React.FC & ElementProps> = ({ enableNew, - logo = , - logoHref = '/', + logo, + logoHref, featureName, - apps = [], + apps, tenants, currentTenantId, onTenantSelect, children, className, }) => { - const { - wrapper, - logoLink, - tenantInfo: tenantInfoStyle, - tenantNameText, - actions, - } = header({ enableNew }) + const styles = useMemo(() => { + const { + wrapper, + logoLink, + tenantInfo: tenantInfoStyle, + tenantNameText, + actions, + } = header({ enableNew }) + + return { + wrapper: wrapper({ className }), + logoLink: logoLink(), + tenantInfo: tenantInfoStyle(), + tenantNameText: tenantNameText(), + actions: actions(), + } + }, [enableNew, className]) + + return ( + + + + {logo} + + {enableNew ? ( + + ) : ( + + )} + + + {children} + + + ) +} + +const Logo = React.memo< + Pick & { children: Props['logo']; href: Props['logoHref']; className: string } +>(({ children, href, enableNew, className }) => ( + + {children || } + +)) + +const MemoizedAppLauncher = React.memo>( + ({ featureName, apps = [], enableNew }) => { + const decorators = useMemo(() => { + if (!featureName) { + return undefined + } + + return { triggerLabel: () => featureName } + }, [featureName]) + + return featureName && + }, +) + +const TenantSwitcher = React.memo< + Pick & { + styles: { tenantInfo: string; tenantNameText: string } + } +>(({ currentTenantId, tenants, styles, onTenantSelect }) => { const currentTenantName = useMemo(() => { if (tenants && tenants.length >= 1) { const current = tenants.find(({ id }) => id === currentTenantId) @@ -89,53 +154,46 @@ export const Header: React.FC & ElementProps> = ({ return undefined }, [currentTenantId, tenants]) - const tenantInfo = useMemo( + + return ( + currentTenantName && ( +
    + {tenants && tenants.length > 1 ? ( + + ) : ( + + {currentTenantName} + + )} +
    + ) + ) +}) + +const MultiTenantDropdownMenuButton = React.memo< + Pick, 'tenants'> & Pick & { label: ReactNode } +>(({ label, tenants, onTenantSelect }) => { + const onClick = useMemo( () => - tenants && tenants.length > 1 ? ( - - {tenants.map(({ id, name }) => ( - - ))} - - ) : ( - - {currentTenantName} - - ), - [currentTenantName, onTenantSelect, tenants, tenantNameText], + onTenantSelect + ? (e: React.MouseEvent) => { + onTenantSelect(e.currentTarget.value) + } + : undefined, + [onTenantSelect], ) return ( - - - - {logo} - - {enableNew - ? featureName && ( - featureName }} - /> - ) - : currentTenantName &&
    {tenantInfo}
    } -
    - - {children} - -
    + + {tenants.map(({ id, name }) => ( + + ))} + ) -} +}) diff --git a/packages/smarthr-ui/src/components/Header/HeaderLink.tsx b/packages/smarthr-ui/src/components/Header/HeaderLink.tsx index aac7df051a..7b485aa511 100644 --- a/packages/smarthr-ui/src/components/Header/HeaderLink.tsx +++ b/packages/smarthr-ui/src/components/Header/HeaderLink.tsx @@ -22,5 +22,6 @@ const headerLink = tv({ export const HeaderLink: React.FC = ({ enableNew, className, ...props }) => { const style = headerLink({ enableNew, className }) + return } diff --git a/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx b/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx index 5a54ba387d..84c3c68d70 100644 --- a/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx +++ b/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx @@ -1,6 +1,6 @@ 'use client' -import React, { HTMLAttributes, useMemo } from 'react' +import React, { HTMLAttributes, ReactNode, useCallback, useMemo } from 'react' import { VariantProps, tv } from 'tailwind-variants' import { tabbable } from '../../../libs/tabbable' @@ -25,6 +25,8 @@ type ElementProps = Omit, keyof Props> const TRIGGER_LABEL = 'Language' const CHECK_ICON_ALT = '選択中' +const ARROW_KEY_REGEX = /^Arrow(Up|Down|Left|Right)$/ +const ARROW_UPS_REGEX = /^Arrow(Up|Left)$/ const appLauncher = tv({ slots: { @@ -73,91 +75,131 @@ export const LanguageSwitcher: React.FC = ({ ...rest }) => { const locales = useMemo(() => Object.entries(localeMap), [localeMap]) - const triggerLabel = useMemo( - () => decorators?.triggerLabel?.(TRIGGER_LABEL) || TRIGGER_LABEL, - [decorators], - ) - const checkIconAlt = useMemo( - () => decorators?.checkIconAlt?.(CHECK_ICON_ALT) || CHECK_ICON_ALT, - [decorators], - ) + const decoratedTexts = useMemo(() => { + if (!decorators) { + return { + triggerLabel: TRIGGER_LABEL, + checkIconAlt: CHECK_ICON_ALT, + } + } + return { + triggerLabel: decorators.triggerLabel?.(TRIGGER_LABEL) || TRIGGER_LABEL, + checkIconAlt: decorators.checkIconAlt?.(CHECK_ICON_ALT) || CHECK_ICON_ALT, + } + }, [decorators]) const currentLang = useMemo( () => locale || defaultLocale || Object.keys(localeMap)[0], [locale, defaultLocale, localeMap], ) - - const { languageButton, languageItemsList, languageItem, switchButton } = appLauncher() - - const handleLanguageSelect = (code: string) => { - if (onLanguageSelect !== undefined) { - onLanguageSelect(code) + const styles = useMemo(() => { + const { languageButton, languageItemsList, languageItem, switchButton } = appLauncher() + + return { + languageButton: languageButton(), + languageItemsList: languageItemsList(), + languageItem: languageItem(), + switchButton: switchButton({ invert, enableNew }), } - } + }, [enableNew, invert]) + + const handleLanguageSelect = useMemo( + () => + onLanguageSelect + ? (e: React.MouseEvent) => { + onLanguageSelect(e.currentTarget.value) + } + : undefined, + [onLanguageSelect], + ) - const handleKeyDown = (e: React.KeyboardEvent) => { - const { key, target, currentTarget } = e - if (!['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight'].includes(key)) { + const handleKeyDown = useCallback((e: React.KeyboardEvent) => { + if (!ARROW_KEY_REGEX.test(e.key)) { return } - const isUp = key === 'ArrowUp' || key === 'ArrowLeft' - const isDown = key === 'ArrowDown' || key === 'ArrowRight' e.preventDefault() - const buttons = tabbable(currentTarget) - const i = buttons.indexOf(target as HTMLElement) - if (isDown) { - if (i + 1 === buttons.length) { - buttons.at(0)?.focus() - return - } - buttons.at(i + 1)?.focus() - return - } - if (isUp) { - buttons.at(i - 1)?.focus() - } - } + const buttons = tabbable(e.currentTarget) + const i = buttons.indexOf(e.target as HTMLElement) + let buttonAt = 0 - const NarrowTrigger = ( - - ) + if (ARROW_UPS_REGEX.test(e.key)) { + buttonAt = i - 1 + } else if (i + 1 === buttons.length) { + buttonAt = i + 1 + } - const Trigger = ( - - ) + buttons.at(buttonAt)?.focus() + }, []) return ( - {narrow ? NarrowTrigger : Trigger} + -
      - {locales.map(([code, label]) => { - const isCurrent = currentLang === code - return ( -
    • - -
    • - ) - })} +
        + {locales.map(([code, label]) => ( + + {label} + + ))}
      ) } + +const LanguageListItemButton = React.memo<{ + code: string + children: string + className: string + buttonStyle: string + current: boolean + iconAlt: ReactNode + handleLanguageSelect?: (e: React.MouseEvent) => void +}>(({ code, children, buttonStyle, className, current, iconAlt, handleLanguageSelect }) => ( +
    • + +
    • +)) + +const MemoizedDropdownTrigger = React.memo< + Pick & { className: string; label: ReactNode } +>(({ narrow, invert, className, label }) => ( + + {narrow ? ( + + ) : ( + + )} + +)) From 2e4482c3da0b5df33e153ccc60d77d123e768561 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Mon, 3 Feb 2025 06:56:45 +0900 Subject: [PATCH 06/22] =?UTF-8?q?chore:=20Dropdown=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=8D=E3=83=B3=E3=83=88=E5=86=85=E3=81=AE?= =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92=E6=95=B4=E7=90=86?= =?UTF-8?q?=E3=81=99=E3=82=8B=20(#5304)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/Dropdown/Dropdown.tsx | 51 +++++++------- .../components/Dropdown/DropdownCloser.tsx | 18 +++-- .../Dropdown/DropdownContentInner.tsx | 26 +++---- .../components/Dropdown/DropdownTrigger.tsx | 39 +++++------ .../src/components/Dropdown/dropdownHelper.ts | 15 ++-- .../Dropdown/useKeyboardNavigation.ts | 69 ++++++++++--------- 6 files changed, 112 insertions(+), 106 deletions(-) diff --git a/packages/smarthr-ui/src/components/Dropdown/Dropdown.tsx b/packages/smarthr-ui/src/components/Dropdown/Dropdown.tsx index ca03ac9dfc..f7e5b18dc8 100644 --- a/packages/smarthr-ui/src/components/Dropdown/Dropdown.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/Dropdown.tsx @@ -6,6 +6,7 @@ import React, { PropsWithChildren, ReactNode, createContext, + useCallback, useContext, useEffect, useId, @@ -69,11 +70,11 @@ export const Dropdown: FC> = ({ onOpen, onClose, childr useEffect(() => { const onClickBody = (e: any) => { // ignore events from events within DropdownTrigger and DropdownContent - if (isEventFromChild(e, triggerElementRef.current) || isChildPortal(e.target)) { - return + if (!isEventFromChild(e, triggerElementRef.current) && !isChildPortal(e.target)) { + setActive(false) } - setActive(false) } + document.body.addEventListener('click', onClickBody, false) return () => { @@ -83,23 +84,36 @@ export const Dropdown: FC> = ({ onOpen, onClose, childr // This is the root container of a dropdown content located in outside the DOM tree const DropdownContentRoot = useMemo>( - () => (props) => { - if (!active) return null - return createPortal(props.children) - }, + () => (props) => (active ? createPortal(props.children) : null), [active, createPortal], ) + // set the displayName explicit for DevTools + DropdownContentRoot.displayName = 'DropdownContentRoot' + useEffect(() => { if (isPortalRootMounted()) { - if (active) onOpen?.() - else onClose?.() + ;(active ? onOpen : onClose)?.() } // eslint-disable-next-line react-hooks/exhaustive-deps }, [active]) - // set the displayName explicit for DevTools - DropdownContentRoot.displayName = 'DropdownContentRoot' + const onClickTrigger = useCallback((rect: Rect) => { + const newActive = !active + + setActive(newActive) + + if (newActive) { + setTriggerRect(rect) + } + }, []) + + const onClickCloser = useCallback(() => { + setActive(false) + + // return focus to the Trigger + getFirstTabbable(triggerElementRef)?.focus() + }, []) return ( @@ -109,19 +123,8 @@ export const Dropdown: FC> = ({ onOpen, onClose, childr triggerRect, triggerElementRef, rootTriggerRef: rootTriggerRef || triggerElementRef || null, - onClickTrigger: (rect) => { - const newActive = !active - setActive(newActive) - if (newActive) setTriggerRect(rect) - }, - onClickCloser: () => { - setActive(false) - // return focus to the Trigger - const trigger = getFirstTabbable(triggerElementRef) - if (trigger) { - trigger.focus() - } - }, + onClickTrigger, + onClickCloser, DropdownContentRoot, contentId, }} diff --git a/packages/smarthr-ui/src/components/Dropdown/DropdownCloser.tsx b/packages/smarthr-ui/src/components/Dropdown/DropdownCloser.tsx index 597dbc3bfc..f34c6d0c1e 100644 --- a/packages/smarthr-ui/src/components/Dropdown/DropdownCloser.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/DropdownCloser.tsx @@ -21,19 +21,17 @@ export const DropdownCloser: React.FC = ({ children, className }) => { const { onClickCloser, controllable } = useContext(DropdownContentContext) const { maxHeight } = useContext(DropdownContentInnerContext) - const styleProps = useMemo(() => { - const maxHeightStyle = controllable ? undefined : maxHeight - return { - className: closer({ controllable, className }), - style: { - maxHeight: maxHeightStyle, - }, - } - }, [className, controllable, maxHeight]) + const closerStyle = useMemo(() => closer({ controllable, className }), [controllable, className]) + const styleProps = useMemo( + () => ({ + maxHeight: controllable ? undefined : maxHeight, + }), + [maxHeight, controllable], + ) return ( // eslint-disable-next-line smarthr/a11y-delegate-element-has-role-presentation -
      +
      {children}
      ) diff --git a/packages/smarthr-ui/src/components/Dropdown/DropdownContentInner.tsx b/packages/smarthr-ui/src/components/Dropdown/DropdownContentInner.tsx index 0ae12b6190..be566e166b 100644 --- a/packages/smarthr-ui/src/components/Dropdown/DropdownContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/DropdownContentInner.tsx @@ -56,6 +56,11 @@ export const DropdownContentInner: FC = ({ const wrapperRef = useRef(null) const focusTargetRef = useRef(null) + const contentInnerStyle = useMemo( + () => contentInner({ isActive, className }), + [isActive, className], + ) + const wrapperStyleProps = useMemo(() => { const leftMargin = contentBox.left === undefined ? spacing[0.5] : `max(${contentBox.left}, 0px)` const rightMargin = @@ -63,20 +68,15 @@ export const DropdownContentInner: FC = ({ const maxWidthStyle = `calc(100% - ${leftMargin} - ${rightMargin})` return { - className: contentInner({ isActive, className }), - style: { - insetBlockStart: contentBox.top, - insetInlineStart: contentBox.left || undefined, - insetInlineEnd: contentBox.right || undefined, - maxWidth: maxWidthStyle, - }, + insetBlockStart: contentBox.top, + insetInlineStart: contentBox.left || undefined, + insetInlineEnd: contentBox.right || undefined, + maxWidth: maxWidthStyle, } - }, [className, contentBox.left, contentBox.right, contentBox.top, isActive]) + }, [contentBox.left, contentBox.right, contentBox.top]) const controllableWrapperStyleProps = useMemo( () => ({ - style: { - maxHeight: contentBox.maxHeight || undefined, - }, + maxHeight: contentBox.maxHeight || undefined, }), [contentBox.maxHeight], ) @@ -113,11 +113,11 @@ export const DropdownContentInner: FC = ({ useKeyboardNavigation(wrapperRef, focusTargetRef) return ( -
      +
      {/* dummy element for focus management. */}
      {controllable ? ( -
      {children}
      +
      {children}
      ) : ( {children} diff --git a/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx b/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx index 68caf03085..224e9ed0fb 100644 --- a/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx @@ -30,10 +30,12 @@ export const DropdownTrigger: React.FC = ({ children, className }) => { if (!triggerElementRef.current) { return } + // apply ARIA to all focusable elements in trigger const triggers = tabbable(triggerElementRef.current, { shouldIgnoreVisibility: true }) + triggers.forEach((trigger) => { - trigger.setAttribute('aria-expanded', String(active)) + trigger.setAttribute('aria-expanded', active.toString()) trigger.setAttribute('aria-controls', contentId) }) }, [triggerElementRef, active, contentId]) @@ -42,29 +44,24 @@ export const DropdownTrigger: React.FC = ({ children, className }) => { return (
      - {React.Children.map(children, (child) => { - if (foundFirstElement || !React.isValidElement(child)) { - return child - } - - foundFirstElement = true - - return React.cloneElement(child as ReactElement, { - onClick: (e: MouseEvent) => { - // 引き金となる要素が disabled な場合は発火させない - if (includeDisabledTrigger(children)) { - return + {/* 引き金となる要素が disabled な場合、処理を差し込む必要がないため、そのまま出力する */} + {includeDisabledTrigger(children) + ? children + : React.Children.map(children, (child) => { + if (foundFirstElement || !React.isValidElement(child)) { + return child } - const { top, right, bottom, left } = e.currentTarget.getBoundingClientRect() - onClickTrigger({ top, right, bottom, left }) + foundFirstElement = true - if (child.props.onClick) { - child.props.onClick(e) - } - }, - }) - })} + return React.cloneElement(child as ReactElement, { + onClick: (e: MouseEvent) => { + onClickTrigger(e.currentTarget.getBoundingClientRect()) + + child.props.onClick?.(e) + }, + }) + })}
      ) } diff --git a/packages/smarthr-ui/src/components/Dropdown/dropdownHelper.ts b/packages/smarthr-ui/src/components/Dropdown/dropdownHelper.ts index c353da457f..b75fe19805 100644 --- a/packages/smarthr-ui/src/components/Dropdown/dropdownHelper.ts +++ b/packages/smarthr-ui/src/components/Dropdown/dropdownHelper.ts @@ -18,8 +18,16 @@ export type ContentBoxStyle = { } export function isEventFromChild(e: Event, parent: Element | null): boolean { + if (!parent) { + return false + } + const path = e.composedPath() - if (path.length === 0 || !parent) return false + + if (path.length === 0) { + return false + } + return path.includes(parent) } @@ -73,9 +81,8 @@ export function getContentBoxStyle( export function getFirstTabbable(ref: RefObject) { if (ref.current) { - const tabbables = tabbable(ref.current) - const firstTabbable = tabbables[0] - return firstTabbable + return tabbable(ref.current)[0] } + return null } diff --git a/packages/smarthr-ui/src/components/Dropdown/useKeyboardNavigation.ts b/packages/smarthr-ui/src/components/Dropdown/useKeyboardNavigation.ts index c0addb8d4a..412580c997 100644 --- a/packages/smarthr-ui/src/components/Dropdown/useKeyboardNavigation.ts +++ b/packages/smarthr-ui/src/components/Dropdown/useKeyboardNavigation.ts @@ -5,6 +5,8 @@ import { tabbable } from '../../libs/tabbable' import { DropdownContext } from './Dropdown' import { getFirstTabbable } from './dropdownHelper' +const KEY_ESCAPE = /^Esc(ape)?$/ + export function useKeyboardNavigation( wrapperRef: RefObject, dummyFocusRef: RefObject, @@ -14,81 +16,80 @@ export function useKeyboardNavigation( const handleKeyDown = useCallback( (e: KeyboardEvent) => { if (e.key === 'Tab') { - if ( - !wrapperRef.current || - !triggerElementRef.current || - !rootTriggerRef || - !rootTriggerRef.current - ) { + if (!wrapperRef.current || !triggerElementRef.current || !rootTriggerRef?.current) { return } + const tabbablesInContent = tabbable(wrapperRef.current) + if (tabbablesInContent.length === 0) { return } - const triggers = tabbable(triggerElementRef.current) - const trigger = triggers[triggers.length - 1] + + const trigger = tabbable(triggerElementRef.current).at(-1) const firstTabbable = tabbablesInContent[0] - const lastTabbable = tabbablesInContent[tabbablesInContent.length - 1] if (e.target === trigger) { if (e.shiftKey) { // move focus previous of the Trigger return } + // focus a first tabbable element in the dropdown content e.preventDefault() firstTabbable.focus() + return - } else if ( - e.shiftKey && - (e.target === firstTabbable || e.target === dummyFocusRef.current) - ) { - // focus the Trigger - e.preventDefault() - trigger.focus() - onClickCloser() - } else if (!e.shiftKey && e.target === lastTabbable) { + } else if (e.shiftKey) { + if (e.target === firstTabbable || e.target === dummyFocusRef.current) { + // focus the Trigger + e.preventDefault() + trigger!.focus() + onClickCloser() + } + } else if (e.target === tabbablesInContent.at(-1)) { // move focus next of the Trigger - const rootTriggers = tabbable(rootTriggerRef.current) - const rootTrigger = rootTriggers[rootTriggers.length - 1] + const rootTrigger = tabbable(rootTriggerRef.current).at(-1) + if (rootTrigger) { rootTrigger.focus() onClickCloser() } } - } else if (e.key === 'Escape' || e.key === 'Esc') { - if (triggerElementRef.current) { - const trigger = getFirstTabbable(triggerElementRef) - if (trigger && e.target === trigger) { - // close the dropdown when the Trigger is focused and Esc key is pressed - onClickCloser() - return - } + } else if (KEY_ESCAPE.test(e.key)) { + if (e.target && e.target === dummyFocusRef.current) { + onClickCloser() + + return } - if (e.target && e.target === dummyFocusRef.current) { + const trigger = getFirstTabbable(triggerElementRef) + + if (trigger && e.target === trigger) { + // close the dropdown when the Trigger is focused and Esc key is pressed onClickCloser() + return } if (wrapperRef.current) { - const tabbablesInContent = tabbable(wrapperRef.current) - tabbablesInContent.some((inner) => { + for (const inner of tabbable(wrapperRef.current)) { if (inner === e.target) { // close the dropdown when an element that is included in dropdown content is focused and Esc key is pressed onClickCloser() - return true + + break } - return false - }) + } } } }, [wrapperRef, triggerElementRef, rootTriggerRef, dummyFocusRef, onClickCloser], ) + useEffect(() => { window.addEventListener('keydown', handleKeyDown) + return () => { window.removeEventListener('keydown', handleKeyDown) } From c0c50d1b706c8925892b777d5867a38af377113b Mon Sep 17 00:00:00 2001 From: "shingo.sasaki" Date: Mon, 3 Feb 2025 10:20:03 +0900 Subject: [PATCH 07/22] =?UTF-8?q?chore:=20CI=E3=81=A7=E3=81=AF=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=89=88=E3=81=AEcorepack=E3=82=92=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B=20(#5359)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .circleci/config.yml | 1 + .github/workflows/previewRelease.yml | 1 + .github/workflows/publishRelease.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8128c67ddc..a6b40c7346 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,6 +30,7 @@ commands: # fallback to using the latest cache if no exact match is found - modules-cache- - run: | + sudo npm install -g corepack@latest sudo corepack enable sudo corepack prepare pnpm install diff --git a/.github/workflows/previewRelease.yml b/.github/workflows/previewRelease.yml index 48aaac1882..b62dc88c3d 100644 --- a/.github/workflows/previewRelease.yml +++ b/.github/workflows/previewRelease.yml @@ -18,6 +18,7 @@ jobs: node-version: 20 - name: install dependencies run: | + npm install -g corepack@latest corepack enable corepack prepare pnpm ui install diff --git a/.github/workflows/publishRelease.yml b/.github/workflows/publishRelease.yml index 4430491bfe..7e78aef8f7 100644 --- a/.github/workflows/publishRelease.yml +++ b/.github/workflows/publishRelease.yml @@ -27,6 +27,7 @@ jobs: git config user.name "github-actions[bot]" - name: pnpm install run: | + npm install -g corepack@latest corepack enable corepack prepare pnpm ui install From d7b02ca2c7869fb713d4645965b6669afe42368f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 10:25:05 +0900 Subject: [PATCH 08/22] chore: update dependency tar@<6.2.1 to v7 (#5356) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: s-sasaki-0529 --- package.json | 1 - pnpm-lock.yaml | 87 +++++++++++++++++++++++++------------------------- 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index fde518c9a3..82642c6dda 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "react-dom": "^19.0.0", "micromatch@<4.0.8": ">=4.0.8", "cross-spawn@<7.0.5": ">=7.0.5", - "tar@<6.2.1": ">=6.2.1", "nanoid": "3.3.8" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac10a5ca6f..ee4b2af328 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,6 @@ overrides: react-dom: ^19.0.0 micromatch@<4.0.8: '>=4.0.8' cross-spawn@<7.0.5: '>=7.0.5' - tar@<6.2.1: '>=6.2.1' nanoid: 3.3.8 importers: @@ -1449,10 +1448,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -2872,9 +2867,9 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} chromatic@11.22.2: resolution: {integrity: sha512-Z7+9hD1yp1fUm34XX1wojIco0lQlXOVYhzDSE8v1ZU6qLD2r4N6UHKD+N+XY1Jj+gpsDFWYMTpSnDfcHZf5mhg==} @@ -3950,6 +3945,10 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs-monkey@1.0.4: resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} @@ -5201,13 +5200,21 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} - engines: {node: '>= 18'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} mkdirp@0.5.5: resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} @@ -6165,10 +6172,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - rimraf@6.0.1: resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} engines: {node: 20 || >=22} @@ -6630,9 +6633,9 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} temp@0.8.4: resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} @@ -7262,10 +7265,6 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -8514,10 +8513,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -10313,7 +10308,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@3.0.0: {} + chownr@2.0.0: {} chromatic@11.22.2: {} @@ -11619,6 +11614,10 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs-monkey@1.0.4: {} fs.realpath@1.0.0: {} @@ -11681,7 +11680,7 @@ snapshots: mri: 1.2.0 node-fetch-native: 1.1.0 pathe: 1.1.2 - tar: 7.4.3 + tar: 6.2.1 transitivePeerDependencies: - supports-color @@ -13146,12 +13145,18 @@ snapshots: minimist@1.2.8: {} + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + minipass@7.1.2: {} - minizlib@3.0.1: + minizlib@2.1.2: dependencies: - minipass: 7.1.2 - rimraf: 5.0.10 + minipass: 3.3.6 + yallist: 4.0.0 mkdirp@0.5.5: dependencies: @@ -14084,10 +14089,6 @@ snapshots: dependencies: glob: 7.2.0 - rimraf@5.0.10: - dependencies: - glob: 10.4.5 - rimraf@6.0.1: dependencies: glob: 11.0.1 @@ -14684,14 +14685,14 @@ snapshots: tapable@2.2.1: {} - tar@7.4.3: + tar@6.2.1: dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.1 - mkdirp: 3.0.1 - yallist: 5.0.0 + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 temp@0.8.4: dependencies: @@ -15413,8 +15414,6 @@ snapshots: yallist@4.0.0: {} - yallist@5.0.0: {} - yaml@1.10.2: {} yaml@2.6.1: {} From 869dc34bbecdfd9f2edae0146c6b339901efa7b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 10:28:39 +0900 Subject: [PATCH 09/22] chore: update dependency @swc/core to ^1.10.12 (#5357) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/smarthr-ui/package.json | 2 +- pnpm-lock.yaml | 290 +++++++++++++++---------------- 2 files changed, 146 insertions(+), 146 deletions(-) diff --git a/packages/smarthr-ui/package.json b/packages/smarthr-ui/package.json index a980a43077..c447ba387e 100644 --- a/packages/smarthr-ui/package.json +++ b/packages/smarthr-ui/package.json @@ -39,7 +39,7 @@ "@storybook/test": "^8.4.7", "@storybook/test-runner": "^0.21.0", "@storybook/theming": "^8.4.7", - "@swc/core": "^1.10.9", + "@swc/core": "^1.10.12", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", "@types/lodash.merge": "^4.6.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee4b2af328..fa87c3860e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,7 +65,7 @@ importers: version: 0.1.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@22.9.1)(typescript@5.7.3) + version: 10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.9.1)(typescript@5.7.3) typescript: specifier: ^5.7.3 version: 5.7.3 @@ -101,10 +101,10 @@ importers: version: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tailwind-variants: specifier: ^0.3.1 - version: 0.3.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))) + version: 0.3.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))) tailwindcss: specifier: ^3.4.17 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) devDependencies: '@babel/core': specifier: ^7.26.7 @@ -135,13 +135,13 @@ importers: version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@storybook/addon-styling-webpack': specifier: ^1.0.1 - version: 1.0.1(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 1.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) '@storybook/addon-viewport': specifier: ^8.4.7 version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@storybook/addon-webpack5-compiler-babel': specifier: ^3.0.5 - version: 3.0.5(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 3.0.5(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) '@storybook/blocks': specifier: ^8.4.7 version: 8.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2)) @@ -159,7 +159,7 @@ importers: version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@storybook/react-webpack5': specifier: ^8.4.7 - version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) + version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@storybook/source-loader': specifier: ^8.4.7 version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) @@ -168,13 +168,13 @@ importers: version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@storybook/test-runner': specifier: ^0.21.0 - version: 0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.16)(storybook@8.4.7(prettier@3.4.2))(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + version: 0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.16)(storybook@8.4.7(prettier@3.4.2))(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) '@storybook/theming': specifier: ^8.4.7 version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@swc/core': - specifier: ^1.10.9 - version: 1.10.9(@swc/helpers@0.5.15) + specifier: ^1.10.12 + version: 1.10.12(@swc/helpers@0.5.15) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -213,7 +213,7 @@ importers: version: 2.0.3(playwright@1.49.1) babel-loader: specifier: ^9.2.1 - version: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) babel-plugin-polyfill-corejs2: specifier: ^0.4.12 version: 0.4.12(@babel/core@7.26.7) @@ -225,10 +225,10 @@ importers: version: 11.22.2 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 7.1.2(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) ecma-version-validator-webpack-plugin: specifier: ^1.2.1 - version: 1.2.1(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 1.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) fs-extra: specifier: ^11.2.0 version: 11.2.0 @@ -258,7 +258,7 @@ importers: version: 8.4.49 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.49)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 8.1.1(postcss@8.4.49)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) postcss-styled-syntax: specifier: ^0.7.1 version: 0.7.1(postcss@8.4.49) @@ -294,16 +294,16 @@ importers: version: 4.0.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2)) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 4.0.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) styled-components: specifier: ^5.3.11 version: 5.3.11(react-dom@19.0.0(react@19.0.0))(react-is@19.0.0)(react@19.0.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) ttypescript: specifier: ^1.5.15 - version: 1.5.15(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))(typescript@5.7.3) + version: 1.5.15(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))(typescript@5.7.3) typescript-plugin-styled-components: specifier: ^3.0.0 version: 3.0.0(typescript@5.7.3) @@ -315,7 +315,7 @@ importers: version: 8.0.2 webpack: specifier: ^5.97.1 - version: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + version: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) sandbox/next: dependencies: @@ -349,7 +349,7 @@ importers: version: 8.4.49 tailwindcss: specifier: ^3.4.17 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1980,68 +1980,68 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@swc/core-darwin-arm64@1.10.9': - resolution: {integrity: sha512-XTHLtijFervv2B+i1ngM993umhSj9K1IeMomvU/Db84Asjur2XmD4KXt9QPnGDRFgv2kLSjZ+DDL25Qk0f4r+w==} + '@swc/core-darwin-arm64@1.10.12': + resolution: {integrity: sha512-pOANQegUTAriW7jq3SSMZGM5l89yLVMs48R0F2UG6UZsH04SiViCnDctOGlA/Sa++25C+rL9MGMYM1jDLylBbg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.10.9': - resolution: {integrity: sha512-bi3el9/FV/la8HIsolSjeDar+tM7m9AmSF1w7X6ZByW2qgc4Z1tmq0A4M4H9aH3TfHesZbfq8hgaNtc2/VtzzQ==} + '@swc/core-darwin-x64@1.10.12': + resolution: {integrity: sha512-m4kbpIDDsN1FrwfNQMU+FTrss356xsXvatLbearwR+V0lqOkjLBP0VmRvQfHEg+uy13VPyrT9gj4HLoztlci7w==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.10.9': - resolution: {integrity: sha512-xsLHV02S+RTDuI+UJBkA2muNk/s0ETRpoc1K/gNt0i8BqTurPYkrvGDDALN9+leiUPydHvZi9P1qdExbgUJnXw==} + '@swc/core-linux-arm-gnueabihf@1.10.12': + resolution: {integrity: sha512-OY9LcupgqEu8zVK+rJPes6LDJJwPDmwaShU96beTaxX2K6VrXbpwm5WbPS/8FfQTsmpnuA7dCcMPUKhNgmzTrQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.10.9': - resolution: {integrity: sha512-41hJgPoGhIa12U6Tud+yLF/m64YA3mGut3TmBEkj2R7rdJdE0mljdtR0tf4J2RoQaWZPPi0DBSqGdROiAEx9dg==} + '@swc/core-linux-arm64-gnu@1.10.12': + resolution: {integrity: sha512-nJD587rO0N4y4VZszz3xzVr7JIiCzSMhEMWnPjuh+xmPxDBz0Qccpr8xCr1cSxpl1uY7ERkqAGlKr6CwoV5kVg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.10.9': - resolution: {integrity: sha512-DUMRhl49b9r7bLg9oNzCdW4lLcDJKrRBn87Iq5APPvixsm1auGnsVQycGkQcDDKvVllxIFSbmCYzjagx3l8Hnw==} + '@swc/core-linux-arm64-musl@1.10.12': + resolution: {integrity: sha512-oqhSmV+XauSf0C//MoQnVErNUB/5OzmSiUzuazyLsD5pwqKNN+leC3JtRQ/QVzaCpr65jv9bKexT9+I2Tt3xDw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.10.9': - resolution: {integrity: sha512-xW0y88vQvmzYo3Gn7yFnY03TfHMwuca4aFH3ZmhwDNOYHmTOi6fmhAkg/13F/NrwjMYO+GnF5uJTjdjb3B6tdQ==} + '@swc/core-linux-x64-gnu@1.10.12': + resolution: {integrity: sha512-XldSIHyjD7m1Gh+/8rxV3Ok711ENLI420CU2EGEqSe3VSGZ7pHJvJn9ZFbYpWhsLxPqBYMFjp3Qw+J6OXCPXCA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.10.9': - resolution: {integrity: sha512-jYs32BEx+CPVuxN6NdsWEpdehjnmAag25jyJzwjQx+NCGYwHEV3bT5y8TX4eFhaVB1rafmqJOlYQPs4+MSyGCg==} + '@swc/core-linux-x64-musl@1.10.12': + resolution: {integrity: sha512-wvPXzJxzPgTqhyp1UskOx1hRTtdWxlyFD1cGWOxgLsMik0V9xKRgqKnMPv16Nk7L9xl6quQ6DuUHj9ID7L3oVw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.10.9': - resolution: {integrity: sha512-Uhh5T3Fq3Nyom96Bm3ACBNASH3iqNc76in7ewZz8PooUqeTIO8aZpsghnncjctRNE9T819/8btpiFIhHo3sKtg==} + '@swc/core-win32-arm64-msvc@1.10.12': + resolution: {integrity: sha512-TUYzWuu1O7uyIcRfxdm6Wh1u+gNnrW5M1DUgDOGZLsyQzgc2Zjwfh2llLhuAIilvCVg5QiGbJlpibRYJ/8QGsg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.10.9': - resolution: {integrity: sha512-bD5BpbojEsDfrAvT+1qjQPf5RCKLg4UL+3Uwm019+ZR02hd8qO538BlOnQdOqRqccu+75DF6aRglQ7AJ24Cs0Q==} + '@swc/core-win32-ia32-msvc@1.10.12': + resolution: {integrity: sha512-4Qrw+0Xt+Fe2rz4OJ/dEPMeUf/rtuFWWAj/e0vL7J5laUHirzxawLRE5DCJLQTarOiYR6mWnmadt9o3EKzV6Xg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.10.9': - resolution: {integrity: sha512-NwkuUNeBBQnAaXVvcGw8Zr6RR8kylyjFUnlYZZ3G0QkQZ4rYLXYTafAmiRjrfzgVb0LcMF/sBzJvGOk7SwtIDg==} + '@swc/core-win32-x64-msvc@1.10.12': + resolution: {integrity: sha512-YiloZXLW7rUxJpALwHXaGjVaAEn+ChoblG7/3esque+Y7QCyheoBUJp2DVM1EeVA43jBfZ8tvYF0liWd9Tpz1A==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.10.9': - resolution: {integrity: sha512-MQ97YSXu2oibzm7wi4GNa7hhndjLuVt/lmO2sq53+P37oZmyg/JQ/IYYtSiC6UGK3+cHoiVAykrK+glxLjJbag==} + '@swc/core@1.10.12': + resolution: {integrity: sha512-+iUL0PYpPm6N9AdV1wvafakvCqFegQus1aoEDxgFsv3/uNVNIyRaupf/v/Zkp5hbep2EzhtoJR0aiJIzDbXWHg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -8532,7 +8532,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -8546,7 +8546,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -8941,10 +8941,10 @@ snapshots: storybook: 8.4.7(prettier@3.4.2) tiny-invariant: 1.3.3 - '@storybook/addon-styling-webpack@1.0.1(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5))': + '@storybook/addon-styling-webpack@1.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5))': dependencies: '@storybook/node-logger': 8.0.5 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) '@storybook/addon-toolbars@8.4.7(storybook@8.4.7(prettier@3.4.2))': dependencies: @@ -8955,10 +8955,10 @@ snapshots: memoizerific: 1.11.3 storybook: 8.4.7(prettier@3.4.2) - '@storybook/addon-webpack5-compiler-babel@3.0.5(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5))': + '@storybook/addon-webpack5-compiler-babel@3.0.5(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5))': dependencies: '@babel/core': 7.26.7 - babel-loader: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + babel-loader: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) transitivePeerDependencies: - supports-color - webpack @@ -8973,7 +8973,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@storybook/builder-webpack5@8.4.7(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': + '@storybook/builder-webpack5@8.4.7(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': dependencies: '@storybook/core-webpack': 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@types/node': 22.9.1 @@ -8982,23 +8982,23 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.2.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) es-module-lexer: 1.6.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) - html-webpack-plugin: 5.6.0(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + html-webpack-plugin: 5.6.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 semver: 7.6.3 storybook: 8.4.7(prettier@3.4.2) - style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) - terser-webpack-plugin: 5.3.10(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) ts-dedent: 2.2.0 url: 0.11.1 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) - webpack-dev-middleware: 6.1.3(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack-dev-middleware: 6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) webpack-hot-middleware: 2.25.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -9117,11 +9117,11 @@ snapshots: '@storybook/node-logger@8.0.5': {} - '@storybook/preset-react-webpack@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': + '@storybook/preset-react-webpack@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': dependencies: '@storybook/core-webpack': 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@storybook/react': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) '@types/node': 22.9.1 '@types/semver': 7.5.0 find-up: 5.0.0 @@ -9133,7 +9133,7 @@ snapshots: semver: 7.6.3 storybook: 8.4.7(prettier@3.4.2) tsconfig-paths: 4.2.0 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -9148,7 +9148,7 @@ snapshots: dependencies: storybook: 8.4.7(prettier@3.4.2) - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5))': dependencies: debug: 4.4.0(supports-color@5.5.0) endent: 2.1.0 @@ -9158,7 +9158,7 @@ snapshots: react-docgen-typescript: 2.2.2(typescript@5.7.3) tslib: 2.8.1 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) transitivePeerDependencies: - supports-color @@ -9168,10 +9168,10 @@ snapshots: react-dom: 19.0.0(react@19.0.0) storybook: 8.4.7(prettier@3.4.2) - '@storybook/react-webpack5@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': + '@storybook/react-webpack5@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': dependencies: - '@storybook/builder-webpack5': 8.4.7(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) - '@storybook/preset-react-webpack': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) + '@storybook/builder-webpack5': 8.4.7(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) + '@storybook/preset-react-webpack': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@storybook/react': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@types/node': 22.9.1 react: 19.0.0 @@ -9211,7 +9211,7 @@ snapshots: prettier: 3.4.2 storybook: 8.4.7(prettier@3.4.2) - '@storybook/test-runner@0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.16)(storybook@8.4.7(prettier@3.4.2))(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))': + '@storybook/test-runner@0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.16)(storybook@8.4.7(prettier@3.4.2))(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))': dependencies: '@babel/core': 7.26.7 '@babel/generator': 7.26.5 @@ -9219,17 +9219,17 @@ snapshots: '@babel/types': 7.26.7 '@jest/types': 29.6.3 '@storybook/csf': 0.1.11 - '@swc/core': 1.10.9(@swc/helpers@0.5.15) - '@swc/jest': 0.2.36(@swc/core@1.10.9(@swc/helpers@0.5.15)) + '@swc/core': 1.10.12(@swc/helpers@0.5.15) + '@swc/jest': 0.2.36(@swc/core@1.10.12(@swc/helpers@0.5.15)) expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-junit: 16.0.0 - jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))) + jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))) jest-runner: 29.7.0 jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))) + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))) nyc: 15.1.0 playwright: 1.49.1 storybook: 8.4.7(prettier@3.4.2) @@ -9258,51 +9258,51 @@ snapshots: dependencies: storybook: 8.4.7(prettier@3.4.2) - '@swc/core-darwin-arm64@1.10.9': + '@swc/core-darwin-arm64@1.10.12': optional: true - '@swc/core-darwin-x64@1.10.9': + '@swc/core-darwin-x64@1.10.12': optional: true - '@swc/core-linux-arm-gnueabihf@1.10.9': + '@swc/core-linux-arm-gnueabihf@1.10.12': optional: true - '@swc/core-linux-arm64-gnu@1.10.9': + '@swc/core-linux-arm64-gnu@1.10.12': optional: true - '@swc/core-linux-arm64-musl@1.10.9': + '@swc/core-linux-arm64-musl@1.10.12': optional: true - '@swc/core-linux-x64-gnu@1.10.9': + '@swc/core-linux-x64-gnu@1.10.12': optional: true - '@swc/core-linux-x64-musl@1.10.9': + '@swc/core-linux-x64-musl@1.10.12': optional: true - '@swc/core-win32-arm64-msvc@1.10.9': + '@swc/core-win32-arm64-msvc@1.10.12': optional: true - '@swc/core-win32-ia32-msvc@1.10.9': + '@swc/core-win32-ia32-msvc@1.10.12': optional: true - '@swc/core-win32-x64-msvc@1.10.9': + '@swc/core-win32-x64-msvc@1.10.12': optional: true - '@swc/core@1.10.9(@swc/helpers@0.5.15)': + '@swc/core@1.10.12(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.17 optionalDependencies: - '@swc/core-darwin-arm64': 1.10.9 - '@swc/core-darwin-x64': 1.10.9 - '@swc/core-linux-arm-gnueabihf': 1.10.9 - '@swc/core-linux-arm64-gnu': 1.10.9 - '@swc/core-linux-arm64-musl': 1.10.9 - '@swc/core-linux-x64-gnu': 1.10.9 - '@swc/core-linux-x64-musl': 1.10.9 - '@swc/core-win32-arm64-msvc': 1.10.9 - '@swc/core-win32-ia32-msvc': 1.10.9 - '@swc/core-win32-x64-msvc': 1.10.9 + '@swc/core-darwin-arm64': 1.10.12 + '@swc/core-darwin-x64': 1.10.12 + '@swc/core-linux-arm-gnueabihf': 1.10.12 + '@swc/core-linux-arm64-gnu': 1.10.12 + '@swc/core-linux-arm64-musl': 1.10.12 + '@swc/core-linux-x64-gnu': 1.10.12 + '@swc/core-linux-x64-musl': 1.10.12 + '@swc/core-win32-arm64-msvc': 1.10.12 + '@swc/core-win32-ia32-msvc': 1.10.12 + '@swc/core-win32-x64-msvc': 1.10.12 '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} @@ -9311,10 +9311,10 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/jest@0.2.36(@swc/core@1.10.9(@swc/helpers@0.5.15))': + '@swc/jest@0.2.36(@swc/core@1.10.12(@swc/helpers@0.5.15))': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.10.9(@swc/helpers@0.5.15) + '@swc/core': 1.10.12(@swc/helpers@0.5.15) '@swc/counter': 0.1.3 jsonc-parser: 3.2.0 @@ -10056,12 +10056,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + babel-loader@9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: '@babel/core': 7.26.7 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) babel-plugin-istanbul@6.1.1: dependencies: @@ -10619,13 +10619,13 @@ snapshots: optionalDependencies: typescript: 5.7.3 - create-jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -10665,7 +10665,7 @@ snapshots: css-functions-list@3.2.3: {} - css-loader@6.11.0(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + css-loader@6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -10676,9 +10676,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) - css-loader@7.1.2(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + css-loader@7.1.2(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -10689,7 +10689,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) css-select@4.1.3: dependencies: @@ -10925,10 +10925,10 @@ snapshots: eastasianwidth@0.2.0: {} - ecma-version-validator-webpack-plugin@1.2.1(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + ecma-version-validator-webpack-plugin@1.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: acorn: 8.14.0 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) electron-to-chromium@1.5.63: {} @@ -11569,7 +11569,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: '@babel/code-frame': 7.26.2 chalk: 4.1.2 @@ -11584,7 +11584,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) form-data@4.0.1: dependencies: @@ -11919,7 +11919,7 @@ snapshots: html-tags@3.3.1: {} - html-webpack-plugin@5.6.0(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + html-webpack-plugin@5.6.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -11927,7 +11927,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) htmlparser2@3.10.1: dependencies: @@ -12372,16 +12372,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.0.2 - jest-config: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -12391,7 +12391,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.7 '@jest/test-sequencer': 29.7.0 @@ -12417,7 +12417,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.16 - ts-node: 10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -12505,10 +12505,10 @@ snapshots: '@types/node': 20.17.16 jest-util: 29.7.0 - jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))): + jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-process-manager: 0.4.0 @@ -12662,11 +12662,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))): + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))): dependencies: ansi-escapes: 6.2.1 chalk: 5.4.1 - jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -12697,12 +12697,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): + jest@29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.0.2 - jest-cli: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@20.17.16)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13675,22 +13675,22 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.49 - postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): dependencies: lilconfig: 3.1.3 yaml: 2.6.1 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3) - postcss-loader@8.1.1(postcss@8.4.49)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + postcss-loader@8.1.1(postcss@8.4.49)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: cosmiconfig: 9.0.0(typescript@5.7.3) jiti: 1.21.6 postcss: 8.4.49 semver: 7.6.3 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) transitivePeerDependencies: - typescript @@ -14514,13 +14514,13 @@ snapshots: strip-json-comments@3.1.1: {} - style-loader@3.3.4(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + style-loader@3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) - style-loader@4.0.0(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + style-loader@4.0.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) styled-components@5.3.11(react-dom@19.0.0(react@19.0.0))(react-is@19.0.0)(react@19.0.0): dependencies: @@ -14651,12 +14651,12 @@ snapshots: tailwind-merge@2.5.4: {} - tailwind-variants@0.3.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))): + tailwind-variants@0.3.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))): dependencies: tailwind-merge: 2.5.4 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -14675,7 +14675,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -14698,16 +14698,16 @@ snapshots: dependencies: rimraf: 2.6.3 - terser-webpack-plugin@5.3.10(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.27.0 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) optionalDependencies: - '@swc/core': 1.10.9(@swc/helpers@0.5.15) + '@swc/core': 1.10.12(@swc/helpers@0.5.15) esbuild: 0.21.5 terser@5.27.0: @@ -14800,7 +14800,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-loader@9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + ts-loader@9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -14808,9 +14808,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) - ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3): + ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.8 @@ -14828,9 +14828,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.10.9(@swc/helpers@0.5.15) + '@swc/core': 1.10.12(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@22.9.1)(typescript@5.7.3): + ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.9.1)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.8 @@ -14848,7 +14848,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.10.9(@swc/helpers@0.5.15) + '@swc/core': 1.10.12(@swc/helpers@0.5.15) tsconfig-paths@3.15.0: dependencies: @@ -14865,10 +14865,10 @@ snapshots: tslib@2.8.1: {} - ttypescript@1.5.15(ts-node@10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))(typescript@5.7.3): + ttypescript@1.5.15(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))(typescript@5.7.3): dependencies: resolve: 1.22.8 - ts-node: 10.9.2(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3) typescript: 5.7.3 type-check@0.4.0: @@ -15218,7 +15218,7 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-dev-middleware@6.1.3(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)): + webpack-dev-middleware@6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): dependencies: colorette: 2.0.20 memfs: 3.6.0 @@ -15226,7 +15226,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.0.0 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) webpack-hot-middleware@2.25.1: dependencies: @@ -15241,7 +15241,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5): + webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -15263,7 +15263,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.9(@swc/helpers@0.5.15))(esbuild@0.21.5)) + terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: From 3666564e3c5e33fa64214627b9eb37b200f74cc5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 10:02:13 +0900 Subject: [PATCH 10/22] chore: update pnpm to v9.15.5 (#5358) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: shingo.sasaki --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82642c6dda..a3c28bf79a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "commitmsg": "commitlint -e $GIT_PARAMS", "prepare": "husky" }, - "packageManager": "pnpm@9.15.4", + "packageManager": "pnpm@9.15.5", "pnpm": { "overrides": { "@babel/helper-compilation-targets": "^7.26.5", From 300ad26c9be36c588e2f1926dbcc9a22697186bb Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Tue, 4 Feb 2025 10:26:59 +0900 Subject: [PATCH 11/22] =?UTF-8?q?chore:=20MessageDialog=E3=81=AE=E5=86=85?= =?UTF-8?q?=E9=83=A8=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92=E6=95=B4?= =?UTF-8?q?=E7=90=86=E3=81=99=E3=82=8B=20(#5320)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageDialog/MessageDialogContent.tsx | 5 +- .../MessageDialogContentInner.tsx | 47 ++++++++++++++----- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContent.tsx b/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContent.tsx index 2a2274a4ff..fe7ad6cf0b 100644 --- a/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContent.tsx +++ b/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContent.tsx @@ -24,10 +24,9 @@ export const MessageDialogContent: React.FC = ({ const { createPortal } = useDialogPortal(portalParent) const handleClickClose = useCallback(() => { - if (!active) { - return + if (active) { + onClickClose() } - onClickClose() }, [active, onClickClose]) const titleId = useId() diff --git a/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx b/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx index 4b99580ac0..1c282bcebe 100644 --- a/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx @@ -1,7 +1,8 @@ -import React, { type FC } from 'react' +import React, { type FC, useMemo } from 'react' import { Button } from '../../Button' -import { Cluster, Stack } from '../../Layout' +import { Cluster } from '../../Layout' +import { Section } from '../../SectioningContent' import { DialogBody, Props as DialogBodyProps } from '../DialogBody' import { DialogHeader, Props as DialogHeaderProps } from '../DialogHeader' import { dialogContentInner } from '../dialogInnerStyle' @@ -33,20 +34,44 @@ export const MessageDialogContentInner: FC = ({ onClickClose, decorators, }) => { - const { wrapper, actionArea } = dialogContentInner() + const styles = useMemo(() => { + const { wrapper, actionArea } = dialogContentInner() + + return { + wrapper: wrapper(), + actionArea: actionArea(), + } + }, []) return ( - // eslint-disable-next-line smarthr/best-practice-for-layouts, smarthr/a11y-heading-in-sectioning-content - + // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content +
      {description} - - - - + +
      ) } + +const FooterCluster = React.memo< + Pick & { className: string } +>(({ onClickClose, decorators, className }) => { + const children = useMemo( + () => decorators?.closeButtonLabel?.(CLOSE_BUTTON_LABEL) || CLOSE_BUTTON_LABEL, + [decorators], + ) + + return ( + + + + ) +}) From d286b9061bb232c23560b5700b6c8a1960ea1053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ry=C5=8D=20Igarashi?= Date: Tue, 4 Feb 2025 13:18:50 +0900 Subject: [PATCH 12/22] =?UTF-8?q?fix:=20SegmentedControl=E5=86=85=E3=81=AE?= =?UTF-8?q?=E9=81=B8=E6=8A=9E=E6=B8=88=E3=81=BF=E9=A0=85=E7=9B=AE=E3=81=A7?= =?UTF-8?q?Button[variant=3Dprimary]=E3=82=92=E5=88=A9=E7=94=A8=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#5310)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/SegmentedControl/SegmentedControl.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/smarthr-ui/src/components/SegmentedControl/SegmentedControl.tsx b/packages/smarthr-ui/src/components/SegmentedControl/SegmentedControl.tsx index 52aad95cfd..f72401b17d 100644 --- a/packages/smarthr-ui/src/components/SegmentedControl/SegmentedControl.tsx +++ b/packages/smarthr-ui/src/components/SegmentedControl/SegmentedControl.tsx @@ -49,11 +49,6 @@ const segmentedControl = tv({ 'smarthr-ui-SegmentedControl-button', 'shr-m-0', 'shr-rounded-none', - 'aria-checked:shr-border-main', - 'aria-checked:shr-bg-main', - 'aria-checked:shr-text-white', - 'aria-checked:hover:shr-border-main/50', - 'aria-checked:hover:shr-bg-main/50', 'focus-visible:shr-focus-indicator', 'first:shr-rounded-tl-m', 'first:shr-rounded-bl-m', @@ -226,6 +221,7 @@ const SegmentedControlButton: FC< diff --git a/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/FilterDropdown.stories.tsx b/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/FilterDropdown.stories.tsx index 8e010d59ab..aee14e659a 100644 --- a/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/FilterDropdown.stories.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/FilterDropdown.stories.tsx @@ -66,3 +66,10 @@ export const Handlers: StoryObj = { onClose: action('close'), }, } + +export const OnlyIconTrigger: StoryObj = { + name: 'onlyIconTrigger', + args: { + onlyIconTrigger: true, + }, +} diff --git a/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/VRTFilterDropdown.stories.tsx b/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/VRTFilterDropdown.stories.tsx index 8b3ba5414a..b76bdc209f 100644 --- a/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/VRTFilterDropdown.stories.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/stories/VRTFilterDropdown.stories.tsx @@ -8,15 +8,20 @@ import type { Meta, StoryObj } from '@storybook/react' /** * $ pict filter-dropdown.pict - * triggerSize isFiltered disabled - * s true true - * s false false - * default false true - * default true false + * triggerSize isFiltered disabled onlyIconTrigger + * default false false true + * s true true false + * s false false false + * default false true false + * default true false false */ const _cases: Array< - Pick, 'isFiltered' | 'triggerSize' | 'disabled'> + Pick< + ComponentProps, + 'isFiltered' | 'triggerSize' | 'disabled' | 'onlyIconTrigger' + > > = [ + { onlyIconTrigger: true }, { triggerSize: 's', isFiltered: true, disabled: true }, { triggerSize: 's' }, { isFiltered: false, disabled: true }, @@ -41,7 +46,10 @@ export default { }, play: async ({ canvasElement }) => { const canvas = within(canvasElement) - const { length, [length - 1]: last } = await canvas.findAllByRole('button') + + const { length, 0: first, [length - 1]: last } = await canvas.findAllByRole('button') + + userEvent.hover(first) userEvent.click(last) }, tags: ['!autodocs'], From 411f0d5470becdccf8768d844032aceef6e47d24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 03:32:31 +0900 Subject: [PATCH 15/22] chore: update dependency vitest to v3.0.5 [security] (#5365) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 931 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 623 insertions(+), 308 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa87c3860e..c95282ba34 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,7 +56,7 @@ importers: version: 9.0.5(stylelint@16.12.0(typescript@5.7.3)) stylelint-config-smarthr: specifier: ^3.0.2 - version: 3.0.2(postcss-styled-syntax@0.7.1(postcss@8.4.49))(stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.3)))(stylelint@16.12.0(typescript@5.7.3)) + version: 3.0.2(postcss-styled-syntax@0.7.1(postcss@8.5.1))(stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.3)))(stylelint@16.12.0(typescript@5.7.3)) stylelint-config-standard: specifier: ^36.0.1 version: 36.0.1(stylelint@16.12.0(typescript@5.7.3)) @@ -135,13 +135,13 @@ importers: version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@storybook/addon-styling-webpack': specifier: ^1.0.1 - version: 1.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 1.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) '@storybook/addon-viewport': specifier: ^8.4.7 version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@storybook/addon-webpack5-compiler-babel': specifier: ^3.0.5 - version: 3.0.5(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 3.0.5(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) '@storybook/blocks': specifier: ^8.4.7 version: 8.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2)) @@ -159,7 +159,7 @@ importers: version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@storybook/react-webpack5': specifier: ^8.4.7 - version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) + version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@storybook/source-loader': specifier: ^8.4.7 version: 8.4.7(storybook@8.4.7(prettier@3.4.2)) @@ -207,13 +207,13 @@ importers: version: 5.1.34 autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.49) + version: 10.4.20(postcss@8.5.1) axe-playwright: specifier: ^2.0.3 version: 2.0.3(playwright@1.49.1) babel-loader: specifier: ^9.2.1 - version: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) babel-plugin-polyfill-corejs2: specifier: ^0.4.12 version: 0.4.12(@babel/core@7.26.7) @@ -225,10 +225,10 @@ importers: version: 11.22.2 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 7.1.2(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) ecma-version-validator-webpack-plugin: specifier: ^1.2.1 - version: 1.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 1.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) fs-extra: specifier: ^11.2.0 version: 11.2.0 @@ -255,16 +255,16 @@ importers: version: 4.0.1 postcss: specifier: ^8.4.49 - version: 8.4.49 + version: 8.5.1 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.49)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 8.1.1(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) postcss-styled-syntax: specifier: ^0.7.1 - version: 0.7.1(postcss@8.4.49) + version: 0.7.1(postcss@8.5.1) postcss-syntax: specifier: ^0.36.2 - version: 0.36.2(postcss@8.4.49) + version: 0.36.2(postcss@8.5.1) react: specifier: ^19.0.0 version: 19.0.0 @@ -294,13 +294,13 @@ importers: version: 4.0.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2)) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 4.0.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) styled-components: specifier: ^5.3.11 version: 5.3.11(react-dom@19.0.0(react@19.0.0))(react-is@19.0.0)(react@19.0.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + version: 9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) ttypescript: specifier: ^1.5.15 version: 1.5.15(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3))(typescript@5.7.3) @@ -309,13 +309,13 @@ importers: version: 3.0.0(typescript@5.7.3) vitest: specifier: ^3.0.4 - version: 3.0.4(@types/node@20.17.16)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0) + version: 3.0.5(@types/node@20.17.16)(jiti@2.4.1)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1) wait-on: specifier: ^8.0.2 version: 8.0.2 webpack: specifier: ^5.97.1 - version: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + version: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) sandbox/next: dependencies: @@ -346,7 +346,7 @@ importers: version: 19.0.3(@types/react@18.3.18) postcss: specifier: ^8.4.49 - version: 8.4.49 + version: 8.5.1 tailwindcss: specifier: ^3.4.17 version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) @@ -1139,138 +1139,288 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1632,93 +1782,98 @@ packages: engines: {node: '>=18'} hasBin: true - '@rollup/rollup-android-arm-eabi@4.27.3': - resolution: {integrity: sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==} + '@rollup/rollup-android-arm-eabi@4.34.2': + resolution: {integrity: sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.27.3': - resolution: {integrity: sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==} + '@rollup/rollup-android-arm64@4.34.2': + resolution: {integrity: sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.27.3': - resolution: {integrity: sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==} + '@rollup/rollup-darwin-arm64@4.34.2': + resolution: {integrity: sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.27.3': - resolution: {integrity: sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==} + '@rollup/rollup-darwin-x64@4.34.2': + resolution: {integrity: sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.27.3': - resolution: {integrity: sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==} + '@rollup/rollup-freebsd-arm64@4.34.2': + resolution: {integrity: sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.27.3': - resolution: {integrity: sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==} + '@rollup/rollup-freebsd-x64@4.34.2': + resolution: {integrity: sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.27.3': - resolution: {integrity: sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.34.2': + resolution: {integrity: sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.27.3': - resolution: {integrity: sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==} + '@rollup/rollup-linux-arm-musleabihf@4.34.2': + resolution: {integrity: sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.27.3': - resolution: {integrity: sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==} + '@rollup/rollup-linux-arm64-gnu@4.34.2': + resolution: {integrity: sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.27.3': - resolution: {integrity: sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==} + '@rollup/rollup-linux-arm64-musl@4.34.2': + resolution: {integrity: sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': - resolution: {integrity: sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==} + '@rollup/rollup-linux-loongarch64-gnu@4.34.2': + resolution: {integrity: sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': + resolution: {integrity: sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.27.3': - resolution: {integrity: sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==} + '@rollup/rollup-linux-riscv64-gnu@4.34.2': + resolution: {integrity: sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.27.3': - resolution: {integrity: sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==} + '@rollup/rollup-linux-s390x-gnu@4.34.2': + resolution: {integrity: sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.27.3': - resolution: {integrity: sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==} + '@rollup/rollup-linux-x64-gnu@4.34.2': + resolution: {integrity: sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.27.3': - resolution: {integrity: sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==} + '@rollup/rollup-linux-x64-musl@4.34.2': + resolution: {integrity: sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.27.3': - resolution: {integrity: sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==} + '@rollup/rollup-win32-arm64-msvc@4.34.2': + resolution: {integrity: sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.27.3': - resolution: {integrity: sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==} + '@rollup/rollup-win32-ia32-msvc@4.34.2': + resolution: {integrity: sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.27.3': - resolution: {integrity: sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==} + '@rollup/rollup-win32-x64-msvc@4.34.2': + resolution: {integrity: sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==} cpu: [x64] os: [win32] @@ -2301,14 +2456,14 @@ packages: '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/expect@2.1.8': - resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} - '@vitest/expect@3.0.4': - resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==} + '@vitest/expect@3.0.5': + resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} - '@vitest/mocker@2.1.8': - resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 @@ -2318,8 +2473,8 @@ packages: vite: optional: true - '@vitest/mocker@3.0.4': - resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==} + '@vitest/mocker@3.0.5': + resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -2332,41 +2487,41 @@ packages: '@vitest/pretty-format@2.0.5': resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - '@vitest/pretty-format@2.1.8': - resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - '@vitest/pretty-format@3.0.4': - resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==} + '@vitest/pretty-format@3.0.5': + resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} - '@vitest/runner@2.1.8': - resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} - '@vitest/runner@3.0.4': - resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==} + '@vitest/runner@3.0.5': + resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} - '@vitest/snapshot@2.1.8': - resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} - '@vitest/snapshot@3.0.4': - resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==} + '@vitest/snapshot@3.0.5': + resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} '@vitest/spy@2.0.5': resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/spy@2.1.8': - resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} - '@vitest/spy@3.0.4': - resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==} + '@vitest/spy@3.0.5': + resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - '@vitest/utils@2.1.8': - resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - '@vitest/utils@3.0.4': - resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==} + '@vitest/utils@3.0.5': + resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -3557,6 +3712,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5043,8 +5203,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -5804,8 +5964,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -6177,8 +6337,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.27.3: - resolution: {integrity: sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==} + rollup@4.34.2: + resolution: {integrity: sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -6972,18 +7132,18 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-node@2.1.8: - resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-node@3.0.4: - resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==} + vite-node@3.0.5: + resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@5.4.11: - resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7013,15 +7173,55 @@ packages: terser: optional: true - vitest@2.1.8: - resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + vite@6.0.11: + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.8 - '@vitest/ui': 2.1.8 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7038,16 +7238,16 @@ packages: jsdom: optional: true - vitest@3.0.4: - resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==} + vitest@3.0.5: + resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.4 - '@vitest/ui': 3.0.4 + '@vitest/browser': 3.0.5 + '@vitest/ui': 3.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -8299,72 +8499,147 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.24.2': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.24.2': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.24.2': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.24.2': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.24.2': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.24.2': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.24.2': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.24.2': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.24.2': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.24.2': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.24.2': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.24.2': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.24.2': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.24.2': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.24.2': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.24.2': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.24.2': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.24.2': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.24.2': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.24.2': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.24.2': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@9.17.0(jiti@2.4.1))': dependencies: eslint: 9.17.0(jiti@2.4.1) @@ -8772,58 +9047,61 @@ snapshots: dependencies: playwright: 1.49.1 - '@rollup/rollup-android-arm-eabi@4.27.3': + '@rollup/rollup-android-arm-eabi@4.34.2': + optional: true + + '@rollup/rollup-android-arm64@4.34.2': optional: true - '@rollup/rollup-android-arm64@4.27.3': + '@rollup/rollup-darwin-arm64@4.34.2': optional: true - '@rollup/rollup-darwin-arm64@4.27.3': + '@rollup/rollup-darwin-x64@4.34.2': optional: true - '@rollup/rollup-darwin-x64@4.27.3': + '@rollup/rollup-freebsd-arm64@4.34.2': optional: true - '@rollup/rollup-freebsd-arm64@4.27.3': + '@rollup/rollup-freebsd-x64@4.34.2': optional: true - '@rollup/rollup-freebsd-x64@4.27.3': + '@rollup/rollup-linux-arm-gnueabihf@4.34.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.27.3': + '@rollup/rollup-linux-arm-musleabihf@4.34.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.27.3': + '@rollup/rollup-linux-arm64-gnu@4.34.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.27.3': + '@rollup/rollup-linux-arm64-musl@4.34.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.27.3': + '@rollup/rollup-linux-loongarch64-gnu@4.34.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.27.3': + '@rollup/rollup-linux-riscv64-gnu@4.34.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.27.3': + '@rollup/rollup-linux-s390x-gnu@4.34.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.27.3': + '@rollup/rollup-linux-x64-gnu@4.34.2': optional: true - '@rollup/rollup-linux-x64-musl@4.27.3': + '@rollup/rollup-linux-x64-musl@4.34.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.27.3': + '@rollup/rollup-win32-arm64-msvc@4.34.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.27.3': + '@rollup/rollup-win32-ia32-msvc@4.34.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.27.3': + '@rollup/rollup-win32-x64-msvc@4.34.2': optional: true '@rtsao/scc@1.1.0': {} @@ -8941,10 +9219,10 @@ snapshots: storybook: 8.4.7(prettier@3.4.2) tiny-invariant: 1.3.3 - '@storybook/addon-styling-webpack@1.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5))': + '@storybook/addon-styling-webpack@1.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': dependencies: '@storybook/node-logger': 8.0.5 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) '@storybook/addon-toolbars@8.4.7(storybook@8.4.7(prettier@3.4.2))': dependencies: @@ -8955,10 +9233,10 @@ snapshots: memoizerific: 1.11.3 storybook: 8.4.7(prettier@3.4.2) - '@storybook/addon-webpack5-compiler-babel@3.0.5(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5))': + '@storybook/addon-webpack5-compiler-babel@3.0.5(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': dependencies: '@babel/core': 7.26.7 - babel-loader: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + babel-loader: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) transitivePeerDependencies: - supports-color - webpack @@ -8973,7 +9251,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@storybook/builder-webpack5@8.4.7(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': + '@storybook/builder-webpack5@8.4.7(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': dependencies: '@storybook/core-webpack': 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@types/node': 22.9.1 @@ -8982,23 +9260,23 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.2.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) es-module-lexer: 1.6.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) - html-webpack-plugin: 5.6.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + html-webpack-plugin: 5.6.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 semver: 7.6.3 storybook: 8.4.7(prettier@3.4.2) - style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) - terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) ts-dedent: 2.2.0 url: 0.11.1 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) - webpack-dev-middleware: 6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack-dev-middleware: 6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) webpack-hot-middleware: 2.25.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -9074,8 +9352,8 @@ snapshots: '@storybook/csf': 0.1.11 better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.21.5 - esbuild-register: 3.5.0(esbuild@0.21.5) + esbuild: 0.24.2 + esbuild-register: 3.5.0(esbuild@0.24.2) jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.6 @@ -9108,7 +9386,7 @@ snapshots: '@storybook/instrumenter@8.4.7(storybook@8.4.7(prettier@3.4.2))': dependencies: '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.8 + '@vitest/utils': 2.1.9 storybook: 8.4.7(prettier@3.4.2) '@storybook/manager-api@8.4.7(storybook@8.4.7(prettier@3.4.2))': @@ -9117,11 +9395,11 @@ snapshots: '@storybook/node-logger@8.0.5': {} - '@storybook/preset-react-webpack@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': + '@storybook/preset-react-webpack@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': dependencies: '@storybook/core-webpack': 8.4.7(storybook@8.4.7(prettier@3.4.2)) '@storybook/react': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) '@types/node': 22.9.1 '@types/semver': 7.5.0 find-up: 5.0.0 @@ -9133,7 +9411,7 @@ snapshots: semver: 7.6.3 storybook: 8.4.7(prettier@3.4.2) tsconfig-paths: 4.2.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -9148,7 +9426,7 @@ snapshots: dependencies: storybook: 8.4.7(prettier@3.4.2) - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': dependencies: debug: 4.4.0(supports-color@5.5.0) endent: 2.1.0 @@ -9158,7 +9436,7 @@ snapshots: react-docgen-typescript: 2.2.2(typescript@5.7.3) tslib: 2.8.1 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) transitivePeerDependencies: - supports-color @@ -9168,10 +9446,10 @@ snapshots: react-dom: 19.0.0(react@19.0.0) storybook: 8.4.7(prettier@3.4.2) - '@storybook/react-webpack5@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': + '@storybook/react-webpack5@8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3)': dependencies: - '@storybook/builder-webpack5': 8.4.7(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) - '@storybook/preset-react-webpack': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) + '@storybook/builder-webpack5': 8.4.7(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) + '@storybook/preset-react-webpack': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@storybook/react': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(prettier@3.4.2))(typescript@5.7.3) '@types/node': 22.9.1 react: 19.0.0 @@ -9616,67 +9894,67 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/expect@2.1.8': + '@vitest/expect@2.1.9': dependencies: - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/expect@3.0.4': + '@vitest/expect@3.0.5': dependencies: - '@vitest/spy': 3.0.4 - '@vitest/utils': 3.0.4 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0))': + '@vitest/mocker@2.1.9(vite@5.4.14(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0))': dependencies: - '@vitest/spy': 2.1.8 + '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) + vite: 5.4.14(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) - '@vitest/mocker@3.0.4(vite@5.4.11(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0))': + '@vitest/mocker@3.0.5(vite@6.0.11(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1))': dependencies: - '@vitest/spy': 3.0.4 + '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.11(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0) + vite: 6.0.11(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1) '@vitest/pretty-format@2.0.5': dependencies: tinyrainbow: 1.2.0 - '@vitest/pretty-format@2.1.8': + '@vitest/pretty-format@2.1.9': dependencies: tinyrainbow: 1.2.0 - '@vitest/pretty-format@3.0.4': + '@vitest/pretty-format@3.0.5': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@2.1.8': + '@vitest/runner@2.1.9': dependencies: - '@vitest/utils': 2.1.8 + '@vitest/utils': 2.1.9 pathe: 1.1.2 - '@vitest/runner@3.0.4': + '@vitest/runner@3.0.5': dependencies: - '@vitest/utils': 3.0.4 + '@vitest/utils': 3.0.5 pathe: 2.0.2 - '@vitest/snapshot@2.1.8': + '@vitest/snapshot@2.1.9': dependencies: - '@vitest/pretty-format': 2.1.8 + '@vitest/pretty-format': 2.1.9 magic-string: 0.30.17 pathe: 1.1.2 - '@vitest/snapshot@3.0.4': + '@vitest/snapshot@3.0.5': dependencies: - '@vitest/pretty-format': 3.0.4 + '@vitest/pretty-format': 3.0.5 magic-string: 0.30.17 pathe: 2.0.2 @@ -9684,11 +9962,11 @@ snapshots: dependencies: tinyspy: 3.0.2 - '@vitest/spy@2.1.8': + '@vitest/spy@2.1.9': dependencies: tinyspy: 3.0.2 - '@vitest/spy@3.0.4': + '@vitest/spy@3.0.5': dependencies: tinyspy: 3.0.2 @@ -9696,19 +9974,19 @@ snapshots: dependencies: '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 - loupe: 3.1.2 + loupe: 3.1.3 tinyrainbow: 1.2.0 - '@vitest/utils@2.1.8': + '@vitest/utils@2.1.9': dependencies: - '@vitest/pretty-format': 2.1.8 - loupe: 3.1.2 + '@vitest/pretty-format': 2.1.9 + loupe: 3.1.3 tinyrainbow: 1.2.0 - '@vitest/utils@3.0.4': + '@vitest/utils@3.0.5': dependencies: - '@vitest/pretty-format': 3.0.4 - loupe: 3.1.2 + '@vitest/pretty-format': 3.0.5 + loupe: 3.1.3 tinyrainbow: 2.0.0 '@webassemblyjs/ast@1.14.1': @@ -9999,14 +10277,14 @@ snapshots: asynckit@0.4.0: {} - autoprefixer@10.4.20(postcss@8.4.49): + autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.2 caniuse-lite: 1.0.30001683 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -10056,12 +10334,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + babel-loader@9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: '@babel/core': 7.26.7 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) babel-plugin-istanbul@6.1.1: dependencies: @@ -10252,7 +10530,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.2 + loupe: 3.1.3 pathval: 2.0.0 chalk@2.4.2: @@ -10665,31 +10943,31 @@ snapshots: css-functions-list@3.2.3: {} - css-loader@6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + css-loader@6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) - postcss-modules-local-by-default: 4.1.0(postcss@8.4.49) - postcss-modules-scope: 3.2.1(postcss@8.4.49) - postcss-modules-values: 4.0.0(postcss@8.4.49) + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.1) + postcss-modules-local-by-default: 4.1.0(postcss@8.5.1) + postcss-modules-scope: 3.2.1(postcss@8.5.1) + postcss-modules-values: 4.0.0(postcss@8.5.1) postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) - css-loader@7.1.2(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + css-loader@7.1.2(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) - postcss-modules-local-by-default: 4.1.0(postcss@8.4.49) - postcss-modules-scope: 3.2.1(postcss@8.4.49) - postcss-modules-values: 4.0.0(postcss@8.4.49) + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.1) + postcss-modules-local-by-default: 4.1.0(postcss@8.5.1) + postcss-modules-scope: 3.2.1(postcss@8.5.1) + postcss-modules-values: 4.0.0(postcss@8.5.1) postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) css-select@4.1.3: dependencies: @@ -10925,10 +11203,10 @@ snapshots: eastasianwidth@0.2.0: {} - ecma-version-validator-webpack-plugin@1.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + ecma-version-validator-webpack-plugin@1.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: acorn: 8.14.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) electron-to-chromium@1.5.63: {} @@ -11070,10 +11348,10 @@ snapshots: es6-error@4.1.1: {} - esbuild-register@3.5.0(esbuild@0.21.5): + esbuild-register@3.5.0(esbuild@0.24.2): dependencies: debug: 4.4.0(supports-color@5.5.0) - esbuild: 0.21.5 + esbuild: 0.24.2 transitivePeerDependencies: - supports-color @@ -11103,6 +11381,34 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -11133,7 +11439,7 @@ snapshots: react: 19.0.0 typescript: 5.7.3 typescript-eslint: 8.18.0(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.3) - vitest: 2.1.8(@types/node@22.9.1)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0) + vitest: 2.1.9(@types/node@22.9.1)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@types/node' @@ -11569,7 +11875,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: '@babel/code-frame': 7.26.2 chalk: 4.1.2 @@ -11584,7 +11890,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) form-data@4.0.1: dependencies: @@ -11919,7 +12225,7 @@ snapshots: html-tags@3.3.1: {} - html-webpack-plugin@5.6.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + html-webpack-plugin@5.6.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -11927,7 +12233,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) htmlparser2@3.10.1: dependencies: @@ -12007,9 +12313,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.4.49): + icss-utils@5.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 ieee754@1.2.1: {} @@ -12998,7 +13304,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.2: {} + loupe@3.1.3: {} lower-case@2.0.2: dependencies: @@ -13663,68 +13969,68 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.49): + postcss-import@15.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.49): + postcss-js@4.0.1(postcss@8.5.1): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.49 + postcss: 8.5.1 - postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): + postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)): dependencies: lilconfig: 3.1.3 yaml: 2.6.1 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 ts-node: 10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3) - postcss-loader@8.1.1(postcss@8.4.49)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + postcss-loader@8.1.1(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: cosmiconfig: 9.0.0(typescript@5.7.3) jiti: 1.21.6 - postcss: 8.4.49 + postcss: 8.5.1 semver: 7.6.3 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) transitivePeerDependencies: - typescript - postcss-modules-extract-imports@3.1.0(postcss@8.4.49): + postcss-modules-extract-imports@3.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-modules-local-by-default@4.1.0(postcss@8.4.49): + postcss-modules-local-by-default@4.1.0(postcss@8.5.1): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.4.49): + postcss-modules-scope@3.2.1(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser: 7.0.0 - postcss-modules-values@4.0.0(postcss@8.4.49): + postcss-modules-values@4.0.0(postcss@8.5.1): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 - postcss-nested@6.2.0(postcss@8.4.49): + postcss-nested@6.2.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser: 6.1.2 postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@7.0.1(postcss@8.4.49): + postcss-safe-parser@7.0.1(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser@6.1.2: dependencies: @@ -13736,14 +14042,14 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-styled-syntax@0.7.1(postcss@8.4.49): + postcss-styled-syntax@0.7.1(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 typescript: 5.7.3 - postcss-syntax@0.36.2(postcss@8.4.49): + postcss-syntax@0.36.2(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser@4.2.0: {} @@ -13753,7 +14059,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -14094,28 +14400,29 @@ snapshots: glob: 11.0.1 package-json-from-dist: 1.0.1 - rollup@4.27.3: + rollup@4.34.2: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.27.3 - '@rollup/rollup-android-arm64': 4.27.3 - '@rollup/rollup-darwin-arm64': 4.27.3 - '@rollup/rollup-darwin-x64': 4.27.3 - '@rollup/rollup-freebsd-arm64': 4.27.3 - '@rollup/rollup-freebsd-x64': 4.27.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.27.3 - '@rollup/rollup-linux-arm-musleabihf': 4.27.3 - '@rollup/rollup-linux-arm64-gnu': 4.27.3 - '@rollup/rollup-linux-arm64-musl': 4.27.3 - '@rollup/rollup-linux-powerpc64le-gnu': 4.27.3 - '@rollup/rollup-linux-riscv64-gnu': 4.27.3 - '@rollup/rollup-linux-s390x-gnu': 4.27.3 - '@rollup/rollup-linux-x64-gnu': 4.27.3 - '@rollup/rollup-linux-x64-musl': 4.27.3 - '@rollup/rollup-win32-arm64-msvc': 4.27.3 - '@rollup/rollup-win32-ia32-msvc': 4.27.3 - '@rollup/rollup-win32-x64-msvc': 4.27.3 + '@rollup/rollup-android-arm-eabi': 4.34.2 + '@rollup/rollup-android-arm64': 4.34.2 + '@rollup/rollup-darwin-arm64': 4.34.2 + '@rollup/rollup-darwin-x64': 4.34.2 + '@rollup/rollup-freebsd-arm64': 4.34.2 + '@rollup/rollup-freebsd-x64': 4.34.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.2 + '@rollup/rollup-linux-arm-musleabihf': 4.34.2 + '@rollup/rollup-linux-arm64-gnu': 4.34.2 + '@rollup/rollup-linux-arm64-musl': 4.34.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.2 + '@rollup/rollup-linux-riscv64-gnu': 4.34.2 + '@rollup/rollup-linux-s390x-gnu': 4.34.2 + '@rollup/rollup-linux-x64-gnu': 4.34.2 + '@rollup/rollup-linux-x64-musl': 4.34.2 + '@rollup/rollup-win32-arm64-msvc': 4.34.2 + '@rollup/rollup-win32-ia32-msvc': 4.34.2 + '@rollup/rollup-win32-x64-msvc': 4.34.2 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -14514,13 +14821,13 @@ snapshots: strip-json-comments@3.1.1: {} - style-loader@3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + style-loader@3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) - style-loader@4.0.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + style-loader@4.0.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) styled-components@5.3.11(react-dom@19.0.0(react@19.0.0))(react-is@19.0.0)(react@19.0.0): dependencies: @@ -14551,9 +14858,9 @@ snapshots: dependencies: stylelint: 16.12.0(typescript@5.7.3) - stylelint-config-smarthr@3.0.2(postcss-styled-syntax@0.7.1(postcss@8.4.49))(stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.3)))(stylelint@16.12.0(typescript@5.7.3)): + stylelint-config-smarthr@3.0.2(postcss-styled-syntax@0.7.1(postcss@8.5.1))(stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.3)))(stylelint@16.12.0(typescript@5.7.3)): dependencies: - postcss-styled-syntax: 0.7.1(postcss@8.4.49) + postcss-styled-syntax: 0.7.1(postcss@8.5.1) stylelint: 16.12.0(typescript@5.7.3) stylelint-config-standard: 36.0.1(stylelint@16.12.0(typescript@5.7.3)) @@ -14593,9 +14900,9 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 + postcss: 8.5.1 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.4.49) + postcss-safe-parser: 7.0.1(postcss@8.5.1) postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -14672,11 +14979,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) - postcss-nested: 6.2.0(postcss@8.4.49) + postcss: 8.5.1 + postcss-import: 15.1.0(postcss@8.5.1) + postcss-js: 4.0.1(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3)) + postcss-nested: 6.2.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -14698,17 +15005,17 @@ snapshots: dependencies: rimraf: 2.6.3 - terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.27.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) optionalDependencies: '@swc/core': 1.10.12(@swc/helpers@0.5.15) - esbuild: 0.21.5 + esbuild: 0.24.2 terser@5.27.0: dependencies: @@ -14800,7 +15107,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-loader@9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + ts-loader@9.5.2(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -14808,7 +15115,7 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@20.17.16)(typescript@5.7.3): dependencies: @@ -15039,13 +15346,13 @@ snapshots: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 - vite-node@2.1.8(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0): + vite-node@2.1.9(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@5.5.0) es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) + vite: 5.4.14(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) transitivePeerDependencies: - '@types/node' - less @@ -15057,15 +15364,16 @@ snapshots: - supports-color - terser - vite-node@3.0.4(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0): + vite-node@3.0.5(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@5.5.0) es-module-lexer: 1.6.0 pathe: 2.0.2 - vite: 5.4.11(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0) + vite: 6.0.11(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -15074,38 +15382,42 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml - vite@5.4.11(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0): + vite@5.4.14(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.49 - rollup: 4.27.3 + postcss: 8.5.1 + rollup: 4.34.2 optionalDependencies: - '@types/node': 20.17.16 + '@types/node': 22.9.1 fsevents: 2.3.3 less: 4.2.0 terser: 5.27.0 - vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0): + vite@6.0.11(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1): dependencies: - esbuild: 0.21.5 - postcss: 8.4.49 - rollup: 4.27.3 + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.34.2 optionalDependencies: - '@types/node': 22.9.1 + '@types/node': 20.17.16 fsevents: 2.3.3 + jiti: 2.4.1 less: 4.2.0 terser: 5.27.0 + yaml: 2.6.1 - vitest@2.1.8(@types/node@22.9.1)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0): + vitest@2.1.9(@types/node@22.9.1)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0): dependencies: - '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0)) - '@vitest/pretty-format': 2.1.8 - '@vitest/runner': 2.1.8 - '@vitest/snapshot': 2.1.8 - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.14(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 chai: 5.1.2 debug: 4.4.0(supports-color@5.5.0) expect-type: 1.1.0 @@ -15116,8 +15428,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) - vite-node: 2.1.8(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) + vite: 5.4.14(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) + vite-node: 2.1.9(@types/node@22.9.1)(less@4.2.0)(terser@5.27.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.9.1 @@ -15133,15 +15445,15 @@ snapshots: - supports-color - terser - vitest@3.0.4(@types/node@20.17.16)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0): + vitest@3.0.5(@types/node@20.17.16)(jiti@2.4.1)(jsdom@26.0.0)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1): dependencies: - '@vitest/expect': 3.0.4 - '@vitest/mocker': 3.0.4(vite@5.4.11(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0)) - '@vitest/pretty-format': 3.0.4 - '@vitest/runner': 3.0.4 - '@vitest/snapshot': 3.0.4 - '@vitest/spy': 3.0.4 - '@vitest/utils': 3.0.4 + '@vitest/expect': 3.0.5 + '@vitest/mocker': 3.0.5(vite@6.0.11(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1)) + '@vitest/pretty-format': 3.0.5 + '@vitest/runner': 3.0.5 + '@vitest/snapshot': 3.0.5 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 chai: 5.1.2 debug: 4.4.0(supports-color@5.5.0) expect-type: 1.1.0 @@ -15152,13 +15464,14 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 5.4.11(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0) - vite-node: 3.0.4(@types/node@20.17.16)(less@4.2.0)(terser@5.27.0) + vite: 6.0.11(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1) + vite-node: 3.0.5(@types/node@20.17.16)(jiti@2.4.1)(less@4.2.0)(terser@5.27.0)(yaml@2.6.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.17.16 jsdom: 26.0.0 transitivePeerDependencies: + - jiti - less - lightningcss - msw @@ -15168,6 +15481,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml w3c-xmlserializer@5.0.0: dependencies: @@ -15218,7 +15533,7 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-dev-middleware@6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)): + webpack-dev-middleware@6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): dependencies: colorette: 2.0.20 memfs: 3.6.0 @@ -15226,7 +15541,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.0.0 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5) + webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) webpack-hot-middleware@2.25.1: dependencies: @@ -15241,7 +15556,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5): + webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -15263,7 +15578,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.21.5)) + terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: From 547d2e50640cb37ac55e4061b4024f30b211b951 Mon Sep 17 00:00:00 2001 From: eatski-gaha <19850020+eatski@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:49:21 +0900 Subject: [PATCH 16/22] =?UTF-8?q?fix(MultiComboBox):=20item.label=E3=81=8C?= =?UTF-8?q?ReactNode=E3=81=A0=E3=81=A3=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=AE?= =?UTF-8?q?item=E3=81=AE=E6=AF=94=E8=BC=83=E3=82=92=E5=86=85=E9=83=A8?= =?UTF-8?q?=E3=81=AE=E6=96=87=E5=AD=97=E5=88=97=E3=81=AB=E3=82=88=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E8=A1=8C=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=20(#5191?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComboBox/MultiComboBox/MultiComboBox.tsx | 11 +++++------ .../components/ComboBox/__tests__/useOptions.test.tsx | 4 ++-- .../src/components/ComboBox/comboBoxHelper.ts | 8 ++++++++ .../smarthr-ui/src/components/ComboBox/useOptions.ts | 10 +++------- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx b/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx index e304b25962..c6f6d8e1ac 100644 --- a/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx +++ b/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx @@ -19,6 +19,7 @@ import { useOuterClick } from '../../../hooks/useOuterClick' import { genericsForwardRef } from '../../../libs/util' import { textColor } from '../../../themes' import { FaCaretDownIcon } from '../../Icon' +import { areComboBoxItemsEqual } from '../comboBoxHelper' import { useFocusControl } from '../useFocusControl' import { useListBox } from '../useListBox' import { useOptions } from '../useOptions' @@ -198,9 +199,7 @@ const ActualMultiComboBox = ( if (onDelete) onDelete(item) if (onChangeSelected) onChangeSelected( - selectedItems.filter( - (selected) => selected.label !== item.label || selected.value !== item.value, - ), + selectedItems.filter((selected) => !areComboBoxItemsEqual(selected, item)), ) }) }, @@ -211,8 +210,8 @@ const ActualMultiComboBox = ( // HINT: Dropdown系コンポーネント内でComboBoxを使うと、選択肢がportalで表現されている関係上Dropdownが閉じてしまう // requestAnimationFrameを追加、処理を遅延させることで正常に閉じる/閉じないの判定を行えるようにする requestAnimationFrame(() => { - const matchedSelectedItem = selectedItems.find( - (item) => item.label === selected.label && item.value === selected.value, + const matchedSelectedItem = selectedItems.find((item) => + areComboBoxItemsEqual(item, selected), ) if (matchedSelectedItem !== undefined) { if (matchedSelectedItem.deletable !== false) { @@ -468,7 +467,7 @@ const ActualMultiComboBox = ( className={selectedListStyle} > {selectedItems.map((selectedItem, i) => ( -
    • +
    • { expect(options[0].item).toEqual({ label: labelElement3, value: 'value3' }) }) - it('isItemSelectedが渡されていなくてoptionのインスタンスが違うとき、selectedにならないこと', () => { + it('isItemSelectedが渡されていなくてvalueが同じかつlabelのインスタンスが違うとき、selectedになること', () => { const newLabelElement1 = (
      label1 @@ -250,7 +250,7 @@ describe('useOptions', () => { expect(options.length).toBe(1) expect(options[0].item).toEqual({ label: labelElement1, value: 'value1' }) - expect(options[0].selected).toBeFalsy() + expect(options[0].selected).toBeTruthy() expect(options[0].isNew).toBeFalsy() }) }) diff --git a/packages/smarthr-ui/src/components/ComboBox/comboBoxHelper.ts b/packages/smarthr-ui/src/components/ComboBox/comboBoxHelper.ts index c4b8d1e527..2b92129c2e 100644 --- a/packages/smarthr-ui/src/components/ComboBox/comboBoxHelper.ts +++ b/packages/smarthr-ui/src/components/ComboBox/comboBoxHelper.ts @@ -1,3 +1,7 @@ +import innerText from 'react-innertext' + +import { ComboBoxItem } from './types' + export function convertMatchableString(original: string) { return ( original @@ -13,3 +17,7 @@ export function convertMatchableString(original: string) { .toLowerCase() ) } + +export function areComboBoxItemsEqual(a: ComboBoxItem, b: ComboBoxItem) { + return a.value === b.value && innerText(a.label) === innerText(b.label) +} diff --git a/packages/smarthr-ui/src/components/ComboBox/useOptions.ts b/packages/smarthr-ui/src/components/ComboBox/useOptions.ts index c0604749d1..71265c60f9 100644 --- a/packages/smarthr-ui/src/components/ComboBox/useOptions.ts +++ b/packages/smarthr-ui/src/components/ComboBox/useOptions.ts @@ -1,17 +1,13 @@ import { useCallback, useId, useMemo } from 'react' import innerText from 'react-innertext' -import { convertMatchableString } from './comboBoxHelper' +import { areComboBoxItemsEqual, convertMatchableString } from './comboBoxHelper' import { ComboBoxItem, ComboBoxOption } from './types' const defaultIsItemSelected = ( targetItem: ComboBoxItem, selectedItems: Array>, -) => - selectedItems.find( - (selectedItem) => - selectedItem.label === targetItem.label && selectedItem.value === targetItem.value, - ) !== undefined +) => selectedItems.some((item) => areComboBoxItemsEqual(item, targetItem)) export function useOptions({ items, @@ -45,7 +41,7 @@ export function useOptions({ if (Array.isArray(selected)) { return isItemSelected(item, selected) } else { - return selected !== null && selected.label === item.label + return selected !== null && areComboBoxItemsEqual(selected, item) } }, [isItemSelected, selected], From d9723a90ab4dc27083f0cd4d8efbf4ab9d41a65a Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Thu, 6 Feb 2025 07:26:05 +0900 Subject: [PATCH 17/22] =?UTF-8?q?chore:=20Dialog=E5=91=A8=E8=BE=BA?= =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=8D=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92=E6=95=B4?= =?UTF-8?q?=E7=90=86=E3=81=99=E3=82=8B=20(#5318)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/Dialog/DialogBody.tsx | 22 ++++-- .../components/Dialog/DialogContentInner.tsx | 69 +++++++++---------- .../src/components/Dialog/DialogHeader.tsx | 9 +-- .../src/components/Dialog/DialogTrigger.tsx | 1 + .../src/components/Dialog/DialogWrapper.tsx | 18 ++--- .../src/components/Dialog/ModelessDialog.tsx | 21 ++++-- .../smarthr-ui/src/hooks/useHandleEscape.ts | 31 ++++++--- 7 files changed, 101 insertions(+), 70 deletions(-) diff --git a/packages/smarthr-ui/src/components/Dialog/DialogBody.tsx b/packages/smarthr-ui/src/components/Dialog/DialogBody.tsx index d52ccdc68e..e7bf152042 100644 --- a/packages/smarthr-ui/src/components/Dialog/DialogBody.tsx +++ b/packages/smarthr-ui/src/components/Dialog/DialogBody.tsx @@ -1,4 +1,4 @@ -import React, { type PropsWithChildren } from 'react' +import React, { type PropsWithChildren, useMemo } from 'react' import { VariantProps, tv } from 'tailwind-variants' import type { Gap } from '../../types' @@ -81,13 +81,25 @@ const dialogBody = tv({ export const DialogBody: React.FC = ({ contentBgColor, - contentPadding = 1.5, + contentPadding, className, ...rest }) => { - const paddingBlock = contentPadding instanceof Object ? contentPadding.block : contentPadding - const paddingInline = contentPadding instanceof Object ? contentPadding.inline : contentPadding + const actualPaddings = useMemo(() => { + const initialized = contentPadding === undefined ? 1.5 : contentPadding + + return initialized instanceof Object ? initialized : { block: initialized, inline: initialized } + }, [contentPadding]) + const style = useMemo( + () => + dialogBody({ + contentBgColor, + paddingBlock: actualPaddings.block, + paddingInline: actualPaddings.inline, + className, + }), + [actualPaddings.block, actualPaddings.inline, contentBgColor, className], + ) - const style = dialogBody({ contentBgColor, paddingBlock, paddingInline, className }) return
      } diff --git a/packages/smarthr-ui/src/components/Dialog/DialogContentInner.tsx b/packages/smarthr-ui/src/components/Dialog/DialogContentInner.tsx index a668e6538e..bc78bcf259 100644 --- a/packages/smarthr-ui/src/components/Dialog/DialogContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dialog/DialogContentInner.tsx @@ -1,14 +1,6 @@ 'use client' -import React, { - ComponentProps, - FC, - PropsWithChildren, - RefObject, - useCallback, - useMemo, - useRef, -} from 'react' +import React, { ComponentProps, FC, PropsWithChildren, RefObject, useMemo, useRef } from 'react' import { tv } from 'tailwind-variants' import { useHandleEscape } from '../../hooks/useHandleEscape' @@ -68,9 +60,7 @@ const dialogContentInner = tv({ export const DialogContentInner: FC = ({ onClickOverlay, - onPressEscape = () => { - /* noop */ - }, + onPressEscape, isOpen, id, width, @@ -81,44 +71,39 @@ export const DialogContentInner: FC = ({ className, ...rest }) => { - const { layoutStyleProps, innerStyle, backgroundStyle } = useMemo(() => { + const { layoutStyle, innerStyle, backgroundStyle } = useMemo(() => { const { layout, inner, background } = dialogContentInner() - const actualWidth = typeof width === 'number' ? `${width}px` : width + return { - layoutStyleProps: { - className: layout(), - style: { - width: actualWidth ?? undefined, - }, - }, + layoutStyle: layout(), innerStyle: inner({ className }), backgroundStyle: background(), } - }, [className, width]) + }, [className]) + const styleAttr = useMemo(() => { + const actualWidth = typeof width === 'number' ? `${width}px` : width + + if (!actualWidth) { + return undefined + } + + return { + width: actualWidth, + } + }, [width]) const innerRef = useRef(null) + useHandleEscape( - useCallback(() => { - if (!isOpen) { - return - } - onPressEscape() - }, [isOpen, onPressEscape]), + useMemo(() => (onPressEscape && isOpen ? onPressEscape : undefined), [isOpen, onPressEscape]), ) - const handleClickOverlay = useCallback(() => { - if (isOpen && onClickOverlay) { - onClickOverlay() - } - }, [isOpen, onClickOverlay]) - useBodyScrollLock(isOpen) return ( -
      - {/* eslint-disable-next-line smarthr/a11y-delegate-element-has-role-presentation */} -
      +
      +
      = ({ ) } + +const Overlay = React.memo< + Pick & { className: string } +>(({ onClickOverlay, isOpen, className }) => { + const handleClickOverlay = useMemo( + () => (onClickOverlay && isOpen ? onClickOverlay : undefined), + [isOpen, onClickOverlay], + ) + + // eslint-disable-next-line smarthr/a11y-delegate-element-has-role-presentation + return
      +}) diff --git a/packages/smarthr-ui/src/components/Dialog/DialogHeader.tsx b/packages/smarthr-ui/src/components/Dialog/DialogHeader.tsx index 61fa9a5732..a6dac1155f 100644 --- a/packages/smarthr-ui/src/components/Dialog/DialogHeader.tsx +++ b/packages/smarthr-ui/src/components/Dialog/DialogHeader.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useMemo } from 'react' import { tv } from 'tailwind-variants' import { Heading, HeadingTagTypes } from '../Heading' @@ -25,8 +25,9 @@ const dialogHeader = tv({ ], }) -export const DialogHeader: React.FC = ({ title, subtitle, titleTag, titleId }) => { - const style = dialogHeader() +export const DialogHeader = React.memo(({ title, subtitle, titleTag, titleId }) => { + const style = useMemo(() => dialogHeader(), []) + return ( // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content @@ -42,4 +43,4 @@ export const DialogHeader: React.FC = ({ title, subtitle, titleTag, title ) -} +}) diff --git a/packages/smarthr-ui/src/components/Dialog/DialogTrigger.tsx b/packages/smarthr-ui/src/components/Dialog/DialogTrigger.tsx index 9ecfb728c7..a1c57f82d0 100644 --- a/packages/smarthr-ui/src/components/Dialog/DialogTrigger.tsx +++ b/packages/smarthr-ui/src/components/Dialog/DialogTrigger.tsx @@ -6,6 +6,7 @@ import { DialogContext } from './DialogWrapper' export const DialogTrigger: React.FC = (props) => { const { onClickTrigger } = useContext(DialogContext) + return ( // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events,smarthr/a11y-delegate-element-has-role-presentation
      diff --git a/packages/smarthr-ui/src/components/Dialog/DialogWrapper.tsx b/packages/smarthr-ui/src/components/Dialog/DialogWrapper.tsx index 7436374a7d..ddf497daf5 100644 --- a/packages/smarthr-ui/src/components/Dialog/DialogWrapper.tsx +++ b/packages/smarthr-ui/src/components/Dialog/DialogWrapper.tsx @@ -1,6 +1,6 @@ 'use client' -import React, { PropsWithChildren, createContext, useState } from 'react' +import React, { PropsWithChildren, createContext, useCallback, useState } from 'react' type DialogContextType = { onClickTrigger: () => void @@ -8,25 +8,25 @@ type DialogContextType = { active: boolean } +const noop = () => undefined export const DialogContext = createContext({ - onClickTrigger: () => { - /* noop */ - }, - onClickClose: () => { - /* noop */ - }, + onClickTrigger: noop, + onClickClose: noop, active: false, }) export const DialogWrapper: React.FC = (props) => { const [active, setActive] = useState(false) + const onClickTrigger = useCallback(() => setActive(true), []) + const onClickClose = useCallback(() => setActive(false), []) + return ( setActive(true), - onClickClose: () => setActive(false), + onClickTrigger, + onClickClose, active, }} /> diff --git a/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx b/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx index 17598023ef..6f5c8f6b38 100644 --- a/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx @@ -320,13 +320,22 @@ export const ModelessDialog: FC + onPressEscape + ? () => { + lastFocusElementRef.current?.focus() + onPressEscape() + } + : undefined, + [onPressEscape], + ) + useHandleEscape( - useCallback(() => { - if (isOpen && onPressEscape) { - lastFocusElementRef.current?.focus() - onPressEscape() - } - }, [isOpen, onPressEscape]), + useMemo( + () => (actualOnPressEscape && isOpen ? actualOnPressEscape : undefined), + [isOpen, actualOnPressEscape], + ), ) useEffect(() => { diff --git a/packages/smarthr-ui/src/hooks/useHandleEscape.ts b/packages/smarthr-ui/src/hooks/useHandleEscape.ts index 82da161f97..8802117844 100644 --- a/packages/smarthr-ui/src/hooks/useHandleEscape.ts +++ b/packages/smarthr-ui/src/hooks/useHandleEscape.ts @@ -1,18 +1,29 @@ -import { useCallback, useEffect } from 'react' +import { useEffect, useMemo } from 'react' -export const useHandleEscape = (cb: () => void) => { - const handleKeyPress = useCallback( - (e: KeyboardEvent) => { - // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key - // Esc is a IE/Edge specific value - if (e.key === 'Escape' || e.key === 'Esc') { - cb() - } - }, +const ESCAPE_KEY_REGEX = /^Esc(ape)?$/ + +export const useHandleEscape = (cb?: () => void) => { + const handleKeyPress = useMemo( + () => + cb + ? (e: KeyboardEvent) => { + // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key + // Esc is a IE/Edge specific value + if (ESCAPE_KEY_REGEX.test(e.key)) { + cb() + } + } + : null, [cb], ) + useEffect(() => { + if (!handleKeyPress) { + return + } + document.addEventListener('keydown', handleKeyPress) + return () => document.removeEventListener('keydown', handleKeyPress) }, [handleKeyPress]) } From a9a14b725ef82d86194e3252b3b84d1612c599a3 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Thu, 6 Feb 2025 07:29:18 +0900 Subject: [PATCH 18/22] =?UTF-8?q?chore:=20ActionDialog=E3=81=AE=E5=86=85?= =?UTF-8?q?=E9=83=A8=E5=87=A6=E7=90=86=E3=82=92=E6=95=B4=E7=90=86=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#5324)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dialog/ActionDialog/ActionDialog.tsx | 12 +- .../ActionDialog/ActionDialogContent.tsx | 12 +- .../ActionDialog/ActionDialogContentInner.tsx | 178 ++++++++++++++---- .../ActionDialogWithTrigger.tsx | 33 ++-- 4 files changed, 166 insertions(+), 69 deletions(-) diff --git a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialog.tsx b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialog.tsx index b39960ab13..d1f420fb57 100644 --- a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialog.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialog.tsx @@ -24,7 +24,7 @@ export const ActionDialog: React.FC = ({ onClickClose, onPressEscape = onClickClose, responseMessage, - actionDisabled = false, + actionDisabled, closeDisabled, subActionArea, className, @@ -37,17 +37,15 @@ export const ActionDialog: React.FC = ({ const titleId = useId() const handleClickClose = useCallback(() => { - if (!props.isOpen) { - return + if (props.isOpen) { + onClickClose() } - onClickClose() }, [onClickClose, props.isOpen]) const handleClickAction = useCallback(() => { - if (!props.isOpen) { - return + if (props.isOpen) { + onClickAction(onClickClose) } - onClickAction(onClickClose) }, [onClickAction, onClickClose, props.isOpen]) return createPortal( diff --git a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContent.tsx b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContent.tsx index 2202f21684..b79ee4eef4 100644 --- a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContent.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContent.tsx @@ -20,7 +20,7 @@ export const ActionDialogContent: React.FC = ({ actionText, actionTheme, onClickAction, - actionDisabled = false, + actionDisabled, portalParent, className = '', decorators, @@ -30,17 +30,15 @@ export const ActionDialogContent: React.FC = ({ const { createPortal } = useDialogPortal(portalParent) const handleClickClose = useCallback(() => { - if (!active) { - return + if (active) { + onClickClose() } - onClickClose() }, [active, onClickClose]) const handleClickAction = useCallback(() => { - if (!active) { - return + if (active) { + onClickAction(onClickClose) } - onClickAction(onClickClose) }, [active, onClickAction, onClickClose]) const titleId = useId() diff --git a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx index 4d83d9a9bf..414bec0910 100644 --- a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx @@ -1,10 +1,11 @@ 'use client' -import React, { type FC, type PropsWithChildren, type ReactNode, useCallback } from 'react' +import React, { type FC, type PropsWithChildren, type ReactNode, useCallback, useMemo } from 'react' import { Button } from '../../Button' import { Cluster, Stack } from '../../Layout' import { ResponseMessage } from '../../ResponseMessage' +import { Section } from '../../SectioningContent' import { DialogBody, type Props as DialogBodyProps } from '../DialogBody' import { DialogHeader, type Props as DialogHeaderProps } from '../DialogHeader' import { dialogContentInner } from '../dialogInnerStyle' @@ -40,6 +41,8 @@ export type ActionDialogContentInnerProps = BaseProps & { } const CLOSE_BUTTON_LABEL = 'キャンセル' +const ACTION_AREA_CLUSTER_GAP = { row: 0.5, column: 1 } as const + export const ActionDialogContentInner: FC = ({ children, title, @@ -49,59 +52,166 @@ export const ActionDialogContentInner: FC = ({ contentBgColor, contentPadding, actionText, - actionTheme = 'primary', + actionTheme, onClickAction, onClickClose, responseMessage, - actionDisabled = false, + actionDisabled, closeDisabled, subActionArea, decorators, }) => { - const handleClickAction = useCallback(() => { - onClickAction(onClickClose) - }, [onClickAction, onClickClose]) - const isRequestProcessing = responseMessage && responseMessage.status === 'processing' + const calcedResponseStatus = useMemo(() => { + if (!responseMessage) { + return { + isProcessing: false, + visibleMessage: false, + } + } + + if (responseMessage.status === 'processing') { + return { + isProcessing: true, + visibleMessage: false, + } + } - const { wrapper, actionArea, buttonArea, message } = dialogContentInner() + return { + isProcessing: false, + visibleMessage: true, + // HINT: statusがprocessingではない === success or errorであることが確定する + // success or error の場合、text属性も必ず存在する + status: responseMessage.status as 'success' | 'error', + message: (responseMessage as { text: string }).text, + } + }, [responseMessage]) + + const styles = useMemo(() => { + const { wrapper, actionArea, buttonArea, message } = dialogContentInner() + + return { + wrapper: wrapper(), + actionArea: actionArea(), + buttonArea: buttonArea(), + message: message(), + } + }, []) return ( - // eslint-disable-next-line smarthr/best-practice-for-layouts, smarthr/a11y-heading-in-sectioning-content - + // eslint-disable-next-line smarthr/a11y-heading-in-sectioning-content +
      {children} - + {subActionArea} - - - - + - {(responseMessage?.status === 'success' || responseMessage?.status === 'error') && ( -
      - - {responseMessage.text} + {calcedResponseStatus.visibleMessage && ( +
      + + {calcedResponseStatus.message}
      )} - +
      ) } + +const ActionAreaCluster = React.memo< + Pick< + ActionDialogContentInnerProps, + | 'onClickClose' + | 'onClickAction' + | 'closeDisabled' + | 'actionDisabled' + | 'actionTheme' + | 'decorators' + | 'actionText' + > & { loading: boolean; className: string } +>( + ({ + onClickClose, + onClickAction, + closeDisabled, + actionDisabled, + loading, + actionTheme, + decorators, + actionText, + className, + }) => { + const handleClickAction = useCallback(() => { + onClickAction(onClickClose) + }, [onClickAction, onClickClose]) + + return ( + + + + {actionText} + + + ) + }, +) + +const ActionButton = React.memo< + PropsWithChildren<{ + variant: ActionDialogContentInnerProps['actionTheme'] + disabled: ActionDialogContentInnerProps['actionDisabled'] + loading: boolean + onClick: () => void + }> +>(({ variant = 'primary', disabled, loading, onClick, children }) => ( + +)) + +const CloseButton = React.memo< + Pick & { + onClick: ActionDialogContentInnerProps['onClickClose'] + disabled: boolean + } +>(({ onClick, disabled, decorators }) => { + const children = useMemo( + () => decorators?.closeButtonLabel?.(CLOSE_BUTTON_LABEL) || CLOSE_BUTTON_LABEL, + [decorators], + ) + + return ( + + ) +}) diff --git a/packages/smarthr-ui/src/components/Dialog/ActionDialogWithTrigger/ActionDialogWithTrigger.tsx b/packages/smarthr-ui/src/components/Dialog/ActionDialogWithTrigger/ActionDialogWithTrigger.tsx index ee360419fe..1f7aa68bb3 100644 --- a/packages/smarthr-ui/src/components/Dialog/ActionDialogWithTrigger/ActionDialogWithTrigger.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ActionDialogWithTrigger/ActionDialogWithTrigger.tsx @@ -21,29 +21,20 @@ export const ActionDialogWithTrigger: React.FC< const open = useCallback(() => setIsOpen(true), []) const close = useCallback(() => setIsOpen(false), []) - const onClickOpen = useCallback(() => { - if (onClickTrigger) { - return onClickTrigger(open) - } - - open() - }, [onClickTrigger, open]) - - const actualOnClickClose = useCallback(() => { - if (onClickClose) { - return onClickClose(close) - } - - close() - }, [onClickClose, close]) + const onClickOpen = useMemo( + () => (onClickTrigger ? () => onClickTrigger(open) : open), + [onClickTrigger, open], + ) - const actualOnPressEscape = useCallback(() => { - if (onPressEscape) { - return onPressEscape(close) - } + const actualOnClickClose = useMemo( + () => (onClickClose ? () => onClickClose(close) : close), + [onClickClose, close], + ) - close() - }, [onPressEscape, close]) + const actualOnPressEscape = useMemo( + () => (onPressEscape ? () => onPressEscape(close) : close), + [onPressEscape, close], + ) const actualTrigger = useMemo( () => From 6bd8c22314fc4d7aa57b4743651890a8564baac1 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Thu, 6 Feb 2025 08:31:05 +0900 Subject: [PATCH 19/22] =?UTF-8?q?chore:=20DropdownMenuButton=20=E3=81=AE?= =?UTF-8?q?=E5=86=85=E9=83=A8=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92?= =?UTF-8?q?=E6=95=B4=E7=90=86=E3=81=99=E3=82=8B=20(#5314)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DropdownMenuButton/DropdownMenuButton.tsx | 109 +++++++++++----- .../DropdownMenuButton/DropdownMenuGroup.tsx | 33 +++-- .../useKeyboardNavigation.ts | 123 ++++++++---------- .../components/Dropdown/DropdownTrigger.tsx | 6 +- 4 files changed, 156 insertions(+), 115 deletions(-) diff --git a/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuButton.tsx b/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuButton.tsx index bd37f752e2..7d46968068 100644 --- a/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuButton.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuButton.tsx @@ -70,46 +70,37 @@ export const DropdownMenuButton: FC = ({ label, children, triggerSize, - onlyIconTrigger = false, - triggerIcon: TriggerIcon, + onlyIconTrigger, + triggerIcon, className, - ...props + ...rest }) => { const containerRef = React.useRef(null) - const triggerLabel = useMemo(() => { - const Icon = TriggerIcon || FaEllipsisIcon - return onlyIconTrigger ? ( - - ) : ( - label - ) - }, [label, TriggerIcon, onlyIconTrigger]) - const triggerSuffix = useMemo( - () => (onlyIconTrigger ? undefined : ), - [onlyIconTrigger], - ) - useKeyboardNavigation(containerRef) + const styles = useMemo( + () => ({ + triggerWrapper: triggerWrapper({ className }), + triggerButton: triggerButton(), + actionList: actionList(), + }), + [className], + ) + return ( - - - + - + {renderButtonList(children)} @@ -117,15 +108,61 @@ export const DropdownMenuButton: FC = ({ ) } +const MemoizedTriggerButton = React.memo< + Pick & + ElementProps & { wrapperStyle: string; buttonStyle: string } +>(({ onlyIconTrigger, triggerSize, label, triggerIcon, wrapperStyle, buttonStyle, ...rest }) => { + const tooltip = useMemo( + () => ({ show: onlyIconTrigger, message: label }), + [label, onlyIconTrigger], + ) + + return ( + + + + ) +}) + +const TriggerLabelText = React.memo>( + ({ label, onlyIconTrigger, triggerIcon }) => { + if (!onlyIconTrigger) { + return label + } + + const Icon = triggerIcon || FaEllipsisIcon + + return + }, +) + +const ButtonSuffixIcon = React.memo>( + ({ onlyIconTrigger }) => !onlyIconTrigger && , +) + export const renderButtonList = (children: Actions) => React.Children.map(children, (item): ReactNode => { - if (!(item && React.isValidElement(item))) return null - if (item.type === React.Fragment) { - return renderButtonList(item.props.children) + if (!item || !React.isValidElement(item)) { + return null } - if (item.type === DropdownMenuGroup) { - return item + switch (item.type) { + case React.Fragment: + return renderButtonList(item.props.children) + case DropdownMenuGroup: + return item } const actualElement = React.cloneElement(item as ReactElement, { diff --git a/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.tsx b/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.tsx index 4fec4fe0c9..01d8255e3c 100644 --- a/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/DropdownMenuGroup.tsx @@ -1,4 +1,4 @@ -import React, { ComponentProps, type PropsWithChildren, type ReactNode } from 'react' +import React, { ComponentProps, type PropsWithChildren, type ReactNode, useMemo } from 'react' import { tv } from 'tailwind-variants' import { Text } from '../../Text' @@ -36,13 +36,28 @@ export const DropdownMenuGroup: React.FC = ({ name, children, className, -}) => ( -
    • - {name && ( - - {name} +}) => { + const styles = useMemo( + () => ({ + group: group({ className }), + groupName: groupName(), + }), + [className], + ) + + return ( +
    • + {name} +
        {renderButtonList(children)}
      +
    • + ) +} + +const NameText = React.memo>( + ({ children, className }) => + children && ( + + {children} - )} -
        {renderButtonList(children)}
      -
    • + ), ) diff --git a/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/useKeyboardNavigation.ts b/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/useKeyboardNavigation.ts index d5cb97f2da..b8746bad30 100644 --- a/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/useKeyboardNavigation.ts +++ b/packages/smarthr-ui/src/components/Dropdown/DropdownMenuButton/useKeyboardNavigation.ts @@ -4,35 +4,63 @@ const matchesDisabledState = (element: Element): boolean => element.matches(':disabled') || element.getAttribute('aria-disabled') === 'true' const isElementDisabled = (element: Element): boolean => { - if (matchesDisabledState(element)) return true - return Array.from(element.querySelectorAll('*')).some((child) => matchesDisabledState(child)) + if (matchesDisabledState(element)) { + return true + } + + return Array.from(element.querySelectorAll('*')).some(matchesDisabledState) } -const moveFocus = ( - direction: number, - enabledItems: Element[], - focusedIndex: number, - hoveredItem: Element | null, -) => { - const calculateNextIndex = () => { - if (focusedIndex > -1) { - // フォーカスされているアイテムが存在する場合 - return (focusedIndex + direction + enabledItems.length) % enabledItems.length - } +const KEY_UP_REGEX = /^(Arrow)?(Up|Left)$/ +const KEY_DOWN_REGEX = /^(Arrow)?(Down|Right)$/ + +const moveFocus = (element: Element, direction: 1 | -1) => { + const { hoveredItem, tabbableItems, focusedIndex } = Array.from( + element.querySelectorAll('li > *'), + ).reduce( + ( + acc: { + hoveredItem: Element | null + tabbableItems: Element[] + focusedIndex: number + }, + item, + ) => { + if (item.matches(':hover') && acc.hoveredItem === null) { + acc.hoveredItem = item + } - if (hoveredItem) { - // ホバー状態のアイテムが存在する場合 - return ( - (enabledItems.indexOf(hoveredItem) + direction + enabledItems.length) % enabledItems.length - ) - } + if (!isElementDisabled(item)) { + acc.tabbableItems.push(item) + + if (document.activeElement === item) { + acc.focusedIndex = acc.tabbableItems.length - 1 + } + } - // どちらもない場合は最初のアイテムからスタート - return direction > 0 ? 0 : enabledItems.length - 1 + return acc + }, + { + hoveredItem: null, + tabbableItems: [], + focusedIndex: -1, + }, + ) + + let nextIndex = 0 + + if (focusedIndex > -1) { + // フォーカスされているアイテムが存在する場合 + nextIndex = (focusedIndex + direction + tabbableItems.length) % tabbableItems.length + } else if (hoveredItem) { + // ホバー状態のアイテムが存在する場合 + nextIndex = + (tabbableItems.indexOf(hoveredItem) + direction + tabbableItems.length) % tabbableItems.length + } else if (direction === -1) { + nextIndex = tabbableItems.length - 1 } - const nextIndex = calculateNextIndex() - const nextItem = enabledItems[nextIndex] + const nextItem = tabbableItems[nextIndex] if (nextItem instanceof HTMLElement) { nextItem.focus() @@ -46,50 +74,10 @@ const useKeyboardNavigation = (containerRef: React.RefObject) => { return } - const allItems = Array.from(containerRef.current.querySelectorAll('li > *')) - const { - hoveredItem, - tabbableItems: enabledItems, - focusedIndex, - } = allItems.reduce( - ( - acc: { - hoveredItem: Element | null - tabbableItems: Element[] - focusedIndex: number - }, - item, - ) => { - if (item.matches(':hover') && acc.hoveredItem === null) { - acc.hoveredItem = item - } - - const isDisabled = isElementDisabled(item) - - if (isDisabled) { - return acc - } - - acc.tabbableItems.push(item) - if (document.activeElement === item) { - acc.focusedIndex = acc.tabbableItems.length - 1 - } - - return acc - }, - { - hoveredItem: null, - tabbableItems: [], - focusedIndex: -1, - }, - ) - - if (['Up', 'ArrowUp', 'Left', 'ArrowLeft'].includes(e.key)) { - moveFocus(-1, enabledItems, focusedIndex, hoveredItem) - } - - if (['Down', 'ArrowDown', 'Right', 'ArrowRight'].includes(e.key)) { - moveFocus(1, enabledItems, focusedIndex, hoveredItem) + if (KEY_UP_REGEX.test(e.key)) { + moveFocus(containerRef.current, -1) + } else if (KEY_DOWN_REGEX.test(e.key)) { + moveFocus(containerRef.current, 1) } }, [containerRef], @@ -97,6 +85,7 @@ const useKeyboardNavigation = (containerRef: React.RefObject) => { useEffect(() => { document.addEventListener('keydown', handleKeyDown) + return () => { document.removeEventListener('keydown', handleKeyDown) } diff --git a/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx b/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx index 8e726e8330..24eea4615f 100644 --- a/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/DropdownTrigger.tsx @@ -20,7 +20,7 @@ import { Tooltip } from '../Tooltip' import { DropdownContext } from './Dropdown' type ConditionalWrapperProps = { - shouldWrapContent: boolean + shouldWrapContent?: boolean wrapper: FC } @@ -34,7 +34,7 @@ const ConditionalWrapper: FC> = ({ }) => (shouldWrapContent ? wrapper({ children }) : children) type Props = PropsWithChildren> & { - tooltip?: { message: ReactNode; show: boolean } + tooltip?: { message: ReactNode; show?: boolean } } const wrapper = tv({ @@ -64,7 +64,7 @@ export const DropdownTrigger: FC = ({ children, className, tooltip }) => return (
      ( Date: Thu, 6 Feb 2025 09:51:03 +0900 Subject: [PATCH 20/22] chore: update pnpm to v10 (#5362) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a3c28bf79a..1d116f319e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "commitmsg": "commitlint -e $GIT_PARAMS", "prepare": "husky" }, - "packageManager": "pnpm@9.15.5", + "packageManager": "pnpm@10.2.0", "pnpm": { "overrides": { "@babel/helper-compilation-targets": "^7.26.5", From d51423503713079b9b61b98e903092d5fdcdd699 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Thu, 6 Feb 2025 10:02:32 +0900 Subject: [PATCH 21/22] =?UTF-8?q?chore:=20DatePicker=E3=81=AE=E5=86=85?= =?UTF-8?q?=E9=83=A8=E5=87=A6=E7=90=86=E3=82=92=E6=95=B4=E7=90=86=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#5329)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/DatePicker/DatePicker.tsx | 295 ++++++++++-------- .../src/components/DatePicker/Portal.tsx | 27 +- .../components/DatePicker/datePickerHelper.ts | 18 +- .../components/DatePicker/useGlobalKeyDown.ts | 1 + 4 files changed, 186 insertions(+), 155 deletions(-) diff --git a/packages/smarthr-ui/src/components/DatePicker/DatePicker.tsx b/packages/smarthr-ui/src/components/DatePicker/DatePicker.tsx index e9e85d1dab..bea59cbffa 100644 --- a/packages/smarthr-ui/src/components/DatePicker/DatePicker.tsx +++ b/packages/smarthr-ui/src/components/DatePicker/DatePicker.tsx @@ -76,6 +76,12 @@ const datePicker = tv({ }, }) +const DEFAULT_DATE_TO_STRING_FORMAT = 'YYYY/MM/DD' +const DEFAULT_DATE_TO_STRING = (d: Date | null) => + d ? dayjs(d).format(DEFAULT_DATE_TO_STRING_FORMAT) : '' +const RETURN_NULL = () => null +const ESCAPE_KEY_REGEX = /^Esc(ape)?$/ + /** @deprecated DatePicker は非推奨です。Input[type=date] を使ってください。 */ export const DatePicker = forwardRef( ( @@ -97,56 +103,34 @@ export const DatePicker = forwardRef( }, ref, ) => { - const { - containerStyleProps, - inputSuffixLayoutStyle, - inputSuffixWrapperStyle, - inputSuffixTextStyle, - } = useMemo(() => { + const containerStyleAttr = useMemo( + () => ({ + width: typeof width === 'number' ? `${width}px` : width, + }), + [width], + ) + const styles = useMemo(() => { const { container, inputSuffixLayout, inputSuffixWrapper, inputSuffixText } = datePicker() + return { - containerStyleProps: { - className: container({ className }), - style: { - width: typeof width === 'number' ? `${width}px` : width, - }, - }, - inputSuffixLayoutStyle: inputSuffixLayout(), - inputSuffixWrapperStyle: inputSuffixWrapper(), - inputSuffixTextStyle: inputSuffixText(), + container: container({ className }), + inputSuffixLayout: inputSuffixLayout(), + inputSuffixWrapper: inputSuffixWrapper(), + inputSuffixText: inputSuffixText(), } - }, [className, width]) + }, [className]) - const stringToDate = useCallback( - (str?: string | null) => { - if (!str) { - return null - } - return parseInput ? parseInput(str) : parseJpnDateString(str) - }, + const stringToDate = useMemo( + () => + parseInput + ? (str?: string | null) => (str ? parseInput(str) : null) + : (str?: string | null) => (str ? parseJpnDateString(str) : null), [parseInput], ) - const dateToString = useCallback( - (d: Date | null) => { - if (formatDate) { - return formatDate(d) - } - if (!d) { - return '' - } - return dayjs(d).format('YYYY/MM/DD') - }, - [formatDate], - ) - - const dateToAlternativeFormat = useCallback( - (d: Date | null) => { - if (!d || !showAlternative) { - return null - } - return showAlternative(d) - }, + const dateToString = useMemo(() => formatDate || DEFAULT_DATE_TO_STRING, [formatDate]) + const dateToAlternativeFormat = useMemo( + () => (showAlternative ? (d: Date | null) => (d ? showAlternative(d) : null) : RETURN_NULL), [showAlternative], ) @@ -165,7 +149,7 @@ export const DatePicker = forwardRef( () => inputRef.current, ) - const updateDate = useCallback( + const baseUpdateDate = useCallback( (newDate: Date | null) => { if ( !inputRef.current || @@ -177,37 +161,52 @@ export const DatePicker = forwardRef( } const isValid = !newDate || dayjs(newDate).isValid() - const nextDate = isValid ? newDate : null const errors: string[] = [] if (!isValid) { errors.push('INVALID_DATE') } - inputRef.current.value = dateToString(nextDate) + const nextDate = isValid ? newDate : null + const currentValue = dateToString(nextDate) + + inputRef.current.value = currentValue setAlternativeFormat(dateToAlternativeFormat(nextDate)) setSelectedDate(nextDate) - if (onChangeDate) onChangeDate(nextDate, inputRef.current.value, { errors }) + + return [nextDate, currentValue, errors] as [Date | null, string, string[]] }, - [selectedDate, dateToString, dateToAlternativeFormat, onChangeDate], + [selectedDate, dateToString, dateToAlternativeFormat], ) + const updateDate = useMemo( + () => + onChangeDate + ? (newDate: Date | null) => { + const result = baseUpdateDate(newDate) - const switchCalendarVisibility = useCallback((isVisible: boolean) => { - if (!isVisible) { - setIsCalendarShown(false) - return - } - if (!inputWrapperRef.current) { - return + if (result) { + const [nextDate, currentValue, errors] = result + + onChangeDate(nextDate, currentValue, { errors }) + } + } + : baseUpdateDate, + [onChangeDate, baseUpdateDate], + ) + + const closeCalendar = useCallback(() => setIsCalendarShown(false), []) + const openCalendar = useCallback(() => { + if (inputWrapperRef.current) { + setIsCalendarShown(true) + setInputRect(inputWrapperRef.current.getBoundingClientRect()) } - setIsCalendarShown(true) - setInputRect(inputWrapperRef.current.getBoundingClientRect()) }, []) useEffect(() => { if (value === undefined || !inputRef.current) { return } + /** * Do not format the given value in the following cases * - while input element is focused. @@ -215,102 +214,140 @@ export const DatePicker = forwardRef( */ if (!isInputFocused) { const newDate = stringToDate(value) + if (newDate && dayjs(newDate).isValid()) { inputRef.current.value = dateToString(newDate) setAlternativeFormat(dateToAlternativeFormat(newDate)) setSelectedDate(newDate) + return } + setSelectedDate(null) } + inputRef.current.value = value || '' }, [value, isInputFocused, dateToString, dateToAlternativeFormat, stringToDate]) - useOuterClick( - [inputWrapperRef, calendarPortalRef], - useCallback(() => { - switchCalendarVisibility(false) - }, [switchCalendarVisibility]), - ) + useOuterClick([inputWrapperRef, calendarPortalRef], closeCalendar) const handleKeyDown = useCallback( (e: KeyboardEvent) => { - if (e.key !== 'Tab' || !inputRef.current || !calendarPortalRef.current) { + if (!inputRef.current || !calendarPortalRef.current || e.key !== 'Tab') { return } + const calendarButtons = calendarPortalRef.current.querySelectorAll('button') + if (calendarButtons.length === 0) { return } + const firstCalendarButton = calendarButtons[0] - const lastCalendarButton = calendarButtons[calendarButtons.length - 1] + if (isInputFocused) { if (e.shiftKey) { // move focus from Input to previous elements of DatePicker - switchCalendarVisibility(false) + closeCalendar() + return } + // move focus from Input to Calendar e.preventDefault() firstCalendarButton.focus() + return } - const currentFocused = Array.from(calendarButtons).find((button) => button === e.target) - if (e.shiftKey && currentFocused === firstCalendarButton) { - // move focus from Calendar to Input - inputRef.current.focus() - e.preventDefault() - } else if (!e.shiftKey && currentFocused === lastCalendarButton) { + + const calendarButtonAry = Array.from(calendarButtons) + const currentFocused = calendarButtonAry.find((button) => button === e.target) + + if (e.shiftKey) { + if (currentFocused === firstCalendarButton) { + // move focus from Calendar to Input + inputRef.current.focus() + e.preventDefault() + } + } else if (currentFocused === calendarButtonAry.at(-1)) { // move focus from Calendar to next elements of DatePicker inputRef.current.focus() - switchCalendarVisibility(false) + closeCalendar() } }, - [isInputFocused, switchCalendarVisibility], + [isInputFocused, closeCalendar], ) - const handleBlur = useCallback>( + + const baseHandleBlur = useCallback>( (e) => { - const { - target: { value: inputString }, - } = e setIsInputFocused(false) - if (inputString === '') { - updateDate(null) - } else { - const newDate = stringToDate(inputString) - updateDate(newDate) - } - if (onBlur) onBlur(e) + updateDate(e.target.value ? stringToDate(e.target.value) : null) }, - [onBlur, stringToDate, updateDate], + [stringToDate, updateDate], ) + const handleBlur = useMemo>( + () => + onBlur + ? (e) => { + baseHandleBlur(e) + onBlur(e) + } + : baseHandleBlur, + [onBlur, baseHandleBlur], + ) + useGlobalKeyDown(handleKeyDown) const caretIconColor = useMemo(() => { if (isInputFocused || isCalendarShown) return textColor.black if (disabled) return textColor.disabled + return textColor.grey }, [isInputFocused, isCalendarShown, disabled]) + const onDelegateKeyDown = useCallback( + (e: React.KeyboardEvent) => { + if (ESCAPE_KEY_REGEX.test(e.key)) { + e.stopPropagation() + // delay hiding calendar because calendar will be displayed when input is focused + requestAnimationFrame(closeCalendar) + + if (inputRef.current) inputRef.current.focus() + } + }, + [closeCalendar], + ) + const onKeyPressInput = useCallback( + (e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + ;(isCalendarShown ? openCalendar : closeCalendar)() + updateDate(stringToDate(e.currentTarget.value)) + } + }, + [isCalendarShown, updateDate, closeCalendar, openCalendar, stringToDate], + ) + const onFocusInput = useCallback(() => { + setIsInputFocused(true) + openCalendar() + }, [openCalendar]) + const onSelectDateCalendar = useCallback( + (_: any, selected: Date | null) => { + updateDate(selected) + // delay hiding calendar because calendar will be displayed when input is focused + requestAnimationFrame(closeCalendar) + + if (inputRef.current) inputRef.current.focus() + }, + [updateDate, closeCalendar], + ) + return (
      { - if (!disabled && !isCalendarShown) { - switchCalendarVisibility(true) - } - }} - onKeyDown={(e) => { - if ((e.key === 'Escape' || e.key === 'Esc') && isCalendarShown) { - e.stopPropagation() - requestAnimationFrame(() => { - // delay hiding calendar because calendar will be displayed when input is focused - switchCalendarVisibility(false) - }) - if (inputRef.current) inputRef.current.focus() - } - }} + onClick={!isCalendarShown && !disabled ? openCalendar : undefined} + onKeyDown={isCalendarShown ? onDelegateKeyDown : undefined} role="presentation" + className={styles.container} + style={containerStyleAttr} >
      ( data-smarthr-ui-input="true" width="100%" name={name} - onChange={() => { - if (isCalendarShown) { - switchCalendarVisibility(false) - } - }} - onKeyPress={({ key, currentTarget: { value: inputString } }) => { - if (key === 'Enter') { - switchCalendarVisibility(!isCalendarShown) - const newDate = stringToDate(inputString) - updateDate(newDate) - } - }} - onFocus={() => { - setIsInputFocused(true) - switchCalendarVisibility(true) - }} + onChange={isCalendarShown ? closeCalendar : undefined} + onKeyPress={onKeyPressInput} + onFocus={onFocusInput} onBlur={handleBlur} suffix={ - - - {showAlternative && ( - {alternativeFormat} - )} - - - + } disabled={disabled} error={error} @@ -361,14 +382,7 @@ export const DatePicker = forwardRef( value={selectedDate || undefined} from={from} to={to} - onSelectDate={(_, selected) => { - updateDate(selected) - requestAnimationFrame(() => { - // delay hiding calendar because calendar will be displayed when input is focused - switchCalendarVisibility(false) - }) - if (inputRef.current) inputRef.current.focus() - }} + onSelectDate={onSelectDateCalendar} /> )} @@ -376,3 +390,16 @@ export const DatePicker = forwardRef( ) }, ) + +const InputSuffixIcon = React.memo<{ + styles: { inputSuffixLayout: string; inputSuffixWrapper: string; inputSuffixText: string } + alternativeFormat: null | ReactNode + caretIconColor: React.ComponentProps['color'] +}>(({ styles, alternativeFormat, caretIconColor }) => ( + + + {alternativeFormat && {alternativeFormat}} + + + +)) diff --git a/packages/smarthr-ui/src/components/DatePicker/Portal.tsx b/packages/smarthr-ui/src/components/DatePicker/Portal.tsx index 049c4da2f7..41ffb3037d 100644 --- a/packages/smarthr-ui/src/components/DatePicker/Portal.tsx +++ b/packages/smarthr-ui/src/components/DatePicker/Portal.tsx @@ -29,25 +29,24 @@ export const Portal = forwardRef(({ inputRect, ...props } left: 0, }) const containerRef = useRef(null) + useImperativeHandle(ref, () => containerRef.current) useEnhancedEffect(() => { - if (!containerRef.current) { - return + if (containerRef.current) { + setPosition(getPortalPosition(inputRect, containerRef.current.offsetHeight)) } - setPosition(getPortalPosition(inputRect, containerRef.current.offsetHeight)) }, [inputRect, isPortalRootMounted]) - const containerStyleProps = useMemo(() => { - const container = portal() - return { - className: container, - style: { - top: `${position.top}px`, - left: `${position.left}px`, - }, - } - }, [position.left, position.top]) + const style = useMemo(() => portal(), []) + + const styleAttr = useMemo( + () => ({ + top: `${position.top}px`, + left: `${position.left}px`, + }), + [position.left, position.top], + ) - return createPortal(
      ) + return createPortal(
      ) }) diff --git a/packages/smarthr-ui/src/components/DatePicker/datePickerHelper.ts b/packages/smarthr-ui/src/components/DatePicker/datePickerHelper.ts index 149a93e52c..13b1b03b57 100644 --- a/packages/smarthr-ui/src/components/DatePicker/datePickerHelper.ts +++ b/packages/smarthr-ui/src/components/DatePicker/datePickerHelper.ts @@ -7,24 +7,28 @@ export function parseJpnDateString(dateString: string): Date { return isValid ? result : dayjs(formatted).toDate() } +const PORTAL_POSITION_MARGIN = 4 + export function getPortalPosition(inputRect: DOMRect, contentHeihgt: number) { - const margin = 4 const { innerHeight, pageYOffset } = window - const left = pageXOffset + inputRect.left - const hasNoSpaceOnBottomSide = inputRect.bottom + contentHeihgt > innerHeight - const isTopSideSpaceBiggerThanBottomSide = inputRect.top > innerHeight - inputRect.bottom - if (hasNoSpaceOnBottomSide && isTopSideSpaceBiggerThanBottomSide) { + if ( + // has no space on bottom side + inputRect.bottom + contentHeihgt > innerHeight && + // top side space bigger than bottom side + inputRect.top > innerHeight - inputRect.bottom + ) { // display on top side return { - top: pageYOffset + inputRect.top - contentHeihgt + margin, + top: pageYOffset + inputRect.top - contentHeihgt + PORTAL_POSITION_MARGIN, left, } } + // display on bottom side return { - top: pageYOffset + inputRect.bottom - margin, + top: pageYOffset + inputRect.bottom - PORTAL_POSITION_MARGIN, left, } } diff --git a/packages/smarthr-ui/src/components/DatePicker/useGlobalKeyDown.ts b/packages/smarthr-ui/src/components/DatePicker/useGlobalKeyDown.ts index 2e39bbc9c9..34905875c2 100644 --- a/packages/smarthr-ui/src/components/DatePicker/useGlobalKeyDown.ts +++ b/packages/smarthr-ui/src/components/DatePicker/useGlobalKeyDown.ts @@ -3,6 +3,7 @@ import { useEffect } from 'react' export function useGlobalKeyDown(callback: (e: KeyboardEvent) => void) { useEffect(() => { window.addEventListener('keydown', callback) + return () => { window.removeEventListener('keydown', callback) } From f2f34f60439a1e530b98fdb34e1a6285873f36f5 Mon Sep 17 00:00:00 2001 From: Mizoue Atsushi Date: Thu, 6 Feb 2025 11:47:59 +0900 Subject: [PATCH 22/22] =?UTF-8?q?chore:=20decorators=E3=81=AB=E5=AF=BE?= =?UTF-8?q?=E3=81=99=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92=E5=85=B1=E9=80=9A?= =?UTF-8?q?=E5=8C=96=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=80=81?= =?UTF-8?q?useDecorators=E3=82=92=E5=AE=9A=E7=BE=A9=E3=81=99=E3=82=8B=20(#?= =?UTF-8?q?5326)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/Browser/Browser.tsx | 2 +- .../src/components/Button/Button.tsx | 2 +- .../ComboBox/MultiComboBox/MultiComboBox.tsx | 2 +- .../SingleComboBox/SingleComboBox.tsx | 2 +- .../src/components/ComboBox/useListBox.tsx | 3 +- .../ActionDialog/ActionDialogContentInner.tsx | 3 +- .../FormDialog/FormDialogContentInner.tsx | 3 +- .../MessageDialogContentInner.tsx | 3 +- .../src/components/Dialog/ModelessDialog.tsx | 3 +- .../src/components/DropZone/DropZone.tsx | 3 +- .../FilterDropdown/FilterDropdown.tsx | 3 +- .../Dropdown/SortDropdown/SortDropdown.tsx | 3 +- .../Header/AppLauncher/AppLauncher.tsx | 3 +- .../LanguageSwitcher/LanguageSwitcher.tsx | 3 +- .../InformationPanel/InformationPanel.tsx | 3 +- .../Input/SearchInput/SearchInput.tsx | 3 +- .../src/components/InputFile/InputFile.tsx | 3 +- .../components/PageCounter/PageCounter.tsx | 3 +- .../src/components/Select/Select.tsx | 3 +- .../src/components/Table/ThCheckbox.tsx | 3 +- .../src/components/Text/RangeSeparator.tsx | 3 +- .../src/components/Textarea/Textarea.tsx | 73 ++++++------------- .../Textarea/stories/Textarea.stories.tsx | 23 ++++++ .../smarthr-ui/src/hooks/useDecorators.ts | 27 +++++++ packages/smarthr-ui/src/types/Decorator.ts | 7 -- packages/smarthr-ui/src/types/index.ts | 1 - 26 files changed, 98 insertions(+), 92 deletions(-) create mode 100644 packages/smarthr-ui/src/hooks/useDecorators.ts delete mode 100644 packages/smarthr-ui/src/types/Decorator.ts diff --git a/packages/smarthr-ui/src/components/Browser/Browser.tsx b/packages/smarthr-ui/src/components/Browser/Browser.tsx index 3f6596696e..b8828a8c64 100644 --- a/packages/smarthr-ui/src/components/Browser/Browser.tsx +++ b/packages/smarthr-ui/src/components/Browser/Browser.tsx @@ -1,7 +1,7 @@ import React, { FC, KeyboardEventHandler, useCallback, useMemo } from 'react' import { tv } from 'tailwind-variants' -import { DecoratorsType } from '../../types' +import { type DecoratorsType } from '../../hooks/useDecorators' import { Text } from '../Text' import { BrowserColumn } from './BrowserColumn' diff --git a/packages/smarthr-ui/src/components/Button/Button.tsx b/packages/smarthr-ui/src/components/Button/Button.tsx index 13f3c718e9..d0c3aa42c6 100644 --- a/packages/smarthr-ui/src/components/Button/Button.tsx +++ b/packages/smarthr-ui/src/components/Button/Button.tsx @@ -3,8 +3,8 @@ import React, { ButtonHTMLAttributes, forwardRef, useMemo } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../hooks/useDecorators' import { usePortal } from '../../hooks/usePortal' -import { DecoratorsType } from '../../types' import { Loader } from '../Loader' import { VisuallyHiddenText } from '../VisuallyHiddenText' diff --git a/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx b/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx index c6f6d8e1ac..09e6c4facb 100644 --- a/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx +++ b/packages/smarthr-ui/src/components/ComboBox/MultiComboBox/MultiComboBox.tsx @@ -15,6 +15,7 @@ import { useId } from 'react' import innerText from 'react-innertext' import { tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { useOuterClick } from '../../../hooks/useOuterClick' import { genericsForwardRef } from '../../../libs/util' import { textColor } from '../../../themes' @@ -27,7 +28,6 @@ import { useOptions } from '../useOptions' import { MultiSelectedItem } from './MultiSelectedItem' import { hasParentElementByClassName } from './multiComboBoxHelper' -import type { DecoratorsType } from '../../../types' import type { BaseProps, ComboBoxItem } from '../types' type Props = BaseProps & { diff --git a/packages/smarthr-ui/src/components/ComboBox/SingleComboBox/SingleComboBox.tsx b/packages/smarthr-ui/src/components/ComboBox/SingleComboBox/SingleComboBox.tsx index 8898d4dfed..053af77e0b 100644 --- a/packages/smarthr-ui/src/components/ComboBox/SingleComboBox/SingleComboBox.tsx +++ b/packages/smarthr-ui/src/components/ComboBox/SingleComboBox/SingleComboBox.tsx @@ -17,6 +17,7 @@ import innerText from 'react-innertext' import { tv } from 'tailwind-variants' import { useClick } from '../../../hooks/useClick' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { genericsForwardRef } from '../../../libs/util' import { textColor } from '../../../themes' import { UnstyledButton } from '../../Button' @@ -25,7 +26,6 @@ import { Input } from '../../Input' import { useListBox } from '../useListBox' import { useOptions } from '../useOptions' -import type { DecoratorsType } from '../../../types' import type { BaseProps, ComboBoxItem } from '../types' type Props = BaseProps & { diff --git a/packages/smarthr-ui/src/components/ComboBox/useListBox.tsx b/packages/smarthr-ui/src/components/ComboBox/useListBox.tsx index eca85e675b..bbe874e38c 100644 --- a/packages/smarthr-ui/src/components/ComboBox/useListBox.tsx +++ b/packages/smarthr-ui/src/components/ComboBox/useListBox.tsx @@ -11,6 +11,7 @@ import React, { } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../hooks/useDecorators' import { useEnhancedEffect } from '../../hooks/useEnhancedEffect' import { usePortal } from '../../hooks/usePortal' import { spacing } from '../../themes' @@ -23,8 +24,6 @@ import { ComboBoxItem, ComboBoxOption } from './types' import { useActiveOption } from './useActiveOption' import { usePartialRendering } from './usePartialRendering' -import type { DecoratorsType } from '../../types' - type Props = { options: Array> dropdownHelpMessage?: ReactNode diff --git a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx index 414bec0910..26ea7b34f4 100644 --- a/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ActionDialog/ActionDialogContentInner.tsx @@ -2,6 +2,7 @@ import React, { type FC, type PropsWithChildren, type ReactNode, useCallback, useMemo } from 'react' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { Button } from '../../Button' import { Cluster, Stack } from '../../Layout' import { ResponseMessage } from '../../ResponseMessage' @@ -10,7 +11,7 @@ import { DialogBody, type Props as DialogBodyProps } from '../DialogBody' import { DialogHeader, type Props as DialogHeaderProps } from '../DialogHeader' import { dialogContentInner } from '../dialogInnerStyle' -import type { DecoratorsType, ResponseMessageType } from '../../../types' +import type { ResponseMessageType } from '../../../types' export type BaseProps = PropsWithChildren< DialogHeaderProps & diff --git a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx index be9ba580da..5c6642aa1a 100644 --- a/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dialog/FormDialog/FormDialogContentInner.tsx @@ -8,6 +8,7 @@ import React, { } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { Button } from '../../Button' import { Cluster, Stack } from '../../Layout' import { ResponseMessage } from '../../ResponseMessage' @@ -16,7 +17,7 @@ import { DialogBody, Props as DialogBodyProps } from '../DialogBody' import { DialogHeader, type Props as DialogHeaderProps } from '../DialogHeader' import { dialogContentInner } from '../dialogInnerStyle' -import type { DecoratorsType, ResponseMessageType } from '../../../types' +import type { ResponseMessageType } from '../../../types' export type BaseProps = PropsWithChildren< DialogHeaderProps & diff --git a/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx b/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx index 1c282bcebe..d0a591f6aa 100644 --- a/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx +++ b/packages/smarthr-ui/src/components/Dialog/MessageDialog/MessageDialogContentInner.tsx @@ -1,5 +1,6 @@ import React, { type FC, useMemo } from 'react' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { Button } from '../../Button' import { Cluster } from '../../Layout' import { Section } from '../../SectioningContent' @@ -7,8 +8,6 @@ import { DialogBody, Props as DialogBodyProps } from '../DialogBody' import { DialogHeader, Props as DialogHeaderProps } from '../DialogHeader' import { dialogContentInner } from '../dialogInnerStyle' -import type { DecoratorsType } from '../../../types' - export type BaseProps = DialogHeaderProps & DialogBodyProps & { /** ダイアログの説明 */ diff --git a/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx b/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx index 6f5c8f6b38..6f9582f303 100644 --- a/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx +++ b/packages/smarthr-ui/src/components/Dialog/ModelessDialog.tsx @@ -17,6 +17,7 @@ import React, { import Draggable from 'react-draggable' import { VariantProps, tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../hooks/useDecorators' import { useHandleEscape } from '../../hooks/useHandleEscape' import { Base, BaseElementProps } from '../Base' import { Button } from '../Button' @@ -26,8 +27,6 @@ import { DialogBody, type Props as DialogBodyProps } from './DialogBody' import { DialogOverlap } from './DialogOverlap' import { useDialogPortal } from './useDialogPortal' -import type { DecoratorsType } from '../../types' - type Props = PropsWithChildren<{ /** * ダイアログのヘッダ部分の内容 diff --git a/packages/smarthr-ui/src/components/DropZone/DropZone.tsx b/packages/smarthr-ui/src/components/DropZone/DropZone.tsx index ead14d1e92..46f2211fb5 100644 --- a/packages/smarthr-ui/src/components/DropZone/DropZone.tsx +++ b/packages/smarthr-ui/src/components/DropZone/DropZone.tsx @@ -14,11 +14,10 @@ import React, { } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../hooks/useDecorators' import { Button } from '../Button' import { FaFolderOpenIcon } from '../Icon' -import type { DecoratorsType } from '../../types' - const dropZone = tv({ slots: { wrapper: [ diff --git a/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/FilterDropdown.tsx b/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/FilterDropdown.tsx index 25450cc27f..ccec28c018 100644 --- a/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/FilterDropdown.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/FilterDropdown/FilterDropdown.tsx @@ -4,6 +4,7 @@ import React, { ComponentProps, FC, ReactNode, useMemo } from 'react' import innerText from 'react-innertext' import { tv } from 'tailwind-variants' +import { type DecoratorType, type DecoratorsType } from '../../../hooks/useDecorators' import { Button, BaseProps as ButtonProps } from '../../Button' import { FaCircleCheckIcon, FaFilterIcon, FaRotateLeftIcon } from '../../Icon' import { Cluster, Stack } from '../../Layout' @@ -13,7 +14,7 @@ import { DropdownCloser } from '../DropdownCloser' import { DropdownContent } from '../DropdownContent' import { DropdownTrigger } from '../DropdownTrigger' -import type { DecoratorType, DecoratorsType, ResponseMessageType } from '../../../types' +import type { ResponseMessageType } from '../../../types' type Props = { isFiltered?: boolean diff --git a/packages/smarthr-ui/src/components/Dropdown/SortDropdown/SortDropdown.tsx b/packages/smarthr-ui/src/components/Dropdown/SortDropdown/SortDropdown.tsx index 56f4dfceb0..f5427ec3c2 100644 --- a/packages/smarthr-ui/src/components/Dropdown/SortDropdown/SortDropdown.tsx +++ b/packages/smarthr-ui/src/components/Dropdown/SortDropdown/SortDropdown.tsx @@ -3,6 +3,7 @@ import React, { ComponentPropsWithRef } from 'react' import { type FC, type MouseEventHandler } from 'react' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { Button } from '../../Button' import { Fieldset } from '../../Fieldset' import { FormControl } from '../../FormControl' @@ -16,8 +17,6 @@ import { DropdownTrigger } from '../DropdownTrigger' import { useSortDropdown } from './useSortDropdown' -import type { DecoratorsType } from '../../../types' - type SortFieldType = { value: string } & Omit, 'value'> diff --git a/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx b/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx index b144fc5703..1a7a5a3776 100644 --- a/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx +++ b/packages/smarthr-ui/src/components/Header/AppLauncher/AppLauncher.tsx @@ -1,6 +1,7 @@ import React, { HTMLAttributes, ReactNode, useMemo } from 'react' import { VariantProps, tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { Button } from '../../Button' import { Dropdown, DropdownContent, DropdownTrigger } from '../../Dropdown' import { Heading } from '../../Heading' @@ -8,8 +9,6 @@ import { FaCaretDownIcon, FaToolboxIcon } from '../../Icon' import { Cluster, Stack } from '../../Layout' import { TextLink } from '../../TextLink' -import type { DecoratorsType } from '../../../types' - type Category = { type?: string heading: ReactNode diff --git a/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx b/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx index 84c3c68d70..b870c3d600 100644 --- a/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx +++ b/packages/smarthr-ui/src/components/Header/LanguageSwitcher/LanguageSwitcher.tsx @@ -3,12 +3,13 @@ import React, { HTMLAttributes, ReactNode, useCallback, useMemo } from 'react' import { VariantProps, tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { tabbable } from '../../../libs/tabbable' import { Button } from '../../Button' import { Dropdown, DropdownContent, DropdownTrigger } from '../../Dropdown' import { FaCaretDownIcon, FaCheckIcon, FaGlobeIcon, LanguageIcon } from '../../Icon' -import type { DecoratorsType, LocaleMap } from '../../../types' +import type { LocaleMap } from '../../../types' export type Props = { narrow?: boolean diff --git a/packages/smarthr-ui/src/components/InformationPanel/InformationPanel.tsx b/packages/smarthr-ui/src/components/InformationPanel/InformationPanel.tsx index df3708d612..2628c11239 100644 --- a/packages/smarthr-ui/src/components/InformationPanel/InformationPanel.tsx +++ b/packages/smarthr-ui/src/components/InformationPanel/InformationPanel.tsx @@ -11,6 +11,7 @@ import React, { } from 'react' import { VariantProps, tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../hooks/useDecorators' import { Base, BaseElementProps } from '../Base' import { Button } from '../Button' import { Heading, HeadingTagTypes } from '../Heading' @@ -18,8 +19,6 @@ import { FaCaretDownIcon, FaCaretUpIcon } from '../Icon' import { Cluster } from '../Layout' import { ResponseMessage } from '../ResponseMessage' -import type { DecoratorsType } from '../../types' - type AbstractProps = PropsWithChildren<{ /** パネルのタイトル */ title: React.ReactNode diff --git a/packages/smarthr-ui/src/components/Input/SearchInput/SearchInput.tsx b/packages/smarthr-ui/src/components/Input/SearchInput/SearchInput.tsx index b680d91f76..fabcf131b1 100644 --- a/packages/smarthr-ui/src/components/Input/SearchInput/SearchInput.tsx +++ b/packages/smarthr-ui/src/components/Input/SearchInput/SearchInput.tsx @@ -1,11 +1,10 @@ import React, { ComponentProps, forwardRef, useMemo } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../../hooks/useDecorators' import { FaMagnifyingGlassIcon } from '../../Icon' import { InputWithTooltip } from '../InputWithTooltip' -import type { DecoratorsType } from '../../../types' - type Props = Omit, 'tooltipMessage' | 'prefix'> & { /** 入力欄の説明を紐付けるツールチップに表示するメッセージ */ tooltipMessage: React.ReactNode diff --git a/packages/smarthr-ui/src/components/InputFile/InputFile.tsx b/packages/smarthr-ui/src/components/InputFile/InputFile.tsx index fed78b2c04..44b5b5065d 100644 --- a/packages/smarthr-ui/src/components/InputFile/InputFile.tsx +++ b/packages/smarthr-ui/src/components/InputFile/InputFile.tsx @@ -12,13 +12,12 @@ import React, { } from 'react' import { VariantProps, tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../hooks/useDecorators' import { BaseColumn } from '../Base' import { Button } from '../Button' import { FaFolderOpenIcon, FaTrashCanIcon } from '../Icon' import { Stack } from '../Layout' -import type { DecoratorsType } from '../../types' - const inputFile = tv({ slots: { wrapper: 'smarthr-ui-InputFile shr-block', diff --git a/packages/smarthr-ui/src/components/PageCounter/PageCounter.tsx b/packages/smarthr-ui/src/components/PageCounter/PageCounter.tsx index b49355ec5f..08155b824a 100644 --- a/packages/smarthr-ui/src/components/PageCounter/PageCounter.tsx +++ b/packages/smarthr-ui/src/components/PageCounter/PageCounter.tsx @@ -1,11 +1,10 @@ import React, { ComponentPropsWithoutRef, useMemo } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorType, type DecoratorsType } from '../../hooks/useDecorators' import { Cluster } from '../Layout' import { RangeSeparator, Text } from '../Text' -import type { DecoratorType, DecoratorsType } from '../../types' - type Props = { start: number end: number diff --git a/packages/smarthr-ui/src/components/Select/Select.tsx b/packages/smarthr-ui/src/components/Select/Select.tsx index e581883fef..78743469ab 100644 --- a/packages/smarthr-ui/src/components/Select/Select.tsx +++ b/packages/smarthr-ui/src/components/Select/Select.tsx @@ -9,12 +9,11 @@ import React, { } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorType, type DecoratorsType } from '../../hooks/useDecorators' import { isIOS, isMobileSafari } from '../../libs/ua' import { genericsForwardRef } from '../../libs/util' import { FaSortIcon } from '../Icon' -import type { DecoratorType, DecoratorsType } from '../../types' - type Option = { value: T } & Omit, 'value'> diff --git a/packages/smarthr-ui/src/components/Table/ThCheckbox.tsx b/packages/smarthr-ui/src/components/Table/ThCheckbox.tsx index cc17c4fbdc..06e6da8539 100644 --- a/packages/smarthr-ui/src/components/Table/ThCheckbox.tsx +++ b/packages/smarthr-ui/src/components/Table/ThCheckbox.tsx @@ -1,13 +1,12 @@ import React, { ComponentProps, forwardRef, useMemo } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorsType } from '../../hooks/useDecorators' import { Balloon } from '../Balloon' import { CheckBox, Props as CheckBoxProps } from '../CheckBox' import { Th } from './Th' -import type { DecoratorsType } from '../../types' - type Props = { decorators?: DecoratorsType<'checkAllInvisibleLabel'> & { checkColumnName?: (text: string) => string diff --git a/packages/smarthr-ui/src/components/Text/RangeSeparator.tsx b/packages/smarthr-ui/src/components/Text/RangeSeparator.tsx index 5356e5163c..bca1828f4c 100644 --- a/packages/smarthr-ui/src/components/Text/RangeSeparator.tsx +++ b/packages/smarthr-ui/src/components/Text/RangeSeparator.tsx @@ -1,9 +1,8 @@ import React, { useMemo } from 'react' +import { type DecoratorType, type DecoratorsType } from '../../hooks/useDecorators' import { VisuallyHiddenText } from '../VisuallyHiddenText' -import type { DecoratorType, DecoratorsType } from '../../types' - type Props = { decorators?: DecoratorsType<'text' | 'visuallyHiddenText'> } diff --git a/packages/smarthr-ui/src/components/Textarea/Textarea.tsx b/packages/smarthr-ui/src/components/Textarea/Textarea.tsx index 9446a033d2..0496a97bb2 100644 --- a/packages/smarthr-ui/src/components/Textarea/Textarea.tsx +++ b/packages/smarthr-ui/src/components/Textarea/Textarea.tsx @@ -16,13 +16,12 @@ import React, { } from 'react' import { tv } from 'tailwind-variants' +import { type DecoratorsType, useDecorators } from '../../hooks/useDecorators' import { debounce } from '../../libs/debounce' import { lineHeight } from '../../themes' import { defaultHtmlFontSize } from '../../themes/createFontSize' import { VisuallyHiddenText } from '../VisuallyHiddenText' -import type { DecoratorsType } from '../../types' - type Props = { /** 入力値にエラーがあるかどうか */ error?: boolean @@ -39,13 +38,7 @@ type Props = { /** 入力可能な最大文字数。あと何文字入力できるかの表示が追加される。html的なvalidateは発生しない */ maxLetters?: number /** コンポーネント内の文言を変更するための関数を設定 */ - decorators?: DecoratorsType< - | 'beforeMaxLettersCount' - | 'afterMaxLettersCount' - | 'afterMaxLettersCountExceeded' - | 'beforeScreenReaderMaxLettersDescription' - | 'afterScreenReaderMaxLettersDescription' - > + decorators?: DecoratorsType /** * @deprecated placeholder属性は非推奨です。別途ヒント用要素の設置を検討してください。 */ @@ -66,12 +59,14 @@ const getStringLength = (value: string | number | readonly string[]) => { return formattedValue.length - (formattedValue.match(surrogatePairs) || []).length } -const TEXT_BEFORE_MAXLETTERS_COUNT = 'あと' -const TEXT_AFTER_MAXLETTERS_COUNT = '文字' -const TEXT_AFTER_MAXLETTERS_COUNT_EXCEEDED = 'オーバー' - -const SCREEN_READER_BEFORE_MAXLETTERS_DESCRIPTION = '最大' -const SCREEN_READER_AFTER_MAXLETTERS_DESCRIPTION = '文字入力できます' +const DECORATOR_DEFAULT_TEXTS = { + beforeMaxLettersCount: 'あと', + afterMaxLettersCount: '文字', + afterMaxLettersCountExceeded: 'オーバー', + beforeScreenReaderMaxLettersDescription: '最大', + afterScreenReaderMaxLettersDescription: '文字入力できます', +} as const +type DecoratorKeyTypes = keyof typeof DECORATOR_DEFAULT_TEXTS const textarea = tv({ slots: { @@ -141,34 +136,7 @@ export const Textarea = forwardRef( const [count, setCount] = useState(currentValue ? getStringLength(currentValue) : 0) const [srCounterMessage, setSrCounterMessage] = useState('') - const { - afterMaxLettersCount, - beforeMaxLettersCount, - maxLettersCountExceeded, - beforeScreenReaderMaxLettersDescription, - afterScreenReaderMaxLettersDescription, - } = useMemo( - () => ({ - beforeMaxLettersCount: - decorators?.beforeMaxLettersCount?.(TEXT_BEFORE_MAXLETTERS_COUNT) || - TEXT_BEFORE_MAXLETTERS_COUNT, - afterMaxLettersCount: - decorators?.afterMaxLettersCount?.(TEXT_AFTER_MAXLETTERS_COUNT) || - TEXT_AFTER_MAXLETTERS_COUNT, - maxLettersCountExceeded: - decorators?.afterMaxLettersCountExceeded?.(TEXT_AFTER_MAXLETTERS_COUNT_EXCEEDED) || - TEXT_AFTER_MAXLETTERS_COUNT_EXCEEDED, - beforeScreenReaderMaxLettersDescription: - decorators?.beforeScreenReaderMaxLettersDescription?.( - SCREEN_READER_BEFORE_MAXLETTERS_DESCRIPTION, - ) || SCREEN_READER_BEFORE_MAXLETTERS_DESCRIPTION, - afterScreenReaderMaxLettersDescription: - decorators?.afterScreenReaderMaxLettersDescription?.( - SCREEN_READER_AFTER_MAXLETTERS_DESCRIPTION, - ) || SCREEN_READER_AFTER_MAXLETTERS_DESCRIPTION, - }), - [decorators], - ) + const decorated = useDecorators(DECORATOR_DEFAULT_TEXTS, decorators) const getCounterMessage = useCallback( (counterValue: number) => { @@ -179,8 +147,8 @@ export const Textarea = forwardRef( return ( <> {counterValue - maxLetters} - {afterMaxLettersCount} - {maxLettersCountExceeded} + {decorated.afterMaxLettersCount} + {decorated.afterMaxLettersCountExceeded} ) } @@ -188,13 +156,18 @@ export const Textarea = forwardRef( // あと{count}文字 return ( <> - {beforeMaxLettersCount} + {decorated.beforeMaxLettersCount} {maxLetters - counterValue} - {afterMaxLettersCount} + {decorated.afterMaxLettersCount} ) }, - [maxLetters, maxLettersCountExceeded, afterMaxLettersCount, beforeMaxLettersCount], + [ + maxLetters, + decorated.afterMaxLettersCountExceeded, + decorated.afterMaxLettersCount, + decorated.beforeMaxLettersCount, + ], ) const counterVisualMessage = useMemo(() => getCounterMessage(count), [count, getCounterMessage]) @@ -319,9 +292,9 @@ export const Textarea = forwardRef( {srCounterMessage} - {beforeScreenReaderMaxLettersDescription} + {decorated.beforeScreenReaderMaxLettersDescription} {maxLetters} - {afterScreenReaderMaxLettersDescription} + {decorated.afterScreenReaderMaxLettersDescription} ) : ( diff --git a/packages/smarthr-ui/src/components/Textarea/stories/Textarea.stories.tsx b/packages/smarthr-ui/src/components/Textarea/stories/Textarea.stories.tsx index 3de94e8e5d..f23bd63e53 100644 --- a/packages/smarthr-ui/src/components/Textarea/stories/Textarea.stories.tsx +++ b/packages/smarthr-ui/src/components/Textarea/stories/Textarea.stories.tsx @@ -85,6 +85,29 @@ export const MaxLetters: StoryObj = { }, } +export const Decorators: StoryObj = { + name: 'decorators', + args: { + decorators: { + beforeMaxLettersCount: (org) => <>beforeMaxLettersCount({org}), + afterMaxLettersCount: (org) => <>afterMaxLettersCount({org}), + afterMaxLettersCountExceeded: (org) => <>afterMaxLettersCountExceeded({org}), + beforeScreenReaderMaxLettersDescription: (org) => ( + <>beforeScreenReaderMaxLettersDescription({org}) + ), + afterScreenReaderMaxLettersDescription: (org) => ( + <>afterScreenReaderMaxLettersDescription({org}) + ), + }, + }, + render: (args) => ( + <> +