@fpkit/acss 6.4.3 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/libs/chunk-EARHB4PD.js +11 -0
- package/libs/chunk-EARHB4PD.js.map +1 -0
- package/libs/chunk-PSIXTYFY.cjs +19 -0
- package/libs/chunk-PSIXTYFY.cjs.map +1 -0
- package/libs/components/dialog/dialog.cjs +3 -3
- package/libs/components/dialog/dialog.css +1 -1
- package/libs/components/dialog/dialog.css.map +1 -1
- package/libs/components/dialog/dialog.d.cts +1 -1
- package/libs/components/dialog/dialog.d.ts +1 -1
- package/libs/components/dialog/dialog.js +1 -1
- package/libs/components/dialog/dialog.min.css +2 -2
- package/libs/{dialog-5cef1073.d.ts → dialog-e28c085f.d.ts} +14 -1
- package/libs/index.cjs +35 -32
- package/libs/index.cjs.map +1 -1
- package/libs/index.css +1 -1
- package/libs/index.css.map +1 -1
- package/libs/index.d.cts +2 -2
- package/libs/index.d.ts +2 -2
- package/libs/index.js +13 -13
- package/libs/index.js.map +1 -1
- package/package.json +2 -2
- package/src/components/dialog/README.mdx +87 -2
- package/src/components/dialog/STYLES.mdx +119 -12
- package/src/components/dialog/dialog-modal.stories.tsx +107 -2
- package/src/components/dialog/dialog-modal.tsx +6 -0
- package/src/components/dialog/dialog.scss +89 -2
- package/src/components/dialog/dialog.stories.tsx +30 -3
- package/src/components/dialog/dialog.test.tsx +96 -0
- package/src/components/dialog/dialog.tsx +7 -1
- package/src/components/dialog/dialog.types.ts +25 -0
- package/src/components/dialog/views/dialog-header.tsx +10 -8
- package/src/index.ts +2 -0
- package/src/styles/dialog/dialog.css +88 -2
- package/src/styles/dialog/dialog.css.map +1 -1
- package/src/styles/index.css +87 -2
- package/src/styles/index.css.map +1 -1
- package/libs/chunk-VQTCTLFN.js +0 -11
- package/libs/chunk-VQTCTLFN.js.map +0 -1
- package/libs/chunk-ZOPHCNFD.cjs +0 -18
- package/libs/chunk-ZOPHCNFD.cjs.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { b } from './chunk-AQAI6COH.js';
|
|
2
|
+
import { b as b$1 } from './chunk-4F6SI5V5.js';
|
|
3
|
+
import { a, b as b$2 } from './chunk-34NWHFHP.js';
|
|
4
|
+
import { a as a$1 } from './chunk-4KJP3L35.js';
|
|
5
|
+
import s, { useCallback, useRef, useId, useEffect } from 'react';
|
|
6
|
+
|
|
7
|
+
var f=({icon:e,label:o,variant:i="icon",type:t="button",...a$1})=>s.createElement(a,{variant:i,"data-icon-btn":o?"has-label":"icon",...a$1,type:t},e,o&&s.createElement("span",{"data-icon-label":!0},o));f.displayName="IconButton";var B=({dialogTitle:e,onClick:o,id:i,type:t="h3",closeIconSize:a=24})=>{let r=useCallback(()=>{o();},[o]);return s.createElement(a$1,{as:"div",classes:"dialog-header"},s.createElement(b,{type:t,className:"dialog-title",id:i},e||"Dialog"),s.createElement(f,{type:"button",onClick:r,className:"dialog-close","aria-label":"Close dialog",icon:s.createElement(b$1,null,s.createElement(b$1.Remove,{size:a}))}))},H=s.memo(B);B.displayName="DialogHeader";var P=({onClose:e,onConfirm:o,confirmLabel:i,cancelLabel:t})=>{let a=useCallback(()=>{e();},[e]),r=useCallback(()=>{o&&o();},[o]);return s.createElement(a$1,{as:"section",className:"dialog-footer"},t&&s.createElement(b$2,{type:"button",onClick:a,className:"dialog-button button-secondary","data-btn":"sm"},t),o&&s.createElement(b$2,{type:"button",onClick:r,className:"dialog-button button-primary","data-btn":"sm"},i))};P.displayName="DialogFooter";var v=s.memo(P);var F=(e,o)=>useCallback(t=>{let a=e.current?.getBoundingClientRect();a&&(t.clientY<a.top||t.clientY>a.bottom||t.clientX<a.left||t.clientX>a.right)&&o();},[e,o]);var x=({isOpen:e,onOpenChange:o,isAlertDialog:i=!1,onClose:t,dialogTitle:a,dialogLabel:r,children:U,onConfirm:E,confirmLabel:M="Confirm",cancelLabel:T="Cancel",className:W="",hideFooter:O=!1,styles:j,size:b,position:y="center",closeIconSize:w})=>{let p=useRef(null),C=useId();useEffect(()=>{let n=p.current;n&&(e?i?n.show():n.showModal():n.close());},[e,i]);let d=useCallback(()=>{o(!1),t&&t();},[o,t]),z=F(p,d),D=useId();return s.createElement(a$1,{as:"dialog",role:i?"alertdialog":"dialog",ref:p,onClose:d,onClick:z,"aria-modal":e&&!i?"true":void 0,"aria-labelledby":C,"aria-describedby":D,"aria-label":r,className:`dialog-modal ${W}`.trim(),style:j,...b&&{"data-size":b},...y&&{"data-position":y}},s.createElement(H,{dialogTitle:a,onClick:d,id:C,closeIconSize:w}),s.createElement(a$1,{as:"section",id:D,className:"dialog-content",onClick:n=>n.stopPropagation()},U,!O&&s.createElement(v,{onClose:d,onConfirm:E,confirmLabel:M,cancelLabel:T})))};x.displayName="Dialog";var uo=s.memo(x);
|
|
8
|
+
|
|
9
|
+
export { f as a, x as b, uo as c };
|
|
10
|
+
//# sourceMappingURL=out.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-EARHB4PD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dialog/dialog.tsx","../src/components/dialog/views/dialog-header.tsx","../src/components/buttons/icon-button.tsx","../src/components/dialog/views/dialog-footer.tsx","../src/hooks/useDialogClickHandler.ts"],"names":["React","useRef","useEffect","useCallback","useId","IconButton","icon","label","variant","type","props","Button","DialogHeader","dialogTitle","onClick","id","closeIconSize","handleClose","ui_default","heading_default","icon_default","dialog_header_default","DialogFooter","onClose","onConfirm","confirmLabel","cancelLabel","handleCancel","handleConfirm","button_default","dialog_footer_default","useDialogClickHandler","dialogRef","e","dialogDimensions","Dialog","isOpen","onOpenChange","isAlertDialog","dialogLabel","children","className","hideFooter","styles","size","position","titleId","dialog","handleClickOutside","contentId","dialog_default"],"mappings":"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","sourcesContent":["import React, { useRef, useEffect, useCallback, useId } from \"react\";\nimport UI from \"#components/ui\";\nimport DialogHeader from \"#components/dialog/views/dialog-header\";\nimport DialogFooter from \"#components/dialog/views/dialog-footer\";\nimport { useDialogClickHandler } from \"#hooks/useDialogClickHandler.js\";\nimport type { DialogProps } from \"./dialog.types\";\n\n/**\n * A controlled dialog component that supports both modal and non-modal (inline alert) modes.\n *\n * **Modal Dialog** (default): Uses native `<dialog>` element with `.showModal()` which provides:\n * - Automatic focus trap (Tab cycles within dialog)\n * - Escape key closes dialog (native behavior)\n * - Backdrop overlay with click-to-close\n * - Inert background (page content becomes non-interactive)\n *\n * **Inline Alert Dialog** (`isAlertDialog={true}`): Uses `.show()` for non-modal inline alerts:\n * - No focus trap (page remains interactive)\n * - No escape key behavior\n * - Positioned inline in page flow\n * - User must explicitly close with button\n *\n * @component\n * @example\n * ```tsx\n * // Controlled usage\n * const [open, setOpen] = useState(false);\n * <Dialog\n * isOpen={open}\n * onOpenChange={setOpen}\n * dialogTitle=\"Confirm Delete\"\n * >\n * Are you sure you want to delete this item?\n * </Dialog>\n * ```\n *\n * @param {DialogProps} props - Component props\n * @param {boolean} props.isOpen - Controls whether the dialog is currently open\n * @param {(open: boolean) => void} props.onOpenChange - Callback fired when dialog open state changes\n * @param {string} props.dialogTitle - The title displayed in the dialog header\n * @param {boolean} [props.isAlertDialog=false] - If true, renders as non-modal inline alert\n * @param {() => void} [props.onClose] - Deprecated: Use onOpenChange. Called when dialog closes.\n * @param {ReactNode} props.children - Content to display inside the dialog body\n * @param {() => void | Promise<void>} [props.onConfirm] - Callback fired when confirm button is clicked\n * @param {string} [props.confirmLabel=\"Confirm\"] - Text label for confirm button\n * @param {string} [props.cancelLabel=\"Cancel\"] - Text label for cancel button\n * @param {boolean} [props.hideFooter=false] - If true, hides the footer with action buttons\n * @param {string} [props.className] - Additional CSS classes to apply\n * @param {string} [props.dialogLabel] - Optional aria-label for the dialog\n * @param {CSSProperties} [props.styles] - Inline styles to apply to dialog element\n * @param {number} [props.closeIconSize=24] - Size of the close icon in pixels\n * @returns {JSX.Element} A controlled dialog component\n */\nexport const Dialog: React.FC<DialogProps> = ({\n isOpen,\n onOpenChange,\n isAlertDialog = false,\n onClose,\n dialogTitle,\n dialogLabel,\n children,\n onConfirm,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n className = \"\",\n hideFooter = false,\n styles,\n size,\n position = \"center\",\n closeIconSize,\n}) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const titleId = useId();\n\n // Handle native dialog open/close based on isOpen prop\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (isOpen) {\n if (isAlertDialog) {\n // Non-modal inline alert - no focus trap, no backdrop\n dialog.show();\n } else {\n // Modal dialog - native focus trap, escape key, backdrop\n dialog.showModal();\n }\n } else {\n dialog.close();\n }\n }, [isOpen, isAlertDialog]);\n\n // Handle close event - notify parent via onOpenChange\n const handleClose = useCallback(() => {\n onOpenChange(false);\n // Support deprecated onClose prop for backward compatibility\n if (onClose) onClose();\n }, [onOpenChange, onClose]);\n\n // Handle backdrop clicks (only for modal dialogs)\n const handleClickOutside = useDialogClickHandler(dialogRef, handleClose);\n\n const contentId = useId();\n\n return (\n <UI\n as=\"dialog\"\n role={isAlertDialog ? \"alertdialog\" : \"dialog\"}\n ref={dialogRef}\n onClose={handleClose}\n onClick={handleClickOutside}\n aria-modal={isOpen && !isAlertDialog ? \"true\" : undefined}\n aria-labelledby={titleId}\n aria-describedby={contentId}\n aria-label={dialogLabel}\n className={`dialog-modal ${className}`.trim()}\n style={styles}\n {...(size && { \"data-size\": size })}\n {...(position && { \"data-position\": position })}\n >\n <DialogHeader dialogTitle={dialogTitle} onClick={handleClose} id={titleId} closeIconSize={closeIconSize} />\n\n <UI\n as=\"section\"\n id={contentId}\n className=\"dialog-content\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {children}\n {!hideFooter && (\n <DialogFooter\n onClose={handleClose}\n onConfirm={onConfirm}\n confirmLabel={confirmLabel}\n cancelLabel={cancelLabel}\n />\n )}\n </UI>\n </UI>\n );\n};\nDialog.displayName = \"Dialog\";\n\nexport default React.memo(Dialog);\n","import React, { useCallback } from \"react\";\nimport UI from \"#components/ui\";\nimport Heading from \"#components/heading/heading\";\nimport { IconButton } from \"#components/buttons/icon-button\";\nimport Icon from \"#components/icons/icon\";\nimport type { DialogHeaderProps } from \"../dialog.types\";\n\n/**\n * DialogHeader component displays the header section of a dialog with a title and close button.\n *\n * This component is optimized for accessibility with:\n * - Unique ID for `aria-labelledby` linking to parent dialog\n * - Semantic heading structure for screen readers\n * - Clear close button with accessible label\n * - Memoized to prevent unnecessary re-renders\n *\n * @component\n * @param {DialogHeaderProps} props - Component props\n * @param {string} props.dialogTitle - The title text to display in the dialog header\n * @param {() => void} props.onClick - Callback function triggered when close button is clicked\n * @param {string} [props.id] - Optional ID for aria-labelledby linking. Auto-generated if not provided.\n * @param {\"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"} [props.type=\"h3\"] - Heading level for semantic structure\n * @param {number} [props.closeIconSize=24] - Size of the close icon in pixels\n * @returns {JSX.Element} A dialog header with title and close button\n *\n * @example\n * ```tsx\n * <DialogHeader\n * id=\"dialog-title-1\"\n * dialogTitle=\"Confirm Action\"\n * onClick={() => setIsOpen(false)}\n * type=\"h2\"\n * />\n * ```\n */\nconst DialogHeader: React.FC<DialogHeaderProps> = ({\n dialogTitle,\n onClick,\n id,\n type = \"h3\",\n closeIconSize = 24,\n}) => {\n const handleClose = useCallback(() => {\n onClick();\n }, [onClick]);\n\n return (\n <UI as=\"div\" classes=\"dialog-header\">\n <Heading type={type} className=\"dialog-title\" id={id}>\n {dialogTitle || \"Dialog\"}\n </Heading>\n <IconButton\n type=\"button\"\n onClick={handleClose}\n className=\"dialog-close\"\n aria-label=\"Close dialog\"\n icon={\n <Icon>\n <Icon.Remove size={closeIconSize} />\n </Icon>\n }\n />\n </UI>\n );\n};\n\nexport default React.memo(DialogHeader);\nDialogHeader.displayName = \"DialogHeader\";\n","import React from \"react\";\nimport { Button, type ButtonProps } from \"./button\";\n\n/**\n * XOR constraint: exactly one of aria-label or aria-labelledby is required.\n * Passing both or neither is a TypeScript compile-time error.\n * Satisfies WCAG 2.1 SC 1.1.1 (Non-text Content).\n */\ntype WithAriaLabel = { \"aria-label\": string; \"aria-labelledby\"?: never };\ntype WithAriaLabelledBy = { \"aria-labelledby\": string; \"aria-label\"?: never };\n\nexport type IconButtonProps = Omit<ButtonProps, \"children\"> &\n (WithAriaLabel | WithAriaLabelledBy) & {\n /** The icon element rendered inside the button. */\n icon: React.ReactNode;\n /**\n * Optional text shown alongside the icon at desktop widths.\n * Visually hidden below the `$icon-label-bp` SCSS breakpoint (default 48rem / 768px)\n * via a media query on `[data-icon-label]`, but always present in the accessibility\n * tree — screen readers announce it at every viewport size.\n *\n * NOTE: When `label` is provided, the default `variant=\"icon\"` removes padding.\n * Use `variant=\"outline\"` (or another padded variant) to restore layout padding\n * alongside the label.\n */\n label?: string;\n /** Button type: button, submit, or reset. Required. */\n type: \"button\" | \"submit\" | \"reset\";\n };\n\n/**\n * Accessible icon button component. Wraps `Button` with:\n * - Required accessible label via `aria-label` or `aria-labelledby` (XOR enforced)\n * - Optional `label` text hidden on mobile (< 48rem), visible on desktop — always in a11y tree\n * - `variant=\"icon\"` default (square, no padding)\n * - Fixed `3rem × 3rem` tap target (48px at default root font size — WCAG 2.5.5 AAA)\n *\n * @example\n * // Icon only\n * <IconButton type=\"button\" aria-label=\"Close menu\" icon={<CloseIcon />} />\n *\n * @example\n * // Icon + label (label hides on mobile, visible at >= 48rem / 768px)\n * <IconButton\n * type=\"button\"\n * aria-label=\"Settings\"\n * icon={<SettingsIcon />}\n * label=\"Settings\"\n * variant=\"outline\"\n * />\n *\n * @example\n * // Labelled by external element\n * <span id=\"btn-label\">Delete item</span>\n * <IconButton type=\"button\" aria-labelledby=\"btn-label\" icon={<TrashIcon />} />\n */\nexport const IconButton = ({\n icon,\n label,\n variant = \"icon\",\n type = \"button\",\n ...props\n}: IconButtonProps) => (\n <Button\n variant={variant}\n data-icon-btn={label ? \"has-label\" : \"icon\"}\n {...props}\n type={type}\n >\n {icon}\n {label && <span data-icon-label>{label}</span>}\n </Button>\n);\n\nIconButton.displayName = \"IconButton\";\n","import React, { useCallback } from \"react\";\nimport UI from \"#components/ui\";\nimport Button from \"#components/buttons/button\";\nimport type { DialogFooterProps } from \"../dialog.types\";\n\n/**\n * DialogFooter component renders action buttons for dialog confirmation/cancellation.\n *\n * This component provides a consistent footer layout with:\n * - Cancel button (secondary style) - Always shown if cancelLabel provided\n * - Confirm button (primary style) - Only shown if onConfirm callback provided\n * - Proper semantic button types\n * - Accessible button sizing and spacing\n * - Memoized to prevent unnecessary re-renders\n *\n * @component\n * @param {DialogFooterProps} props - Component props\n * @param {() => void} props.onClose - Callback fired when cancel button is clicked\n * @param {() => void | Promise<void>} [props.onConfirm] - Optional callback for confirm action. If omitted, confirm button is hidden.\n * @param {string} props.confirmLabel - Text label for the confirm button\n * @param {string} props.cancelLabel - Text label for the cancel button\n * @returns {JSX.Element} A footer section with action buttons\n *\n * @example\n * ```tsx\n * // Simple close-only footer\n * <DialogFooter\n * onClose={() => setOpen(false)}\n * cancelLabel=\"Close\"\n * confirmLabel=\"OK\"\n * />\n *\n * // Confirmation dialog with both actions\n * <DialogFooter\n * onClose={() => setOpen(false)}\n * onConfirm={async () => await deleteItem()}\n * confirmLabel=\"Delete\"\n * cancelLabel=\"Cancel\"\n * />\n * ```\n */\nconst DialogFooter: React.FC<DialogFooterProps> = ({\n onClose,\n onConfirm,\n confirmLabel,\n cancelLabel,\n}) => {\n // Memoize handlers to prevent unnecessary re-renders\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleConfirm = useCallback(() => {\n if (onConfirm) {\n onConfirm();\n }\n }, [onConfirm]);\n\n return (\n <UI as=\"section\" className=\"dialog-footer\">\n {cancelLabel && (\n <Button\n type=\"button\"\n onClick={handleCancel}\n className=\"dialog-button button-secondary\"\n data-btn=\"sm\"\n >\n {cancelLabel}\n </Button>\n )}\n\n {onConfirm && (\n <Button\n type=\"button\"\n onClick={handleConfirm}\n className=\"dialog-button button-primary\"\n data-btn=\"sm\"\n >\n {confirmLabel}\n </Button>\n )}\n </UI>\n );\n};\n\nDialogFooter.displayName = \"DialogFooter\";\n\nexport default React.memo(DialogFooter);\n","import { useCallback, RefObject } from \"react\";\n\nexport const useDialogClickHandler = (\n dialogRef: RefObject<HTMLDialogElement>,\n handleClose: () => void\n) => {\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDialogElement>) => {\n const dialogDimensions = dialogRef.current?.getBoundingClientRect();\n if (dialogDimensions) {\n const isClickOutside =\n e.clientY < dialogDimensions.top ||\n e.clientY > dialogDimensions.bottom ||\n e.clientX < dialogDimensions.left ||\n e.clientX > dialogDimensions.right;\n\n if (isClickOutside) {\n handleClose();\n }\n }\n },\n [dialogRef, handleClose]\n );\n\n return handleClick;\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk6WMLG4O5_cjs = require('./chunk-6WMLG4O5.cjs');
|
|
4
|
+
var chunkOZM455LO_cjs = require('./chunk-OZM455LO.cjs');
|
|
5
|
+
var chunk25KCUE3R_cjs = require('./chunk-25KCUE3R.cjs');
|
|
6
|
+
var chunk66C2J4IX_cjs = require('./chunk-66C2J4IX.cjs');
|
|
7
|
+
var s = require('react');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var s__default = /*#__PURE__*/_interopDefault(s);
|
|
12
|
+
|
|
13
|
+
var f=({icon:e,label:o,variant:i="icon",type:t="button",...a})=>s__default.default.createElement(chunk25KCUE3R_cjs.a,{variant:i,"data-icon-btn":o?"has-label":"icon",...a,type:t},e,o&&s__default.default.createElement("span",{"data-icon-label":!0},o));f.displayName="IconButton";var B=({dialogTitle:e,onClick:o,id:i,type:t="h3",closeIconSize:a=24})=>{let r=s.useCallback(()=>{o();},[o]);return s__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"div",classes:"dialog-header"},s__default.default.createElement(chunk6WMLG4O5_cjs.b,{type:t,className:"dialog-title",id:i},e||"Dialog"),s__default.default.createElement(f,{type:"button",onClick:r,className:"dialog-close","aria-label":"Close dialog",icon:s__default.default.createElement(chunkOZM455LO_cjs.b,null,s__default.default.createElement(chunkOZM455LO_cjs.b.Remove,{size:a}))}))},H=s__default.default.memo(B);B.displayName="DialogHeader";var P=({onClose:e,onConfirm:o,confirmLabel:i,cancelLabel:t})=>{let a=s.useCallback(()=>{e();},[e]),r=s.useCallback(()=>{o&&o();},[o]);return s__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section",className:"dialog-footer"},t&&s__default.default.createElement(chunk25KCUE3R_cjs.b,{type:"button",onClick:a,className:"dialog-button button-secondary","data-btn":"sm"},t),o&&s__default.default.createElement(chunk25KCUE3R_cjs.b,{type:"button",onClick:r,className:"dialog-button button-primary","data-btn":"sm"},i))};P.displayName="DialogFooter";var v=s__default.default.memo(P);var F=(e,o)=>s.useCallback(t=>{let a=e.current?.getBoundingClientRect();a&&(t.clientY<a.top||t.clientY>a.bottom||t.clientX<a.left||t.clientX>a.right)&&o();},[e,o]);var x=({isOpen:e,onOpenChange:o,isAlertDialog:i=!1,onClose:t,dialogTitle:a,dialogLabel:r,children:U,onConfirm:E,confirmLabel:M="Confirm",cancelLabel:T="Cancel",className:W="",hideFooter:O=!1,styles:j,size:b,position:y="center",closeIconSize:w})=>{let p=s.useRef(null),C=s.useId();s.useEffect(()=>{let n=p.current;n&&(e?i?n.show():n.showModal():n.close());},[e,i]);let d=s.useCallback(()=>{o(!1),t&&t();},[o,t]),z=F(p,d),D=s.useId();return s__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"dialog",role:i?"alertdialog":"dialog",ref:p,onClose:d,onClick:z,"aria-modal":e&&!i?"true":void 0,"aria-labelledby":C,"aria-describedby":D,"aria-label":r,className:`dialog-modal ${W}`.trim(),style:j,...b&&{"data-size":b},...y&&{"data-position":y}},s__default.default.createElement(H,{dialogTitle:a,onClick:d,id:C,closeIconSize:w}),s__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section",id:D,className:"dialog-content",onClick:n=>n.stopPropagation()},U,!O&&s__default.default.createElement(v,{onClose:d,onConfirm:E,confirmLabel:M,cancelLabel:T})))};x.displayName="Dialog";var uo=s__default.default.memo(x);
|
|
14
|
+
|
|
15
|
+
exports.a = f;
|
|
16
|
+
exports.b = x;
|
|
17
|
+
exports.c = uo;
|
|
18
|
+
//# sourceMappingURL=out.js.map
|
|
19
|
+
//# sourceMappingURL=chunk-PSIXTYFY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dialog/dialog.tsx","../src/components/dialog/views/dialog-header.tsx","../src/components/buttons/icon-button.tsx","../src/components/dialog/views/dialog-footer.tsx","../src/hooks/useDialogClickHandler.ts"],"names":["React","useRef","useEffect","useCallback","useId","IconButton","icon","label","variant","type","props","Button","DialogHeader","dialogTitle","onClick","id","closeIconSize","handleClose","ui_default","heading_default","icon_default","dialog_header_default","DialogFooter","onClose","onConfirm","confirmLabel","cancelLabel","handleCancel","handleConfirm","button_default","dialog_footer_default","useDialogClickHandler","dialogRef","e","dialogDimensions","Dialog","isOpen","onOpenChange","isAlertDialog","dialogLabel","children","className","hideFooter","styles","size","position","titleId","dialog","handleClickOutside","contentId","dialog_default"],"mappings":"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","sourcesContent":["import React, { useRef, useEffect, useCallback, useId } from \"react\";\nimport UI from \"#components/ui\";\nimport DialogHeader from \"#components/dialog/views/dialog-header\";\nimport DialogFooter from \"#components/dialog/views/dialog-footer\";\nimport { useDialogClickHandler } from \"#hooks/useDialogClickHandler.js\";\nimport type { DialogProps } from \"./dialog.types\";\n\n/**\n * A controlled dialog component that supports both modal and non-modal (inline alert) modes.\n *\n * **Modal Dialog** (default): Uses native `<dialog>` element with `.showModal()` which provides:\n * - Automatic focus trap (Tab cycles within dialog)\n * - Escape key closes dialog (native behavior)\n * - Backdrop overlay with click-to-close\n * - Inert background (page content becomes non-interactive)\n *\n * **Inline Alert Dialog** (`isAlertDialog={true}`): Uses `.show()` for non-modal inline alerts:\n * - No focus trap (page remains interactive)\n * - No escape key behavior\n * - Positioned inline in page flow\n * - User must explicitly close with button\n *\n * @component\n * @example\n * ```tsx\n * // Controlled usage\n * const [open, setOpen] = useState(false);\n * <Dialog\n * isOpen={open}\n * onOpenChange={setOpen}\n * dialogTitle=\"Confirm Delete\"\n * >\n * Are you sure you want to delete this item?\n * </Dialog>\n * ```\n *\n * @param {DialogProps} props - Component props\n * @param {boolean} props.isOpen - Controls whether the dialog is currently open\n * @param {(open: boolean) => void} props.onOpenChange - Callback fired when dialog open state changes\n * @param {string} props.dialogTitle - The title displayed in the dialog header\n * @param {boolean} [props.isAlertDialog=false] - If true, renders as non-modal inline alert\n * @param {() => void} [props.onClose] - Deprecated: Use onOpenChange. Called when dialog closes.\n * @param {ReactNode} props.children - Content to display inside the dialog body\n * @param {() => void | Promise<void>} [props.onConfirm] - Callback fired when confirm button is clicked\n * @param {string} [props.confirmLabel=\"Confirm\"] - Text label for confirm button\n * @param {string} [props.cancelLabel=\"Cancel\"] - Text label for cancel button\n * @param {boolean} [props.hideFooter=false] - If true, hides the footer with action buttons\n * @param {string} [props.className] - Additional CSS classes to apply\n * @param {string} [props.dialogLabel] - Optional aria-label for the dialog\n * @param {CSSProperties} [props.styles] - Inline styles to apply to dialog element\n * @param {number} [props.closeIconSize=24] - Size of the close icon in pixels\n * @returns {JSX.Element} A controlled dialog component\n */\nexport const Dialog: React.FC<DialogProps> = ({\n isOpen,\n onOpenChange,\n isAlertDialog = false,\n onClose,\n dialogTitle,\n dialogLabel,\n children,\n onConfirm,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n className = \"\",\n hideFooter = false,\n styles,\n size,\n position = \"center\",\n closeIconSize,\n}) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const titleId = useId();\n\n // Handle native dialog open/close based on isOpen prop\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (isOpen) {\n if (isAlertDialog) {\n // Non-modal inline alert - no focus trap, no backdrop\n dialog.show();\n } else {\n // Modal dialog - native focus trap, escape key, backdrop\n dialog.showModal();\n }\n } else {\n dialog.close();\n }\n }, [isOpen, isAlertDialog]);\n\n // Handle close event - notify parent via onOpenChange\n const handleClose = useCallback(() => {\n onOpenChange(false);\n // Support deprecated onClose prop for backward compatibility\n if (onClose) onClose();\n }, [onOpenChange, onClose]);\n\n // Handle backdrop clicks (only for modal dialogs)\n const handleClickOutside = useDialogClickHandler(dialogRef, handleClose);\n\n const contentId = useId();\n\n return (\n <UI\n as=\"dialog\"\n role={isAlertDialog ? \"alertdialog\" : \"dialog\"}\n ref={dialogRef}\n onClose={handleClose}\n onClick={handleClickOutside}\n aria-modal={isOpen && !isAlertDialog ? \"true\" : undefined}\n aria-labelledby={titleId}\n aria-describedby={contentId}\n aria-label={dialogLabel}\n className={`dialog-modal ${className}`.trim()}\n style={styles}\n {...(size && { \"data-size\": size })}\n {...(position && { \"data-position\": position })}\n >\n <DialogHeader dialogTitle={dialogTitle} onClick={handleClose} id={titleId} closeIconSize={closeIconSize} />\n\n <UI\n as=\"section\"\n id={contentId}\n className=\"dialog-content\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {children}\n {!hideFooter && (\n <DialogFooter\n onClose={handleClose}\n onConfirm={onConfirm}\n confirmLabel={confirmLabel}\n cancelLabel={cancelLabel}\n />\n )}\n </UI>\n </UI>\n );\n};\nDialog.displayName = \"Dialog\";\n\nexport default React.memo(Dialog);\n","import React, { useCallback } from \"react\";\nimport UI from \"#components/ui\";\nimport Heading from \"#components/heading/heading\";\nimport { IconButton } from \"#components/buttons/icon-button\";\nimport Icon from \"#components/icons/icon\";\nimport type { DialogHeaderProps } from \"../dialog.types\";\n\n/**\n * DialogHeader component displays the header section of a dialog with a title and close button.\n *\n * This component is optimized for accessibility with:\n * - Unique ID for `aria-labelledby` linking to parent dialog\n * - Semantic heading structure for screen readers\n * - Clear close button with accessible label\n * - Memoized to prevent unnecessary re-renders\n *\n * @component\n * @param {DialogHeaderProps} props - Component props\n * @param {string} props.dialogTitle - The title text to display in the dialog header\n * @param {() => void} props.onClick - Callback function triggered when close button is clicked\n * @param {string} [props.id] - Optional ID for aria-labelledby linking. Auto-generated if not provided.\n * @param {\"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"} [props.type=\"h3\"] - Heading level for semantic structure\n * @param {number} [props.closeIconSize=24] - Size of the close icon in pixels\n * @returns {JSX.Element} A dialog header with title and close button\n *\n * @example\n * ```tsx\n * <DialogHeader\n * id=\"dialog-title-1\"\n * dialogTitle=\"Confirm Action\"\n * onClick={() => setIsOpen(false)}\n * type=\"h2\"\n * />\n * ```\n */\nconst DialogHeader: React.FC<DialogHeaderProps> = ({\n dialogTitle,\n onClick,\n id,\n type = \"h3\",\n closeIconSize = 24,\n}) => {\n const handleClose = useCallback(() => {\n onClick();\n }, [onClick]);\n\n return (\n <UI as=\"div\" classes=\"dialog-header\">\n <Heading type={type} className=\"dialog-title\" id={id}>\n {dialogTitle || \"Dialog\"}\n </Heading>\n <IconButton\n type=\"button\"\n onClick={handleClose}\n className=\"dialog-close\"\n aria-label=\"Close dialog\"\n icon={\n <Icon>\n <Icon.Remove size={closeIconSize} />\n </Icon>\n }\n />\n </UI>\n );\n};\n\nexport default React.memo(DialogHeader);\nDialogHeader.displayName = \"DialogHeader\";\n","import React from \"react\";\nimport { Button, type ButtonProps } from \"./button\";\n\n/**\n * XOR constraint: exactly one of aria-label or aria-labelledby is required.\n * Passing both or neither is a TypeScript compile-time error.\n * Satisfies WCAG 2.1 SC 1.1.1 (Non-text Content).\n */\ntype WithAriaLabel = { \"aria-label\": string; \"aria-labelledby\"?: never };\ntype WithAriaLabelledBy = { \"aria-labelledby\": string; \"aria-label\"?: never };\n\nexport type IconButtonProps = Omit<ButtonProps, \"children\"> &\n (WithAriaLabel | WithAriaLabelledBy) & {\n /** The icon element rendered inside the button. */\n icon: React.ReactNode;\n /**\n * Optional text shown alongside the icon at desktop widths.\n * Visually hidden below the `$icon-label-bp` SCSS breakpoint (default 48rem / 768px)\n * via a media query on `[data-icon-label]`, but always present in the accessibility\n * tree — screen readers announce it at every viewport size.\n *\n * NOTE: When `label` is provided, the default `variant=\"icon\"` removes padding.\n * Use `variant=\"outline\"` (or another padded variant) to restore layout padding\n * alongside the label.\n */\n label?: string;\n /** Button type: button, submit, or reset. Required. */\n type: \"button\" | \"submit\" | \"reset\";\n };\n\n/**\n * Accessible icon button component. Wraps `Button` with:\n * - Required accessible label via `aria-label` or `aria-labelledby` (XOR enforced)\n * - Optional `label` text hidden on mobile (< 48rem), visible on desktop — always in a11y tree\n * - `variant=\"icon\"` default (square, no padding)\n * - Fixed `3rem × 3rem` tap target (48px at default root font size — WCAG 2.5.5 AAA)\n *\n * @example\n * // Icon only\n * <IconButton type=\"button\" aria-label=\"Close menu\" icon={<CloseIcon />} />\n *\n * @example\n * // Icon + label (label hides on mobile, visible at >= 48rem / 768px)\n * <IconButton\n * type=\"button\"\n * aria-label=\"Settings\"\n * icon={<SettingsIcon />}\n * label=\"Settings\"\n * variant=\"outline\"\n * />\n *\n * @example\n * // Labelled by external element\n * <span id=\"btn-label\">Delete item</span>\n * <IconButton type=\"button\" aria-labelledby=\"btn-label\" icon={<TrashIcon />} />\n */\nexport const IconButton = ({\n icon,\n label,\n variant = \"icon\",\n type = \"button\",\n ...props\n}: IconButtonProps) => (\n <Button\n variant={variant}\n data-icon-btn={label ? \"has-label\" : \"icon\"}\n {...props}\n type={type}\n >\n {icon}\n {label && <span data-icon-label>{label}</span>}\n </Button>\n);\n\nIconButton.displayName = \"IconButton\";\n","import React, { useCallback } from \"react\";\nimport UI from \"#components/ui\";\nimport Button from \"#components/buttons/button\";\nimport type { DialogFooterProps } from \"../dialog.types\";\n\n/**\n * DialogFooter component renders action buttons for dialog confirmation/cancellation.\n *\n * This component provides a consistent footer layout with:\n * - Cancel button (secondary style) - Always shown if cancelLabel provided\n * - Confirm button (primary style) - Only shown if onConfirm callback provided\n * - Proper semantic button types\n * - Accessible button sizing and spacing\n * - Memoized to prevent unnecessary re-renders\n *\n * @component\n * @param {DialogFooterProps} props - Component props\n * @param {() => void} props.onClose - Callback fired when cancel button is clicked\n * @param {() => void | Promise<void>} [props.onConfirm] - Optional callback for confirm action. If omitted, confirm button is hidden.\n * @param {string} props.confirmLabel - Text label for the confirm button\n * @param {string} props.cancelLabel - Text label for the cancel button\n * @returns {JSX.Element} A footer section with action buttons\n *\n * @example\n * ```tsx\n * // Simple close-only footer\n * <DialogFooter\n * onClose={() => setOpen(false)}\n * cancelLabel=\"Close\"\n * confirmLabel=\"OK\"\n * />\n *\n * // Confirmation dialog with both actions\n * <DialogFooter\n * onClose={() => setOpen(false)}\n * onConfirm={async () => await deleteItem()}\n * confirmLabel=\"Delete\"\n * cancelLabel=\"Cancel\"\n * />\n * ```\n */\nconst DialogFooter: React.FC<DialogFooterProps> = ({\n onClose,\n onConfirm,\n confirmLabel,\n cancelLabel,\n}) => {\n // Memoize handlers to prevent unnecessary re-renders\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleConfirm = useCallback(() => {\n if (onConfirm) {\n onConfirm();\n }\n }, [onConfirm]);\n\n return (\n <UI as=\"section\" className=\"dialog-footer\">\n {cancelLabel && (\n <Button\n type=\"button\"\n onClick={handleCancel}\n className=\"dialog-button button-secondary\"\n data-btn=\"sm\"\n >\n {cancelLabel}\n </Button>\n )}\n\n {onConfirm && (\n <Button\n type=\"button\"\n onClick={handleConfirm}\n className=\"dialog-button button-primary\"\n data-btn=\"sm\"\n >\n {confirmLabel}\n </Button>\n )}\n </UI>\n );\n};\n\nDialogFooter.displayName = \"DialogFooter\";\n\nexport default React.memo(DialogFooter);\n","import { useCallback, RefObject } from \"react\";\n\nexport const useDialogClickHandler = (\n dialogRef: RefObject<HTMLDialogElement>,\n handleClose: () => void\n) => {\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLDialogElement>) => {\n const dialogDimensions = dialogRef.current?.getBoundingClientRect();\n if (dialogDimensions) {\n const isClickOutside =\n e.clientY < dialogDimensions.top ||\n e.clientY > dialogDimensions.bottom ||\n e.clientX < dialogDimensions.left ||\n e.clientX > dialogDimensions.right;\n\n if (isClickOutside) {\n handleClose();\n }\n }\n },\n [dialogRef, handleClose]\n );\n\n return handleClick;\n};\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var chunkPSIXTYFY_cjs = require('../../chunk-PSIXTYFY.cjs');
|
|
6
6
|
require('../../chunk-6WMLG4O5.cjs');
|
|
7
7
|
require('../../chunk-OZM455LO.cjs');
|
|
8
8
|
require('../../chunk-25KCUE3R.cjs');
|
|
@@ -14,11 +14,11 @@ require('../../chunk-66C2J4IX.cjs');
|
|
|
14
14
|
|
|
15
15
|
Object.defineProperty(exports, 'Dialog', {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkPSIXTYFY_cjs.b; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, 'default', {
|
|
20
20
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
21
|
+
get: function () { return chunkPSIXTYFY_cjs.c; }
|
|
22
22
|
});
|
|
23
23
|
//# sourceMappingURL=out.js.map
|
|
24
24
|
//# sourceMappingURL=dialog.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--dialog-min-width: max(20rem, 80%);--dialog-gap: 0.625rem;--dialog-border-color: var(--color-border);--dialog-border-width: thin;--dialog-border-style: solid;--dialog-border-radius: var(--border-radius);--dialog-padding: 1.5rem;--dialog-padding-inline: 1rem;--dialog-close-color: var(--color-text-secondary);--dialog-button-bg: transparent;--dialog-button-border: transparent thin solid;--dialog-button-hover-bg: var(--color-surface-secondary);--dialog-display: flex;--dialog-flex-direction: column;--dialog-focus-color: var(--color-focus);--dialog-focus-width: 0.125rem;--dialog-focus-offset: 0.125rem;--dialog-focus-outline: var(--dialog-focus-width) solid var(--dialog-focus-color)}@media(prefers-contrast: high){:root{--dialog-border-color: currentColor;--dialog-border-width: 0.125rem;--dialog-close-color: currentColor;--dialog-button-border: currentColor 0.125rem solid;--dialog-focus-width: 0.1875rem}}dialog{
|
|
1
|
+
:root{--dialog-min-width: max(20rem, 80%);--dialog-width: var(--dialog-min-width);--dialog-max-width: 90vw;--dialog-max-height: 85vh;--dialog-margin: auto;--dialog-inset: 0;--dialog-gap: 0.625rem;--dialog-border-color: var(--color-border);--dialog-border-width: thin;--dialog-border-style: solid;--dialog-border-radius: var(--border-radius);--dialog-padding: 1.5rem;--dialog-padding-inline: 1rem;--dialog-close-color: var(--color-text-secondary);--dialog-button-bg: transparent;--dialog-button-border: transparent thin solid;--dialog-button-hover-bg: var(--color-surface-secondary);--dialog-display: flex;--dialog-flex-direction: column;--dialog-focus-color: var(--color-focus);--dialog-focus-width: 0.125rem;--dialog-focus-offset: 0.125rem;--dialog-focus-outline: var(--dialog-focus-width) solid var(--dialog-focus-color)}@media(prefers-contrast: high){:root{--dialog-border-color: currentColor;--dialog-border-width: 0.125rem;--dialog-close-color: currentColor;--dialog-button-border: currentColor 0.125rem solid;--dialog-focus-width: 0.1875rem}}dialog{margin:var(--dialog-margin);inset:var(--dialog-inset);width:var(--dialog-width);max-width:var(--dialog-max-width);max-height:var(--dialog-max-height);gap:var(--dialog-gap);border:var(--dialog-border-color) var(--dialog-border-width) solid;border-radius:var(--dialog-border-radius);padding:var(--dialog-padding);padding-block-start:var(--dialog-padding)}dialog:focus-visible{outline:var(--dialog-focus-outline);outline-offset:var(--dialog-focus-offset)}dialog[open]{display:var(--dialog-display);flex-direction:var(--dialog-flex-direction);gap:var(--dialog-gap)}dialog section{width:100%;display:flex;justify-content:start;gap:var(--dialog-gap);flex-direction:var(--dialog-flex-direction);margin-block-start:0;--sect-y: 0}.dialog-header{display:flex;justify-content:space-between;align-items:center;width:100%;min-width:100%}.dialog-header h3{margin-block-start:0;margin-block-end:0}.dialog-header .dialog-close{margin-block-end:0}.dialog-header button[type=button]{background-color:var(--dialog-button-bg);border:var(--dialog-button-border);color:var(--dialog-close-color);cursor:pointer}.dialog-header button[type=button]:hover{border-color:var(--dialog-close-color);background-color:var(--dialog-button-hover-bg)}.dialog-header button[type=button]:focus-visible{outline:var(--dialog-focus-outline);outline-offset:var(--dialog-focus-offset);border-color:var(--dialog-focus-color);background-color:var(--dialog-button-hover-bg)}.dialog-header button[type=button]:focus:not(:focus-visible){outline:none}.alert-dialog-actions,.dialog-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:var(--dialog-footer-justify, flex-end);gap:var(--dialog-gap);width:100%}.alert-dialog-actions button:focus-visible,.dialog-footer button:focus-visible{outline:var(--dialog-focus-outline);outline-offset:var(--dialog-focus-offset)}.alert-dialog-actions button:focus:not(:focus-visible),.dialog-footer button:focus:not(:focus-visible){outline:none}dialog[data-size=sm]{--dialog-width: 25rem}dialog[data-size=md]{--dialog-width: 32rem}dialog[data-size=lg]{--dialog-width: 48rem}dialog[data-size=full]{box-sizing:border-box;width:100vw;max-width:100vw;height:100vh;max-height:100vh;margin:0;inset:0;border:0;border-radius:0}dialog[data-position=center]{--dialog-margin: auto;--dialog-inset: 0}dialog[data-position=top]{--dialog-margin: 0 auto auto auto;--dialog-inset: 0}dialog[data-position=bottom]{--dialog-margin: auto auto 0 auto;--dialog-inset: 0}dialog[data-position=left]{--dialog-margin: 0 auto 0 0;--dialog-inset: 0;height:100vh;max-height:100vh;border-radius:0}dialog[data-position=right]{--dialog-margin: 0 0 0 auto;--dialog-inset: 0;height:100vh;max-height:100vh;border-radius:0}dialog[data-position=top-left]{--dialog-margin: 0 auto auto 0;--dialog-inset: 0}dialog[data-position=top-right]{--dialog-margin: 0 0 auto auto;--dialog-inset: 0}dialog[data-position=bottom-left]{--dialog-margin: auto auto 0 0;--dialog-inset: 0}dialog[data-position=bottom-right]{--dialog-margin: auto 0 0 auto;--dialog-inset: 0}/*# sourceMappingURL=dialog.css.map */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../../../src/components/dialog/dialog.scss"],"names":[],"mappings":"AAAA,MACE,oCACA,uBACA,2CACA,4BACA,6BACA,6CACA,yBACA,8BACA,kDACA,gCACA,+CACA,yDACA,uBACA,gCAGA,yCACA,+BACA,gCACA,kFAIF,+BACE,MACE,oCACA,gCACA,mCACA,oDACA,iCAIJ,OACE,
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../src/components/dialog/dialog.scss"],"names":[],"mappings":"AAAA,MACE,oCACA,wCACA,yBACA,0BACA,sBACA,kBACA,uBACA,2CACA,4BACA,6BACA,6CACA,yBACA,8BACA,kDACA,gCACA,+CACA,yDACA,uBACA,gCAGA,yCACA,+BACA,gCACA,kFAIF,+BACE,MACE,oCACA,gCACA,mCACA,oDACA,iCAIJ,OACE,4BACA,0BACA,0BACA,kCACA,oCACA,sBACA,mEACA,0CACA,8BACA,0CAGA,qBACE,oCACA,0CAGF,aACE,8BACA,4CACA,sBAGF,eACE,WACA,aACA,sBACA,sBACA,4CACA,qBACA,YAIJ,eACE,aACA,8BACA,mBACA,WACA,eAEA,kBACE,qBACA,mBAGF,6BACE,mBAGF,mCACE,yCACA,mCACA,gCACA,eAEA,yCACE,uCACA,+CAIF,iDACE,oCACA,0CACA,uCACA,+CAIF,6DACE,aAKN,qCAEE,aACA,mBACA,eACA,uDACA,sBACA,WAGA,+EACE,oCACA,0CAGF,uGACE,aAMJ,qBACE,sBAGF,qBACE,sBAGF,qBACE,sBAGF,uBACE,sBACA,YACA,gBACA,aACA,iBACA,SACA,QACA,SACA,gBAKF,6BACE,sBACA,kBAGF,0BACE,kCACA,kBAGF,6BACE,kCACA,kBAGF,2BACE,4BACA,kBACA,aACA,iBACA,gBAGF,4BACE,4BACA,kBACA,aACA,iBACA,gBAGF,+BACE,+BACA,kBAGF,gCACE,+BACA,kBAGF,kCACE,+BACA,kBAGF,mCACE,+BACA","file":"dialog.css"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
export { a as Dialog, _ as default } from '../../dialog-
|
|
2
|
+
export { a as Dialog, _ as default } from '../../dialog-e28c085f.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
export { a as Dialog, _ as default } from '../../dialog-
|
|
2
|
+
export { a as Dialog, _ as default } from '../../dialog-e28c085f.js';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
:root{--dialog-min-width: max(20rem, 80%);--dialog-gap: 0.625rem;--dialog-border-color: var(--color-border);--dialog-border-width: thin;--dialog-border-style: solid;--dialog-border-radius: var(--border-radius);--dialog-padding: 1.5rem;--dialog-padding-inline: 1rem;--dialog-close-color: var(--color-text-secondary);--dialog-button-bg: transparent;--dialog-button-border: transparent thin solid;--dialog-button-hover-bg: var(--color-surface-secondary);--dialog-display: flex;--dialog-flex-direction: column;--dialog-focus-color: var(--color-focus);--dialog-focus-width: 0.125rem;--dialog-focus-offset: 0.125rem;--dialog-focus-outline: var(--dialog-focus-width) solid var(--dialog-focus-color)}@media(prefers-contrast: high){:root{--dialog-border-color: currentColor;--dialog-border-width: 0.125rem;--dialog-close-color: currentColor;--dialog-button-border: currentColor 0.125rem solid;--dialog-focus-width: 0.1875rem}}dialog{
|
|
1
|
+
:root{--dialog-min-width: max(20rem, 80%);--dialog-width: var(--dialog-min-width);--dialog-max-width: 90vw;--dialog-max-height: 85vh;--dialog-margin: auto;--dialog-inset: 0;--dialog-gap: 0.625rem;--dialog-border-color: var(--color-border);--dialog-border-width: thin;--dialog-border-style: solid;--dialog-border-radius: var(--border-radius);--dialog-padding: 1.5rem;--dialog-padding-inline: 1rem;--dialog-close-color: var(--color-text-secondary);--dialog-button-bg: transparent;--dialog-button-border: transparent thin solid;--dialog-button-hover-bg: var(--color-surface-secondary);--dialog-display: flex;--dialog-flex-direction: column;--dialog-focus-color: var(--color-focus);--dialog-focus-width: 0.125rem;--dialog-focus-offset: 0.125rem;--dialog-focus-outline: var(--dialog-focus-width) solid var(--dialog-focus-color)}@media(prefers-contrast: high){:root{--dialog-border-color: currentColor;--dialog-border-width: 0.125rem;--dialog-close-color: currentColor;--dialog-button-border: currentColor 0.125rem solid;--dialog-focus-width: 0.1875rem}}dialog{margin:var(--dialog-margin);inset:var(--dialog-inset);width:var(--dialog-width);max-width:var(--dialog-max-width);max-height:var(--dialog-max-height);gap:var(--dialog-gap);border:var(--dialog-border-color) var(--dialog-border-width) solid;border-radius:var(--dialog-border-radius);padding:var(--dialog-padding);padding-block-start:var(--dialog-padding)}dialog:focus-visible{outline:var(--dialog-focus-outline);outline-offset:var(--dialog-focus-offset)}dialog[open]{display:var(--dialog-display);flex-direction:var(--dialog-flex-direction);gap:var(--dialog-gap)}dialog section{width:100%;display:flex;justify-content:start;gap:var(--dialog-gap);flex-direction:var(--dialog-flex-direction);margin-block-start:0;--sect-y: 0}.dialog-header{display:flex;justify-content:space-between;align-items:center;width:100%;min-width:100%}.dialog-header h3{margin-block-start:0;margin-block-end:0}.dialog-header .dialog-close{margin-block-end:0}.dialog-header button[type=button]{background-color:var(--dialog-button-bg);border:var(--dialog-button-border);color:var(--dialog-close-color);cursor:pointer}.dialog-header button[type=button]:hover{border-color:var(--dialog-close-color);background-color:var(--dialog-button-hover-bg)}.dialog-header button[type=button]:focus-visible{outline:var(--dialog-focus-outline);outline-offset:var(--dialog-focus-offset);border-color:var(--dialog-focus-color);background-color:var(--dialog-button-hover-bg)}.dialog-header button[type=button]:focus:not(:focus-visible){outline:none}.alert-dialog-actions,.dialog-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:var(--dialog-footer-justify, flex-end);gap:var(--dialog-gap);width:100%}.alert-dialog-actions button:focus-visible,.dialog-footer button:focus-visible{outline:var(--dialog-focus-outline);outline-offset:var(--dialog-focus-offset)}.alert-dialog-actions button:focus:not(:focus-visible),.dialog-footer button:focus:not(:focus-visible){outline:none}dialog[data-size=sm]{--dialog-width: 25rem}dialog[data-size=md]{--dialog-width: 32rem}dialog[data-size=lg]{--dialog-width: 48rem}dialog[data-size=full]{box-sizing:border-box;width:100vw;max-width:100vw;height:100vh;max-height:100vh;margin:0;inset:0;border:0;border-radius:0}dialog[data-position=center]{--dialog-margin: auto;--dialog-inset: 0}dialog[data-position=top]{--dialog-margin: 0 auto auto auto;--dialog-inset: 0}dialog[data-position=bottom]{--dialog-margin: auto auto 0 auto;--dialog-inset: 0}dialog[data-position=left]{--dialog-margin: 0 auto 0 0;--dialog-inset: 0;height:100vh;max-height:100vh;border-radius:0}dialog[data-position=right]{--dialog-margin: 0 0 0 auto;--dialog-inset: 0;height:100vh;max-height:100vh;border-radius:0}dialog[data-position=top-left]{--dialog-margin: 0 auto auto 0;--dialog-inset: 0}dialog[data-position=top-right]{--dialog-margin: 0 0 auto auto;--dialog-inset: 0}dialog[data-position=bottom-left]{--dialog-margin: auto auto 0 0;--dialog-inset: 0}dialog[data-position=bottom-right]{--dialog-margin: auto 0 0 auto;--dialog-inset: 0}
|
|
2
2
|
|
|
3
|
-
/*# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9kaWFsb2cuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUNFLG1DQUFBLENBQ0EsdUNBQUEsQ0FDQSx3QkFBQSxDQUNBLHlCQUFBLENBQ0EscUJBQUEsQ0FDQSxpQkFBQSxDQUNBLHNCQUFBLENBQ0EsMENBQUEsQ0FDQSwyQkFBQSxDQUNBLDRCQUFBLENBQ0EsNENBQUEsQ0FDQSx3QkFBQSxDQUNBLDZCQUFBLENBQ0EsaURBQUEsQ0FDQSwrQkFBQSxDQUNBLDhDQUFBLENBQ0Esd0RBQUEsQ0FDQSxzQkFBQSxDQUNBLCtCQUFBLENBR0Esd0NBQUEsQ0FDQSw4QkFBQSxDQUNBLCtCQUFBLENBQ0EsaUZBQUEsQ0FJRiwrQkFDRSxNQUNFLG1DQUFBLENBQ0EsK0JBQUEsQ0FDQSxrQ0FBQSxDQUNBLG1EQUFBLENBQ0EsK0JBQUEsQ0FBQSxDQUlKLE9BQ0UsMkJBQUEsQ0FDQSx5QkFBQSxDQUNBLHlCQUFBLENBQ0EsaUNBQUEsQ0FDQSxtQ0FBQSxDQUNBLHFCQUFBLENBQ0Esa0VBQUEsQ0FDQSx5Q0FBQSxDQUNBLDZCQUFBLENBQ0EseUNBQUEsQ0FHQSxxQkFDRSxtQ0FBQSxDQUNBLHlDQUFBLENBR0YsYUFDRSw2QkFBQSxDQUNBLDJDQUFBLENBQ0EscUJBQUEsQ0FHRixlQUNFLFVBQUEsQ0FDQSxZQUFBLENBQ0EscUJBQUEsQ0FDQSxxQkFBQSxDQUNBLDJDQUFBLENBQ0Esb0JBQUEsQ0FDQSxXQUFBLENBSUosZUFDRSxZQUFBLENBQ0EsNkJBQUEsQ0FDQSxrQkFBQSxDQUNBLFVBQUEsQ0FDQSxjQUFBLENBRUEsa0JBQ0Usb0JBQUEsQ0FDQSxrQkFBQSxDQUdGLDZCQUNFLGtCQUFBLENBR0YsbUNBQ0Usd0NBQUEsQ0FDQSxrQ0FBQSxDQUNBLCtCQUFBLENBQ0EsY0FBQSxDQUVBLHlDQUNFLHNDQUFBLENBQ0EsOENBQUEsQ0FJRixpREFDRSxtQ0FBQSxDQUNBLHlDQUFBLENBQ0Esc0NBQUEsQ0FDQSw4Q0FBQSxDQUlGLDZEQUNFLFlBQUEsQ0FLTixxQ0FFRSxZQUFBLENBQ0Esa0JBQUEsQ0FDQSxjQUFBLENBQ0Esc0RBQUEsQ0FDQSxxQkFBQSxDQUNBLFVBQUEsQ0FHQSwrRUFDRSxtQ0FBQSxDQUNBLHlDQUFBLENBR0YsdUdBQ0UsWUFBQSxDQU1KLHFCQUNFLHFCQUFBLENBR0YscUJBQ0UscUJBQUEsQ0FHRixxQkFDRSxxQkFBQSxDQUdGLHVCQUNFLHFCQUFBLENBQ0EsV0FBQSxDQUNBLGVBQUEsQ0FDQSxZQUFBLENBQ0EsZ0JBQUEsQ0FDQSxRQUFBLENBQ0EsT0FBQSxDQUNBLFFBQUEsQ0FDQSxlQUFBLENBS0YsNkJBQ0UscUJBQUEsQ0FDQSxpQkFBQSxDQUdGLDBCQUNFLGlDQUFBLENBQ0EsaUJBQUEsQ0FHRiw2QkFDRSxpQ0FBQSxDQUNBLGlCQUFBLENBR0YsMkJBQ0UsMkJBQUEsQ0FDQSxpQkFBQSxDQUNBLFlBQUEsQ0FDQSxnQkFBQSxDQUNBLGVBQUEsQ0FHRiw0QkFDRSwyQkFBQSxDQUNBLGlCQUFBLENBQ0EsWUFBQSxDQUNBLGdCQUFBLENBQ0EsZUFBQSxDQUdGLCtCQUNFLDhCQUFBLENBQ0EsaUJBQUEsQ0FHRixnQ0FDRSw4QkFBQSxDQUNBLGlCQUFBLENBR0Ysa0NBQ0UsOEJBQUEsQ0FDQSxpQkFBQSxDQUdGLG1DQUNFLDhCQUFBLENBQ0EsaUJBQUEiLCJmaWxlIjoiZGlhbG9nLm1pbi5jc3MifQ== */
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import React, { ReactElement, ReactNode, CSSProperties } from 'react';
|
|
2
2
|
|
|
3
|
+
/** Size variant for the dialog. Controls width (and height for "full"). */
|
|
4
|
+
type DialogSize = "sm" | "md" | "lg" | "full";
|
|
5
|
+
/** Position of the dialog on screen. "left"/"right" render as full-height drawer panels. */
|
|
6
|
+
type DialogPosition = "center" | "top" | "bottom" | "left" | "right" | "top-left" | "top-right" | "bottom-left" | "bottom-right";
|
|
3
7
|
/**
|
|
4
8
|
* Base properties shared by all dialog variants.
|
|
5
9
|
*
|
|
@@ -8,6 +12,8 @@ import React, { ReactElement, ReactNode, CSSProperties } from 'react';
|
|
|
8
12
|
* @property {ReactNode} children - Content to be displayed inside the dialog body
|
|
9
13
|
* @property {string} [className] - Additional CSS classes to apply to the dialog
|
|
10
14
|
* @property {CSSProperties} [styles] - Inline styles to apply to the dialog element
|
|
15
|
+
* @property {DialogSize} [size] - Size variant controlling dialog dimensions
|
|
16
|
+
* @property {DialogPosition} [position] - Position of the dialog on screen
|
|
11
17
|
*/
|
|
12
18
|
interface BaseDialogProps {
|
|
13
19
|
/** The title displayed in the dialog header */
|
|
@@ -20,6 +26,12 @@ interface BaseDialogProps {
|
|
|
20
26
|
className?: string;
|
|
21
27
|
/** Inline styles to apply to the dialog element */
|
|
22
28
|
styles?: CSSProperties;
|
|
29
|
+
/** Size variant controlling dialog dimensions (sm, md, lg, full) */
|
|
30
|
+
size?: DialogSize;
|
|
31
|
+
/** Position of the dialog on screen (center, top, bottom, left, right, corners) */
|
|
32
|
+
position?: DialogPosition;
|
|
33
|
+
/** Size of the close button icon in pixels. @default 24 */
|
|
34
|
+
closeIconSize?: number;
|
|
23
35
|
}
|
|
24
36
|
/**
|
|
25
37
|
* Props for the controlled Dialog component.
|
|
@@ -142,9 +154,10 @@ interface DialogModalProps extends BaseDialogProps {
|
|
|
142
154
|
* @param {string} [props.className] - Additional CSS classes to apply
|
|
143
155
|
* @param {string} [props.dialogLabel] - Optional aria-label for the dialog
|
|
144
156
|
* @param {CSSProperties} [props.styles] - Inline styles to apply to dialog element
|
|
157
|
+
* @param {number} [props.closeIconSize=24] - Size of the close icon in pixels
|
|
145
158
|
* @returns {JSX.Element} A controlled dialog component
|
|
146
159
|
*/
|
|
147
160
|
declare const Dialog: React.FC<DialogProps>;
|
|
148
161
|
declare const _default: React.NamedExoticComponent<DialogProps>;
|
|
149
162
|
|
|
150
|
-
export { DialogModalProps as D, _default as _, Dialog as a, DialogProps as b };
|
|
163
|
+
export { DialogModalProps as D, _default as _, Dialog as a, DialogProps as b, DialogSize as c, DialogPosition as d };
|
package/libs/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var chunkVN2CVD4H_cjs = require('./chunk-VN2CVD4H.cjs');
|
|
4
4
|
var chunkBVPUT2PP_cjs = require('./chunk-BVPUT2PP.cjs');
|
|
5
5
|
var chunkTNEJXNZA_cjs = require('./chunk-TNEJXNZA.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunkPSIXTYFY_cjs = require('./chunk-PSIXTYFY.cjs');
|
|
7
7
|
var chunk3RVZZZWX_cjs = require('./chunk-3RVZZZWX.cjs');
|
|
8
8
|
var chunkVISQ434C_cjs = require('./chunk-VISQ434C.cjs');
|
|
9
9
|
var chunkZJ4RUKI2_cjs = require('./chunk-ZJ4RUKI2.cjs');
|
|
@@ -20,25 +20,25 @@ require('./chunk-PNWIRCG3.cjs');
|
|
|
20
20
|
require('./chunk-TON2YGMD.cjs');
|
|
21
21
|
var chunkLQPWXSCK_cjs = require('./chunk-LQPWXSCK.cjs');
|
|
22
22
|
var chunk66C2J4IX_cjs = require('./chunk-66C2J4IX.cjs');
|
|
23
|
-
var
|
|
23
|
+
var b = require('react');
|
|
24
24
|
|
|
25
25
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
26
26
|
|
|
27
|
-
var
|
|
27
|
+
var b__default = /*#__PURE__*/_interopDefault(b);
|
|
28
28
|
|
|
29
|
-
var
|
|
29
|
+
var Ve={default:"",info:"Information: ",success:"Success: ",warning:"Warning: ",error:"Error: "},O=({severity:e})=>{let t=Ve[e];return t?b__default.default.createElement("span",{className:"sr-only"},t):null};var ze=(e,t)=>({info:b__default.default.createElement(chunkOZM455LO_cjs.b.InfoSolid,{...t}),success:b__default.default.createElement(chunkOZM455LO_cjs.b.SuccessSolid,{...t}),warning:b__default.default.createElement(chunkOZM455LO_cjs.b.WarnSolid,{...t}),error:b__default.default.createElement(chunkOZM455LO_cjs.b.AlertSolid,{...t}),default:b__default.default.createElement(chunkOZM455LO_cjs.b.AlertSquareSolid,{...t})})[e],_=({severity:e,iconProps:t,hideIcon:o})=>{if(o)return null;let s=ze(e,t);return b__default.default.createElement(chunk66C2J4IX_cjs.a,{"aria-hidden":"true",className:"alert-icon"},s)};var q=({title:e,titleLevel:t})=>{if(!e)return null;let o=t?`h${t}`:"strong";return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:o,className:"alert-title"},e)};var K=({children:e,contentType:t})=>t==="node"?b__default.default.createElement(b__default.default.Fragment,null,e):b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"p"},e);var W=({actions:e})=>e?b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"div",className:"alert-actions"},e):null;var ee=b__default.default.memo(({onDismiss:e,iconSize:t=16})=>b__default.default.createElement(chunk25KCUE3R_cjs.b,{type:"button",onClick:e,"aria-label":"Close alert",className:"alert-dismiss","data-btn":"icon sm"},b__default.default.createElement(chunkOZM455LO_cjs.b,null,b__default.default.createElement(chunkOZM455LO_cjs.b.Close,{size:t})))),te=ee;ee.displayName="DismissButton";var qe={default:"polite",info:"polite",success:"polite",warning:"polite",error:"assertive"},D=b__default.default.forwardRef(({severity:e,variant:t,isVisible:o,dismissible:s,onDismiss:r,onInteractionStart:l,onInteractionEnd:a,autoFocus:i,title:p,titleLevel:u,children:m,contentType:c,actions:y,hideIcon:h,iconProps:I,...x},g)=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"div",ref:g,role:"alert","aria-live":qe[e],"aria-atomic":"true",className:`alert alert-${e}`,"data-alert":e,"data-visible":o,"data-variant":t,tabIndex:i?-1:void 0,onMouseEnter:l,onMouseLeave:a,onFocus:l,onBlur:a,...x},b__default.default.createElement(O,{severity:e}),b__default.default.createElement(_,{severity:e,iconProps:I,hideIcon:h}),b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"div",classes:"alert-message"},b__default.default.createElement(q,{title:p,titleLevel:u}),b__default.default.createElement(K,{contentType:c},m),b__default.default.createElement(W,{actions:y})),s&&b__default.default.createElement(te,{onDismiss:r})));D.displayName="AlertView";var Je=({open:e,onDismiss:t,dismissible:o,autoHideDuration:s,pauseOnHover:r,autoFocus:l,alertRef:a})=>{let[i,p]=b__default.default.useState(e),[u,m]=b__default.default.useState(e),[c,y]=b__default.default.useState(!1),h=b__default.default.useCallback(()=>{p(!1),setTimeout(()=>{m(!1),t?.();},300);},[t]);b__default.default.useEffect(()=>{e?(m(!0),p(!0)):p(!1);},[e]),b__default.default.useEffect(()=>{if(!s||!i||c)return;let g=setTimeout(()=>{h();},s);return ()=>clearTimeout(g)},[s,i,c,h]),b__default.default.useEffect(()=>{if(!o||!i)return;let g=P=>{P.key==="Escape"&&h();};return document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)},[o,i,h]),b__default.default.useEffect(()=>{l&&i&&a.current&&a.current.focus();},[l,i,a]);let I=b__default.default.useCallback(()=>{r&&s&&y(!0);},[r,s]),x=b__default.default.useCallback(()=>{r&&s&&y(!1);},[r,s]);return {isVisible:i,shouldRender:u,handleDismiss:h,handleInteractionStart:I,handleInteractionEnd:x}},oe=({open:e,severity:t="default",children:o,title:s,dismissible:r=!1,onDismiss:l,iconSize:a,iconProps:i,hideIcon:p,autoHideDuration:u,pauseOnHover:m=!0,titleLevel:c=3,actions:y,autoFocus:h=!1,variant:I="outlined",contentType:x="text",...g})=>{let P=b__default.default.useRef(null),{isVisible:d,shouldRender:f,handleDismiss:$,handleInteractionStart:v,handleInteractionEnd:C}=Je({open:e,onDismiss:l,dismissible:r,autoHideDuration:u,pauseOnHover:m,autoFocus:h,alertRef:P});if(!f)return null;let S={size:a||16,...i};return b__default.default.createElement(D,{ref:P,severity:t,variant:I,isVisible:d,dismissible:r,onDismiss:$,onInteractionStart:v,onInteractionEnd:C,autoFocus:h,title:s,titleLevel:c,contentType:x,actions:y,hideIcon:p,iconProps:S,...g},o)};oe.displayName="Alert";var se=b__default.default.forwardRef(({id:e,label:t,checked:o,defaultChecked:s,value:r="on",onChange:l,classes:a,inputClasses:i,styles:p,size:u,name:m,disabled:c,required:y,validationState:h,errorMessage:I,hintText:x,onBlur:g,onFocus:P,autoFocus:d,...f},$)=>{let v=b__default.default.useCallback($e=>{l?.($e.target.checked);},[l]),C=o!==void 0,S=C?{checked:o}:{},N=!C&&s!==void 0?{defaultChecked:s}:{},j=b__default.default.useRef(C);return b__default.default.useEffect(()=>{process.env.NODE_ENV==="development"&&(j.current!==C&&console.warn(`Checkbox with id="${e}" is changing from ${j.current?"controlled":"uncontrolled"} to ${C?"controlled":"uncontrolled"}. This is likely a bug. Decide between using "checked" (controlled) or "defaultChecked" (uncontrolled) and stick with it.`),j.current=C);},[C,e]),b__default.default.createElement("div",{className:a,style:p,"data-checkbox-size":u},b__default.default.createElement(chunk4BZKFPEC_cjs.a,{ref:$,type:"checkbox",id:e,name:m,value:r,...S,...N,classes:i||"checkbox-input",disabled:c,required:y,validationState:h,errorMessage:I,hintText:x,onChange:v,onBlur:g,onFocus:P,autoFocus:d,...f}),b__default.default.createElement("label",{htmlFor:e,className:"checkbox-label"},t,y&&b__default.default.createElement("span",{className:"checkbox-required","aria-label":"required"}," *")))});se.displayName="Checkbox";var re=({src:e="//",alt:t,width:o=480,height:s,styles:r,loading:l="lazy",placeholder:a,fetchpriority:i="low",decoding:p="auto",srcSet:u,sizes:m,onError:c,onLoad:y,...h})=>{let I=b.useMemo(()=>{let d=typeof o=="number"?o:480,f=typeof s=="number"?s:Math.round(d*.75),$=`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${d} ${f}">
|
|
30
30
|
<defs>
|
|
31
|
-
<linearGradient id="grad-${
|
|
31
|
+
<linearGradient id="grad-${d}-${f}" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
32
32
|
<stop offset="0%" style="stop-color:#6366f1;stop-opacity:1" />
|
|
33
33
|
<stop offset="50%" style="stop-color:#8b5cf6;stop-opacity:1" />
|
|
34
34
|
<stop offset="100%" style="stop-color:#ec4899;stop-opacity:1" />
|
|
35
35
|
</linearGradient>
|
|
36
36
|
</defs>
|
|
37
|
-
<rect width="${
|
|
38
|
-
<circle cx="${
|
|
39
|
-
<path d="M0,${f*.75} Q${
|
|
40
|
-
<text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" font-family="system-ui,-apple-system,sans-serif" font-size="${Math.max(16,Math.min(
|
|
41
|
-
</svg>`;return `data:image/svg+xml,${encodeURIComponent($)}`},[o,r]),x=a??P;return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"img",src:e,alt:t,width:o,height:r||"auto",loading:l,style:s,srcSet:d,sizes:m,onError:u=>{c&&c(u),u.defaultPrevented||u.currentTarget.src!==x&&(u.currentTarget.src=x);},onLoad:u=>{g?.(u);},decoding:p,...h,...i&&{fetchpriority:i}})};ne.displayName="Img";var ae=({isAlertDialog:e=!1,onClose:t,dialogTitle:o,dialogLabel:r,btnLabel:s="Open Dialog",btnSize:l="sm",btnOnClick:a,children:i,onConfirm:p,confirmLabel:d="Confirm",cancelLabel:m="Cancel",className:c,hideFooter:g=!1,btnProps:h,icon:P})=>{let[x,y]=v.useState(!1),I=v.useRef(null),u=v.useCallback(b=>{y(b),!b&&t&&t();},[t]),f=v.useCallback(()=>{I.current=document.activeElement,y(!0),a&&a();},[a]);v.useEffect(()=>{if(!x&&I.current){let b=setTimeout(()=>{I.current?.focus();},100);return ()=>clearTimeout(b)}},[x]);let $={type:"button",onClick:f,"aria-haspopup":"dialog",...h};return v__default.default.createElement(v__default.default.Fragment,null,P?v__default.default.createElement(L,{icon:P,"aria-label":s,label:s,size:l,...$}):v__default.default.createElement(chunk25KCUE3R_cjs.b,{"data-btn":l,...$},s),v__default.default.createElement(chunkZOPHCNFD_cjs.b,{isOpen:x,onOpenChange:u,dialogTitle:o,dialogLabel:r,className:c,isAlertDialog:e,onConfirm:p,confirmLabel:d,cancelLabel:m,hideFooter:g},i))};ae.displayName="DialogModal";var S=e=>v__default.default.createElement(v__default.default.Fragment,null,e),et=({id:e,children:t,headerBackground:o,styles:r,classes:s,...l})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"header",id:e,styles:r,className:s,...l},o,v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},t)),tt=({id:e,children:t,styles:o,classes:r,...s})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"main",id:e,styles:o,...s,className:r},t),ot=({id:e,classes:t,children:o,styles:r={},...s})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"footer",id:e,className:t,styles:r,...s},v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},o||"Copyright \xA9 2022")),rt=({id:e,children:t,styles:o={},classes:r,...s})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"aside",id:e,styles:o,className:r,...s},v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},t)),st=({id:e,children:t,styles:o,classes:r,...s})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section",id:e,styles:o,className:r,...s},t),nt=({id:e,children:t,styles:o,classes:r,...s})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"article",id:e,styles:o,className:r,...s},t),lt=({id:e,children:t,legend:o,description:r,descriptionId:s,styles:l,classes:a,...i})=>{let p=s||(r?`${e}-desc`:void 0);return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"fieldset",id:e,styles:l,className:a,"aria-describedby":p,...i},o&&v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"legend"},o),r&&v__default.default.createElement("p",{id:p,className:"fieldset-description"},r),t)};S.displayName="Landmarks";S.Header=et;S.Main=tt;S.Footer=ot;S.Aside=rt;S.Section=st;S.Article=nt;S.Fieldset=lt;var pe=v__default.default.forwardRef(({padding:e,paddingInline:t,paddingBlock:o,margin:r,marginInline:s,marginBlock:l,width:a,maxWidth:i,radius:p,as:d="div",className:m,classes:c,children:g,...h},P)=>{let x=[];e&&x.push(`box-padding-${e}`),t&&x.push(`box-padding-inline-${t}`),o&&x.push(`box-padding-block-${o}`),r&&x.push(`box-margin-${r}`),s&&x.push(`box-margin-inline-${s}`),l&&x.push(`box-margin-block-${l}`),a&&x.push(`box-width-${a}`),i&&x.push(`box-max-width-${i}`),p&&x.push(`box-radius-${p}`);let y=[...x,m,c].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:d,ref:P,classes:y||void 0,...h},g)});pe.displayName="Box";var fe=v__default.default.forwardRef(({gap:e,direction:t="vertical",align:o,justify:r,wrap:s,as:l="div",className:a,classes:i,children:p,...d},m)=>{let c=["stack"];t==="horizontal"?c.push("stack-horizontal"):c.push("stack-vertical"),e&&c.push(`stack-gap-${e}`),o&&c.push(`stack-align-${o}`),r&&c.push(`stack-justify-${r}`),s&&c.push(`stack-${s}`);let g=[...c,a,i].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:l,ref:m,classes:g,...d},p)});fe.displayName="Stack";var de=v__default.default.forwardRef(({gap:e,justify:t,align:o,as:r="div",className:s,classes:l,children:a,...i},p)=>{let d=["cluster"];e&&d.push(`cluster-gap-${e}`),t&&d.push(`cluster-justify-${t}`),o&&d.push(`cluster-align-${o}`);let m=[...d,s,l].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:r,ref:p,classes:m,...i},a)});de.displayName="Cluster";var ue=v__default.default.forwardRef(({columns:e,auto:t,minColumnWidth:o,gap:r,gapX:s,gapY:l,justifyItems:a,alignItems:i,as:p="div",className:d,classes:m,children:c,style:g,styles:h,...P},x)=>{let y=["grid"];e&&y.push(`grid-cols-${e}`),t&&y.push(`grid-auto-${t}`),r&&y.push(`grid-gap-${r}`),s&&y.push(`grid-gap-x-${s}`),l&&y.push(`grid-gap-y-${l}`),a&&y.push(`grid-justify-items-${a}`),i&&y.push(`grid-align-items-${i}`);let I=[...y,d,m].filter(Boolean).join(" "),u={...g||{},...h||{}};return t&&o&&(u.gridTemplateColumns=`repeat(auto-${t}, minmax(${o}, 1fr))`),v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:p,ref:x,classes:I,style:Object.keys(u).length>0?u:void 0,...P},c)});ue.displayName="Grid";var X=v__default.default.forwardRef(({span:e,rowSpan:t,as:o="div",className:r,classes:s,children:l,...a},i)=>{let p=[];e&&p.push(`grid-col-span-${e}`),t&&p.push(`grid-row-span-${t}`);let d=[...p,r,s].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:o,ref:i,classes:d,...a},l)});X.displayName="GridItem";var xe=ue;xe.Item=X;var at=xe;var ge=v__default.default.forwardRef(({gap:e,justify:t,align:o,wrap:r,alwaysProportional:s=!1,as:l="div",className:a,classes:i,children:p,...d},m)=>{process.env.NODE_ENV==="development"&&s&&console.warn('[fpkit] Row: alwaysProportional is deprecated and will be removed in v5.0.0. Use responsive column utilities instead: className="col-sm-6 col-md-4"');let c=["col-row"];e&&c.push(`col-row-gap-${e}`),t&&c.push(`col-row-justify-${t}`),o&&c.push(`col-row-align-${o}`),r&&r!=="wrap"&&c.push(`col-row-${r}`),s&&c.push("col-row-proportional");let g=[...c,a,i].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:l,ref:m,classes:g,...d},p)});ge.displayName="Row";var Ie=v__default.default.forwardRef(({span:e,offset:t,order:o,auto:r=!1,as:s="div",className:l,classes:a,children:i,...p},d)=>{let m=[];r?m.push("col-auto"):e==="flex"?m.push("col-flex"):e&&m.push(`col-${e}`),t!==void 0&&m.push(`col-offset-${t}`),o!==void 0&&m.push(`col-order-${o}`);let c=[...m,l,a].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:s,ref:d,classes:c,...p},i)});Ie.displayName="Col";var U=(e,t="")=>{let o=[];if(e.direction){let r={row:"flex-row","row-reverse":"flex-row-reverse",column:"flex-col","column-reverse":"flex-col-reverse"};o.push(`${t}${r[e.direction]}`);}if(e.wrap){let r={wrap:"flex-wrap",nowrap:"flex-nowrap","wrap-reverse":"flex-wrap-reverse"};o.push(`${t}${r[e.wrap]}`);}if(e.gap&&o.push(`${t}gap-${e.gap}`),e.rowGap&&o.push(`${t}row-gap-${e.rowGap}`),e.colGap&&o.push(`${t}col-gap-${e.colGap}`),e.justify){let r={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"};o.push(`${t}${r[e.justify]}`);}if(e.align){let r={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};o.push(`${t}${r[e.align]}`);}if(e.alignContent){let r={start:"content-start",end:"content-end",center:"content-center",between:"content-between",around:"content-around",evenly:"content-evenly",stretch:"content-stretch"};o.push(`${t}${r[e.alignContent]}`);}return o},Pe=v__default.default.forwardRef((e,t)=>{let{variant:o,inline:r=!1,as:s="div",className:l="",styles:a,children:i,sm:p,md:d,lg:m,xl:c,direction:g,wrap:h,gap:P,rowGap:x,colGap:y,justify:I,align:u,alignContent:f,...$}=e,b=[];if(b.push(r?"flex-inline":"flex"),o){let M={center:"flex-center",between:"flex-between",around:"flex-around",stack:"flex-stack",spread:"flex-spread"};b.push(M[o]);}b.push(...U({direction:g,wrap:h,gap:P,rowGap:x,colGap:y,justify:I,align:u,alignContent:f})),p&&b.push(...U(p,"sm:")),d&&b.push(...U(d,"md:")),m&&b.push(...U(m,"lg:")),c&&b.push(...U(c,"xl:"));let w=[...b,l].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:s,ref:t,classes:w,styles:a,...$},i)});Pe.displayName="Flex";var be=v__default.default.forwardRef((e,t)=>{let{grow:o,shrink:r,basis:s,flex:l,alignSelf:a,order:i,as:p="div",className:d="",styles:m,children:c,sm:g,md:h,lg:P,xl:x,...y}=e,I=[];if(l){let f={1:"flex-1",auto:"flex-auto",initial:"flex-initial",none:"flex-none"};I.push(f[l]);}if(o!==void 0&&I.push(`flex-grow-${o}`),r!==void 0&&I.push(`flex-shrink-${r}`),s){let f={auto:"flex-basis-auto",0:"flex-basis-0",full:"flex-basis-full"};I.push(f[s]);}if(a){let f={auto:"self-auto",start:"self-start",end:"self-end",center:"self-center",baseline:"self-baseline",stretch:"self-stretch"};I.push(f[a]);}if(i){let f={first:"order-first",last:"order-last",none:"order-none"};I.push(f[i]);}if(g?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};I.push(`sm:${f[g.flex]}`);}if(h?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};I.push(`md:${f[h.flex]}`);}if(P?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};I.push(`lg:${f[P.flex]}`);}if(x?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};I.push(`xl:${f[x.flex]}`);}let u=[...I,d].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:p,ref:t,classes:u,styles:m,...y},c)});be.displayName="Flex.Item";var ve=v__default.default.forwardRef((e,t)=>{let{as:o="div",className:r="",styles:s,...l}=e,a=["flex-1",r].filter(Boolean).join(" ");return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:o,ref:t,classes:a,styles:s,...l})});ve.displayName="Flex.Spacer";var Q=Pe;Q.Item=be;Q.Spacer=ve;var it=Q;var we=({id:e,styles:t,classes:o,children:r,variant:s,...l})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"sup",id:e,styles:t,className:o,"data-badge":s||void 0,role:"status",...l},v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"span"},r));we.displayName="Badge";var ct=({elm:e="span",role:t="note",variant:o,children:r,styles:s,...l})=>v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:e,role:t,"data-tag":o||void 0,styles:s,...l},r);ct.displayName="Tag";var ft=v__default.default.forwardRef(({summary:e,icon:t,styles:o,classes:r,ariaLabel:s,name:l,open:a,onPointerDown:i,onToggle:p,children:d,...m},c)=>{let g=v.useCallback(P=>{i?.(P);},[i]),h=v.useCallback(P=>{p?.(P);},[p]);return v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"details",styles:o,classes:r,onToggle:h,ref:c,open:a,"aria-label":s,name:l,...m},v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"summary",onPointerDown:g},t,e),v__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},d))});ft.displayName="Details";
|
|
37
|
+
<rect width="${d}" height="${f}" fill="url(#grad-${d}-${f})"/>
|
|
38
|
+
<circle cx="${d*.15}" cy="${f*.2}" r="${Math.min(d,f)*.08}" fill="rgba(255,255,255,0.2)"/>
|
|
39
|
+
<path d="M0,${f*.75} Q${d*.25},${f*.65} ${d*.5},${f*.75} T${d},${f*.75} L${d},${f} L0,${f} Z" fill="rgba(0,0,0,0.15)"/>
|
|
40
|
+
<text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" font-family="system-ui,-apple-system,sans-serif" font-size="${Math.max(16,Math.min(d,f)*.05)}" font-weight="500" fill="rgba(255,255,255,0.9)">${d}\xD7${f}</text>
|
|
41
|
+
</svg>`;return `data:image/svg+xml,${encodeURIComponent($)}`},[o,s]),x=a??I;return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"img",src:e,alt:t,width:o,height:s||"auto",loading:l,style:r,srcSet:u,sizes:m,onError:d=>{c&&c(d),d.defaultPrevented||d.currentTarget.src!==x&&(d.currentTarget.src=x);},onLoad:d=>{y?.(d);},decoding:p,...h,...i&&{fetchpriority:i}})};re.displayName="Img";var le=({isAlertDialog:e=!1,onClose:t,dialogTitle:o,dialogLabel:s,btnLabel:r="Open Dialog",btnSize:l="sm",btnOnClick:a,children:i,onConfirm:p,confirmLabel:u="Confirm",cancelLabel:m="Cancel",className:c,hideFooter:y=!1,btnProps:h,icon:I,size:x,position:g,closeIconSize:P})=>{let[d,f]=b.useState(!1),$=b.useRef(null),v=b.useCallback(N=>{f(N),!N&&t&&t();},[t]),C=b.useCallback(()=>{$.current=document.activeElement,f(!0),a&&a();},[a]);b.useEffect(()=>{if(!d&&$.current){let N=setTimeout(()=>{$.current?.focus();},100);return ()=>clearTimeout(N)}},[d]);let S={type:"button",onClick:C,"aria-haspopup":"dialog",...h};return b__default.default.createElement(b__default.default.Fragment,null,I?b__default.default.createElement(chunkPSIXTYFY_cjs.a,{icon:I,"aria-label":r,label:r,size:l,...S}):b__default.default.createElement(chunk25KCUE3R_cjs.b,{"data-btn":l,...S},r),b__default.default.createElement(chunkPSIXTYFY_cjs.c,{isOpen:d,onOpenChange:v,dialogTitle:o,dialogLabel:s,className:c,isAlertDialog:e,onConfirm:p,confirmLabel:u,cancelLabel:m,hideFooter:y,size:x,position:g,closeIconSize:P},i))};le.displayName="DialogModal";var k=e=>b__default.default.createElement(b__default.default.Fragment,null,e),Ze=({id:e,children:t,headerBackground:o,styles:s,classes:r,...l})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"header",id:e,styles:s,className:r,...l},o,b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},t)),et=({id:e,children:t,styles:o,classes:s,...r})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"main",id:e,styles:o,...r,className:s},t),tt=({id:e,classes:t,children:o,styles:s={},...r})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"footer",id:e,className:t,styles:s,...r},b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},o||"Copyright \xA9 2022")),ot=({id:e,children:t,styles:o={},classes:s,...r})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"aside",id:e,styles:o,className:s,...r},b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},t)),st=({id:e,children:t,styles:o,classes:s,...r})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section",id:e,styles:o,className:s,...r},t),rt=({id:e,children:t,styles:o,classes:s,...r})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"article",id:e,styles:o,className:s,...r},t),nt=({id:e,children:t,legend:o,description:s,descriptionId:r,styles:l,classes:a,...i})=>{let p=r||(s?`${e}-desc`:void 0);return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"fieldset",id:e,styles:l,className:a,"aria-describedby":p,...i},o&&b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"legend"},o),s&&b__default.default.createElement("p",{id:p,className:"fieldset-description"},s),t)};k.displayName="Landmarks";k.Header=Ze;k.Main=et;k.Footer=tt;k.Aside=ot;k.Section=st;k.Article=rt;k.Fieldset=nt;var ie=b__default.default.forwardRef(({padding:e,paddingInline:t,paddingBlock:o,margin:s,marginInline:r,marginBlock:l,width:a,maxWidth:i,radius:p,as:u="div",className:m,classes:c,children:y,...h},I)=>{let x=[];e&&x.push(`box-padding-${e}`),t&&x.push(`box-padding-inline-${t}`),o&&x.push(`box-padding-block-${o}`),s&&x.push(`box-margin-${s}`),r&&x.push(`box-margin-inline-${r}`),l&&x.push(`box-margin-block-${l}`),a&&x.push(`box-width-${a}`),i&&x.push(`box-max-width-${i}`),p&&x.push(`box-radius-${p}`);let g=[...x,m,c].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:u,ref:I,classes:g||void 0,...h},y)});ie.displayName="Box";var ce=b__default.default.forwardRef(({gap:e,direction:t="vertical",align:o,justify:s,wrap:r,as:l="div",className:a,classes:i,children:p,...u},m)=>{let c=["stack"];t==="horizontal"?c.push("stack-horizontal"):c.push("stack-vertical"),e&&c.push(`stack-gap-${e}`),o&&c.push(`stack-align-${o}`),s&&c.push(`stack-justify-${s}`),r&&c.push(`stack-${r}`);let y=[...c,a,i].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:l,ref:m,classes:y,...u},p)});ce.displayName="Stack";var me=b__default.default.forwardRef(({gap:e,justify:t,align:o,as:s="div",className:r,classes:l,children:a,...i},p)=>{let u=["cluster"];e&&u.push(`cluster-gap-${e}`),t&&u.push(`cluster-justify-${t}`),o&&u.push(`cluster-align-${o}`);let m=[...u,r,l].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:s,ref:p,classes:m,...i},a)});me.displayName="Cluster";var de=b__default.default.forwardRef(({columns:e,auto:t,minColumnWidth:o,gap:s,gapX:r,gapY:l,justifyItems:a,alignItems:i,as:p="div",className:u,classes:m,children:c,style:y,styles:h,...I},x)=>{let g=["grid"];e&&g.push(`grid-cols-${e}`),t&&g.push(`grid-auto-${t}`),s&&g.push(`grid-gap-${s}`),r&&g.push(`grid-gap-x-${r}`),l&&g.push(`grid-gap-y-${l}`),a&&g.push(`grid-justify-items-${a}`),i&&g.push(`grid-align-items-${i}`);let P=[...g,u,m].filter(Boolean).join(" "),d={...y||{},...h||{}};return t&&o&&(d.gridTemplateColumns=`repeat(auto-${t}, minmax(${o}, 1fr))`),b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:p,ref:x,classes:P,style:Object.keys(d).length>0?d:void 0,...I},c)});de.displayName="Grid";var X=b__default.default.forwardRef(({span:e,rowSpan:t,as:o="div",className:s,classes:r,children:l,...a},i)=>{let p=[];e&&p.push(`grid-col-span-${e}`),t&&p.push(`grid-row-span-${t}`);let u=[...p,s,r].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:o,ref:i,classes:u,...a},l)});X.displayName="GridItem";var ue=de;ue.Item=X;var lt=ue;var ye=b__default.default.forwardRef(({gap:e,justify:t,align:o,wrap:s,alwaysProportional:r=!1,as:l="div",className:a,classes:i,children:p,...u},m)=>{process.env.NODE_ENV==="development"&&r&&console.warn('[fpkit] Row: alwaysProportional is deprecated and will be removed in v5.0.0. Use responsive column utilities instead: className="col-sm-6 col-md-4"');let c=["col-row"];e&&c.push(`col-row-gap-${e}`),t&&c.push(`col-row-justify-${t}`),o&&c.push(`col-row-align-${o}`),s&&s!=="wrap"&&c.push(`col-row-${s}`),r&&c.push("col-row-proportional");let y=[...c,a,i].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:l,ref:m,classes:y,...u},p)});ye.displayName="Row";var he=b__default.default.forwardRef(({span:e,offset:t,order:o,auto:s=!1,as:r="div",className:l,classes:a,children:i,...p},u)=>{let m=[];s?m.push("col-auto"):e==="flex"?m.push("col-flex"):e&&m.push(`col-${e}`),t!==void 0&&m.push(`col-offset-${t}`),o!==void 0&&m.push(`col-order-${o}`);let c=[...m,l,a].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:r,ref:u,classes:c,...p},i)});he.displayName="Col";var L=(e,t="")=>{let o=[];if(e.direction){let s={row:"flex-row","row-reverse":"flex-row-reverse",column:"flex-col","column-reverse":"flex-col-reverse"};o.push(`${t}${s[e.direction]}`);}if(e.wrap){let s={wrap:"flex-wrap",nowrap:"flex-nowrap","wrap-reverse":"flex-wrap-reverse"};o.push(`${t}${s[e.wrap]}`);}if(e.gap&&o.push(`${t}gap-${e.gap}`),e.rowGap&&o.push(`${t}row-gap-${e.rowGap}`),e.colGap&&o.push(`${t}col-gap-${e.colGap}`),e.justify){let s={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"};o.push(`${t}${s[e.justify]}`);}if(e.align){let s={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};o.push(`${t}${s[e.align]}`);}if(e.alignContent){let s={start:"content-start",end:"content-end",center:"content-center",between:"content-between",around:"content-around",evenly:"content-evenly",stretch:"content-stretch"};o.push(`${t}${s[e.alignContent]}`);}return o},Ie=b__default.default.forwardRef((e,t)=>{let{variant:o,inline:s=!1,as:r="div",className:l="",styles:a,children:i,sm:p,md:u,lg:m,xl:c,direction:y,wrap:h,gap:I,rowGap:x,colGap:g,justify:P,align:d,alignContent:f,...$}=e,v=[];if(v.push(s?"flex-inline":"flex"),o){let S={center:"flex-center",between:"flex-between",around:"flex-around",stack:"flex-stack",spread:"flex-spread"};v.push(S[o]);}v.push(...L({direction:y,wrap:h,gap:I,rowGap:x,colGap:g,justify:P,align:d,alignContent:f})),p&&v.push(...L(p,"sm:")),u&&v.push(...L(u,"md:")),m&&v.push(...L(m,"lg:")),c&&v.push(...L(c,"xl:"));let C=[...v,l].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:r,ref:t,classes:C,styles:a,...$},i)});Ie.displayName="Flex";var Pe=b__default.default.forwardRef((e,t)=>{let{grow:o,shrink:s,basis:r,flex:l,alignSelf:a,order:i,as:p="div",className:u="",styles:m,children:c,sm:y,md:h,lg:I,xl:x,...g}=e,P=[];if(l){let f={1:"flex-1",auto:"flex-auto",initial:"flex-initial",none:"flex-none"};P.push(f[l]);}if(o!==void 0&&P.push(`flex-grow-${o}`),s!==void 0&&P.push(`flex-shrink-${s}`),r){let f={auto:"flex-basis-auto",0:"flex-basis-0",full:"flex-basis-full"};P.push(f[r]);}if(a){let f={auto:"self-auto",start:"self-start",end:"self-end",center:"self-center",baseline:"self-baseline",stretch:"self-stretch"};P.push(f[a]);}if(i){let f={first:"order-first",last:"order-last",none:"order-none"};P.push(f[i]);}if(y?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};P.push(`sm:${f[y.flex]}`);}if(h?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};P.push(`md:${f[h.flex]}`);}if(I?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};P.push(`lg:${f[I.flex]}`);}if(x?.flex){let f={1:"flex-1",auto:"flex-auto",none:"flex-none"};P.push(`xl:${f[x.flex]}`);}let d=[...P,u].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:p,ref:t,classes:d,styles:m,...g},c)});Pe.displayName="Flex.Item";var ve=b__default.default.forwardRef((e,t)=>{let{as:o="div",className:s="",styles:r,...l}=e,a=["flex-1",s].filter(Boolean).join(" ");return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:o,ref:t,classes:a,styles:r,...l})});ve.displayName="Flex.Spacer";var Q=Ie;Q.Item=Pe;Q.Spacer=ve;var at=Q;var Ce=({id:e,styles:t,classes:o,children:s,variant:r,...l})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"sup",id:e,styles:t,className:o,"data-badge":r||void 0,role:"status",...l},b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"span"},s));Ce.displayName="Badge";var pt=({elm:e="span",role:t="note",variant:o,children:s,styles:r,...l})=>b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:e,role:t,"data-tag":o||void 0,styles:r,...l},s);pt.displayName="Tag";var ct=b__default.default.forwardRef(({summary:e,icon:t,styles:o,classes:s,ariaLabel:r,name:l,open:a,onPointerDown:i,onToggle:p,children:u,...m},c)=>{let y=b.useCallback(I=>{i?.(I);},[i]),h=b.useCallback(I=>{p?.(I);},[p]);return b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"details",styles:o,classes:s,onToggle:h,ref:c,open:a,"aria-label":r,name:l,...m},b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"summary",onPointerDown:y},t,e),b__default.default.createElement(chunk66C2J4IX_cjs.a,{as:"section"},u))});ct.displayName="Details";
|
|
42
42
|
|
|
43
43
|
Object.defineProperty(exports, 'Textarea', {
|
|
44
44
|
enumerable: true,
|
|
@@ -78,7 +78,11 @@ Object.defineProperty(exports, 'Tr', {
|
|
|
78
78
|
});
|
|
79
79
|
Object.defineProperty(exports, 'Dialog', {
|
|
80
80
|
enumerable: true,
|
|
81
|
-
get: function () { return
|
|
81
|
+
get: function () { return chunkPSIXTYFY_cjs.b; }
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(exports, 'IconButton', {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
get: function () { return chunkPSIXTYFY_cjs.a; }
|
|
82
86
|
});
|
|
83
87
|
Object.defineProperty(exports, 'Nav', {
|
|
84
88
|
enumerable: true,
|
|
@@ -168,29 +172,28 @@ Object.defineProperty(exports, 'UI', {
|
|
|
168
172
|
enumerable: true,
|
|
169
173
|
get: function () { return chunk66C2J4IX_cjs.a; }
|
|
170
174
|
});
|
|
171
|
-
exports.Alert =
|
|
172
|
-
exports.Article =
|
|
173
|
-
exports.Aside =
|
|
174
|
-
exports.Badge =
|
|
175
|
-
exports.Box =
|
|
175
|
+
exports.Alert = oe;
|
|
176
|
+
exports.Article = rt;
|
|
177
|
+
exports.Aside = ot;
|
|
178
|
+
exports.Badge = Ce;
|
|
179
|
+
exports.Box = ie;
|
|
176
180
|
exports.Checkbox = se;
|
|
177
|
-
exports.Cluster =
|
|
178
|
-
exports.Col =
|
|
179
|
-
exports.Details =
|
|
180
|
-
exports.DialogModal =
|
|
181
|
-
exports.Fieldset =
|
|
182
|
-
exports.Flex =
|
|
183
|
-
exports.Footer =
|
|
184
|
-
exports.Grid =
|
|
181
|
+
exports.Cluster = me;
|
|
182
|
+
exports.Col = he;
|
|
183
|
+
exports.Details = ct;
|
|
184
|
+
exports.DialogModal = le;
|
|
185
|
+
exports.Fieldset = nt;
|
|
186
|
+
exports.Flex = at;
|
|
187
|
+
exports.Footer = tt;
|
|
188
|
+
exports.Grid = lt;
|
|
185
189
|
exports.GridItem = X;
|
|
186
|
-
exports.Header =
|
|
187
|
-
exports.
|
|
188
|
-
exports.
|
|
189
|
-
exports.
|
|
190
|
-
exports.
|
|
191
|
-
exports.Row = ge;
|
|
190
|
+
exports.Header = Ze;
|
|
191
|
+
exports.Img = re;
|
|
192
|
+
exports.Landmarks = k;
|
|
193
|
+
exports.Main = et;
|
|
194
|
+
exports.Row = ye;
|
|
192
195
|
exports.Section = st;
|
|
193
|
-
exports.Stack =
|
|
194
|
-
exports.Tag =
|
|
196
|
+
exports.Stack = ce;
|
|
197
|
+
exports.Tag = pt;
|
|
195
198
|
//# sourceMappingURL=out.js.map
|
|
196
199
|
//# sourceMappingURL=index.cjs.map
|