@mittwald/flow-react-components 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -146,6 +146,7 @@ import { ActionBatch } from "./packages/components/src/components/Action/ActionB
146
146
  import { Popover } from "./packages/components/src/components/Popover/Popover.mjs";
147
147
  import { BrowserOnly } from "./packages/components/src/components/BrowserOnly/BrowserOnly.mjs";
148
148
  import { useControlledRemoteValueProps } from "./packages/components/src/lib/remote/useControlledRemoteValueProps.mjs";
149
+ import { ComponentDefaultsProvider } from "./packages/components/src/components/ComponentDefaultsProvider/ComponentDefaultsProvider.mjs";
149
150
  import { CountryOptions } from "./packages/components/src/components/CountryOptions/CountryOptions.mjs";
150
151
  import { PopoverTrigger } from "./packages/components/src/components/Popover/components/PopoverTrigger/PopoverTrigger.mjs";
151
152
  import { IntlProvider } from "./packages/components/src/components/IntlProvider/IntlProvider.mjs";
@@ -158,4 +159,4 @@ import { SettingsProvider } from "./packages/components/src/components/SettingsP
158
159
  import { List } from "./packages/components/src/components/List/List.mjs";
159
160
  import { typedList } from "./packages/components/src/components/List/typedList.mjs";
160
161
  import { NotificationProvider, useNotificationController } from "./packages/components/src/components/NotificationProvider/NotificationProvider.mjs";
161
- export { Action, ActionBatch, BrowserOnly, CountryOptions, DeprecationWarningProvider, IconAI, IconAnalytics, IconApp, IconAscending, IconAttachment, IconAutoresponder, IconBackLink, IconBackup, IconBold, IconCamera, IconCertificate, IconChangelog, IconCheck, IconCheckboxChecked, IconCheckboxEmpty, IconCheckboxIndeterminate, IconChevronDown, IconChevronLeft, IconChevronRight, IconChevronUp, IconClose, IconCode, IconContainer, IconContextMenu, IconContextMenuVertical, IconContract, IconContractPartner, IconContributor, IconCopy, IconCronjob, IconCustomer, IconDanger, IconDashboard, IconDatabase, IconDate, IconDelete, IconDeliveryBox, IconDescending, IconDesktop, IconDirectory, IconDnsSubZone, IconDnsZone, IconDomain, IconDownload, IconEdit, IconEmail, IconEmailArchive, IconExtension, IconExternalLink, IconFailed, IconFeedback, IconFile, IconFilter, IconForwardAddress, IconForwardLink, IconHide, IconHome, IconImage, IconInfo, IconInvite, IconInvoice, IconItalic, IconKnowledgeHint, IconLanguage, IconLeadFyndr, IconLink, IconLock, IconLockOpen, IconLogout, IconMainUser, IconMarketplace, IconMaximize, IconMember, IconMenu, IconMinimize, IconMinus, IconMittwald, IconMobile, IconMonitoring, IconMove, IconNewsletter, IconNotification, IconNumber, IconOrder, IconOrderedList, IconPassword, IconPath, IconPause, IconPayment, IconPending, IconPicture, IconPlus, IconProject, IconQuote, IconRadioOff, IconRadioOn, IconRedo, IconRefresh, IconRegistry, IconSave, IconSearch, IconSecurity, IconSend, IconServer, IconSettings, IconShare, IconShow, IconSorting, IconSsh, IconSshKey, IconSshSftp, IconStack, IconStar, IconStarFilled, IconStart, IconStrikeThrough, IconSubdomain, IconSucceeded, IconSuccess, IconSupport, IconTerminate, IconTicket, IconTime, IconUnavailable, IconUndo, IconUnorderedList, IconUpload, IconUser, IconVhost, IconView, IconVolume, IconWarning, IntlProvider, LightBox, LightBoxTrigger, List, ListItemView, Modal, ModalTrigger, NotificationProvider, OverlayController, Popover, PopoverTrigger, SettingsProvider, Wrap, typedList, useControlledRemoteValueProps, useIsMounted, useLanguage, useModalController, useNotificationController, useOnChange, useOverlayController, useProps };
162
+ export { Action, ActionBatch, BrowserOnly, ComponentDefaultsProvider, CountryOptions, DeprecationWarningProvider, IconAI, IconAnalytics, IconApp, IconAscending, IconAttachment, IconAutoresponder, IconBackLink, IconBackup, IconBold, IconCamera, IconCertificate, IconChangelog, IconCheck, IconCheckboxChecked, IconCheckboxEmpty, IconCheckboxIndeterminate, IconChevronDown, IconChevronLeft, IconChevronRight, IconChevronUp, IconClose, IconCode, IconContainer, IconContextMenu, IconContextMenuVertical, IconContract, IconContractPartner, IconContributor, IconCopy, IconCronjob, IconCustomer, IconDanger, IconDashboard, IconDatabase, IconDate, IconDelete, IconDeliveryBox, IconDescending, IconDesktop, IconDirectory, IconDnsSubZone, IconDnsZone, IconDomain, IconDownload, IconEdit, IconEmail, IconEmailArchive, IconExtension, IconExternalLink, IconFailed, IconFeedback, IconFile, IconFilter, IconForwardAddress, IconForwardLink, IconHide, IconHome, IconImage, IconInfo, IconInvite, IconInvoice, IconItalic, IconKnowledgeHint, IconLanguage, IconLeadFyndr, IconLink, IconLock, IconLockOpen, IconLogout, IconMainUser, IconMarketplace, IconMaximize, IconMember, IconMenu, IconMinimize, IconMinus, IconMittwald, IconMobile, IconMonitoring, IconMove, IconNewsletter, IconNotification, IconNumber, IconOrder, IconOrderedList, IconPassword, IconPath, IconPause, IconPayment, IconPending, IconPicture, IconPlus, IconProject, IconQuote, IconRadioOff, IconRadioOn, IconRedo, IconRefresh, IconRegistry, IconSave, IconSearch, IconSecurity, IconSend, IconServer, IconSettings, IconShare, IconShow, IconSorting, IconSsh, IconSshKey, IconSshSftp, IconStack, IconStar, IconStarFilled, IconStart, IconStrikeThrough, IconSubdomain, IconSucceeded, IconSuccess, IconSupport, IconTerminate, IconTicket, IconTime, IconUnavailable, IconUndo, IconUnorderedList, IconUpload, IconUser, IconVhost, IconView, IconVolume, IconWarning, IntlProvider, LightBox, LightBoxTrigger, List, ListItemView, Modal, ModalTrigger, NotificationProvider, OverlayController, Popover, PopoverTrigger, SettingsProvider, Wrap, typedList, useControlledRemoteValueProps, useIsMounted, useLanguage, useModalController, useNotificationController, useOnChange, useOverlayController, useProps };
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.mjs","names":[],"sources":["../../../../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import { type PropsWithChildren, type ReactNode, Suspense, useId } from \"react\";\nimport styles from \"./Modal.module.scss\";\nimport clsx from \"clsx\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport { OverlayController } from \"@/lib/controller/overlay\";\nimport type { FlowComponentProps } from \"@/lib/componentFactory/flowComponent\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { Overlay, type OverlayProps } from \"@/components/Overlay/Overlay\";\nimport { Action } from \"@/components/Action\";\nimport { IconClose } from \"@/components/Icon/components/icons\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport ButtonView from \"@/views/ButtonView\";\nimport DivView from \"@/views/DivView\";\nimport { OffCanvasSuspenseFallback } from \"@/components/Modal/components/OffCanvasSuspenseFallback\";\nimport { ConfirmUnsavedChangesModal } from \"@/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal\";\nimport Wrap from \"@/components/Wrap\";\nimport { ClearPropsContext } from \"@/components/ClearPropsContext/ClearPropsContext\";\nimport ClearPropsContextView from \"@/views/ClearPropsContextView\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider\";\nimport { useVirtualKeyboardVisible } from \"@/lib/hooks/dom/useVirtualKeyboardVisible\";\nimport locales from \"./locales/*.locale.json\";\n\ntype SupportedOverlayProps = Pick<\n OverlayProps,\n \"isOpen\" | \"isDefaultOpen\" | \"onOpen\" | \"onClose\" | \"onOpenChange\"\n>;\n\nexport interface ModalProps\n extends\n PropsWithChildren,\n FlowComponentProps,\n PropsWithClassName,\n SupportedOverlayProps {\n /** The size of the modal. @default \"s\" */\n size?: \"s\" | \"m\" | \"l\";\n /** Whether the modal should be displayed as an off canvas. */\n offCanvas?: boolean;\n /**\n * Whether the off canvas should be displayed on the right or left side of the\n * screen. @default \"right\"\n */\n offCanvasOrientation?: \"left\" | \"right\";\n /** An overlay controller to control the modal state. */\n controller?: OverlayController;\n /**\n * Accepts \"actionConfirm\" to use the modal as a confirmation modal for an\n * action.\n */\n slot?: string;\n /** Whether the modal can be closed by clicking outside of it. */\n isDismissable?: boolean;\n /** Whether the close button should be visible */\n showCloseButton?: boolean;\n /**\n * Whether closing the modal must be confirmed – use it to protect unsaved\n * changes.\n */\n confirmOnClose?: boolean;\n}\n\nexport const Modal = flowComponent(\"Modal\", (props) => {\n const {\n size = \"s\",\n offCanvas,\n controller,\n children,\n ref,\n className,\n offCanvasOrientation = \"right\",\n showCloseButton,\n ...overlayProps\n } = props;\n\n const stringFormatter = useLocalizedStringFormatter(locales, \"Modal\");\n\n // On mobile the header/footer are docked (sticky) while at rest, but flow\n // normally while the on-screen keyboard is open so the content gets the full\n // available space (see Modal.module.scss). #2423\n const keyboardVisible = useVirtualKeyboardVisible();\n\n const rootClassName = clsx(\n offCanvas ? styles.offCanvas : styles.modal,\n styles[`size-${size}`],\n offCanvasOrientation === \"left\" && styles[\"left\"],\n keyboardVisible && styles.keyboardVisible,\n className,\n );\n\n const generatedId = useId();\n\n const header = (children: ReactNode) => (\n <>\n <DivView className={styles.headerTitle}>{children}</DivView>\n <ClearPropsContext>\n <ClearPropsContextView>\n <Action closeModal={{ bypassConfirmation: true }}>\n <ButtonView\n variant=\"plain\"\n color=\"secondary\"\n aria-label={stringFormatter.format(\"close\")}\n className={clsx(\n styles.closeButton,\n showCloseButton === true\n ? styles.alwaysVisible\n : showCloseButton === false\n ? styles.alwaysHidden\n : undefined,\n )}\n >\n <IconClose />\n </ButtonView>\n </Action>\n </ClearPropsContextView>\n </ClearPropsContext>\n </>\n );\n\n const nestedHeadingLevel = 3;\n\n const nestedHeadingProps: PropsContext = {\n Heading: { level: nestedHeadingLevel },\n Section: {\n Header: { Heading: { level: nestedHeadingLevel } },\n Heading: { level: nestedHeadingLevel },\n hideSeparator: true,\n },\n Header: { Heading: { level: nestedHeadingLevel } },\n };\n\n const propsContext: PropsContext = {\n Content: {\n ...nestedHeadingProps,\n className: styles.content,\n },\n ColumnLayout: {\n ...nestedHeadingProps,\n l: [2, 1],\n m: [1],\n className: styles.columnLayout,\n AccentBox: { className: styles.accentBox, backgroundColor: \"neutral\" },\n wrapWith: <ClearPropsContext />,\n },\n Heading: {\n className: styles.header,\n level: 2,\n children: dynamic((props) => header(props.children)),\n id: generatedId,\n },\n ActionGroup: {\n className: styles.actionGroup,\n spacing: \"m\",\n Action: {\n closeModal: dynamic((props) => {\n if (props.closeModal === undefined) {\n return;\n }\n if (props.closeModal === true) {\n return { bypassConfirmation: true };\n }\n return {\n bypassConfirmation: true,\n ...props.closeModal,\n };\n }),\n closeOverlay: dynamic((props) => {\n if (props.closeOverlay === undefined) {\n return;\n }\n if (\n props.closeOverlay instanceof OverlayController ||\n typeof props.closeOverlay === \"string\"\n ) {\n return {\n bypassConfirmation: true,\n overlay: props.closeOverlay,\n };\n }\n return {\n bypassConfirmation: true,\n ...props.closeOverlay,\n };\n }),\n },\n },\n };\n\n return (\n <Overlay\n className={rootClassName}\n controller={controller}\n ref={ref}\n aria-labelledby={generatedId}\n {...overlayProps}\n >\n <PropsContextProvider props={propsContext}>\n <Wrap if={offCanvas}>\n <Suspense fallback={<OffCanvasSuspenseFallback />}>\n {children}\n </Suspense>\n </Wrap>\n </PropsContextProvider>\n <ConfirmUnsavedChangesModal />\n </Overlay>\n );\n});\n\nexport default Modal;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgEA,IAAa,QAAQ,cAAc,UAAU,UAAU;CACrD,MAAM,EACJ,OAAO,KACP,WACA,YACA,UACA,KACA,WACA,uBAAuB,SACvB,iBACA,GAAG,iBACD;CAEJ,MAAM,kBAAkB,4BAA4B,kBAAS,OAAO;CAKpE,MAAM,kBAAkB,0BAA0B;CAElD,MAAM,gBAAgB,KACpB,YAAY,qBAAO,YAAY,qBAAO,OACtC,qBAAO,QAAQ,SACf,yBAAyB,UAAU,qBAAO,SAC1C,mBAAmB,qBAAO,iBAC1B,SACF;CAEA,MAAM,cAAc,MAAM;CAE1B,MAAM,UAAU,aACd,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,SAAD;EAAS,WAAW,qBAAO;EAAc;CAAkB,CAAA,GAC3D,oBAAC,mBAAD,EAAA,UACE,oBAAC,uBAAD,EAAA,UACE,oBAAC,QAAD;EAAQ,YAAY,EAAE,oBAAoB,KAAK;EAC7C,UAAA,oBAAC,YAAD;GACE,SAAQ;GACR,OAAM;GACN,cAAY,gBAAgB,OAAO,OAAO;GAC1C,WAAW,KACT,qBAAO,aACP,oBAAoB,OAChB,qBAAO,gBACP,oBAAoB,QAClB,qBAAO,eACP,KAAA,CACR;GAEA,UAAA,oBAAC,WAAD,CAAY,CAAA;EACF,CAAA;CACN,CAAA,EACa,CAAA,EACN,CAAA,CACnB,EAAA,CAAA;CAGJ,MAAM,qBAAqB;CAE3B,MAAM,qBAAmC;EACvC,SAAS,EAAE,OAAO,mBAAmB;EACrC,SAAS;GACP,QAAQ,EAAE,SAAS,EAAE,OAAO,mBAAmB,EAAE;GACjD,SAAS,EAAE,OAAO,mBAAmB;GACrC,eAAe;EACjB;EACA,QAAQ,EAAE,SAAS,EAAE,OAAO,mBAAmB,EAAE;CACnD;CAEA,MAAM,eAA6B;EACjC,SAAS;GACP,GAAG;GACH,WAAW,qBAAO;EACpB;EACA,cAAc;GACZ,GAAG;GACH,GAAG,CAAC,GAAG,CAAC;GACR,GAAG,CAAC,CAAC;GACL,WAAW,qBAAO;GAClB,WAAW;IAAE,WAAW,qBAAO;IAAW,iBAAiB;GAAU;GACrE,UAAU,oBAAC,mBAAD,CAAoB,CAAA;EAChC;EACA,SAAS;GACP,WAAW,qBAAO;GAClB,OAAO;GACP,UAAU,SAAS,UAAU,OAAO,MAAM,QAAQ,CAAC;GACnD,IAAI;EACN;EACA,aAAa;GACX,WAAW,qBAAO;GAClB,SAAS;GACT,QAAQ;IACN,YAAY,SAAS,UAAU;KAC7B,IAAI,MAAM,eAAe,KAAA,GACvB;KAEF,IAAI,MAAM,eAAe,MACvB,OAAO,EAAE,oBAAoB,KAAK;KAEpC,OAAO;MACL,oBAAoB;MACpB,GAAG,MAAM;KACX;IACF,CAAC;IACD,cAAc,SAAS,UAAU;KAC/B,IAAI,MAAM,iBAAiB,KAAA,GACzB;KAEF,IACE,MAAM,wBAAwB,qBAC9B,OAAO,MAAM,iBAAiB,UAE9B,OAAO;MACL,oBAAoB;MACpB,SAAS,MAAM;KACjB;KAEF,OAAO;MACL,oBAAoB;MACpB,GAAG,MAAM;KACX;IACF,CAAC;GACH;EACF;CACF;CAEA,OACE,qBAAC,SAAD;EACE,WAAW;EACC;EACP;EACL,mBAAiB;EACjB,GAAI;EALN,UAAA,CAOE,oBAAC,sBAAD;GAAsB,OAAO;GAC3B,UAAA,oBAAC,MAAD;IAAM,IAAI;IACR,UAAA,oBAAC,UAAD;KAAU,UAAU,oBAAC,2BAAD,CAA4B,CAAA;KAC7C;IACO,CAAA;GACN,CAAA;EACc,CAAA,GACtB,oBAAC,4BAAD,CAA6B,CAAA,CACtB;;AAEb,CAAC"}
1
+ {"version":3,"file":"Modal.mjs","names":[],"sources":["../../../../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import { type PropsWithChildren, type ReactNode, Suspense, useId } from \"react\";\nimport styles from \"./Modal.module.scss\";\nimport clsx from \"clsx\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport { OverlayController } from \"@/lib/controller/overlay\";\nimport type { FlowComponentProps } from \"@/lib/componentFactory/flowComponent\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { Overlay, type OverlayProps } from \"@/components/Overlay/Overlay\";\nimport { Action } from \"@/components/Action\";\nimport { IconClose } from \"@/components/Icon/components/icons\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport ButtonView from \"@/views/ButtonView\";\nimport DivView from \"@/views/DivView\";\nimport { OffCanvasSuspenseFallback } from \"@/components/Modal/components/OffCanvasSuspenseFallback\";\nimport { ConfirmUnsavedChangesModal } from \"@/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal\";\nimport Wrap from \"@/components/Wrap\";\nimport { ClearPropsContext } from \"@/components/ClearPropsContext/ClearPropsContext\";\nimport ClearPropsContextView from \"@/views/ClearPropsContextView\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider\";\nimport { useVirtualKeyboardVisible } from \"@/lib/hooks/dom/useVirtualKeyboardVisible\";\nimport locales from \"./locales/*.locale.json\";\n\ntype SupportedOverlayProps = Pick<\n OverlayProps,\n \"isOpen\" | \"isDefaultOpen\" | \"onOpen\" | \"onClose\" | \"onOpenChange\"\n>;\n\nexport interface ModalProps\n extends\n PropsWithChildren,\n FlowComponentProps,\n PropsWithClassName,\n SupportedOverlayProps {\n /** The size of the modal. @default \"s\" */\n size?: \"s\" | \"m\" | \"l\";\n /** Whether the modal should be displayed as an off canvas. */\n offCanvas?: boolean;\n /**\n * Whether the off canvas should be displayed on the right or left side of the\n * screen. @default \"right\"\n */\n offCanvasOrientation?: \"left\" | \"right\";\n /** An overlay controller to control the modal state. */\n controller?: OverlayController;\n /**\n * Accepts \"actionConfirm\" to use the modal as a confirmation modal for an\n * action.\n */\n slot?: string;\n /** Whether the modal can be closed by clicking outside of it. */\n isDismissable?: boolean;\n /** Whether the close button should be visible */\n showCloseButton?: boolean;\n /**\n * Whether closing the modal must be confirmed – use it to protect unsaved\n * changes. `false` does not switch off the confirmation of a dirty `Form`\n * inside the modal; set `confirmModalCloseOnUnsavedChanges={false}` on the\n * `Form` for that.\n */\n confirmOnClose?: boolean;\n}\n\nexport const Modal = flowComponent(\"Modal\", (props) => {\n const {\n size = \"s\",\n offCanvas,\n controller,\n children,\n ref,\n className,\n offCanvasOrientation = \"right\",\n showCloseButton,\n ...overlayProps\n } = props;\n\n const stringFormatter = useLocalizedStringFormatter(locales, \"Modal\");\n\n // On mobile the header/footer are docked (sticky) while at rest, but flow\n // normally while the on-screen keyboard is open so the content gets the full\n // available space (see Modal.module.scss). #2423\n const keyboardVisible = useVirtualKeyboardVisible();\n\n const rootClassName = clsx(\n offCanvas ? styles.offCanvas : styles.modal,\n styles[`size-${size}`],\n offCanvasOrientation === \"left\" && styles[\"left\"],\n keyboardVisible && styles.keyboardVisible,\n className,\n );\n\n const generatedId = useId();\n\n const header = (children: ReactNode) => (\n <>\n <DivView className={styles.headerTitle}>{children}</DivView>\n <ClearPropsContext>\n <ClearPropsContextView>\n <Action closeModal={{ bypassConfirmation: true }}>\n <ButtonView\n variant=\"plain\"\n color=\"secondary\"\n aria-label={stringFormatter.format(\"close\")}\n className={clsx(\n styles.closeButton,\n showCloseButton === true\n ? styles.alwaysVisible\n : showCloseButton === false\n ? styles.alwaysHidden\n : undefined,\n )}\n >\n <IconClose />\n </ButtonView>\n </Action>\n </ClearPropsContextView>\n </ClearPropsContext>\n </>\n );\n\n const nestedHeadingLevel = 3;\n\n const nestedHeadingProps: PropsContext = {\n Heading: { level: nestedHeadingLevel },\n Section: {\n Header: { Heading: { level: nestedHeadingLevel } },\n Heading: { level: nestedHeadingLevel },\n hideSeparator: true,\n },\n Header: { Heading: { level: nestedHeadingLevel } },\n };\n\n const propsContext: PropsContext = {\n Content: {\n ...nestedHeadingProps,\n className: styles.content,\n },\n ColumnLayout: {\n ...nestedHeadingProps,\n l: [2, 1],\n m: [1],\n className: styles.columnLayout,\n AccentBox: { className: styles.accentBox, backgroundColor: \"neutral\" },\n wrapWith: <ClearPropsContext />,\n },\n Heading: {\n className: styles.header,\n level: 2,\n children: dynamic((props) => header(props.children)),\n id: generatedId,\n },\n ActionGroup: {\n className: styles.actionGroup,\n spacing: \"m\",\n Action: {\n closeModal: dynamic((props) => {\n if (props.closeModal === undefined) {\n return;\n }\n if (props.closeModal === true) {\n return { bypassConfirmation: true };\n }\n return {\n bypassConfirmation: true,\n ...props.closeModal,\n };\n }),\n closeOverlay: dynamic((props) => {\n if (props.closeOverlay === undefined) {\n return;\n }\n if (\n props.closeOverlay instanceof OverlayController ||\n typeof props.closeOverlay === \"string\"\n ) {\n return {\n bypassConfirmation: true,\n overlay: props.closeOverlay,\n };\n }\n return {\n bypassConfirmation: true,\n ...props.closeOverlay,\n };\n }),\n },\n },\n };\n\n return (\n <Overlay\n className={rootClassName}\n controller={controller}\n ref={ref}\n aria-labelledby={generatedId}\n {...overlayProps}\n >\n <PropsContextProvider props={propsContext}>\n <Wrap if={offCanvas}>\n <Suspense fallback={<OffCanvasSuspenseFallback />}>\n {children}\n </Suspense>\n </Wrap>\n </PropsContextProvider>\n <ConfirmUnsavedChangesModal />\n </Overlay>\n );\n});\n\nexport default Modal;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkEA,IAAa,QAAQ,cAAc,UAAU,UAAU;CACrD,MAAM,EACJ,OAAO,KACP,WACA,YACA,UACA,KACA,WACA,uBAAuB,SACvB,iBACA,GAAG,iBACD;CAEJ,MAAM,kBAAkB,4BAA4B,kBAAS,OAAO;CAKpE,MAAM,kBAAkB,0BAA0B;CAElD,MAAM,gBAAgB,KACpB,YAAY,qBAAO,YAAY,qBAAO,OACtC,qBAAO,QAAQ,SACf,yBAAyB,UAAU,qBAAO,SAC1C,mBAAmB,qBAAO,iBAC1B,SACF;CAEA,MAAM,cAAc,MAAM;CAE1B,MAAM,UAAU,aACd,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,SAAD;EAAS,WAAW,qBAAO;EAAc;CAAkB,CAAA,GAC3D,oBAAC,mBAAD,EAAA,UACE,oBAAC,uBAAD,EAAA,UACE,oBAAC,QAAD;EAAQ,YAAY,EAAE,oBAAoB,KAAK;EAC7C,UAAA,oBAAC,YAAD;GACE,SAAQ;GACR,OAAM;GACN,cAAY,gBAAgB,OAAO,OAAO;GAC1C,WAAW,KACT,qBAAO,aACP,oBAAoB,OAChB,qBAAO,gBACP,oBAAoB,QAClB,qBAAO,eACP,KAAA,CACR;GAEA,UAAA,oBAAC,WAAD,CAAY,CAAA;EACF,CAAA;CACN,CAAA,EACa,CAAA,EACN,CAAA,CACnB,EAAA,CAAA;CAGJ,MAAM,qBAAqB;CAE3B,MAAM,qBAAmC;EACvC,SAAS,EAAE,OAAO,mBAAmB;EACrC,SAAS;GACP,QAAQ,EAAE,SAAS,EAAE,OAAO,mBAAmB,EAAE;GACjD,SAAS,EAAE,OAAO,mBAAmB;GACrC,eAAe;EACjB;EACA,QAAQ,EAAE,SAAS,EAAE,OAAO,mBAAmB,EAAE;CACnD;CAEA,MAAM,eAA6B;EACjC,SAAS;GACP,GAAG;GACH,WAAW,qBAAO;EACpB;EACA,cAAc;GACZ,GAAG;GACH,GAAG,CAAC,GAAG,CAAC;GACR,GAAG,CAAC,CAAC;GACL,WAAW,qBAAO;GAClB,WAAW;IAAE,WAAW,qBAAO;IAAW,iBAAiB;GAAU;GACrE,UAAU,oBAAC,mBAAD,CAAoB,CAAA;EAChC;EACA,SAAS;GACP,WAAW,qBAAO;GAClB,OAAO;GACP,UAAU,SAAS,UAAU,OAAO,MAAM,QAAQ,CAAC;GACnD,IAAI;EACN;EACA,aAAa;GACX,WAAW,qBAAO;GAClB,SAAS;GACT,QAAQ;IACN,YAAY,SAAS,UAAU;KAC7B,IAAI,MAAM,eAAe,KAAA,GACvB;KAEF,IAAI,MAAM,eAAe,MACvB,OAAO,EAAE,oBAAoB,KAAK;KAEpC,OAAO;MACL,oBAAoB;MACpB,GAAG,MAAM;KACX;IACF,CAAC;IACD,cAAc,SAAS,UAAU;KAC/B,IAAI,MAAM,iBAAiB,KAAA,GACzB;KAEF,IACE,MAAM,wBAAwB,qBAC9B,OAAO,MAAM,iBAAiB,UAE9B,OAAO;MACL,oBAAoB;MACpB,SAAS,MAAM;KACjB;KAEF,OAAO;MACL,oBAAoB;MACpB,GAAG,MAAM;KACX;IACF,CAAC;GACH;EACF;CACF;CAEA,OACE,qBAAC,SAAD;EACE,WAAW;EACC;EACP;EACL,mBAAiB;EACjB,GAAI;EALN,UAAA,CAOE,oBAAC,sBAAD;GAAsB,OAAO;GAC3B,UAAA,oBAAC,MAAD;IAAM,IAAI;IACR,UAAA,oBAAC,UAAD;KAAU,UAAU,oBAAC,2BAAD,CAA4B,CAAA;KAC7C;IACO,CAAA;GACN,CAAA;EACc,CAAA,GACtB,oBAAC,4BAAD,CAA6B,CAAA,CACtB;;AAEb,CAAC"}
@@ -28,8 +28,9 @@ var useCollapsingItems = () => {
28
28
  if (!list || !more || !container) return;
29
29
  const items = Array.from(list.children).filter((child) => child instanceof HTMLElement);
30
30
  const containerStyle = window.getComputedStyle(container);
31
+ const scale = container.offsetWidth > 0 ? container.getBoundingClientRect().width / container.offsetWidth : 1;
31
32
  const availableWidth = container.clientWidth - (parseFloat(containerStyle.paddingInlineStart) || 0) - (parseFloat(containerStyle.paddingInlineEnd) || 0);
32
- const visibleCount = getVisibleItemCount(items.map((item) => item.getBoundingClientRect().width), availableWidth, more.getBoundingClientRect().width);
33
+ const visibleCount = getVisibleItemCount(items.map((item) => item.getBoundingClientRect().width / scale), availableWidth, more.getBoundingClientRect().width / scale);
33
34
  items.forEach((item, index) => {
34
35
  item.style.visibility = index < visibleCount ? "" : "hidden";
35
36
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useCollapsingItems.mjs","names":[],"sources":["../../../../../../../../src/components/TabNavigation/lib/useCollapsingItems.ts"],"sourcesContent":["import type { RefObject } from \"react\";\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { createFrameResizeObserver } from \"@/lib/dom/createFrameResizeObserver\";\nimport { getVisibleItemCount } from \"./getVisibleItemCount\";\n\ninterface CollapsingItemsState {\n /** Number of visible items. `null` until the first measurement was done. */\n visibleCount: number | null;\n /** Whether at least one item does not fit and is collapsed. */\n hasOverflow: boolean;\n /** Whether one of the collapsed items contains the current page link. */\n menuHasCurrentItem: boolean;\n}\n\ninterface UseCollapsingItemsReturn extends CollapsingItemsState {\n listRef: RefObject<HTMLUListElement | null>;\n moreRef: RefObject<HTMLDivElement | null>;\n}\n\nconst initialState: CollapsingItemsState = {\n visibleCount: null,\n hasOverflow: false,\n menuHasCurrentItem: false,\n};\n\n/**\n * Observes the items of the list and computes how many of them fit into the\n * available width of the list's parent element. Items that do not fit are\n * hidden via `visibility: hidden` (removes them from the accessibility tree and\n * the tab order while keeping them measurable). The width of the \"more\" element\n * is reserved whenever items are collapsed, so it must always be rendered\n * (visually hidden when there is no overflow).\n */\nexport const useCollapsingItems = (): UseCollapsingItemsReturn => {\n const listRef = useRef<HTMLUListElement>(null);\n const moreRef = useRef<HTMLDivElement>(null);\n\n const [state, setState] = useState(initialState);\n\n const update = useCallback(() => {\n const list = listRef.current;\n const more = moreRef.current;\n const container = list?.parentElement;\n\n if (!list || !more || !container) {\n return;\n }\n\n const items = Array.from(list.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement,\n );\n\n const containerStyle = window.getComputedStyle(container);\n const availableWidth =\n container.clientWidth -\n (parseFloat(containerStyle.paddingInlineStart) || 0) -\n (parseFloat(containerStyle.paddingInlineEnd) || 0);\n\n const visibleCount = getVisibleItemCount(\n items.map((item) => item.getBoundingClientRect().width),\n availableWidth,\n more.getBoundingClientRect().width,\n );\n\n items.forEach((item, index) => {\n item.style.visibility = index < visibleCount ? \"\" : \"hidden\";\n });\n\n const menuHasCurrentItem = items\n .slice(visibleCount)\n .some(\n (item) =>\n !!item.querySelector('[aria-current]:not([aria-current=\"false\"])'),\n );\n\n setState((previous) => {\n const next: CollapsingItemsState = {\n visibleCount,\n hasOverflow: visibleCount < items.length,\n menuHasCurrentItem,\n };\n\n const isUnchanged =\n previous.visibleCount === next.visibleCount &&\n previous.hasOverflow === next.hasOverflow &&\n previous.menuHasCurrentItem === next.menuHasCurrentItem;\n\n return isUnchanged ? previous : next;\n });\n }, []);\n\n // Runs after every render (no dependency array): the rendered items may\n // have changed, so the observed elements are re-collected and re-measured.\n // `update()` only triggers a re-render when the computed state changed.\n useLayoutEffect(() => {\n const list = listRef.current;\n const more = moreRef.current;\n const container = list?.parentElement;\n\n if (!list || !more || !container) {\n return;\n }\n\n const observer = createFrameResizeObserver(update);\n observer.observe([container, more, ...list.children]);\n\n update();\n\n return () => observer.disconnect();\n });\n\n return { ...state, listRef, moreRef };\n};\n\nexport default useCollapsingItems;\n"],"mappings":";;;;;;AAmBA,IAAM,eAAqC;CACzC,cAAc;CACd,aAAa;CACb,oBAAoB;AACtB;;;;;;;;;AAUA,IAAa,2BAAqD;CAChE,MAAM,UAAU,OAAyB,IAAI;CAC7C,MAAM,UAAU,OAAuB,IAAI;CAE3C,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAE/C,MAAM,SAAS,kBAAkB;EAC/B,MAAM,OAAO,QAAQ;EACrB,MAAM,OAAO,QAAQ;EACrB,MAAM,YAAY,MAAM;EAExB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WACrB;EAGF,MAAM,QAAQ,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QACrC,UAAgC,iBAAiB,WACpD;EAEA,MAAM,iBAAiB,OAAO,iBAAiB,SAAS;EACxD,MAAM,iBACJ,UAAU,eACT,WAAW,eAAe,kBAAkB,KAAK,MACjD,WAAW,eAAe,gBAAgB,KAAK;EAElD,MAAM,eAAe,oBACnB,MAAM,KAAK,SAAS,KAAK,sBAAsB,CAAC,CAAC,KAAK,GACtD,gBACA,KAAK,sBAAsB,CAAC,CAAC,KAC/B;EAEA,MAAM,SAAS,MAAM,UAAU;GAC7B,KAAK,MAAM,aAAa,QAAQ,eAAe,KAAK;EACtD,CAAC;EAED,MAAM,qBAAqB,MACxB,MAAM,YAAY,CAAC,CACnB,MACE,SACC,CAAC,CAAC,KAAK,cAAc,8CAA4C,CACrE;EAEF,UAAU,aAAa;GACrB,MAAM,OAA6B;IACjC;IACA,aAAa,eAAe,MAAM;IAClC;GACF;GAOA,OAJE,SAAS,iBAAiB,KAAK,gBAC/B,SAAS,gBAAgB,KAAK,eAC9B,SAAS,uBAAuB,KAAK,qBAElB,WAAW;EAClC,CAAC;CACH,GAAG,CAAC,CAAC;CAKL,sBAAsB;EACpB,MAAM,OAAO,QAAQ;EACrB,MAAM,OAAO,QAAQ;EACrB,MAAM,YAAY,MAAM;EAExB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WACrB;EAGF,MAAM,WAAW,0BAA0B,MAAM;EACjD,SAAS,QAAQ;GAAC;GAAW;GAAM,GAAG,KAAK;EAAQ,CAAC;EAEpD,OAAO;EAEP,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EAAE,GAAG;EAAO;EAAS;CAAQ;AACtC"}
1
+ {"version":3,"file":"useCollapsingItems.mjs","names":[],"sources":["../../../../../../../../src/components/TabNavigation/lib/useCollapsingItems.ts"],"sourcesContent":["import type { RefObject } from \"react\";\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { createFrameResizeObserver } from \"@/lib/dom/createFrameResizeObserver\";\nimport { getVisibleItemCount } from \"./getVisibleItemCount\";\n\ninterface CollapsingItemsState {\n /** Number of visible items. `null` until the first measurement was done. */\n visibleCount: number | null;\n /** Whether at least one item does not fit and is collapsed. */\n hasOverflow: boolean;\n /** Whether one of the collapsed items contains the current page link. */\n menuHasCurrentItem: boolean;\n}\n\ninterface UseCollapsingItemsReturn extends CollapsingItemsState {\n listRef: RefObject<HTMLUListElement | null>;\n moreRef: RefObject<HTMLDivElement | null>;\n}\n\nconst initialState: CollapsingItemsState = {\n visibleCount: null,\n hasOverflow: false,\n menuHasCurrentItem: false,\n};\n\n/**\n * Observes the items of the list and computes how many of them fit into the\n * available width of the list's parent element. Items that do not fit are\n * hidden via `visibility: hidden` (removes them from the accessibility tree and\n * the tab order while keeping them measurable). The width of the \"more\" element\n * is reserved whenever items are collapsed, so it must always be rendered\n * (visually hidden when there is no overflow).\n */\nexport const useCollapsingItems = (): UseCollapsingItemsReturn => {\n const listRef = useRef<HTMLUListElement>(null);\n const moreRef = useRef<HTMLDivElement>(null);\n\n const [state, setState] = useState(initialState);\n\n const update = useCallback(() => {\n const list = listRef.current;\n const more = moreRef.current;\n const container = list?.parentElement;\n\n if (!list || !more || !container) {\n return;\n }\n\n const items = Array.from(list.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement,\n );\n\n const containerStyle = window.getComputedStyle(container);\n /*\n * `clientWidth` and a computed padding are layout pixels, while\n * `getBoundingClientRect` below reports rendered ones. Where an ancestor\n * scales the subtree — a `transform`, a CSS `zoom` — comparing the two\n * overstates the room by the scale factor, and the items stay visible\n * instead of collapsing. The container's own two border-box widths give\n * the factor; `clientWidth` would be off by the border.\n */\n const scale =\n container.offsetWidth > 0\n ? container.getBoundingClientRect().width / container.offsetWidth\n : 1;\n\n const availableWidth =\n container.clientWidth -\n (parseFloat(containerStyle.paddingInlineStart) || 0) -\n (parseFloat(containerStyle.paddingInlineEnd) || 0);\n\n const visibleCount = getVisibleItemCount(\n items.map((item) => item.getBoundingClientRect().width / scale),\n availableWidth,\n more.getBoundingClientRect().width / scale,\n );\n\n items.forEach((item, index) => {\n item.style.visibility = index < visibleCount ? \"\" : \"hidden\";\n });\n\n const menuHasCurrentItem = items\n .slice(visibleCount)\n .some(\n (item) =>\n !!item.querySelector('[aria-current]:not([aria-current=\"false\"])'),\n );\n\n setState((previous) => {\n const next: CollapsingItemsState = {\n visibleCount,\n hasOverflow: visibleCount < items.length,\n menuHasCurrentItem,\n };\n\n const isUnchanged =\n previous.visibleCount === next.visibleCount &&\n previous.hasOverflow === next.hasOverflow &&\n previous.menuHasCurrentItem === next.menuHasCurrentItem;\n\n return isUnchanged ? previous : next;\n });\n }, []);\n\n // Runs after every render (no dependency array): the rendered items may\n // have changed, so the observed elements are re-collected and re-measured.\n // `update()` only triggers a re-render when the computed state changed.\n useLayoutEffect(() => {\n const list = listRef.current;\n const more = moreRef.current;\n const container = list?.parentElement;\n\n if (!list || !more || !container) {\n return;\n }\n\n const observer = createFrameResizeObserver(update);\n observer.observe([container, more, ...list.children]);\n\n update();\n\n return () => observer.disconnect();\n });\n\n return { ...state, listRef, moreRef };\n};\n\nexport default useCollapsingItems;\n"],"mappings":";;;;;;AAmBA,IAAM,eAAqC;CACzC,cAAc;CACd,aAAa;CACb,oBAAoB;AACtB;;;;;;;;;AAUA,IAAa,2BAAqD;CAChE,MAAM,UAAU,OAAyB,IAAI;CAC7C,MAAM,UAAU,OAAuB,IAAI;CAE3C,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAE/C,MAAM,SAAS,kBAAkB;EAC/B,MAAM,OAAO,QAAQ;EACrB,MAAM,OAAO,QAAQ;EACrB,MAAM,YAAY,MAAM;EAExB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WACrB;EAGF,MAAM,QAAQ,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QACrC,UAAgC,iBAAiB,WACpD;EAEA,MAAM,iBAAiB,OAAO,iBAAiB,SAAS;EASxD,MAAM,QACJ,UAAU,cAAc,IACpB,UAAU,sBAAsB,CAAC,CAAC,QAAQ,UAAU,cACpD;EAEN,MAAM,iBACJ,UAAU,eACT,WAAW,eAAe,kBAAkB,KAAK,MACjD,WAAW,eAAe,gBAAgB,KAAK;EAElD,MAAM,eAAe,oBACnB,MAAM,KAAK,SAAS,KAAK,sBAAsB,CAAC,CAAC,QAAQ,KAAK,GAC9D,gBACA,KAAK,sBAAsB,CAAC,CAAC,QAAQ,KACvC;EAEA,MAAM,SAAS,MAAM,UAAU;GAC7B,KAAK,MAAM,aAAa,QAAQ,eAAe,KAAK;EACtD,CAAC;EAED,MAAM,qBAAqB,MACxB,MAAM,YAAY,CAAC,CACnB,MACE,SACC,CAAC,CAAC,KAAK,cAAc,8CAA4C,CACrE;EAEF,UAAU,aAAa;GACrB,MAAM,OAA6B;IACjC;IACA,aAAa,eAAe,MAAM;IAClC;GACF;GAOA,OAJE,SAAS,iBAAiB,KAAK,gBAC/B,SAAS,gBAAgB,KAAK,eAC9B,SAAS,uBAAuB,KAAK,qBAElB,WAAW;EAClC,CAAC;CACH,GAAG,CAAC,CAAC;CAKL,sBAAsB;EACpB,MAAM,OAAO,QAAQ;EACrB,MAAM,OAAO,QAAQ;EACrB,MAAM,YAAY,MAAM;EAExB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WACrB;EAGF,MAAM,WAAW,0BAA0B,MAAM;EACjD,SAAS,QAAQ;GAAC;GAAW;GAAM,GAAG,KAAK;EAAQ,CAAC;EAEpD,OAAO;EAEP,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EAAE,GAAG;EAAO;EAAS;CAAQ;AACtC"}
@@ -31,9 +31,10 @@ var useTabIndicator = (isCollapsed) => {
31
31
  }
32
32
  const rootRect = root.getBoundingClientRect();
33
33
  const selectedTabRect = selectedTab.getBoundingClientRect();
34
+ const scale = root.offsetWidth > 0 ? rootRect.width / root.offsetWidth : 1;
34
35
  const nextIndicator = {
35
- x: selectedTabRect.left - rootRect.left,
36
- width: selectedTabRect.width,
36
+ x: (selectedTabRect.left - rootRect.left) / scale,
37
+ width: selectedTabRect.width / scale,
37
38
  isAnimated: hasMeasuredRef.current
38
39
  };
39
40
  setIndicator((previousIndicator) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useTabIndicator.mjs","names":[],"sources":["../../../../../../../../src/components/Tabs/lib/useTabIndicator.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport { createFrameResizeObserver } from \"@/lib/dom/createFrameResizeObserver\";\n\ninterface TabIndicatorState {\n x: number;\n width: number;\n isAnimated: boolean;\n}\n\ninterface TabIndicatorStyle extends CSSProperties {\n \"--tab-indicator-x\": string;\n \"--tab-indicator-width\": string;\n}\n\nconst getTabIndicatorStyle = (\n state: TabIndicatorState | undefined,\n): TabIndicatorStyle | undefined =>\n state && {\n \"--tab-indicator-x\": `${state.x}px`,\n \"--tab-indicator-width\": `${state.width}px`,\n };\n\nexport const useTabIndicator = (isCollapsed: boolean) => {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const titlesRef = useRef<HTMLDivElement | null>(null);\n const hasMeasuredRef = useRef(false);\n const [indicator, setIndicator] = useState<TabIndicatorState | undefined>();\n\n const resetIndicator = () => {\n hasMeasuredRef.current = false;\n // React bails out of the re-render when the state is already `undefined`.\n setIndicator(undefined);\n };\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n const titles = titlesRef.current;\n\n if (!root || !titles || isCollapsed) {\n resetIndicator();\n return;\n }\n\n const measureIndicator = () => {\n const selectedTab = titles.querySelector<HTMLElement>(\"[data-selected]\");\n\n if (!selectedTab) {\n resetIndicator();\n return;\n }\n\n const rootRect = root.getBoundingClientRect();\n const selectedTabRect = selectedTab.getBoundingClientRect();\n const nextIndicator: TabIndicatorState = {\n x: selectedTabRect.left - rootRect.left,\n width: selectedTabRect.width,\n isAnimated: hasMeasuredRef.current,\n };\n\n setIndicator((previousIndicator) => {\n if (\n previousIndicator &&\n previousIndicator.x === nextIndicator.x &&\n previousIndicator.width === nextIndicator.width &&\n previousIndicator.isAnimated === nextIndicator.isAnimated\n ) {\n return previousIndicator;\n }\n\n return nextIndicator;\n });\n\n hasMeasuredRef.current = true;\n };\n\n measureIndicator();\n\n const observer = createFrameResizeObserver(measureIndicator);\n observer.observe([root, titles]);\n\n return () => observer.disconnect();\n });\n\n return {\n rootRef,\n titlesRef,\n indicatorStyle: getTabIndicatorStyle(indicator),\n isAnimated: indicator?.isAnimated ?? false,\n };\n};\n"],"mappings":";;;;;AAeA,IAAM,wBACJ,UAEA,SAAS;CACP,qBAAqB,GAAG,MAAM,EAAE;CAChC,yBAAyB,GAAG,MAAM,MAAM;AAC1C;AAEF,IAAa,mBAAmB,gBAAyB;CACvD,MAAM,UAAU,OAA8B,IAAI;CAClD,MAAM,YAAY,OAA8B,IAAI;CACpD,MAAM,iBAAiB,OAAO,KAAK;CACnC,MAAM,CAAC,WAAW,gBAAgB,SAAwC;CAE1E,MAAM,uBAAuB;EAC3B,eAAe,UAAU;EAEzB,aAAa,KAAA,CAAS;CACxB;CAEA,sBAAsB;EACpB,MAAM,OAAO,QAAQ;EACrB,MAAM,SAAS,UAAU;EAEzB,IAAI,CAAC,QAAQ,CAAC,UAAU,aAAa;GACnC,eAAe;GACf;EACF;EAEA,MAAM,yBAAyB;GAC7B,MAAM,cAAc,OAAO,cAA2B,iBAAiB;GAEvE,IAAI,CAAC,aAAa;IAChB,eAAe;IACf;GACF;GAEA,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,kBAAkB,YAAY,sBAAsB;GAC1D,MAAM,gBAAmC;IACvC,GAAG,gBAAgB,OAAO,SAAS;IACnC,OAAO,gBAAgB;IACvB,YAAY,eAAe;GAC7B;GAEA,cAAc,sBAAsB;IAClC,IACE,qBACA,kBAAkB,MAAM,cAAc,KACtC,kBAAkB,UAAU,cAAc,SAC1C,kBAAkB,eAAe,cAAc,YAE/C,OAAO;IAGT,OAAO;GACT,CAAC;GAED,eAAe,UAAU;EAC3B;EAEA,iBAAiB;EAEjB,MAAM,WAAW,0BAA0B,gBAAgB;EAC3D,SAAS,QAAQ,CAAC,MAAM,MAAM,CAAC;EAE/B,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EACL;EACA;EACA,gBAAgB,qBAAqB,SAAS;EAC9C,YAAY,WAAW,cAAc;CACvC;AACF"}
1
+ {"version":3,"file":"useTabIndicator.mjs","names":[],"sources":["../../../../../../../../src/components/Tabs/lib/useTabIndicator.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport { createFrameResizeObserver } from \"@/lib/dom/createFrameResizeObserver\";\n\ninterface TabIndicatorState {\n x: number;\n width: number;\n isAnimated: boolean;\n}\n\ninterface TabIndicatorStyle extends CSSProperties {\n \"--tab-indicator-x\": string;\n \"--tab-indicator-width\": string;\n}\n\nconst getTabIndicatorStyle = (\n state: TabIndicatorState | undefined,\n): TabIndicatorStyle | undefined =>\n state && {\n \"--tab-indicator-x\": `${state.x}px`,\n \"--tab-indicator-width\": `${state.width}px`,\n };\n\nexport const useTabIndicator = (isCollapsed: boolean) => {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const titlesRef = useRef<HTMLDivElement | null>(null);\n const hasMeasuredRef = useRef(false);\n const [indicator, setIndicator] = useState<TabIndicatorState | undefined>();\n\n const resetIndicator = () => {\n hasMeasuredRef.current = false;\n // React bails out of the re-render when the state is already `undefined`.\n setIndicator(undefined);\n };\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n const titles = titlesRef.current;\n\n if (!root || !titles || isCollapsed) {\n resetIndicator();\n return;\n }\n\n const measureIndicator = () => {\n const selectedTab = titles.querySelector<HTMLElement>(\"[data-selected]\");\n\n if (!selectedTab) {\n resetIndicator();\n return;\n }\n\n const rootRect = root.getBoundingClientRect();\n const selectedTabRect = selectedTab.getBoundingClientRect();\n\n /*\n * `getBoundingClientRect` reports rendered pixels, but the custom\n * properties below are read as lengths inside the same subtree. Where an\n * ancestor scales it — a `transform`, a CSS `zoom` — the two differ, and\n * writing the rendered value back scales it a second time. The root's own\n * rendered and layout width give the factor between them.\n */\n const scale =\n root.offsetWidth > 0 ? rootRect.width / root.offsetWidth : 1;\n\n const nextIndicator: TabIndicatorState = {\n x: (selectedTabRect.left - rootRect.left) / scale,\n width: selectedTabRect.width / scale,\n isAnimated: hasMeasuredRef.current,\n };\n\n setIndicator((previousIndicator) => {\n if (\n previousIndicator &&\n previousIndicator.x === nextIndicator.x &&\n previousIndicator.width === nextIndicator.width &&\n previousIndicator.isAnimated === nextIndicator.isAnimated\n ) {\n return previousIndicator;\n }\n\n return nextIndicator;\n });\n\n hasMeasuredRef.current = true;\n };\n\n measureIndicator();\n\n const observer = createFrameResizeObserver(measureIndicator);\n observer.observe([root, titles]);\n\n return () => observer.disconnect();\n });\n\n return {\n rootRef,\n titlesRef,\n indicatorStyle: getTabIndicatorStyle(indicator),\n isAnimated: indicator?.isAnimated ?? false,\n };\n};\n"],"mappings":";;;;;AAeA,IAAM,wBACJ,UAEA,SAAS;CACP,qBAAqB,GAAG,MAAM,EAAE;CAChC,yBAAyB,GAAG,MAAM,MAAM;AAC1C;AAEF,IAAa,mBAAmB,gBAAyB;CACvD,MAAM,UAAU,OAA8B,IAAI;CAClD,MAAM,YAAY,OAA8B,IAAI;CACpD,MAAM,iBAAiB,OAAO,KAAK;CACnC,MAAM,CAAC,WAAW,gBAAgB,SAAwC;CAE1E,MAAM,uBAAuB;EAC3B,eAAe,UAAU;EAEzB,aAAa,KAAA,CAAS;CACxB;CAEA,sBAAsB;EACpB,MAAM,OAAO,QAAQ;EACrB,MAAM,SAAS,UAAU;EAEzB,IAAI,CAAC,QAAQ,CAAC,UAAU,aAAa;GACnC,eAAe;GACf;EACF;EAEA,MAAM,yBAAyB;GAC7B,MAAM,cAAc,OAAO,cAA2B,iBAAiB;GAEvE,IAAI,CAAC,aAAa;IAChB,eAAe;IACf;GACF;GAEA,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,kBAAkB,YAAY,sBAAsB;GAS1D,MAAM,QACJ,KAAK,cAAc,IAAI,SAAS,QAAQ,KAAK,cAAc;GAE7D,MAAM,gBAAmC;IACvC,IAAI,gBAAgB,OAAO,SAAS,QAAQ;IAC5C,OAAO,gBAAgB,QAAQ;IAC/B,YAAY,eAAe;GAC7B;GAEA,cAAc,sBAAsB;IAClC,IACE,qBACA,kBAAkB,MAAM,cAAc,KACtC,kBAAkB,UAAU,cAAc,SAC1C,kBAAkB,eAAe,cAAc,YAE/C,OAAO;IAGT,OAAO;GACT,CAAC;GAED,eAAe,UAAU;EAC3B;EAEA,iBAAiB;EAEjB,MAAM,WAAW,0BAA0B,gBAAgB;EAC3D,SAAS,QAAQ,CAAC,MAAM,MAAM,CAAC;EAE/B,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EACL;EACA;EACA,gBAAgB,qBAAqB,SAAS;EAC9C,YAAY,WAAW,cAAc;CACvC;AACF"}
@@ -33,7 +33,7 @@ var runWithGrantedModalClose = (modalController, operation) => {
33
33
  return result;
34
34
  };
35
35
  function Form(props) {
36
- const { form, children, onSubmit: onSubmitProp, formComponent = DefaultFormComponent, isReadOnly, ref, id: idProp, autoReset = true, submitController: submitControllerFromProps, ...formProps } = props;
36
+ const { form, children, onSubmit: onSubmitProp, formComponent = DefaultFormComponent, isReadOnly, ref, id: idProp, autoReset = true, confirmModalCloseOnUnsavedChanges: confirmModalCloseOnUnsavedChangesProp, submitController: submitControllerFromProps, ...formProps } = props;
37
37
  const newFormId = useId();
38
38
  const formId = idProp ?? newFormId;
39
39
  const FormComponent = useMemo(() => formComponent, [formId]);
@@ -43,7 +43,8 @@ function Form(props) {
43
43
  const defaultSubmitController = useFormSubmitController();
44
44
  const submitController = submitControllerFromProps ? submitControllerFromProps.submit.extend(defaultSubmitController) : defaultSubmitController;
45
45
  const autoResetOptions = typeof autoReset === "boolean" ? { onAfterModalClose: autoReset } : autoReset;
46
- const { confirmModalCloseOnUnsavedChanges } = useComponentDefaults("Form");
46
+ const defaults = useComponentDefaults("Form");
47
+ const confirmModalCloseOnUnsavedChanges = confirmModalCloseOnUnsavedChangesProp ?? defaults.confirmModalCloseOnUnsavedChanges;
47
48
  const modalController = useModalController();
48
49
  modalController.useUpdateOptions({ confirmOnClose: confirmModalCloseOnUnsavedChanges ? isDirty : void 0 });
49
50
  modalController.useOnClosed(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"Form.mjs","names":[],"sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import { FormContextProvider } from \"@/integrations/react-hook-form/components/FormContextProvider/FormContextProvider\";\nimport { useComponentDefaults } from \"@/components/ComponentDefaultsProvider\";\nimport { type OverlayController, useModalController } from \"@/lib/controller\";\nimport {\n type BaseSyntheticEvent,\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n type Ref,\n type SubmitEventHandler,\n useId,\n useMemo,\n useRef,\n} from \"react\";\nimport type {\n FieldValues,\n Path,\n SubmitHandler,\n UseFormReturn,\n} from \"react-hook-form\";\nimport { FormProvider as RhfFormContextProvider } from \"react-hook-form\";\nimport { useFormRootErrorController } from \"../FormRootError/useFormRootErrorController\";\nimport { FormRootError } from \"../../lib/FormRootError\";\nimport { useFormSettings } from \"../FormSettingsProvider/FormSettingsProvider\";\nimport {\n useFormSubmitController,\n type WithFormSubmitControllerProps,\n} from \"@/integrations/react-hook-form/components/Form/hooks/useFormSubmitController\";\nimport { useHotkeySubmit } from \"@/integrations/react-hook-form/components/Form/hooks/useHotkeySubmit\";\n\nexport type FormOnSubmitHandler<F extends FieldValues> = SubmitHandler<F>;\n\nexport type AfterFormSubmitCallback = (...unknownArgs: unknown[]) => unknown;\n\nexport interface FormAutoResetOptions {\n /**\n * Whether the form is reset to its default values after the surrounding modal\n * has closed.\n *\n * @default true\n */\n onAfterModalClose?: boolean;\n}\n\ntype FormComponentType = FC<\n PropsWithChildren<{\n id: string;\n onSubmit?: SubmitEventHandler | FormOnSubmitHandler<never>;\n ref?: Ref<HTMLFormElement>;\n }>\n>;\n\nexport interface FormProps<F extends FieldValues>\n extends\n Omit<ComponentProps<\"form\">, \"onSubmit\">,\n PropsWithChildren,\n WithFormSubmitControllerProps {\n /** The react-hook-form instance returned by `useForm()`. */\n form: UseFormReturn<F>;\n /**\n * Called with the validated form values when the form is submitted. Returning\n * a promise keeps the submit button pending until it settles.\n */\n onSubmit: FormOnSubmitHandler<F>;\n /**\n * The component rendered as the form element. Use it to render the form with\n * a routers form component. Defaults to a plain `<form />`.\n */\n formComponent?: FC<Omit<FormComponentType, \"ref\">>;\n /**\n * Whether all fields of the form can be read but not edited.\n *\n * @default false\n */\n isReadOnly?: boolean;\n /**\n * When the form is reset to its default values. `true` resets it after the\n * surrounding modal has closed, `false` never resets it.\n *\n * @default true\n */\n autoReset?: FormAutoResetOptions | boolean;\n}\n\nconst DefaultFormComponent: FormComponentType = (p) => <form {...p} />;\n\n/**\n * Runs `operation` while closing the surrounding Modal is allowed without a\n * confirmation, and drops that permission again as soon as the operation has\n * settled. Scoping it to the operation is what keeps a submit that only\n * advances a wizard step from disarming the confirmation for good (#2775).\n */\nconst runWithGrantedModalClose = (\n modalController: OverlayController,\n operation: () => unknown,\n): unknown => {\n const releaseGrant = modalController.grantCloseWithoutConfirmation();\n\n let result: unknown;\n try {\n result = operation();\n } catch (error) {\n releaseGrant();\n throw error;\n }\n\n if (result instanceof Promise) {\n return result.finally(releaseGrant);\n }\n releaseGrant();\n return result;\n};\n\nexport function Form<F extends FieldValues>(props: FormProps<F>) {\n const {\n form,\n children,\n onSubmit: onSubmitProp,\n formComponent = DefaultFormComponent,\n isReadOnly,\n ref,\n id: idProp,\n autoReset = true,\n submitController: submitControllerFromProps,\n ...formProps\n } = props;\n\n const newFormId = useId();\n const formId = idProp ?? newFormId;\n const FormComponent = useMemo(() => formComponent, [formId]);\n const afterSubmitCallback = useRef<AfterFormSubmitCallback>(undefined);\n const { isDirty } = form.formState;\n const rootErrorController = useFormRootErrorController();\n\n const defaultSubmitController = useFormSubmitController();\n const submitController = submitControllerFromProps\n ? submitControllerFromProps.submit.extend(defaultSubmitController)\n : defaultSubmitController;\n\n const autoResetOptions =\n typeof autoReset === \"boolean\"\n ? { onAfterModalClose: autoReset }\n : autoReset;\n\n const { confirmModalCloseOnUnsavedChanges } = useComponentDefaults(\"Form\");\n\n const modalController = useModalController();\n modalController.useUpdateOptions({\n // A dirty Form contributes one close confirmation source to the surrounding\n // Modal; sources are combined, so a clean Form does not overrule a\n // `<Modal confirmOnClose>`. The Modal renders the confirmation dialog.\n // An application that switched the default off contributes nothing at all.\n confirmOnClose: confirmModalCloseOnUnsavedChanges ? isDirty : undefined,\n });\n modalController.useOnClosed(() => {\n if (autoResetOptions?.onAfterModalClose) {\n form.reset();\n }\n });\n\n const { submitInterceptor } = useFormSettings();\n const onSubmit = submitInterceptor\n ? (values: F) => submitInterceptor<F>(onSubmitProp, values, { form })\n : onSubmitProp;\n\n const handleSubmitResult = (result: unknown) => {\n if (typeof result === \"function\") {\n afterSubmitCallback.current = result as AfterFormSubmitCallback;\n }\n const rootError = form.getFieldState(\"root\" as Path<F>)?.error;\n if (rootError && !rootErrorController.errorComponentMounted) {\n throw new FormRootError(rootError);\n }\n };\n\n const handleSubmit = async (e?: BaseSyntheticEvent | F): Promise<void> => {\n const formEvent =\n e && \"nativeEvent\" in e ? (e as BaseSyntheticEvent) : undefined;\n formEvent?.stopPropagation();\n\n // react-hook-form's submit handler resolves with an unknown value; the\n // submit controller only awaits it, so drop the result.\n await form.handleSubmit((values, event) =>\n runWithGrantedModalClose(modalController, () => {\n const submitResult = onSubmit(values, event);\n if (submitResult instanceof Promise) {\n return submitResult.then(handleSubmitResult);\n }\n handleSubmitResult(submitResult);\n }),\n )(formEvent);\n };\n submitController.submit.set(handleSubmit);\n\n const onAfterSuccessFeedback = () => {\n const callback = afterSubmitCallback.current;\n if (!callback) {\n return;\n }\n // The callback runs after the submit itself has finished (and after\n // SubmitButton's success feedback), so it needs its own permission to close\n // the Modal.\n runWithGrantedModalClose(modalController, callback);\n };\n\n const refWithHotkeySubmit = useHotkeySubmit({\n ref,\n submitController,\n });\n\n return (\n <RhfFormContextProvider {...form}>\n <FormContextProvider\n form={form as UseFormReturn}\n isReadOnly={isReadOnly}\n id={formId}\n onAfterSuccessFeedback={onAfterSuccessFeedback}\n rootErrorController={rootErrorController}\n >\n <FormComponent\n {...formProps}\n ref={refWithHotkeySubmit}\n id={formId}\n onSubmit={handleSubmit}\n >\n {children}\n </FormComponent>\n </FormContextProvider>\n </RhfFormContextProvider>\n );\n}\n\nexport default Form;\n"],"mappings":";;;;;;;;;;;;;;AAoFA,IAAM,wBAA2C,MAAM,oBAAC,QAAD,EAAM,GAAI,EAAI,CAAA;;;;;;;AAQrE,IAAM,4BACJ,iBACA,cACY;CACZ,MAAM,eAAe,gBAAgB,8BAA8B;CAEnE,IAAI;CACJ,IAAI;EACF,SAAS,UAAU;CACrB,SAAS,OAAO;EACd,aAAa;EACb,MAAM;CACR;CAEA,IAAI,kBAAkB,SACpB,OAAO,OAAO,QAAQ,YAAY;CAEpC,aAAa;CACb,OAAO;AACT;AAEA,SAAgB,KAA4B,OAAqB;CAC/D,MAAM,EACJ,MACA,UACA,UAAU,cACV,gBAAgB,sBAChB,YACA,KACA,IAAI,QACJ,YAAY,MACZ,kBAAkB,2BAClB,GAAG,cACD;CAEJ,MAAM,YAAY,MAAM;CACxB,MAAM,SAAS,UAAU;CACzB,MAAM,gBAAgB,cAAc,eAAe,CAAC,MAAM,CAAC;CAC3D,MAAM,sBAAsB,OAAgC,KAAA,CAAS;CACrE,MAAM,EAAE,YAAY,KAAK;CACzB,MAAM,sBAAsB,2BAA2B;CAEvD,MAAM,0BAA0B,wBAAwB;CACxD,MAAM,mBAAmB,4BACrB,0BAA0B,OAAO,OAAO,uBAAuB,IAC/D;CAEJ,MAAM,mBACJ,OAAO,cAAc,YACjB,EAAE,mBAAmB,UAAU,IAC/B;CAEN,MAAM,EAAE,sCAAsC,qBAAqB,MAAM;CAEzE,MAAM,kBAAkB,mBAAmB;CAC3C,gBAAgB,iBAAiB,EAK/B,gBAAgB,oCAAoC,UAAU,KAAA,EAChE,CAAC;CACD,gBAAgB,kBAAkB;EAChC,IAAI,kBAAkB,mBACpB,KAAK,MAAM;CAEf,CAAC;CAED,MAAM,EAAE,sBAAsB,gBAAgB;CAC9C,MAAM,WAAW,qBACZ,WAAc,kBAAqB,cAAc,QAAQ,EAAE,KAAK,CAAC,IAClE;CAEJ,MAAM,sBAAsB,WAAoB;EAC9C,IAAI,OAAO,WAAW,YACpB,oBAAoB,UAAU;EAEhC,MAAM,YAAY,KAAK,cAAc,MAAiB,CAAC,EAAE;EACzD,IAAI,aAAa,CAAC,oBAAoB,uBACpC,MAAM,IAAI,cAAc,SAAS;CAErC;CAEA,MAAM,eAAe,OAAO,MAA8C;EACxE,MAAM,YACJ,KAAK,iBAAiB,IAAK,IAA2B,KAAA;EACxD,WAAW,gBAAgB;EAI3B,MAAM,KAAK,cAAc,QAAQ,UAC/B,yBAAyB,uBAAuB;GAC9C,MAAM,eAAe,SAAS,QAAQ,KAAK;GAC3C,IAAI,wBAAwB,SAC1B,OAAO,aAAa,KAAK,kBAAkB;GAE7C,mBAAmB,YAAY;EACjC,CAAC,CACH,CAAC,CAAC,SAAS;CACb;CACA,iBAAiB,OAAO,IAAI,YAAY;CAExC,MAAM,+BAA+B;EACnC,MAAM,WAAW,oBAAoB;EACrC,IAAI,CAAC,UACH;EAKF,yBAAyB,iBAAiB,QAAQ;CACpD;CAEA,MAAM,sBAAsB,gBAAgB;EAC1C;EACA;CACF,CAAC;CAED,OACE,oBAAC,cAAD;EAAwB,GAAI;EAC1B,UAAA,oBAAC,qBAAD;GACQ;GACM;GACZ,IAAI;GACoB;GACH;GAErB,UAAA,oBAAC,eAAD;IACE,GAAI;IACJ,KAAK;IACL,IAAI;IACJ,UAAU;IAET;GACY,CAAA;EACI,CAAA;CACC,CAAA;AAE5B"}
1
+ {"version":3,"file":"Form.mjs","names":[],"sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import { FormContextProvider } from \"@/integrations/react-hook-form/components/FormContextProvider/FormContextProvider\";\nimport { useComponentDefaults } from \"@/components/ComponentDefaultsProvider\";\nimport { type OverlayController, useModalController } from \"@/lib/controller\";\nimport {\n type BaseSyntheticEvent,\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n type Ref,\n type SubmitEventHandler,\n useId,\n useMemo,\n useRef,\n} from \"react\";\nimport type {\n FieldValues,\n Path,\n SubmitHandler,\n UseFormReturn,\n} from \"react-hook-form\";\nimport { FormProvider as RhfFormContextProvider } from \"react-hook-form\";\nimport { useFormRootErrorController } from \"../FormRootError/useFormRootErrorController\";\nimport { FormRootError } from \"../../lib/FormRootError\";\nimport { useFormSettings } from \"../FormSettingsProvider/FormSettingsProvider\";\nimport {\n useFormSubmitController,\n type WithFormSubmitControllerProps,\n} from \"@/integrations/react-hook-form/components/Form/hooks/useFormSubmitController\";\nimport { useHotkeySubmit } from \"@/integrations/react-hook-form/components/Form/hooks/useHotkeySubmit\";\n\nexport type FormOnSubmitHandler<F extends FieldValues> = SubmitHandler<F>;\n\nexport type AfterFormSubmitCallback = (...unknownArgs: unknown[]) => unknown;\n\nexport interface FormAutoResetOptions {\n /**\n * Whether the form is reset to its default values after the surrounding modal\n * has closed.\n *\n * @default true\n */\n onAfterModalClose?: boolean;\n}\n\ntype FormComponentType = FC<\n PropsWithChildren<{\n id: string;\n onSubmit?: SubmitEventHandler | FormOnSubmitHandler<never>;\n ref?: Ref<HTMLFormElement>;\n }>\n>;\n\nexport interface FormProps<F extends FieldValues>\n extends\n Omit<ComponentProps<\"form\">, \"onSubmit\">,\n PropsWithChildren,\n WithFormSubmitControllerProps {\n /** The react-hook-form instance returned by `useForm()`. */\n form: UseFormReturn<F>;\n /**\n * Called with the validated form values when the form is submitted. Returning\n * a promise keeps the submit button pending until it settles.\n */\n onSubmit: FormOnSubmitHandler<F>;\n /**\n * The component rendered as the form element. Use it to render the form with\n * a routers form component. Defaults to a plain `<form />`.\n */\n formComponent?: FC<Omit<FormComponentType, \"ref\">>;\n /**\n * Whether all fields of the form can be read but not edited.\n *\n * @default false\n */\n isReadOnly?: boolean;\n /**\n * When the form is reset to its default values. `true` resets it after the\n * surrounding modal has closed, `false` never resets it.\n *\n * @default true\n */\n autoReset?: FormAutoResetOptions | boolean;\n /**\n * Whether closing the surrounding modal must be confirmed while the form has\n * unsaved changes. Overrides `Form.confirmModalCloseOnUnsavedChanges` of the\n * `ComponentDefaultsProvider`.\n *\n * @default true\n */\n confirmModalCloseOnUnsavedChanges?: boolean;\n}\n\nconst DefaultFormComponent: FormComponentType = (p) => <form {...p} />;\n\n/**\n * Runs `operation` while closing the surrounding Modal is allowed without a\n * confirmation, and drops that permission again as soon as the operation has\n * settled. Scoping it to the operation is what keeps a submit that only\n * advances a wizard step from disarming the confirmation for good (#2775).\n */\nconst runWithGrantedModalClose = (\n modalController: OverlayController,\n operation: () => unknown,\n): unknown => {\n const releaseGrant = modalController.grantCloseWithoutConfirmation();\n\n let result: unknown;\n try {\n result = operation();\n } catch (error) {\n releaseGrant();\n throw error;\n }\n\n if (result instanceof Promise) {\n return result.finally(releaseGrant);\n }\n releaseGrant();\n return result;\n};\n\nexport function Form<F extends FieldValues>(props: FormProps<F>) {\n const {\n form,\n children,\n onSubmit: onSubmitProp,\n formComponent = DefaultFormComponent,\n isReadOnly,\n ref,\n id: idProp,\n autoReset = true,\n confirmModalCloseOnUnsavedChanges: confirmModalCloseOnUnsavedChangesProp,\n submitController: submitControllerFromProps,\n ...formProps\n } = props;\n\n const newFormId = useId();\n const formId = idProp ?? newFormId;\n const FormComponent = useMemo(() => formComponent, [formId]);\n const afterSubmitCallback = useRef<AfterFormSubmitCallback>(undefined);\n const { isDirty } = form.formState;\n const rootErrorController = useFormRootErrorController();\n\n const defaultSubmitController = useFormSubmitController();\n const submitController = submitControllerFromProps\n ? submitControllerFromProps.submit.extend(defaultSubmitController)\n : defaultSubmitController;\n\n const autoResetOptions =\n typeof autoReset === \"boolean\"\n ? { onAfterModalClose: autoReset }\n : autoReset;\n\n const defaults = useComponentDefaults(\"Form\");\n const confirmModalCloseOnUnsavedChanges =\n confirmModalCloseOnUnsavedChangesProp ??\n defaults.confirmModalCloseOnUnsavedChanges;\n\n const modalController = useModalController();\n modalController.useUpdateOptions({\n // A dirty Form contributes one close confirmation source to the surrounding\n // Modal; sources are combined, so a clean Form does not overrule a\n // `<Modal confirmOnClose>`. The Modal renders the confirmation dialog.\n // A Form that switched it off contributes nothing at all.\n confirmOnClose: confirmModalCloseOnUnsavedChanges ? isDirty : undefined,\n });\n modalController.useOnClosed(() => {\n if (autoResetOptions?.onAfterModalClose) {\n form.reset();\n }\n });\n\n const { submitInterceptor } = useFormSettings();\n const onSubmit = submitInterceptor\n ? (values: F) => submitInterceptor<F>(onSubmitProp, values, { form })\n : onSubmitProp;\n\n const handleSubmitResult = (result: unknown) => {\n if (typeof result === \"function\") {\n afterSubmitCallback.current = result as AfterFormSubmitCallback;\n }\n const rootError = form.getFieldState(\"root\" as Path<F>)?.error;\n if (rootError && !rootErrorController.errorComponentMounted) {\n throw new FormRootError(rootError);\n }\n };\n\n const handleSubmit = async (e?: BaseSyntheticEvent | F): Promise<void> => {\n const formEvent =\n e && \"nativeEvent\" in e ? (e as BaseSyntheticEvent) : undefined;\n formEvent?.stopPropagation();\n\n // react-hook-form's submit handler resolves with an unknown value; the\n // submit controller only awaits it, so drop the result.\n await form.handleSubmit((values, event) =>\n runWithGrantedModalClose(modalController, () => {\n const submitResult = onSubmit(values, event);\n if (submitResult instanceof Promise) {\n return submitResult.then(handleSubmitResult);\n }\n handleSubmitResult(submitResult);\n }),\n )(formEvent);\n };\n submitController.submit.set(handleSubmit);\n\n const onAfterSuccessFeedback = () => {\n const callback = afterSubmitCallback.current;\n if (!callback) {\n return;\n }\n // The callback runs after the submit itself has finished (and after\n // SubmitButton's success feedback), so it needs its own permission to close\n // the Modal.\n runWithGrantedModalClose(modalController, callback);\n };\n\n const refWithHotkeySubmit = useHotkeySubmit({\n ref,\n submitController,\n });\n\n return (\n <RhfFormContextProvider {...form}>\n <FormContextProvider\n form={form as UseFormReturn}\n isReadOnly={isReadOnly}\n id={formId}\n onAfterSuccessFeedback={onAfterSuccessFeedback}\n rootErrorController={rootErrorController}\n >\n <FormComponent\n {...formProps}\n ref={refWithHotkeySubmit}\n id={formId}\n onSubmit={handleSubmit}\n >\n {children}\n </FormComponent>\n </FormContextProvider>\n </RhfFormContextProvider>\n );\n}\n\nexport default Form;\n"],"mappings":";;;;;;;;;;;;;;AA4FA,IAAM,wBAA2C,MAAM,oBAAC,QAAD,EAAM,GAAI,EAAI,CAAA;;;;;;;AAQrE,IAAM,4BACJ,iBACA,cACY;CACZ,MAAM,eAAe,gBAAgB,8BAA8B;CAEnE,IAAI;CACJ,IAAI;EACF,SAAS,UAAU;CACrB,SAAS,OAAO;EACd,aAAa;EACb,MAAM;CACR;CAEA,IAAI,kBAAkB,SACpB,OAAO,OAAO,QAAQ,YAAY;CAEpC,aAAa;CACb,OAAO;AACT;AAEA,SAAgB,KAA4B,OAAqB;CAC/D,MAAM,EACJ,MACA,UACA,UAAU,cACV,gBAAgB,sBAChB,YACA,KACA,IAAI,QACJ,YAAY,MACZ,mCAAmC,uCACnC,kBAAkB,2BAClB,GAAG,cACD;CAEJ,MAAM,YAAY,MAAM;CACxB,MAAM,SAAS,UAAU;CACzB,MAAM,gBAAgB,cAAc,eAAe,CAAC,MAAM,CAAC;CAC3D,MAAM,sBAAsB,OAAgC,KAAA,CAAS;CACrE,MAAM,EAAE,YAAY,KAAK;CACzB,MAAM,sBAAsB,2BAA2B;CAEvD,MAAM,0BAA0B,wBAAwB;CACxD,MAAM,mBAAmB,4BACrB,0BAA0B,OAAO,OAAO,uBAAuB,IAC/D;CAEJ,MAAM,mBACJ,OAAO,cAAc,YACjB,EAAE,mBAAmB,UAAU,IAC/B;CAEN,MAAM,WAAW,qBAAqB,MAAM;CAC5C,MAAM,oCACJ,yCACA,SAAS;CAEX,MAAM,kBAAkB,mBAAmB;CAC3C,gBAAgB,iBAAiB,EAK/B,gBAAgB,oCAAoC,UAAU,KAAA,EAChE,CAAC;CACD,gBAAgB,kBAAkB;EAChC,IAAI,kBAAkB,mBACpB,KAAK,MAAM;CAEf,CAAC;CAED,MAAM,EAAE,sBAAsB,gBAAgB;CAC9C,MAAM,WAAW,qBACZ,WAAc,kBAAqB,cAAc,QAAQ,EAAE,KAAK,CAAC,IAClE;CAEJ,MAAM,sBAAsB,WAAoB;EAC9C,IAAI,OAAO,WAAW,YACpB,oBAAoB,UAAU;EAEhC,MAAM,YAAY,KAAK,cAAc,MAAiB,CAAC,EAAE;EACzD,IAAI,aAAa,CAAC,oBAAoB,uBACpC,MAAM,IAAI,cAAc,SAAS;CAErC;CAEA,MAAM,eAAe,OAAO,MAA8C;EACxE,MAAM,YACJ,KAAK,iBAAiB,IAAK,IAA2B,KAAA;EACxD,WAAW,gBAAgB;EAI3B,MAAM,KAAK,cAAc,QAAQ,UAC/B,yBAAyB,uBAAuB;GAC9C,MAAM,eAAe,SAAS,QAAQ,KAAK;GAC3C,IAAI,wBAAwB,SAC1B,OAAO,aAAa,KAAK,kBAAkB;GAE7C,mBAAmB,YAAY;EACjC,CAAC,CACH,CAAC,CAAC,SAAS;CACb;CACA,iBAAiB,OAAO,IAAI,YAAY;CAExC,MAAM,+BAA+B;EACnC,MAAM,WAAW,oBAAoB;EACrC,IAAI,CAAC,UACH;EAKF,yBAAyB,iBAAiB,QAAQ;CACpD;CAEA,MAAM,sBAAsB,gBAAgB;EAC1C;EACA;CACF,CAAC;CAED,OACE,oBAAC,cAAD;EAAwB,GAAI;EAC1B,UAAA,oBAAC,qBAAD;GACQ;GACM;GACZ,IAAI;GACoB;GACH;GAErB,UAAA,oBAAC,eAAD;IACE,GAAI;IACJ,KAAK;IACL,IAAI;IACJ,UAAU;IAET;GACY,CAAA;EACI,CAAA;CACC,CAAA;AAE5B"}
@@ -460,6 +460,10 @@ var component_status_default = {
460
460
  "level": "stable",
461
461
  "isNew": false
462
462
  },
463
+ "@mittwald/flow-react-components/flr-universal#ComponentDefaultsProvider": {
464
+ "level": "stable",
465
+ "isNew": true
466
+ },
463
467
  "@mittwald/flow-react-components/flr-universal#CountryOptions": {
464
468
  "level": "stable",
465
469
  "isNew": false
@@ -1 +1 @@
1
- {"version":3,"file":"component-status.mjs","names":[],"sources":["../../../../../../src/status/component-status.json"],"sourcesContent":["{\n \"@mittwald/flow-react-components#AccentBox\": {\n \"level\": \"beta\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Accordion\": {\n \"level\": \"beta\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Action\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ActionGroup\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Activity\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Alert\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AlertBadge\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AlertIcon\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AlertText\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Align\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use Combine instead\"\n },\n \"@mittwald/flow-react-components#Autocomplete\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Avatar\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AvatarStack\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Badge\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#BigNumber\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Breadcrumb\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#BrowserOnly\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Button\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CartesianChart\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Chat\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Checkbox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CheckboxButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CheckboxGroup\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ClearPropsContext\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CoachMark\": {\n \"level\": \"beta\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#CodeBlock\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CodeEditor\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Color\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ColumnLayout\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Combine\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#ComboBox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ComponentDefaultsProvider\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#ComponentPropsContextProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Content\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ContextMenu\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ContextualHelp\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CopyButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CounterBadge\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CountryOptions\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DatePicker\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DateRangePicker\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DeprecationWarningProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Div\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DonutChart\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FieldDescription\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FieldError\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileCard\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileCardList\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileDropZone\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Flex\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Header\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#HeaderNavigation\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Heading\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Icon\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#IllustratedMessage\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Image\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ImageCropper\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Initials\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#InlineCode\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Kbd\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Label\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LabeledValue\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LayoutCard\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Legend\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LightBox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Link\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#List\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LoadingSpinner\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Markdown\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#MarkdownEditor\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#MenuItem\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Message\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#MessageThread\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Modal\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Navigation\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Notification\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#NotificationProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#NumberField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Option\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Overlay\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#OverlayTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#PasswordCreationField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Popover\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ProgressBar\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#RadioGroup\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#RangeCalendar\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Rating\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SearchField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Section\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SegmentedControl\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use `Tabs` to switch content, or `RadioGroup` to select a value.\"\n },\n \"@mittwald/flow-react-components#Select\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Separator\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SettingsProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Skeleton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SkeletonText\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Slider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SuspenseTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Switch\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TabNavigation\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Table\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Tabs\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Text\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TextArea\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TextField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TimeField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Tooltip\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TranslationProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Truncate\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TunnelEntry\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Wrap\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Action\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#ActionBatch\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#BrowserOnly\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#CountryOptions\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#DeprecationWarningProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#LightBox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#LightBoxTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#List\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#ListItemView\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Modal\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#ModalTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#NotificationProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Popover\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#PopoverTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#SettingsProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Wrap\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/nextjs#Link\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use RouterProvider instead\"\n },\n \"@mittwald/flow-react-components/nextjs#LinkProvider\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use RouterProvider instead\"\n },\n \"@mittwald/flow-react-components/nextjs#RouterProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#Field\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#Form\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#FormAction\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#FormRootError\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components/react-hook-form#FormSettingsProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#ResetButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#SubmitButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"component-status.mjs","names":[],"sources":["../../../../../../src/status/component-status.json"],"sourcesContent":["{\n \"@mittwald/flow-react-components#AccentBox\": {\n \"level\": \"beta\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Accordion\": {\n \"level\": \"beta\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Action\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ActionGroup\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Activity\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Alert\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AlertBadge\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AlertIcon\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AlertText\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Align\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use Combine instead\"\n },\n \"@mittwald/flow-react-components#Autocomplete\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Avatar\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#AvatarStack\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Badge\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#BigNumber\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Breadcrumb\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#BrowserOnly\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Button\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CartesianChart\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Chat\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Checkbox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CheckboxButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CheckboxGroup\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ClearPropsContext\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CoachMark\": {\n \"level\": \"beta\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#CodeBlock\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CodeEditor\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Color\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ColumnLayout\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Combine\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#ComboBox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ComponentDefaultsProvider\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#ComponentPropsContextProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Content\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ContextMenu\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ContextualHelp\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CopyButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CounterBadge\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#CountryOptions\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DatePicker\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DateRangePicker\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DeprecationWarningProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Div\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#DonutChart\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FieldDescription\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FieldError\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileCard\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileCardList\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileDropZone\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#FileField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Flex\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Header\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#HeaderNavigation\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Heading\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Icon\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#IllustratedMessage\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Image\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ImageCropper\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Initials\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#InlineCode\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Kbd\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Label\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LabeledValue\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LayoutCard\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Legend\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LightBox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Link\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#List\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#LoadingSpinner\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Markdown\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#MarkdownEditor\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#MenuItem\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Message\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#MessageThread\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Modal\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Navigation\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Notification\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#NotificationProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#NumberField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Option\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Overlay\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#OverlayTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#PasswordCreationField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Popover\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#ProgressBar\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#RadioGroup\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#RangeCalendar\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Rating\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SearchField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Section\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SegmentedControl\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use `Tabs` to switch content, or `RadioGroup` to select a value.\"\n },\n \"@mittwald/flow-react-components#Select\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Separator\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SettingsProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Skeleton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SkeletonText\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Slider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#SuspenseTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Switch\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TabNavigation\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components#Table\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Tabs\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Text\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TextArea\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TextField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TimeField\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Tooltip\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TranslationProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Truncate\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#TunnelEntry\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components#Wrap\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Action\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#ActionBatch\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#BrowserOnly\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#ComponentDefaultsProvider\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components/flr-universal#CountryOptions\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#DeprecationWarningProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#LightBox\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#LightBoxTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#List\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#ListItemView\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Modal\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#ModalTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#NotificationProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Popover\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#PopoverTrigger\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#SettingsProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/flr-universal#Wrap\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/nextjs#Link\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use RouterProvider instead\"\n },\n \"@mittwald/flow-react-components/nextjs#LinkProvider\": {\n \"level\": \"deprecated\",\n \"isNew\": false,\n \"deprecationNotice\": \"Use RouterProvider instead\"\n },\n \"@mittwald/flow-react-components/nextjs#RouterProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#Field\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#Form\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#FormAction\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#FormRootError\": {\n \"level\": \"stable\",\n \"isNew\": true\n },\n \"@mittwald/flow-react-components/react-hook-form#FormSettingsProvider\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#ResetButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n },\n \"@mittwald/flow-react-components/react-hook-form#SubmitButton\": {\n \"level\": \"stable\",\n \"isNew\": false\n }\n}\n"],"mappings":""}
@@ -27,7 +27,9 @@ export interface ModalProps extends PropsWithChildren, FlowComponentProps, Props
27
27
  showCloseButton?: boolean;
28
28
  /**
29
29
  * Whether closing the modal must be confirmed – use it to protect unsaved
30
- * changes.
30
+ * changes. `false` does not switch off the confirmation of a dirty `Form`
31
+ * inside the modal; set `confirmModalCloseOnUnsavedChanges={false}` on the
32
+ * `Form` for that.
31
33
  */
32
34
  confirmOnClose?: boolean;
33
35
  }
@@ -1,5 +1,5 @@
1
1
  export * from '../components/Icon/components/icons';
2
- export { Action, ActionBatch, type ActionFn, type ActionProps, BrowserOnly, type BrowserOnlyProps, CountryOptions, type CountryOptionsProps, DeprecationWarningProvider, type DeprecationWarningHandler, type DeprecationWarningProviderProps, IntlProvider, LightBox, type LightBoxProps, LightBoxTrigger, type LightBoxTriggerProps, List, type ListProps, ListItemView, type ListItemViewProps, Modal, type ModalProps, ModalTrigger, type ModalTriggerProps, Popover, type PopoverProps, PopoverTrigger, type PopoverTriggerProps, SettingsProvider, typedList, NotificationProvider, type NotificationProviderProps, Wrap, type WrapProps, } from '../components/public';
2
+ export { Action, ActionBatch, type ActionFn, type ActionProps, BrowserOnly, type BrowserOnlyProps, ComponentDefaultsProvider, type ComponentDefaultsProviderProps, CountryOptions, type CountryOptionsProps, DeprecationWarningProvider, type DeprecationWarningHandler, type DeprecationWarningProviderProps, IntlProvider, LightBox, type LightBoxProps, LightBoxTrigger, type LightBoxTriggerProps, List, type ListProps, ListItemView, type ListItemViewProps, Modal, type ModalProps, ModalTrigger, type ModalTriggerProps, Popover, type PopoverProps, PopoverTrigger, type PopoverTriggerProps, SettingsProvider, typedList, NotificationProvider, type NotificationProviderProps, Wrap, type WrapProps, } from '../components/public';
3
3
  export * from '../lib/controller/public';
4
4
  export * from '../lib/hooks/public';
5
5
  export { useControlledRemoteValueProps } from '../lib/remote/useControlledRemoteValueProps';
@@ -43,6 +43,14 @@ export interface FormProps<F extends FieldValues> extends Omit<ComponentProps<"f
43
43
  * @default true
44
44
  */
45
45
  autoReset?: FormAutoResetOptions | boolean;
46
+ /**
47
+ * Whether closing the surrounding modal must be confirmed while the form has
48
+ * unsaved changes. Overrides `Form.confirmModalCloseOnUnsavedChanges` of the
49
+ * `ComponentDefaultsProvider`.
50
+ *
51
+ * @default true
52
+ */
53
+ confirmModalCloseOnUnsavedChanges?: boolean;
46
54
  }
47
55
  export declare function Form<F extends FieldValues>(props: FormProps<F>): import("react").JSX.Element;
48
56
  export default Form;
@@ -457,6 +457,10 @@ declare const _default: {
457
457
  "level": "stable",
458
458
  "isNew": false
459
459
  },
460
+ "@mittwald/flow-react-components/flr-universal#ComponentDefaultsProvider": {
461
+ "level": "stable",
462
+ "isNew": true
463
+ },
460
464
  "@mittwald/flow-react-components/flr-universal#CountryOptions": {
461
465
  "level": "stable",
462
466
  "isNew": false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mittwald/flow-react-components",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "type": "module",
5
5
  "description": "A React implementation of Flow, mittwald’s design system",
6
6
  "homepage": "https://flow.mittwald.de",
@@ -83,9 +83,9 @@
83
83
  "@internationalized/string-compiler": "^3.4.1",
84
84
  "@lezer/common": "^1.5.2",
85
85
  "@lezer/highlight": "^1.2.3",
86
- "@mittwald/flow-icons": "^1.3.0",
86
+ "@mittwald/flow-icons": "^1.3.1",
87
87
  "@mittwald/password-tools-js": "^3.0.0",
88
- "@mittwald/react-tunnel": "^1.3.0",
88
+ "@mittwald/react-tunnel": "^1.3.1",
89
89
  "@mittwald/react-use-promise": "^4.2.2",
90
90
  "@react-aria/form": "^3.2.1",
91
91
  "@react-aria/i18n": "^3.13.1",
@@ -138,12 +138,12 @@
138
138
  "@internationalized/date": "^3.12.3",
139
139
  "@lezer/generator": "^1.8.0",
140
140
  "@lezer/lr": "^1.4.10",
141
- "@mittwald/flow-core": "1.3.0",
142
- "@mittwald/flow-design-tokens": "1.3.0",
143
- "@mittwald/flow-icons-base": "1.3.0",
141
+ "@mittwald/flow-core": "1.3.1",
142
+ "@mittwald/flow-design-tokens": "1.3.1",
143
+ "@mittwald/flow-icons-base": "1.3.1",
144
144
  "@mittwald/react-use-promise": "^4.2.2",
145
145
  "@mittwald/remote-dom-react": "1.2.2-mittwald.10",
146
- "@mittwald/typescript-config": "1.3.0",
146
+ "@mittwald/typescript-config": "1.3.1",
147
147
  "@nx/storybook": "^22.7.6",
148
148
  "@storybook/addon-a11y": "^10.5.10",
149
149
  "@storybook/addon-actions": "^9.0.8",
@@ -195,7 +195,7 @@
195
195
  },
196
196
  "peerDependencies": {
197
197
  "@internationalized/date": "^3.12.2",
198
- "@mittwald/flow-icons-pro": "1.3.0",
198
+ "@mittwald/flow-icons-pro": "1.3.1",
199
199
  "@mittwald/react-use-promise": "^4.2.2",
200
200
  "next": "^16.2.3",
201
201
  "react": "^19.2.0",
@@ -219,5 +219,5 @@
219
219
  "browserslist": [
220
220
  "baseline widely available"
221
221
  ],
222
- "gitHead": "c10f5dfb91a2f7544de5224b80707d9bcb98669e"
222
+ "gitHead": "920f9a93b116dfe0b683cc84d5d9014cef62217b"
223
223
  }