@aster-ui/prefixed 0.12.63 → 0.12.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Collapse.js +60 -58
- package/dist/components/Collapse.js.map +1 -1
- package/dist/components/DatePicker.d.ts +21 -1
- package/dist/components/DatePicker.js +469 -147
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Menu.d.ts +1 -1
- package/dist/components/Menu.js +102 -96
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.js +26 -17
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/Notification.js +53 -45
- package/dist/components/Notification.js.map +1 -1
- package/dist/components/Tabs.js +69 -57
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Tooltip.js +38 -35
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/Transfer.js +130 -121
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/TreeSelect.js +49 -48
- package/dist/components/TreeSelect.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dModal = 'd-modal'\nconst dModalTop = 'd-modal-top'\nconst dModalMiddle = 'd-modal-middle'\nconst dModalBottom = 'd-modal-bottom'\nconst dModalStart = 'd-modal-start'\nconst dModalEnd = 'd-modal-end'\nconst dModalBox = 'd-modal-box'\nconst dModalAction = 'd-modal-action'\nconst dModalBackdrop = 'd-modal-backdrop'\nconst dBtn = 'd-btn'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnError = 'd-btn-error'\nconst dAlert = 'd-alert'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertWarning = 'd-alert-warning'\nconst dAlertError = 'd-alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Callback after modal close animation completes */\n afterClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n /** Show loading spinner on OK button */\n confirmLoading?: boolean\n /** Props for the OK button */\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Props for the Cancel button */\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** CSS z-index for the modal */\n zIndex?: number\n /** Destroy child components when modal is closed */\n destroyOnClose?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nconst Modal = forwardRef<HTMLDialogElement, ModalProps>(function Modal(\n {\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText,\n cancelText,\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n afterClose,\n initialFocus,\n alertDialog = false,\n confirmLoading,\n okButtonProps,\n cancelButtonProps,\n closeIcon,\n zIndex,\n destroyOnClose = false,\n 'data-testid': testId,\n className = '',\n style,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [internalLoading, setInternalLoading] = React.useState(false)\n const [shouldRender, setShouldRender] = React.useState(open || !destroyOnClose)\n const titleId = useId()\n const contentId = useId()\n\n // Use external confirmLoading if provided, otherwise internal state\n const loading = confirmLoading ?? internalLoading\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n // Forward ref\n useImperativeHandle(ref, () => dialogRef.current!, [])\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n setShouldRender(true)\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n // Call afterClose after animation\n if (afterClose) {\n setTimeout(afterClose, 300)\n }\n // Handle destroyOnClose\n if (destroyOnClose) {\n setTimeout(() => setShouldRender(false), 300)\n }\n }\n }\n }, [open, initialFocus, afterClose, destroyOnClose])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [dModal, ...getPositionClasses(), align && alignClasses[align], className]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n if (confirmLoading === undefined) {\n setInternalLoading(true)\n }\n try {\n await onOk()\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n } catch (error) {\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Calculate dialog style for zIndex\n const dialogStyle: React.CSSProperties = {\n ...style,\n ...(zIndex !== undefined ? { zIndex } : {}),\n }\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (!shouldRender) {\n return null\n }\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n style={dialogStyle}\n data-state={open ? 'open' : 'closed'}\n data-testid={testId}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\" data-testid={getTestId('title')}>\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\" data-testid={getTestId('content')}>\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button\n ref={cancelButtonRef}\n className={dBtn}\n onClick={onCancel}\n data-testid={getTestId('cancel-button')}\n {...cancelButtonProps}\n >\n {resolvedCancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading || okButtonProps?.disabled}\n aria-busy={loading || undefined}\n data-testid={getTestId('ok-button')}\n {...okButtonProps}\n >\n {resolvedOkText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop} data-testid={getTestId('backdrop')}>\n <button ref={closeButtonRef} onClick={handleBackdropClick} data-testid={getTestId('close-button')}>\n {closeIcon || <span className=\"sr-only\">Close modal</span>}\n </button>\n </form>\n )}\n </dialog>\n )\n})\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const { locale } = useConfig()\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n // Resolve locale strings\n const resolvedOkText = config.okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = config.cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>{config.title && <h3 className=\"font-bold\">{config.title}</h3>}</div>\n </div>\n ) : (\n config.title\n )\n }\n okText={resolvedOkText}\n cancelText={resolvedCancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {resolvedCancelText}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nconst ModalWithStatics = Modal as typeof Modal & {\n confirm: typeof confirm\n info: typeof info\n success: typeof success\n warning: typeof warning\n error: typeof error\n}\n\nModalWithStatics.confirm = confirm\nModalWithStatics.info = info\nModalWithStatics.success = success\nModalWithStatics.warning = warning\nModalWithStatics.error = error\n\nexport { ModalWithStatics as Modal }\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","forwardRef","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","afterClose","initialFocus","alertDialog","confirmLoading","okButtonProps","cancelButtonProps","closeIcon","zIndex","destroyOnClose","testId","className","style","rest","ref","locale","useConfig","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","internalLoading","setInternalLoading","React","shouldRender","setShouldRender","titleId","useId","contentId","loading","resolvedOkText","resolvedCancelText","useImperativeHandle","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","dialogStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","getTestId","suffix","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","setLoading","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning","ModalWithStatics"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dModal = 'd-modal'\nconst dModalTop = 'd-modal-top'\nconst dModalMiddle = 'd-modal-middle'\nconst dModalBottom = 'd-modal-bottom'\nconst dModalStart = 'd-modal-start'\nconst dModalEnd = 'd-modal-end'\nconst dModalBox = 'd-modal-box'\nconst dModalAction = 'd-modal-action'\nconst dModalBackdrop = 'd-modal-backdrop'\nconst dBtn = 'd-btn'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnError = 'd-btn-error'\nconst dAlert = 'd-alert'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertWarning = 'd-alert-warning'\nconst dAlertError = 'd-alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Callback after modal close animation completes */\n afterClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n /** Show loading spinner on OK button */\n confirmLoading?: boolean\n /** Props for the OK button */\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Props for the Cancel button */\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** CSS z-index for the modal */\n zIndex?: number\n /** Destroy child components when modal is closed */\n destroyOnClose?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nconst Modal = forwardRef<HTMLDialogElement, ModalProps>(function Modal(\n {\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText,\n cancelText,\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n afterClose,\n initialFocus,\n alertDialog = false,\n confirmLoading,\n okButtonProps,\n cancelButtonProps,\n closeIcon,\n zIndex,\n destroyOnClose = false,\n 'data-testid': testId,\n className = '',\n style,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [internalLoading, setInternalLoading] = React.useState(false)\n const [shouldRender, setShouldRender] = React.useState(open || !destroyOnClose)\n const titleId = useId()\n const contentId = useId()\n\n // Use external confirmLoading if provided, otherwise internal state\n const loading = confirmLoading ?? internalLoading\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n // Forward ref\n useImperativeHandle(ref, () => dialogRef.current!, [])\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n setShouldRender(true)\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n // Call afterClose after animation\n if (afterClose) {\n setTimeout(afterClose, 300)\n }\n // Handle destroyOnClose\n if (destroyOnClose) {\n setTimeout(() => setShouldRender(false), 300)\n }\n }\n }\n }, [open, initialFocus, afterClose, destroyOnClose])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [dModal, ...getPositionClasses(), align && alignClasses[align], className]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n if (confirmLoading === undefined) {\n setInternalLoading(true)\n }\n try {\n await onOk()\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n } catch (error) {\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Calculate dialog style for zIndex\n const dialogStyle: React.CSSProperties = {\n ...style,\n ...(zIndex !== undefined ? { zIndex } : {}),\n }\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (!shouldRender) {\n return null\n }\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n style={dialogStyle}\n data-state={open ? 'open' : 'closed'}\n data-testid={testId}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\" data-testid={getTestId('title')}>\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\" data-testid={getTestId('content')}>\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button\n ref={cancelButtonRef}\n className={dBtn}\n onClick={onCancel}\n data-testid={getTestId('cancel-button')}\n {...cancelButtonProps}\n >\n {resolvedCancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading || okButtonProps?.disabled}\n aria-busy={loading || undefined}\n data-testid={getTestId('ok-button')}\n {...okButtonProps}\n >\n {resolvedOkText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop} data-testid={getTestId('backdrop')}>\n <button\n ref={closeButtonRef}\n onClick={handleBackdropClick}\n data-testid={getTestId('close-button')}\n aria-label=\"Close modal\"\n >\n {closeIcon || <span className=\"sr-only\">Close modal</span>}\n </button>\n </form>\n )}\n </dialog>\n )\n})\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const { locale } = useConfig()\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n // Resolve locale strings\n const resolvedOkText = config.okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = config.cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>{config.title && <h3 className=\"font-bold\">{config.title}</h3>}</div>\n </div>\n ) : (\n config.title\n )\n }\n okText={resolvedOkText}\n cancelText={resolvedCancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {resolvedCancelText}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nconst ModalWithStatics = Modal as typeof Modal & {\n confirm: typeof confirm\n info: typeof info\n success: typeof success\n warning: typeof warning\n error: typeof error\n}\n\nModalWithStatics.confirm = confirm\nModalWithStatics.info = info\nModalWithStatics.success = success\nModalWithStatics.warning = warning\nModalWithStatics.error = error\n\nexport { ModalWithStatics as Modal }\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","forwardRef","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","afterClose","initialFocus","alertDialog","confirmLoading","okButtonProps","cancelButtonProps","closeIcon","zIndex","destroyOnClose","testId","className","style","rest","ref","locale","useConfig","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","internalLoading","setInternalLoading","React","shouldRender","setShouldRender","titleId","useId","contentId","loading","resolvedOkText","resolvedCancelText","useImperativeHandle","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","dialogStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","getTestId","suffix","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","setLoading","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning","ModalWithStatics"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { jsx as s, Fragment as
|
|
2
|
-
import { useState as
|
|
3
|
-
import
|
|
4
|
-
const
|
|
5
|
-
class
|
|
1
|
+
import { jsx as s, Fragment as C, jsxs as p } from "react/jsx-runtime";
|
|
2
|
+
import { useState as $, useEffect as y } from "react";
|
|
3
|
+
import x from "react-dom/client";
|
|
4
|
+
const c = "d-toast", h = "d-toast-top", u = "d-toast-bottom", v = "d-toast-start", f = "d-toast-end", w = "d-toast-center", b = "d-alert", N = "d-alert-success", z = "d-alert-error", R = "d-alert-info", k = "d-alert-warning", L = "d-btn", B = "d-btn-xs", M = "d-btn-ghost", T = "d-btn-circle";
|
|
5
|
+
class I {
|
|
6
6
|
notifications = [];
|
|
7
7
|
listeners = [];
|
|
8
8
|
container = null;
|
|
@@ -20,11 +20,11 @@ class M {
|
|
|
20
20
|
this.listeners.forEach((e) => e());
|
|
21
21
|
}
|
|
22
22
|
ensureContainer() {
|
|
23
|
-
this.container || (this.container = document.createElement("div"), document.body.appendChild(this.container), this.root =
|
|
23
|
+
this.container || (this.container = document.createElement("div"), document.body.appendChild(this.container), this.root = x.createRoot(this.container), this.root.render(/* @__PURE__ */ s(E, { manager: this })));
|
|
24
24
|
}
|
|
25
25
|
open(e) {
|
|
26
26
|
this.ensureContainer();
|
|
27
|
-
const o = e.key ?? `notification-${++this.idCounter}`, n = e.variant === "compact",
|
|
27
|
+
const o = e.key ?? `notification-${++this.idCounter}`, n = e.variant === "compact", a = {
|
|
28
28
|
...e,
|
|
29
29
|
id: o,
|
|
30
30
|
createdAt: Date.now(),
|
|
@@ -33,10 +33,10 @@ class M {
|
|
|
33
33
|
variant: e.variant ?? "default",
|
|
34
34
|
closable: e.closable ?? !n,
|
|
35
35
|
type: e.type ?? "info"
|
|
36
|
-
}, r = this.notifications.findIndex((
|
|
37
|
-
return r !== -1 ? this.notifications[r] =
|
|
36
|
+
}, r = this.notifications.findIndex((i) => i.id === o);
|
|
37
|
+
return r !== -1 ? this.notifications[r] = a : this.notifications.push(a), this.emit(), a.duration && a.duration > 0 && setTimeout(() => {
|
|
38
38
|
this.close(o);
|
|
39
|
-
},
|
|
39
|
+
}, a.duration * 1e3), o;
|
|
40
40
|
}
|
|
41
41
|
close(e) {
|
|
42
42
|
const o = this.notifications.find((n) => n.id === e);
|
|
@@ -58,9 +58,9 @@ class M {
|
|
|
58
58
|
this.notifications = [], this.emit();
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
function
|
|
62
|
-
const [, e] =
|
|
63
|
-
|
|
61
|
+
function E({ manager: t }) {
|
|
62
|
+
const [, e] = $({});
|
|
63
|
+
y(() => t.subscribe(() => {
|
|
64
64
|
e({});
|
|
65
65
|
}), [t]);
|
|
66
66
|
const o = t.getNotifications(), n = {
|
|
@@ -74,70 +74,78 @@ function T({ manager: t }) {
|
|
|
74
74
|
o.forEach((r) => {
|
|
75
75
|
n[r.placement].push(r);
|
|
76
76
|
});
|
|
77
|
-
const
|
|
78
|
-
topRight: `${
|
|
79
|
-
topLeft: `${
|
|
80
|
-
topCenter: `${
|
|
81
|
-
bottomRight: `${
|
|
82
|
-
bottomLeft: `${
|
|
83
|
-
bottomCenter: `${
|
|
77
|
+
const a = {
|
|
78
|
+
topRight: `${c} ${h} ${f} z-[9999]`,
|
|
79
|
+
topLeft: `${c} ${h} ${v} z-[9999]`,
|
|
80
|
+
topCenter: `${c} ${h} ${w} z-[9999]`,
|
|
81
|
+
bottomRight: `${c} ${u} ${f} z-[9999]`,
|
|
82
|
+
bottomLeft: `${c} ${u} ${v} z-[9999]`,
|
|
83
|
+
bottomCenter: `${c} ${u} ${w} z-[9999]`
|
|
84
84
|
};
|
|
85
|
-
return /* @__PURE__ */ s(
|
|
85
|
+
return /* @__PURE__ */ s(C, { children: Object.entries(n).map(([r, i]) => i.length === 0 ? null : /* @__PURE__ */ s(
|
|
86
86
|
"div",
|
|
87
87
|
{
|
|
88
|
-
className:
|
|
88
|
+
className: a[r],
|
|
89
89
|
role: "region",
|
|
90
90
|
"aria-live": "polite",
|
|
91
91
|
"aria-label": "Notifications",
|
|
92
|
-
children:
|
|
93
|
-
|
|
92
|
+
children: i.map((l) => /* @__PURE__ */ s(
|
|
93
|
+
A,
|
|
94
94
|
{
|
|
95
|
-
notification:
|
|
96
|
-
onClose: () => t.close(
|
|
95
|
+
notification: l,
|
|
96
|
+
onClose: () => t.close(l.id)
|
|
97
97
|
},
|
|
98
|
-
|
|
98
|
+
l.id
|
|
99
99
|
))
|
|
100
100
|
},
|
|
101
101
|
r
|
|
102
102
|
)) });
|
|
103
103
|
}
|
|
104
|
-
function
|
|
104
|
+
function A({ notification: t, onClose: e }) {
|
|
105
105
|
const o = t.variant === "compact", n = {
|
|
106
|
-
success:
|
|
107
|
-
error:
|
|
108
|
-
info:
|
|
109
|
-
warning:
|
|
110
|
-
},
|
|
106
|
+
success: N,
|
|
107
|
+
error: z,
|
|
108
|
+
info: R,
|
|
109
|
+
warning: k
|
|
110
|
+
}, a = {
|
|
111
111
|
success: /* @__PURE__ */ s("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ s("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }),
|
|
112
112
|
error: /* @__PURE__ */ s("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ s("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }) }),
|
|
113
113
|
info: /* @__PURE__ */ s("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ s("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z", clipRule: "evenodd" }) }),
|
|
114
114
|
warning: /* @__PURE__ */ s("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ s("path", { fillRule: "evenodd", d: "M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) })
|
|
115
115
|
}, r = () => {
|
|
116
116
|
t.onClick && t.onClick();
|
|
117
|
-
},
|
|
117
|
+
}, i = typeof t.onClick == "function", l = i ? typeof t.message == "string" ? t.message : "Notification" : void 0, m = (d) => {
|
|
118
|
+
i && (d.key === "Enter" || d.key === " ") && (d.preventDefault(), r());
|
|
119
|
+
}, g = t.icon ?? a[t.type];
|
|
118
120
|
return o ? /* @__PURE__ */ s(
|
|
119
121
|
"div",
|
|
120
122
|
{
|
|
121
|
-
className: `${
|
|
123
|
+
className: `${b} ${n[t.type]} shadow-md py-2 px-4 cursor-pointer${t.className ? ` ${t.className}` : ""}`,
|
|
122
124
|
style: t.style,
|
|
123
125
|
"data-testid": t["data-testid"],
|
|
124
126
|
onClick: r,
|
|
127
|
+
onKeyDown: m,
|
|
128
|
+
tabIndex: i ? 0 : void 0,
|
|
129
|
+
"aria-label": l,
|
|
125
130
|
role: "alert",
|
|
126
|
-
children: /* @__PURE__ */
|
|
127
|
-
/* @__PURE__ */ s("span", { "aria-hidden": "true", children:
|
|
131
|
+
children: /* @__PURE__ */ p("div", { className: "flex items-center gap-2", children: [
|
|
132
|
+
/* @__PURE__ */ s("span", { "aria-hidden": "true", children: g }),
|
|
128
133
|
/* @__PURE__ */ s("span", { children: t.message })
|
|
129
134
|
] })
|
|
130
135
|
}
|
|
131
|
-
) : /* @__PURE__ */
|
|
136
|
+
) : /* @__PURE__ */ p(
|
|
132
137
|
"div",
|
|
133
138
|
{
|
|
134
|
-
className: `${
|
|
139
|
+
className: `${b} ${n[t.type]} shadow-lg cursor-pointer min-w-[300px] max-w-[400px] relative${t.className ? ` ${t.className}` : ""}`,
|
|
135
140
|
style: t.style,
|
|
136
141
|
"data-testid": t["data-testid"],
|
|
137
142
|
onClick: r,
|
|
143
|
+
onKeyDown: m,
|
|
144
|
+
tabIndex: i ? 0 : void 0,
|
|
145
|
+
"aria-label": l,
|
|
138
146
|
role: "alert",
|
|
139
147
|
children: [
|
|
140
|
-
/* @__PURE__ */
|
|
148
|
+
/* @__PURE__ */ p("div", { className: t.closable ? "pr-8" : "", children: [
|
|
141
149
|
t.message && /* @__PURE__ */ s("div", { className: "font-bold", children: t.message }),
|
|
142
150
|
t.description && /* @__PURE__ */ s("div", { className: "text-sm", children: t.description })
|
|
143
151
|
] }),
|
|
@@ -145,9 +153,9 @@ function k({ notification: t, onClose: e }) {
|
|
|
145
153
|
"button",
|
|
146
154
|
{
|
|
147
155
|
type: "button",
|
|
148
|
-
className: `${
|
|
149
|
-
onClick: (
|
|
150
|
-
|
|
156
|
+
className: `${L} ${B} ${M} ${T} absolute top-2 right-2`,
|
|
157
|
+
onClick: (d) => {
|
|
158
|
+
d.stopPropagation(), e();
|
|
151
159
|
},
|
|
152
160
|
"aria-label": "Close notification",
|
|
153
161
|
children: "✕"
|
|
@@ -157,8 +165,8 @@ function k({ notification: t, onClose: e }) {
|
|
|
157
165
|
}
|
|
158
166
|
);
|
|
159
167
|
}
|
|
160
|
-
const
|
|
168
|
+
const S = new I();
|
|
161
169
|
export {
|
|
162
|
-
|
|
170
|
+
S as notification
|
|
163
171
|
};
|
|
164
172
|
//# sourceMappingURL=Notification.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Notification.js","sources":["../../src/components/Notification.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport ReactDOM from 'react-dom/client'\n\n// DaisyUI classes\nconst dToast = 'd-toast'\nconst dToastTop = 'd-toast-top'\nconst dToastBottom = 'd-toast-bottom'\nconst dToastStart = 'd-toast-start'\nconst dToastEnd = 'd-toast-end'\nconst dToastCenter = 'd-toast-center'\nconst dAlert = 'd-alert'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertError = 'd-alert-error'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertWarning = 'd-alert-warning'\nconst dBtn = 'd-btn'\nconst dBtnXs = 'd-btn-xs'\nconst dBtnGhost = 'd-btn-ghost'\nconst dBtnCircle = 'd-btn-circle'\n\nexport type NotificationType = 'success' | 'info' | 'warning' | 'error'\nexport type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'topCenter' | 'bottomCenter'\nexport type NotificationVariant = 'default' | 'compact'\n\nexport interface NotificationConfig {\n message: React.ReactNode\n description?: React.ReactNode\n type?: NotificationType\n duration?: number // in seconds, 0 = no auto close\n placement?: NotificationPlacement\n variant?: NotificationVariant\n closable?: boolean\n icon?: React.ReactNode\n key?: string\n className?: string\n style?: React.CSSProperties\n 'data-testid'?: string\n onClick?: () => void\n onClose?: () => void\n}\n\ninterface NotificationItem extends NotificationConfig {\n id: string\n createdAt: number\n}\n\ntype Listener = () => void\n\nclass NotificationManager {\n private notifications: NotificationItem[] = []\n private listeners: Listener[] = []\n private container: HTMLDivElement | null = null\n private root: ReactDOM.Root | null = null\n private idCounter = 0\n\n subscribe(listener: Listener) {\n this.listeners.push(listener)\n return () => {\n this.listeners = this.listeners.filter((l) => l !== listener)\n }\n }\n\n getNotifications() {\n return this.notifications\n }\n\n private emit() {\n this.listeners.forEach((listener) => listener())\n }\n\n private ensureContainer() {\n if (!this.container) {\n this.container = document.createElement('div')\n document.body.appendChild(this.container)\n this.root = ReactDOM.createRoot(this.container)\n this.root.render(<NotificationContainer manager={this} />)\n }\n }\n\n open(config: NotificationConfig) {\n this.ensureContainer()\n\n const id = config.key ?? `notification-${++this.idCounter}`\n const isCompact = config.variant === 'compact'\n const notificationItem: NotificationItem = {\n ...config,\n id,\n createdAt: Date.now(),\n duration: config.duration ?? (isCompact ? 3 : 4.5),\n placement: config.placement ?? (isCompact ? 'topCenter' : 'topRight'),\n variant: config.variant ?? 'default',\n closable: config.closable ?? !isCompact,\n type: config.type ?? 'info',\n }\n\n // If key exists, update the existing notification\n const existingIndex = this.notifications.findIndex((n) => n.id === id)\n if (existingIndex !== -1) {\n this.notifications[existingIndex] = notificationItem\n } else {\n this.notifications.push(notificationItem)\n }\n this.emit()\n\n // Auto-dismiss\n if (notificationItem.duration && notificationItem.duration > 0) {\n setTimeout(() => {\n this.close(id)\n }, notificationItem.duration * 1000)\n }\n\n return id\n }\n\n close(id: string) {\n const notification = this.notifications.find((n) => n.id === id)\n this.notifications = this.notifications.filter((n) => n.id !== id)\n this.emit()\n\n if (notification?.onClose) {\n notification.onClose()\n }\n }\n\n success(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'success' })\n }\n\n error(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'error' })\n }\n\n info(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'info' })\n }\n\n warning(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'warning' })\n }\n\n destroy() {\n this.notifications = []\n this.emit()\n }\n}\n\ninterface NotificationContainerProps {\n manager: NotificationManager\n}\n\nfunction NotificationContainer({ manager }: NotificationContainerProps) {\n const [, forceUpdate] = useState({})\n\n useEffect(() => {\n const unsubscribe = manager.subscribe(() => {\n forceUpdate({})\n })\n return unsubscribe\n }, [manager])\n\n const notifications = manager.getNotifications()\n\n // Group by placement\n const grouped: Record<NotificationPlacement, NotificationItem[]> = {\n topLeft: [],\n topRight: [],\n topCenter: [],\n bottomLeft: [],\n bottomRight: [],\n bottomCenter: [],\n }\n\n notifications.forEach((notification) => {\n grouped[notification.placement!].push(notification)\n })\n\n const placementClasses: Record<NotificationPlacement, string> = {\n topRight: `${dToast} ${dToastTop} ${dToastEnd} z-[9999]`,\n topLeft: `${dToast} ${dToastTop} ${dToastStart} z-[9999]`,\n topCenter: `${dToast} ${dToastTop} ${dToastCenter} z-[9999]`,\n bottomRight: `${dToast} ${dToastBottom} ${dToastEnd} z-[9999]`,\n bottomLeft: `${dToast} ${dToastBottom} ${dToastStart} z-[9999]`,\n bottomCenter: `${dToast} ${dToastBottom} ${dToastCenter} z-[9999]`,\n }\n\n return (\n <>\n {Object.entries(grouped).map(([placement, items]) => {\n if (items.length === 0) return null\n\n return (\n <div\n key={placement}\n className={placementClasses[placement as NotificationPlacement]}\n role=\"region\"\n aria-live=\"polite\"\n aria-label=\"Notifications\"\n >\n {items.map((notification) => (\n <NotificationItem\n key={notification.id}\n notification={notification}\n onClose={() => manager.close(notification.id)}\n />\n ))}\n </div>\n )\n })}\n </>\n )\n}\n\ninterface NotificationItemProps {\n notification: NotificationItem\n onClose: () => void\n}\n\nfunction NotificationItem({ notification, onClose }: NotificationItemProps) {\n const isCompact = notification.variant === 'compact'\n\n const alertTypeClasses: Record<NotificationType, string> = {\n success: dAlertSuccess,\n error: dAlertError,\n info: dAlertInfo,\n warning: dAlertWarning,\n }\n\n const typeIcons: Record<NotificationType, React.ReactNode> = {\n success: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" /></svg>,\n error: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" /></svg>,\n info: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" /></svg>,\n warning: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" /></svg>,\n }\n\n const handleClick = () => {\n if (notification.onClick) {\n notification.onClick()\n }\n }\n\n const icon = notification.icon ?? typeIcons[notification.type!]\n\n if (isCompact) {\n return (\n <div\n className={`${dAlert} ${alertTypeClasses[notification.type!]} shadow-md py-2 px-4 cursor-pointer${notification.className ? ` ${notification.className}` : ''}`}\n style={notification.style}\n data-testid={notification['data-testid']}\n onClick={handleClick}\n role=\"alert\"\n >\n <div className=\"flex items-center gap-2\">\n <span aria-hidden=\"true\">{icon}</span>\n <span>{notification.message}</span>\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={`${dAlert} ${alertTypeClasses[notification.type!]} shadow-lg cursor-pointer min-w-[300px] max-w-[400px] relative${notification.className ? ` ${notification.className}` : ''}`}\n style={notification.style}\n data-testid={notification['data-testid']}\n onClick={handleClick}\n role=\"alert\"\n >\n <div className={notification.closable ? 'pr-8' : ''}>\n {notification.message && <div className=\"font-bold\">{notification.message}</div>}\n {notification.description && <div className=\"text-sm\">{notification.description}</div>}\n </div>\n {notification.closable && (\n <button\n type=\"button\"\n className={`${dBtn} ${dBtnXs} ${dBtnGhost} ${dBtnCircle} absolute top-2 right-2`}\n onClick={(e) => {\n e.stopPropagation()\n onClose()\n }}\n aria-label=\"Close notification\"\n >\n ✕\n </button>\n )}\n </div>\n )\n}\n\nexport const notification = new NotificationManager()\n"],"names":["dToast","dToastTop","dToastBottom","dToastStart","dToastEnd","dToastCenter","dAlert","dAlertSuccess","dAlertError","dAlertInfo","dAlertWarning","dBtn","dBtnXs","dBtnGhost","dBtnCircle","NotificationManager","listener","l","ReactDOM","jsx","NotificationContainer","config","id","isCompact","notificationItem","existingIndex","n","notification","manager","forceUpdate","useState","useEffect","notifications","grouped","placementClasses","Fragment","placement","items","NotificationItem","onClose","alertTypeClasses","typeIcons","handleClick","icon","jsxs","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Notification.js","sources":["../../src/components/Notification.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport ReactDOM from 'react-dom/client'\n\n// DaisyUI classes\nconst dToast = 'd-toast'\nconst dToastTop = 'd-toast-top'\nconst dToastBottom = 'd-toast-bottom'\nconst dToastStart = 'd-toast-start'\nconst dToastEnd = 'd-toast-end'\nconst dToastCenter = 'd-toast-center'\nconst dAlert = 'd-alert'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertError = 'd-alert-error'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertWarning = 'd-alert-warning'\nconst dBtn = 'd-btn'\nconst dBtnXs = 'd-btn-xs'\nconst dBtnGhost = 'd-btn-ghost'\nconst dBtnCircle = 'd-btn-circle'\n\nexport type NotificationType = 'success' | 'info' | 'warning' | 'error'\nexport type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'topCenter' | 'bottomCenter'\nexport type NotificationVariant = 'default' | 'compact'\n\nexport interface NotificationConfig {\n message: React.ReactNode\n description?: React.ReactNode\n type?: NotificationType\n duration?: number // in seconds, 0 = no auto close\n placement?: NotificationPlacement\n variant?: NotificationVariant\n closable?: boolean\n icon?: React.ReactNode\n key?: string\n className?: string\n style?: React.CSSProperties\n 'data-testid'?: string\n onClick?: () => void\n onClose?: () => void\n}\n\ninterface NotificationItem extends NotificationConfig {\n id: string\n createdAt: number\n}\n\ntype Listener = () => void\n\nclass NotificationManager {\n private notifications: NotificationItem[] = []\n private listeners: Listener[] = []\n private container: HTMLDivElement | null = null\n private root: ReactDOM.Root | null = null\n private idCounter = 0\n\n subscribe(listener: Listener) {\n this.listeners.push(listener)\n return () => {\n this.listeners = this.listeners.filter((l) => l !== listener)\n }\n }\n\n getNotifications() {\n return this.notifications\n }\n\n private emit() {\n this.listeners.forEach((listener) => listener())\n }\n\n private ensureContainer() {\n if (!this.container) {\n this.container = document.createElement('div')\n document.body.appendChild(this.container)\n this.root = ReactDOM.createRoot(this.container)\n this.root.render(<NotificationContainer manager={this} />)\n }\n }\n\n open(config: NotificationConfig) {\n this.ensureContainer()\n\n const id = config.key ?? `notification-${++this.idCounter}`\n const isCompact = config.variant === 'compact'\n const notificationItem: NotificationItem = {\n ...config,\n id,\n createdAt: Date.now(),\n duration: config.duration ?? (isCompact ? 3 : 4.5),\n placement: config.placement ?? (isCompact ? 'topCenter' : 'topRight'),\n variant: config.variant ?? 'default',\n closable: config.closable ?? !isCompact,\n type: config.type ?? 'info',\n }\n\n // If key exists, update the existing notification\n const existingIndex = this.notifications.findIndex((n) => n.id === id)\n if (existingIndex !== -1) {\n this.notifications[existingIndex] = notificationItem\n } else {\n this.notifications.push(notificationItem)\n }\n this.emit()\n\n // Auto-dismiss\n if (notificationItem.duration && notificationItem.duration > 0) {\n setTimeout(() => {\n this.close(id)\n }, notificationItem.duration * 1000)\n }\n\n return id\n }\n\n close(id: string) {\n const notification = this.notifications.find((n) => n.id === id)\n this.notifications = this.notifications.filter((n) => n.id !== id)\n this.emit()\n\n if (notification?.onClose) {\n notification.onClose()\n }\n }\n\n success(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'success' })\n }\n\n error(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'error' })\n }\n\n info(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'info' })\n }\n\n warning(config: Omit<NotificationConfig, 'type'>) {\n return this.open({ ...config, type: 'warning' })\n }\n\n destroy() {\n this.notifications = []\n this.emit()\n }\n}\n\ninterface NotificationContainerProps {\n manager: NotificationManager\n}\n\nfunction NotificationContainer({ manager }: NotificationContainerProps) {\n const [, forceUpdate] = useState({})\n\n useEffect(() => {\n const unsubscribe = manager.subscribe(() => {\n forceUpdate({})\n })\n return unsubscribe\n }, [manager])\n\n const notifications = manager.getNotifications()\n\n // Group by placement\n const grouped: Record<NotificationPlacement, NotificationItem[]> = {\n topLeft: [],\n topRight: [],\n topCenter: [],\n bottomLeft: [],\n bottomRight: [],\n bottomCenter: [],\n }\n\n notifications.forEach((notification) => {\n grouped[notification.placement!].push(notification)\n })\n\n const placementClasses: Record<NotificationPlacement, string> = {\n topRight: `${dToast} ${dToastTop} ${dToastEnd} z-[9999]`,\n topLeft: `${dToast} ${dToastTop} ${dToastStart} z-[9999]`,\n topCenter: `${dToast} ${dToastTop} ${dToastCenter} z-[9999]`,\n bottomRight: `${dToast} ${dToastBottom} ${dToastEnd} z-[9999]`,\n bottomLeft: `${dToast} ${dToastBottom} ${dToastStart} z-[9999]`,\n bottomCenter: `${dToast} ${dToastBottom} ${dToastCenter} z-[9999]`,\n }\n\n return (\n <>\n {Object.entries(grouped).map(([placement, items]) => {\n if (items.length === 0) return null\n\n return (\n <div\n key={placement}\n className={placementClasses[placement as NotificationPlacement]}\n role=\"region\"\n aria-live=\"polite\"\n aria-label=\"Notifications\"\n >\n {items.map((notification) => (\n <NotificationItem\n key={notification.id}\n notification={notification}\n onClose={() => manager.close(notification.id)}\n />\n ))}\n </div>\n )\n })}\n </>\n )\n}\n\ninterface NotificationItemProps {\n notification: NotificationItem\n onClose: () => void\n}\n\nfunction NotificationItem({ notification, onClose }: NotificationItemProps) {\n const isCompact = notification.variant === 'compact'\n\n const alertTypeClasses: Record<NotificationType, string> = {\n success: dAlertSuccess,\n error: dAlertError,\n info: dAlertInfo,\n warning: dAlertWarning,\n }\n\n const typeIcons: Record<NotificationType, React.ReactNode> = {\n success: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" /></svg>,\n error: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" /></svg>,\n info: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" /></svg>,\n warning: <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" /></svg>,\n }\n\n const handleClick = () => {\n if (notification.onClick) {\n notification.onClick()\n }\n }\n\n const isClickable = typeof notification.onClick === 'function'\n const ariaLabel = isClickable\n ? (typeof notification.message === 'string' ? notification.message : 'Notification')\n : undefined\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isClickable) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }\n\n const icon = notification.icon ?? typeIcons[notification.type!]\n\n if (isCompact) {\n return (\n <div\n className={`${dAlert} ${alertTypeClasses[notification.type!]} shadow-md py-2 px-4 cursor-pointer${notification.className ? ` ${notification.className}` : ''}`}\n style={notification.style}\n data-testid={notification['data-testid']}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n tabIndex={isClickable ? 0 : undefined}\n aria-label={ariaLabel}\n role=\"alert\"\n >\n <div className=\"flex items-center gap-2\">\n <span aria-hidden=\"true\">{icon}</span>\n <span>{notification.message}</span>\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={`${dAlert} ${alertTypeClasses[notification.type!]} shadow-lg cursor-pointer min-w-[300px] max-w-[400px] relative${notification.className ? ` ${notification.className}` : ''}`}\n style={notification.style}\n data-testid={notification['data-testid']}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n tabIndex={isClickable ? 0 : undefined}\n aria-label={ariaLabel}\n role=\"alert\"\n >\n <div className={notification.closable ? 'pr-8' : ''}>\n {notification.message && <div className=\"font-bold\">{notification.message}</div>}\n {notification.description && <div className=\"text-sm\">{notification.description}</div>}\n </div>\n {notification.closable && (\n <button\n type=\"button\"\n className={`${dBtn} ${dBtnXs} ${dBtnGhost} ${dBtnCircle} absolute top-2 right-2`}\n onClick={(e) => {\n e.stopPropagation()\n onClose()\n }}\n aria-label=\"Close notification\"\n >\n ✕\n </button>\n )}\n </div>\n )\n}\n\nexport const notification = new NotificationManager()\n"],"names":["dToast","dToastTop","dToastBottom","dToastStart","dToastEnd","dToastCenter","dAlert","dAlertSuccess","dAlertError","dAlertInfo","dAlertWarning","dBtn","dBtnXs","dBtnGhost","dBtnCircle","NotificationManager","listener","l","ReactDOM","jsx","NotificationContainer","config","id","isCompact","notificationItem","existingIndex","n","notification","manager","forceUpdate","useState","useEffect","notifications","grouped","placementClasses","Fragment","placement","items","NotificationItem","onClose","alertTypeClasses","typeIcons","handleClick","isClickable","ariaLabel","handleKeyDown","e","icon","jsxs"],"mappings":"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"}
|
package/dist/components/Tabs.js
CHANGED
|
@@ -1,65 +1,67 @@
|
|
|
1
|
-
import { jsx as s, jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { useConfig as
|
|
4
|
-
const
|
|
5
|
-
box:
|
|
6
|
-
border:
|
|
7
|
-
lift:
|
|
8
|
-
},
|
|
9
|
-
xs:
|
|
10
|
-
sm:
|
|
11
|
-
md:
|
|
12
|
-
lg:
|
|
13
|
-
xl:
|
|
14
|
-
},
|
|
15
|
-
children:
|
|
16
|
-
items:
|
|
17
|
-
activeKey:
|
|
18
|
-
defaultActiveKey:
|
|
19
|
-
onChange:
|
|
20
|
-
variant:
|
|
21
|
-
size:
|
|
22
|
-
position:
|
|
23
|
-
"data-testid":
|
|
1
|
+
import { jsx as s, jsxs as l, Fragment as r } from "react/jsx-runtime";
|
|
2
|
+
import u, { forwardRef as w, useState as D, useId as E } from "react";
|
|
3
|
+
import { useConfig as F } from "../providers/ConfigProvider.js";
|
|
4
|
+
const K = "d-tabs", M = "d-tabs-box", O = "d-tabs-border", V = "d-tabs-lift", q = "d-tabs-xs", G = "d-tabs-sm", H = "d-tabs-md", J = "d-tabs-lg", Q = "d-tabs-xl", U = "d-tab", W = "d-tab-active", Y = "d-tab-disabled", Z = {
|
|
5
|
+
box: M,
|
|
6
|
+
border: O,
|
|
7
|
+
lift: V
|
|
8
|
+
}, tt = {
|
|
9
|
+
xs: q,
|
|
10
|
+
sm: G,
|
|
11
|
+
md: H,
|
|
12
|
+
lg: J,
|
|
13
|
+
xl: Q
|
|
14
|
+
}, st = w(function({
|
|
15
|
+
children: h,
|
|
16
|
+
items: d,
|
|
17
|
+
activeKey: n,
|
|
18
|
+
defaultActiveKey: x,
|
|
19
|
+
onChange: g,
|
|
20
|
+
variant: m,
|
|
21
|
+
size: p,
|
|
22
|
+
position: y = "top",
|
|
23
|
+
"data-testid": o,
|
|
24
24
|
className: C = "",
|
|
25
25
|
...A
|
|
26
26
|
}, j) {
|
|
27
|
-
const { componentSize: S } =
|
|
28
|
-
(t) =>
|
|
27
|
+
const { componentSize: S } = F(), T = p ?? S, c = (t) => o ? `${o}-${t}` : void 0, B = u.Children.toArray(h).filter(
|
|
28
|
+
(t) => u.isValidElement(t) && t.type === $
|
|
29
29
|
).map((t) => ({
|
|
30
30
|
...t.props,
|
|
31
31
|
_key: t.key != null ? String(t.key) : ""
|
|
32
|
-
})),
|
|
32
|
+
})), i = d && d.length > 0 ? d.map((t) => ({
|
|
33
33
|
_key: t.key,
|
|
34
34
|
tab: t.label,
|
|
35
35
|
children: t.children,
|
|
36
36
|
disabled: t.disabled,
|
|
37
37
|
icon: t.icon
|
|
38
|
-
})) : B, [
|
|
39
|
-
|
|
40
|
-
),
|
|
41
|
-
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
})) : B, [I, N] = D(
|
|
39
|
+
x || i[0]?._key || ""
|
|
40
|
+
), k = n !== void 0 ? n : I, P = (t) => {
|
|
41
|
+
n === void 0 && N(t), g?.(t);
|
|
42
|
+
}, R = [
|
|
43
|
+
K,
|
|
44
|
+
m && Z[m],
|
|
45
|
+
T && tt[T],
|
|
46
46
|
C
|
|
47
|
-
].filter(Boolean).join(" "),
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
t.disabled &&
|
|
47
|
+
].filter(Boolean).join(" "), a = E(), e = i.find((t) => t._key === k), v = /* @__PURE__ */ s("div", { role: "tablist", className: R, "data-testid": c("tablist"), children: i.map((t) => {
|
|
48
|
+
const b = k === t._key, z = `${a}-tab-${t._key}`, L = `${a}-panel-${t._key}`, X = [
|
|
49
|
+
U,
|
|
50
|
+
b && W,
|
|
51
|
+
t.disabled && Y
|
|
52
52
|
].filter(Boolean).join(" ");
|
|
53
|
-
return /* @__PURE__ */
|
|
53
|
+
return /* @__PURE__ */ l(
|
|
54
54
|
"button",
|
|
55
55
|
{
|
|
56
56
|
role: "tab",
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
id: z,
|
|
58
|
+
className: X,
|
|
59
|
+
onClick: () => !t.disabled && P(t._key),
|
|
59
60
|
disabled: t.disabled,
|
|
60
|
-
"data-state":
|
|
61
|
-
"data-testid":
|
|
62
|
-
"aria-selected":
|
|
61
|
+
"data-state": b ? "active" : "inactive",
|
|
62
|
+
"data-testid": c(`tab-${t._key}`),
|
|
63
|
+
"aria-selected": b,
|
|
64
|
+
"aria-controls": L,
|
|
63
65
|
children: [
|
|
64
66
|
t.icon && /* @__PURE__ */ s("span", { className: "mr-1", children: t.icon }),
|
|
65
67
|
t.tab
|
|
@@ -67,22 +69,32 @@ const D = "d-tabs", E = "d-tabs-box", F = "d-tabs-border", K = "d-tabs-lift", M
|
|
|
67
69
|
},
|
|
68
70
|
t._key
|
|
69
71
|
);
|
|
70
|
-
}) }),
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
}) }), _ = e && /* @__PURE__ */ s(
|
|
73
|
+
"div",
|
|
74
|
+
{
|
|
75
|
+
className: y === "top" ? "mt-4" : "mb-4",
|
|
76
|
+
role: "tabpanel",
|
|
77
|
+
id: `${a}-panel-${e._key}`,
|
|
78
|
+
"aria-labelledby": `${a}-tab-${e._key}`,
|
|
79
|
+
"data-testid": c("tabpanel"),
|
|
80
|
+
children: e.children
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
return /* @__PURE__ */ s("div", { ref: j, "data-testid": o, ...A, children: y === "top" ? /* @__PURE__ */ l(r, { children: [
|
|
84
|
+
v,
|
|
85
|
+
_
|
|
86
|
+
] }) : /* @__PURE__ */ l(r, { children: [
|
|
87
|
+
_,
|
|
88
|
+
v
|
|
77
89
|
] }) });
|
|
78
90
|
});
|
|
79
|
-
function
|
|
80
|
-
return /* @__PURE__ */ s(
|
|
91
|
+
function $({ children: f }) {
|
|
92
|
+
return /* @__PURE__ */ s(r, { children: f });
|
|
81
93
|
}
|
|
82
|
-
const
|
|
83
|
-
Panel:
|
|
94
|
+
const nt = Object.assign(st, {
|
|
95
|
+
Panel: $
|
|
84
96
|
});
|
|
85
97
|
export {
|
|
86
|
-
|
|
98
|
+
nt as Tabs
|
|
87
99
|
};
|
|
88
100
|
//# sourceMappingURL=Tabs.js.map
|