asterui 0.12.58 → 0.12.59
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/Autocomplete.js +1 -1
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Button.js +1 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Checkbox.js +1 -1
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/ColorPicker.js +1 -1
- package/dist/components/ColorPicker.js.map +1 -1
- package/dist/components/CopyButton.js +1 -1
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/Countdown.js +1 -1
- package/dist/components/Countdown.js.map +1 -1
- package/dist/components/DatePicker.js +1 -1
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dock.js +1 -1
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/Empty.js +1 -1
- package/dist/components/Empty.js.map +1 -1
- package/dist/components/FileInput.js +1 -1
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.js +1 -1
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Form.js +1 -1
- package/dist/components/Form.js.map +1 -1
- package/dist/components/Input.js +1 -1
- package/dist/components/Input.js.map +1 -1
- package/dist/components/InputNumber.js +1 -1
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/List.js +1 -1
- package/dist/components/List.js.map +1 -1
- package/dist/components/Loading.js +1 -1
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Modal.js +1 -1
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.js +1 -1
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.js +1 -1
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.js +1 -1
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Radio.js +1 -1
- package/dist/components/Radio.js.map +1 -1
- package/dist/components/Range.js +1 -1
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.js +1 -1
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/RichTextEditor.js +1 -1
- package/dist/components/RichTextEditor.js.map +1 -1
- package/dist/components/Segmented.js +1 -1
- package/dist/components/Segmented.js.map +1 -1
- package/dist/components/Select.js +1 -1
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Table.d.ts +19 -0
- package/dist/components/Table.js +348 -310
- package/dist/components/Table.js.map +1 -1
- package/dist/components/Tabs.js +1 -1
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Textarea.js +1 -1
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.js +1 -1
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/TimePicker.js +1 -1
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Toggle.js +1 -1
- package/dist/components/Toggle.js.map +1 -1
- package/dist/hooks/useTheme.d.ts +1 -1
- package/dist/hooks/useTheme.js +1 -1
- package/dist/hooks/useTheme.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/providers/ConfigProvider.js.map +1 -0
- package/dist/providers/ThemeProvider.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/ConfigProvider.js.map +0 -1
- package/dist/components/ThemeProvider.js.map +0 -1
- /package/dist/{components → providers}/ConfigProvider.d.ts +0 -0
- /package/dist/{components → providers}/ConfigProvider.js +0 -0
- /package/dist/{components → providers}/ThemeProvider.d.ts +0 -0
- /package/dist/{components → providers}/ThemeProvider.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnActive = 'btn-active'\nconst dBtnDisabled = 'btn-disabled'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dSelect = 'select'\nconst dSelectBordered = 'select-bordered'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dInput = 'input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Pagination = forwardRef<HTMLDivElement, PaginationProps>(function Pagination(\n {\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Locale strings with fallbacks\n const l = locale.Pagination ?? {}\n const itemsPerPageText = l.itemsPerPage ?? '/ page'\n const goToText = l.goTo ?? 'Go to'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div ref={ref} className={`flex items-center gap-2 ${className}`} data-testid={testId} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n data-testid={getTestId('prev')}\n aria-label={l.prev ?? 'Previous'}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n data-testid={getTestId('next')}\n aria-label={l.next ?? 'Next'}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div ref={ref} className={`flex flex-wrap items-center gap-4 ${className}`} data-testid={testId} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\" data-testid={getTestId('total')}>\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} ${l.items ?? 'items'}`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n data-testid={getTestId('size-changer')}\n >\n {pageSizeOptions.map((sz) => (\n <option key={sz} value={sz}>\n {sz} {itemsPerPageText}\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin} data-testid={getTestId('controls')}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n aria-label=\"First page\"\n data-testid={getTestId('first')}\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n aria-label={l.prev ?? 'Previous'}\n data-testid={getTestId('prev')}\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n data-testid={getTestId(`page-${page}`)}\n aria-current={current === page ? 'page' : undefined}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n aria-label={l.next ?? 'Next'}\n data-testid={getTestId('next')}\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n aria-label=\"Last page\"\n data-testid={getTestId('last')}\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{goToText}</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n data-testid={getTestId('jumper')}\n />\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","forwardRef","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","testId","className","rest","ref","componentSize","locale","useConfig","effectiveSize","getTestId","suffix","l","itemsPerPageText","goToText","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsxs","jsx","sz","index"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnActive = 'btn-active'\nconst dBtnDisabled = 'btn-disabled'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dSelect = 'select'\nconst dSelectBordered = 'select-bordered'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dInput = 'input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Pagination = forwardRef<HTMLDivElement, PaginationProps>(function Pagination(\n {\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Locale strings with fallbacks\n const l = locale.Pagination ?? {}\n const itemsPerPageText = l.itemsPerPage ?? '/ page'\n const goToText = l.goTo ?? 'Go to'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div ref={ref} className={`flex items-center gap-2 ${className}`} data-testid={testId} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n data-testid={getTestId('prev')}\n aria-label={l.prev ?? 'Previous'}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n data-testid={getTestId('next')}\n aria-label={l.next ?? 'Next'}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div ref={ref} className={`flex flex-wrap items-center gap-4 ${className}`} data-testid={testId} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\" data-testid={getTestId('total')}>\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} ${l.items ?? 'items'}`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n data-testid={getTestId('size-changer')}\n >\n {pageSizeOptions.map((sz) => (\n <option key={sz} value={sz}>\n {sz} {itemsPerPageText}\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin} data-testid={getTestId('controls')}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n aria-label=\"First page\"\n data-testid={getTestId('first')}\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n aria-label={l.prev ?? 'Previous'}\n data-testid={getTestId('prev')}\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n data-testid={getTestId(`page-${page}`)}\n aria-current={current === page ? 'page' : undefined}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n aria-label={l.next ?? 'Next'}\n data-testid={getTestId('next')}\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n aria-label=\"Last page\"\n data-testid={getTestId('last')}\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{goToText}</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n data-testid={getTestId('jumper')}\n />\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","forwardRef","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","testId","className","rest","ref","componentSize","locale","useConfig","effectiveSize","getTestId","suffix","l","itemsPerPageText","goToText","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsxs","jsx","sz","index"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as s, jsx as n } from "react/jsx-runtime";
|
|
2
2
|
import D, { forwardRef as F, useState as v, useRef as C, useEffect as H } from "react";
|
|
3
|
-
import { useConfig as J } from "
|
|
3
|
+
import { useConfig as J } from "../providers/ConfigProvider.js";
|
|
4
4
|
const k = "btn", w = "btn-sm", Q = "btn-primary", U = "btn-secondary", V = "btn-accent", Y = "btn-success", Z = "btn-warning", _ = "btn-error", tt = "btn-info", nt = "btn-ghost", et = "loading", st = "loading-spinner", ot = "loading-xs", it = F(function({
|
|
5
5
|
children: f,
|
|
6
6
|
title: y,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popconfirm.js","sources":["../../src/components/Popconfirm.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, forwardRef } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnSecondary = 'btn-secondary'\nconst dBtnAccent = 'btn-accent'\nconst dBtnSuccess = 'btn-success'\nconst dBtnWarning = 'btn-warning'\nconst dBtnError = 'btn-error'\nconst dBtnInfo = 'btn-info'\nconst dBtnGhost = 'btn-ghost'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingXs = 'loading-xs'\n\nexport interface PopconfirmProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n children: React.ReactElement\n title: React.ReactNode\n description?: React.ReactNode\n onConfirm?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n okType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info'\n cancelType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'ghost'\n placement?: 'top' | 'bottom' | 'left' | 'right'\n disabled?: boolean\n icon?: React.ReactNode\n showCancel?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Popconfirm = forwardRef<HTMLDivElement, PopconfirmProps>(function Popconfirm(\n {\n children,\n title,\n description,\n onConfirm,\n onCancel,\n okText,\n cancelText,\n okType = 'primary',\n cancelType = 'ghost',\n placement = 'top',\n disabled = false,\n icon,\n showCancel = true,\n 'data-testid': testId,\n className,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const [isOpen, setIsOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Popconfirm?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Popconfirm?.cancelText ?? 'Cancel'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const popupRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n popupRef.current &&\n !popupRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (disabled) return\n e.stopPropagation()\n setIsOpen(!isOpen)\n }\n\n const handleConfirm = async () => {\n if (onConfirm) {\n setLoading(true)\n try {\n await onConfirm()\n setIsOpen(false)\n } finally {\n setLoading(false)\n }\n } else {\n setIsOpen(false)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n setIsOpen(false)\n }\n\n const getPopupContainerClasses = () => {\n const positions = {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-3',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-3',\n left: 'right-full top-1/2 -translate-y-1/2 mr-3',\n right: 'left-full top-1/2 -translate-y-1/2 ml-3',\n }\n\n return `absolute z-50 ${positions[placement]}`\n }\n\n const getPopupClasses = () => {\n return 'bg-base-100 rounded-lg p-4 min-w-[200px] max-w-[300px] shadow-lg'\n }\n\n const getArrowClasses = () => {\n const base = 'absolute w-2.5 h-2.5 bg-base-100 rotate-45 shadow-lg'\n\n const positions = {\n top: 'bottom-[-5px] left-1/2 -translate-x-1/2',\n bottom: 'top-[-5px] left-1/2 -translate-x-1/2',\n left: 'right-[-5px] top-1/2 -translate-y-1/2',\n right: 'left-[-5px] top-1/2 -translate-y-1/2',\n }\n\n return `${base} ${positions[placement]}`\n }\n\n const buttonClasses = {\n primary: dBtnPrimary,\n secondary: dBtnSecondary,\n accent: dBtnAccent,\n success: dBtnSuccess,\n warning: dBtnWarning,\n error: dBtnError,\n info: dBtnInfo,\n ghost: dBtnGhost,\n } as const\n\n const getButtonClass = (type: keyof typeof buttonClasses) => {\n return buttonClasses[type]\n }\n\n const defaultIcon = (\n <svg\n className=\"w-5 h-5 text-warning\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\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\n return (\n <div ref={ref || containerRef} className={`relative inline-block ${className || ''}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n {React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleTriggerClick(e)\n const originalOnClick = (children.props as any)?.onClick\n if (originalOnClick) {\n originalOnClick(e)\n }\n },\n } as any)}\n\n {isOpen && (\n <div className={getPopupContainerClasses()} data-testid={getTestId('popup')}>\n <div ref={popupRef} className={getPopupClasses()}>\n <div className=\"flex gap-3 relative z-10\">\n <div className=\"flex-shrink-0 mt-0.5\">\n {icon !== undefined ? icon : defaultIcon}\n </div>\n <div className=\"flex-1\">\n <div className=\"font-semibold text-base-content mb-1\" data-testid={getTestId('title')}>{title}</div>\n {description && (\n <div className=\"text-sm text-base-content/70 mb-3\" data-testid={getTestId('description')}>{description}</div>\n )}\n <div className=\"flex justify-end gap-2 mt-3\">\n {showCancel && (\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(cancelType)}`}\n onClick={handleCancel}\n disabled={loading}\n data-testid={getTestId('cancel-button')}\n >\n {resolvedCancelText}\n </button>\n )}\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(okType)}`}\n onClick={handleConfirm}\n disabled={loading}\n data-testid={getTestId('ok-button')}\n >\n {loading && <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs}`}></span>}\n {resolvedOkText}\n </button>\n </div>\n </div>\n </div>\n <div className={getArrowClasses()} />\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnSm","dBtnPrimary","dBtnSecondary","dBtnAccent","dBtnSuccess","dBtnWarning","dBtnError","dBtnInfo","dBtnGhost","dLoading","dLoadingSpinner","dLoadingXs","Popconfirm","forwardRef","children","title","description","onConfirm","onCancel","okText","cancelText","okType","cancelType","placement","disabled","icon","showCancel","testId","className","rest","ref","locale","useConfig","isOpen","setIsOpen","useState","loading","setLoading","containerRef","useRef","resolvedOkText","resolvedCancelText","getTestId","suffix","popupRef","useEffect","handleClickOutside","event","handleTriggerClick","e","handleConfirm","handleCancel","getPopupContainerClasses","getPopupClasses","getArrowClasses","buttonClasses","getButtonClass","type","defaultIcon","jsx","React","originalOnClick","jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Popconfirm.js","sources":["../../src/components/Popconfirm.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnPrimary = 'btn-primary'\nconst dBtnSecondary = 'btn-secondary'\nconst dBtnAccent = 'btn-accent'\nconst dBtnSuccess = 'btn-success'\nconst dBtnWarning = 'btn-warning'\nconst dBtnError = 'btn-error'\nconst dBtnInfo = 'btn-info'\nconst dBtnGhost = 'btn-ghost'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingXs = 'loading-xs'\n\nexport interface PopconfirmProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n children: React.ReactElement\n title: React.ReactNode\n description?: React.ReactNode\n onConfirm?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n okType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info'\n cancelType?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'ghost'\n placement?: 'top' | 'bottom' | 'left' | 'right'\n disabled?: boolean\n icon?: React.ReactNode\n showCancel?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Popconfirm = forwardRef<HTMLDivElement, PopconfirmProps>(function Popconfirm(\n {\n children,\n title,\n description,\n onConfirm,\n onCancel,\n okText,\n cancelText,\n okType = 'primary',\n cancelType = 'ghost',\n placement = 'top',\n disabled = false,\n icon,\n showCancel = true,\n 'data-testid': testId,\n className,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const [isOpen, setIsOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Popconfirm?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Popconfirm?.cancelText ?? 'Cancel'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const popupRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n popupRef.current &&\n !popupRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (disabled) return\n e.stopPropagation()\n setIsOpen(!isOpen)\n }\n\n const handleConfirm = async () => {\n if (onConfirm) {\n setLoading(true)\n try {\n await onConfirm()\n setIsOpen(false)\n } finally {\n setLoading(false)\n }\n } else {\n setIsOpen(false)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n setIsOpen(false)\n }\n\n const getPopupContainerClasses = () => {\n const positions = {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-3',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-3',\n left: 'right-full top-1/2 -translate-y-1/2 mr-3',\n right: 'left-full top-1/2 -translate-y-1/2 ml-3',\n }\n\n return `absolute z-50 ${positions[placement]}`\n }\n\n const getPopupClasses = () => {\n return 'bg-base-100 rounded-lg p-4 min-w-[200px] max-w-[300px] shadow-lg'\n }\n\n const getArrowClasses = () => {\n const base = 'absolute w-2.5 h-2.5 bg-base-100 rotate-45 shadow-lg'\n\n const positions = {\n top: 'bottom-[-5px] left-1/2 -translate-x-1/2',\n bottom: 'top-[-5px] left-1/2 -translate-x-1/2',\n left: 'right-[-5px] top-1/2 -translate-y-1/2',\n right: 'left-[-5px] top-1/2 -translate-y-1/2',\n }\n\n return `${base} ${positions[placement]}`\n }\n\n const buttonClasses = {\n primary: dBtnPrimary,\n secondary: dBtnSecondary,\n accent: dBtnAccent,\n success: dBtnSuccess,\n warning: dBtnWarning,\n error: dBtnError,\n info: dBtnInfo,\n ghost: dBtnGhost,\n } as const\n\n const getButtonClass = (type: keyof typeof buttonClasses) => {\n return buttonClasses[type]\n }\n\n const defaultIcon = (\n <svg\n className=\"w-5 h-5 text-warning\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\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\n return (\n <div ref={ref || containerRef} className={`relative inline-block ${className || ''}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n {React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleTriggerClick(e)\n const originalOnClick = (children.props as any)?.onClick\n if (originalOnClick) {\n originalOnClick(e)\n }\n },\n } as any)}\n\n {isOpen && (\n <div className={getPopupContainerClasses()} data-testid={getTestId('popup')}>\n <div ref={popupRef} className={getPopupClasses()}>\n <div className=\"flex gap-3 relative z-10\">\n <div className=\"flex-shrink-0 mt-0.5\">\n {icon !== undefined ? icon : defaultIcon}\n </div>\n <div className=\"flex-1\">\n <div className=\"font-semibold text-base-content mb-1\" data-testid={getTestId('title')}>{title}</div>\n {description && (\n <div className=\"text-sm text-base-content/70 mb-3\" data-testid={getTestId('description')}>{description}</div>\n )}\n <div className=\"flex justify-end gap-2 mt-3\">\n {showCancel && (\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(cancelType)}`}\n onClick={handleCancel}\n disabled={loading}\n data-testid={getTestId('cancel-button')}\n >\n {resolvedCancelText}\n </button>\n )}\n <button\n className={`${dBtn} ${dBtnSm} ${getButtonClass(okType)}`}\n onClick={handleConfirm}\n disabled={loading}\n data-testid={getTestId('ok-button')}\n >\n {loading && <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingXs}`}></span>}\n {resolvedOkText}\n </button>\n </div>\n </div>\n </div>\n <div className={getArrowClasses()} />\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnSm","dBtnPrimary","dBtnSecondary","dBtnAccent","dBtnSuccess","dBtnWarning","dBtnError","dBtnInfo","dBtnGhost","dLoading","dLoadingSpinner","dLoadingXs","Popconfirm","forwardRef","children","title","description","onConfirm","onCancel","okText","cancelText","okType","cancelType","placement","disabled","icon","showCancel","testId","className","rest","ref","locale","useConfig","isOpen","setIsOpen","useState","loading","setLoading","containerRef","useRef","resolvedOkText","resolvedCancelText","getTestId","suffix","popupRef","useEffect","handleClickOutside","event","handleTriggerClick","e","handleConfirm","handleCancel","getPopupContainerClasses","getPopupClasses","getArrowClasses","buttonClasses","getButtonClass","type","defaultIcon","jsx","React","originalOnClick","jsxs"],"mappings":"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"}
|
package/dist/components/Radio.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as t, jsxs as z } from "react/jsx-runtime";
|
|
2
2
|
import b, { forwardRef as G, useContext as V, createContext as v } from "react";
|
|
3
|
-
import { useConfig as w } from "
|
|
3
|
+
import { useConfig as w } from "../providers/ConfigProvider.js";
|
|
4
4
|
const I = "radio", P = "radio-xs", X = "radio-sm", A = "radio-md", B = "radio-lg", E = "radio-xl", L = "radio-neutral", M = "radio-primary", O = "radio-secondary", W = "radio-accent", $ = "radio-info", q = "radio-success", D = "radio-warning", F = "radio-error", g = v(null);
|
|
5
5
|
function H({ children: i, value: n, defaultValue: d, onChange: o, name: e, className: c = "" }) {
|
|
6
6
|
const [l, r] = b.useState(d), m = n !== void 0 ? n : l, u = (s) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Radio.js","sources":["../../src/components/Radio.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"Radio.js","sources":["../../src/components/Radio.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dRadio = 'radio'\nconst dRadioXs = 'radio-xs'\nconst dRadioSm = 'radio-sm'\nconst dRadioMd = 'radio-md'\nconst dRadioLg = 'radio-lg'\nconst dRadioXl = 'radio-xl'\nconst dRadioNeutral = 'radio-neutral'\nconst dRadioPrimary = 'radio-primary'\nconst dRadioSecondary = 'radio-secondary'\nconst dRadioAccent = 'radio-accent'\nconst dRadioInfo = 'radio-info'\nconst dRadioSuccess = 'radio-success'\nconst dRadioWarning = 'radio-warning'\nconst dRadioError = 'radio-error'\n\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n className?: string\n children?: React.ReactNode\n}\n\nexport interface RadioGroupChangeEvent {\n target: {\n value: string | number\n name?: string\n }\n}\n\nexport interface RadioGroupProps {\n children: React.ReactNode\n value?: string | number\n defaultValue?: string | number\n onChange?: (e: RadioGroupChangeEvent) => void\n name?: string\n className?: string\n}\n\ninterface RadioGroupContextValue {\n value?: string | number\n onChange?: (value: string | number) => void\n name?: string\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\n\nfunction RadioGroup({ children, value, defaultValue, onChange, name, className = '' }: RadioGroupProps) {\n const [internalValue, setInternalValue] = React.useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (newValue: string | number) => {\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.({ target: { value: newValue, name } })\n }\n\n return (\n <RadioGroupContext.Provider value={{ value: currentValue, onChange: handleChange, name }}>\n <div role=\"radiogroup\" className={className}>{children}</div>\n </RadioGroupContext.Provider>\n )\n}\n\nconst RadioRoot = forwardRef<HTMLInputElement, RadioProps>(\n ({ size, color, className = '', value, checked, onChange, name: nameProp, children, ...props }, ref) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const groupContext = useContext(RadioGroupContext)\n\n const sizeClasses = {\n xs: dRadioXs,\n sm: dRadioSm,\n md: dRadioMd,\n lg: dRadioLg,\n xl: dRadioXl,\n }\n\n const colorClasses = {\n neutral: dRadioNeutral,\n primary: dRadioPrimary,\n secondary: dRadioSecondary,\n accent: dRadioAccent,\n info: dRadioInfo,\n success: dRadioSuccess,\n warning: dRadioWarning,\n error: dRadioError,\n }\n\n const radioClasses = [dRadio, effectiveSize && sizeClasses[effectiveSize], color && colorClasses[color]]\n .filter(Boolean)\n .join(' ')\n\n // If in a group, use group's value and onChange\n const isChecked = groupContext ? groupContext.value === value : checked\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (groupContext && value !== undefined) {\n const normalizedValue = typeof value === 'string' || typeof value === 'number' ? value : String(value)\n groupContext.onChange?.(normalizedValue)\n }\n onChange?.(e)\n }\n const name = groupContext?.name || nameProp\n\n const dataState = isChecked ? 'checked' : 'unchecked'\n\n const input = (\n <input\n ref={ref}\n type=\"radio\"\n className={radioClasses}\n value={value}\n checked={isChecked}\n onChange={handleChange}\n name={name}\n data-state={dataState}\n {...props}\n />\n )\n\n // If children are provided, wrap in a label\n if (children) {\n return (\n <label className={`flex items-center gap-2 cursor-pointer ${className}`}>\n <span className=\"flex-shrink-0\">{input}</span>\n <span>{children}</span>\n </label>\n )\n }\n\n return input\n }\n)\n\nRadioRoot.displayName = 'Radio'\n\nexport const Radio = Object.assign(RadioRoot, {\n Group: RadioGroup,\n})\n"],"names":["dRadio","dRadioXs","dRadioSm","dRadioMd","dRadioLg","dRadioXl","dRadioNeutral","dRadioPrimary","dRadioSecondary","dRadioAccent","dRadioInfo","dRadioSuccess","dRadioWarning","dRadioError","RadioGroupContext","createContext","RadioGroup","children","value","defaultValue","onChange","name","className","internalValue","setInternalValue","React","currentValue","handleChange","newValue","jsx","RadioRoot","forwardRef","size","color","checked","nameProp","props","ref","componentSize","useConfig","effectiveSize","groupContext","useContext","sizeClasses","colorClasses","radioClasses","isChecked","e","normalizedValue","input","jsxs","Radio"],"mappings":"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"}
|
package/dist/components/Range.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as V, jsx as s } from "react/jsx-runtime";
|
|
2
2
|
import { useState as b } from "react";
|
|
3
|
-
import { useConfig as j } from "
|
|
3
|
+
import { useConfig as j } from "../providers/ConfigProvider.js";
|
|
4
4
|
const $ = "range", A = "range-xs", I = "range-sm", M = "range-md", X = "range-lg", E = "range-xl", F = "range-primary", L = "range-secondary", P = "range-accent", W = "range-success", _ = "range-warning", k = "range-info", q = "range-error", H = ({
|
|
5
5
|
value: a,
|
|
6
6
|
defaultValue: i = 50,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Range.js","sources":["../../src/components/Range.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"Range.js","sources":["../../src/components/Range.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dRange = 'range'\nconst dRangeXs = 'range-xs'\nconst dRangeSm = 'range-sm'\nconst dRangeMd = 'range-md'\nconst dRangeLg = 'range-lg'\nconst dRangeXl = 'range-xl'\nconst dRangePrimary = 'range-primary'\nconst dRangeSecondary = 'range-secondary'\nconst dRangeAccent = 'range-accent'\nconst dRangeSuccess = 'range-success'\nconst dRangeWarning = 'range-warning'\nconst dRangeInfo = 'range-info'\nconst dRangeError = 'range-error'\n\nexport interface RangeProps {\n value?: number\n defaultValue?: number\n onChange?: (value: number) => void\n min?: number\n max?: number\n step?: number\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'info' | 'error'\n disabled?: boolean\n showValue?: boolean\n showSteps?: boolean\n className?: string\n}\n\nexport const Range: React.FC<RangeProps> = ({\n value,\n defaultValue = 50,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n size,\n color,\n disabled = false,\n showValue = false,\n showSteps = false,\n className = '',\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value)\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n }\n\n const sizeClasses = {\n xs: dRangeXs,\n sm: dRangeSm,\n md: dRangeMd,\n lg: dRangeLg,\n xl: dRangeXl,\n } as const\n\n const colorClasses = {\n primary: dRangePrimary,\n secondary: dRangeSecondary,\n accent: dRangeAccent,\n success: dRangeSuccess,\n warning: dRangeWarning,\n info: dRangeInfo,\n error: dRangeError,\n } as const\n\n const sizeClass = sizeClasses[effectiveSize]\n const colorClass = color ? colorClasses[color] : ''\n\n // Calculate steps for visual markers\n const steps = showSteps\n ? Array.from({ length: Math.floor((max - min) / step) + 1 }, (_, i) => min + i * step)\n : []\n\n return (\n <div className={className}>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n onChange={handleChange}\n disabled={disabled}\n className={`${dRange} ${sizeClass} ${colorClass}`}\n />\n {showSteps && steps.length > 0 && (\n <div className=\"w-full flex justify-between text-xs px-2 mt-2\">\n {steps.map((stepValue) => (\n <span key={stepValue} className=\"text-base-content/60\">\n |\n </span>\n ))}\n </div>\n )}\n {showValue && (\n <div className=\"text-center mt-2 text-sm font-medium text-base-content\">\n {currentValue}\n </div>\n )}\n </div>\n )\n}\n"],"names":["dRange","dRangeXs","dRangeSm","dRangeMd","dRangeLg","dRangeXl","dRangePrimary","dRangeSecondary","dRangeAccent","dRangeSuccess","dRangeWarning","dRangeInfo","dRangeError","Range","value","defaultValue","onChange","min","max","step","size","color","disabled","showValue","showSteps","className","componentSize","useConfig","effectiveSize","internalValue","setInternalValue","useState","currentValue","handleChange","newValue","sizeClasses","colorClasses","sizeClass","colorClass","steps","_","i","jsxs","jsx","stepValue"],"mappings":";;;AAIA,MAAMA,IAAS,SACTC,IAAW,YACXC,IAAW,YACXC,IAAW,YACXC,IAAW,YACXC,IAAW,YACXC,IAAgB,iBAChBC,IAAkB,mBAClBC,IAAe,gBACfC,IAAgB,iBAChBC,IAAgB,iBAChBC,IAAa,cACbC,IAAc,eAiBPC,IAA8B,CAAC;AAAA,EAC1C,OAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,KAAAC,IAAM;AAAA,EACN,MAAAC,IAAO;AAAA,EACP,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AACd,MAAM;AACJ,QAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBR,KAAQM,KAAiB,MACzC,CAACG,GAAeC,CAAgB,IAAIC,EAAShB,CAAY,GACzDiB,IAAelB,MAAU,SAAYA,IAAQe,GAE7CI,IAAe,CAAC,MAA2C;AAC/D,UAAMC,IAAW,WAAW,EAAE,OAAO,KAAK;AAC1C,IAAIpB,MAAU,UACZgB,EAAiBI,CAAQ,GAE3BlB,IAAWkB,CAAQ;AAAA,EACrB,GAEMC,IAAc;AAAA,IAClB,IAAIlC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,GAGA+B,IAAe;AAAA,IACnB,SAAS9B;AAAA,IACT,WAAWC;AAAA,IACX,QAAQC;AAAA,IACR,SAASC;AAAA,IACT,SAASC;AAAA,IACT,MAAMC;AAAA,IACN,OAAOC;AAAA,EAAA,GAGHyB,IAAYF,EAAYP,CAAa,GACrCU,IAAajB,IAAQe,EAAaf,CAAK,IAAI,IAG3CkB,IAAQf,IACV,MAAM,KAAK,EAAE,QAAQ,KAAK,OAAON,IAAMD,KAAOE,CAAI,IAAI,EAAA,GAAK,CAACqB,GAAGC,MAAMxB,IAAMwB,IAAItB,CAAI,IACnF,CAAA;AAEJ,SACE,gBAAAuB,EAAC,SAAI,WAAAjB,GACH,UAAA;AAAA,IAAA,gBAAAkB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAA1B;AAAA,QACA,KAAAC;AAAA,QACA,MAAAC;AAAA,QACA,OAAOa;AAAA,QACP,UAAUC;AAAA,QACV,UAAAX;AAAA,QACA,WAAW,GAAGtB,CAAM,IAAIqC,CAAS,IAAIC,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhDd,KAAae,EAAM,SAAS,KAC3B,gBAAAI,EAAC,OAAA,EAAI,WAAU,iDACZ,UAAAJ,EAAM,IAAI,CAACK,wBACT,QAAA,EAAqB,WAAU,wBAAuB,UAAA,IAAA,GAA5CA,CAEX,CACD,GACH;AAAA,IAEDrB,KACC,gBAAAoB,EAAC,OAAA,EAAI,WAAU,0DACZ,UAAAX,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as I, Fragment as F, jsx as a } from "react/jsx-runtime";
|
|
2
2
|
import L, { useState as y, useId as X, createContext as _, useContext as O } from "react";
|
|
3
|
-
import { useConfig as P } from "
|
|
3
|
+
import { useConfig as P } from "../providers/ConfigProvider.js";
|
|
4
4
|
const q = "rating", D = "rating-xs", J = "rating-sm", K = "rating-md", Q = "rating-lg", T = "rating-xl", U = "rating-half", W = "rating-hidden", Y = "mask", Z = "mask-star", w = "mask-star-2", nn = "mask-heart", tn = "mask-half-1", an = "mask-half-2", z = _(null);
|
|
5
5
|
function sn({
|
|
6
6
|
children: t,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rating.js","sources":["../../src/components/Rating.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useState } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dRating = 'rating'\nconst dRatingXs = 'rating-xs'\nconst dRatingSm = 'rating-sm'\nconst dRatingMd = 'rating-md'\nconst dRatingLg = 'rating-lg'\nconst dRatingXl = 'rating-xl'\nconst dRatingHalf = 'rating-half'\nconst dRatingHidden = 'rating-hidden'\nconst dMask = 'mask'\nconst dMaskStar = 'mask-star'\nconst dMaskStar2 = 'mask-star-2'\nconst dMaskHeart = 'mask-heart'\nconst dMaskHalf1 = 'mask-half-1'\nconst dMaskHalf2 = 'mask-half-2'\n\nexport interface RatingProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode\n value?: number\n defaultValue?: number\n onChange?: (value: number) => void\n onHoverChange?: (value: number) => void\n count?: number\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg'\n color?: string\n mask?: 'star' | 'star-2' | 'heart'\n allowClear?: boolean\n allowHalf?: boolean\n disabled?: boolean\n}\n\nexport interface RatingItemProps {\n value: number\n mask?: 'star' | 'star-2' | 'heart'\n color?: string\n hidden?: boolean\n half?: 'first' | 'second'\n className?: string\n}\n\ninterface RatingContextValue {\n name: string\n currentValue: number\n hoverValue: number\n onChange: (value: number) => void\n onHover: (value: number) => void\n size?: string\n disabled?: boolean\n halfGap?: 'none' | 'xs' | 'sm' | 'md' | 'lg'\n}\n\nconst RatingContext = createContext<RatingContextValue | null>(null)\n\nfunction RatingRoot({\n children,\n value,\n defaultValue = 0,\n onChange,\n onHoverChange,\n count = 5,\n size,\n gap = 'md',\n color = 'bg-warning',\n mask = 'star-2',\n allowClear = true,\n allowHalf = false,\n disabled = false,\n className = '',\n ...rest\n}: RatingProps) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [hoverValue, setHoverValue] = useState(0)\n const currentValue = value !== undefined ? value : internalValue\n const name = useId()\n\n const handleChange = (newValue: number) => {\n if (disabled) return\n // Allow clearing if clicking the same value and allowClear is true\n const finalValue = allowClear && newValue === currentValue ? 0 : newValue\n if (value === undefined) {\n setInternalValue(finalValue)\n }\n // Clear hover state so the clicked value shows immediately\n setHoverValue(0)\n onChange?.(finalValue)\n }\n\n const handleHover = (hoverVal: number) => {\n if (disabled) return\n setHoverValue(hoverVal)\n onHoverChange?.(hoverVal)\n }\n\n const sizeClasses = {\n xs: dRatingXs,\n sm: dRatingSm,\n md: dRatingMd,\n lg: dRatingLg,\n xl: dRatingXl,\n }\n\n const gapClasses = {\n none: 'gap-0',\n xs: 'gap-0.5',\n sm: 'gap-1',\n md: 'gap-2',\n lg: 'gap-3',\n }\n\n const classes = [\n dRating,\n // Half-star mode requires a size class to render correctly, default to md\n allowHalf ? sizeClasses[effectiveSize] : (effectiveSize && sizeClasses[effectiveSize]),\n allowHalf ? dRatingHalf : (gap && gapClasses[gap]),\n className,\n ].filter(Boolean).join(' ')\n\n // Auto-generate items if no children provided\n // Note: half-star mode requires mask-star-2 per DaisyUI\n const effectiveMask = allowHalf ? 'star-2' : mask\n const items = children || (\n <>\n {allowClear && <RatingItem value={0} hidden />}\n {allowHalf ? (\n // Half-star mode: each star is two inputs\n Array.from({ length: count }, (_, i) => (\n <React.Fragment key={i + 1}>\n <RatingItem value={i + 0.5} mask={effectiveMask} color={color} half=\"first\" />\n <RatingItem value={i + 1} mask={effectiveMask} color={color} half=\"second\" />\n </React.Fragment>\n ))\n ) : (\n // Standard mode: one input per star\n Array.from({ length: count }, (_, i) => (\n <RatingItem key={i + 1} value={i + 1} mask={effectiveMask} color={color} />\n ))\n )}\n </>\n )\n\n return (\n <RatingContext.Provider value={{ name, currentValue, hoverValue, onChange: handleChange, onHover: handleHover, size: effectiveSize, disabled, halfGap: allowHalf ? gap : undefined }}>\n <div\n role=\"radiogroup\"\n aria-label=\"Rating\"\n className={classes}\n data-value={currentValue}\n onMouseLeave={() => handleHover(0)}\n {...rest}\n >\n {items}\n </div>\n </RatingContext.Provider>\n )\n}\n\nfunction RatingItem({ value, mask = 'star-2', color = 'bg-warning', hidden = false, half, className = '' }: RatingItemProps) {\n const context = useContext(RatingContext)\n if (!context) {\n throw new Error('Rating.Item must be used within Rating')\n }\n\n const { name, currentValue, hoverValue, onChange, onHover, disabled, halfGap } = context\n\n const maskClasses = {\n star: dMaskStar,\n 'star-2': dMaskStar2,\n heart: dMaskHeart,\n }\n\n const halfGapClasses = {\n none: '',\n xs: 'mr-0.5',\n sm: 'mr-1',\n md: 'mr-2',\n lg: 'mr-3',\n }\n\n const halfClasses = {\n first: dMaskHalf1,\n second: `${dMaskHalf2} ${halfGap ? halfGapClasses[halfGap] : ''}`.trim(),\n }\n\n // Hidden items only get rating-hidden class (no mask)\n // Visible items get mask classes - DaisyUI CSS handles filled/unfilled state\n const classes = hidden\n ? dRatingHidden\n : [\n dMask,\n maskClasses[mask],\n half && halfClasses[half],\n color,\n className,\n ].filter(Boolean).join(' ')\n\n if (disabled) {\n return (\n <div\n className={classes}\n aria-current={currentValue === value ? 'true' : undefined}\n aria-label={`Rating ${value}`}\n />\n )\n }\n\n // Use hoverValue for checked state when hovering (for visual preview)\n // DaisyUI CSS fills all stars up to the checked one\n const displayValue = hoverValue > 0 ? hoverValue : currentValue\n\n return (\n <input\n type=\"radio\"\n name={name}\n className={classes}\n checked={displayValue === value}\n onChange={() => {}} // Controlled by onClick\n onClick={() => onChange(value)}\n onMouseEnter={() => onHover(value)}\n aria-label={`Rating ${value}`}\n />\n )\n}\n\nexport const Rating = Object.assign(RatingRoot, {\n Item: RatingItem,\n})\n"],"names":["dRating","dRatingXs","dRatingSm","dRatingMd","dRatingLg","dRatingXl","dRatingHalf","dRatingHidden","dMask","dMaskStar","dMaskStar2","dMaskHeart","dMaskHalf1","dMaskHalf2","RatingContext","createContext","RatingRoot","children","value","defaultValue","onChange","onHoverChange","count","size","gap","color","mask","allowClear","allowHalf","disabled","className","rest","componentSize","useConfig","effectiveSize","internalValue","setInternalValue","useState","hoverValue","setHoverValue","currentValue","name","useId","handleChange","newValue","finalValue","handleHover","hoverVal","sizeClasses","gapClasses","classes","effectiveMask","items","jsxs","Fragment","jsx","RatingItem","_","i","React","hidden","half","context","useContext","onHover","halfGap","maskClasses","halfClasses","displayValue","Rating"],"mappings":";;;AAIA,MAAMA,IAAU,UACVC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAc,eACdC,IAAgB,iBAChBC,IAAQ,QACRC,IAAY,aACZC,IAAa,eACbC,KAAa,cACbC,KAAa,eACbC,KAAa,eAsCbC,IAAgBC,EAAyC,IAAI;AAEnE,SAASC,GAAW;AAAA,EAClB,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,MAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAgB;AACd,QAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBX,KAAQS,KAAiB,MACzC,CAACG,GAAeC,CAAgB,IAAIC,EAASlB,CAAY,GACzD,CAACmB,GAAYC,CAAa,IAAIF,EAAS,CAAC,GACxCG,IAAetB,MAAU,SAAYA,IAAQiB,GAC7CM,IAAOC,EAAA,GAEPC,IAAe,CAACC,MAAqB;AACzC,QAAIf,EAAU;AAEd,UAAMgB,IAAalB,KAAciB,MAAaJ,IAAe,IAAII;AACjE,IAAI1B,MAAU,UACZkB,EAAiBS,CAAU,GAG7BN,EAAc,CAAC,GACfnB,IAAWyB,CAAU;AAAA,EACvB,GAEMC,IAAc,CAACC,MAAqB;AACxC,IAAIlB,MACJU,EAAcQ,CAAQ,GACtB1B,IAAgB0B,CAAQ;AAAA,EAC1B,GAEMC,IAAc;AAAA,IAClB,IAAI/C;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,GAGA4C,IAAa;AAAA,IACjB,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,IAAU;AAAA,IACdlD;AAAA;AAAA,KAEA4B,KAA0CM,MAAiBc,EAAYd,CAAa;AAAA,IACpFN,IAAYtB,IAAekB,KAAOyB,EAAWzB,CAAG;AAAA,IAChDM;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG,GAIpBqB,IAAgBvB,IAAY,WAAWF,GACvC0B,IAAQnC,KACZ,gBAAAoC,EAAAC,GAAA,EACG,UAAA;AAAA,IAAA3B,KAAc,gBAAA4B,EAACC,GAAA,EAAW,OAAO,GAAG,QAAM,IAAC;AAAA,IAC3C5B;AAAA;AAAA,MAEC,MAAM,KAAK,EAAE,QAAQN,EAAA,GAAS,CAACmC,GAAGC,MAChC,gBAAAL,EAACM,EAAM,UAAN,EACC,UAAA;AAAA,QAAA,gBAAAJ,EAACC,GAAA,EAAW,OAAOE,IAAI,KAAK,MAAMP,GAAe,OAAA1B,GAAc,MAAK,QAAA,CAAQ;AAAA,QAC5E,gBAAA8B,EAACC,KAAW,OAAOE,IAAI,GAAG,MAAMP,GAAe,OAAA1B,GAAc,MAAK,SAAA,CAAS;AAAA,MAAA,EAAA,GAFxDiC,IAAI,CAGzB,CACD;AAAA;AAAA;AAAA,MAGD,MAAM,KAAK,EAAE,QAAQpC,EAAA,GAAS,CAACmC,GAAGC,wBAC/BF,GAAA,EAAuB,OAAOE,IAAI,GAAG,MAAMP,GAAe,OAAA1B,EAAA,GAA1CiC,IAAI,CAAoD,CAC1E;AAAA;AAAA,EAAA,GAEL;AAGF,SACE,gBAAAH,EAACzC,EAAc,UAAd,EAAuB,OAAO,EAAE,MAAA2B,GAAM,cAAAD,GAAc,YAAAF,GAAY,UAAUK,GAAc,SAASG,GAAa,MAAMZ,GAAe,UAAAL,GAAU,SAASD,IAAYJ,IAAM,UACvK,UAAA,gBAAA+B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAWL;AAAA,MACX,cAAYV;AAAA,MACZ,cAAc,MAAMM,EAAY,CAAC;AAAA,MAChC,GAAGf;AAAA,MAEH,UAAAqB;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAEA,SAASI,EAAW,EAAE,OAAAtC,GAAO,MAAAQ,IAAO,UAAU,OAAAD,IAAQ,cAAc,QAAAmC,IAAS,IAAO,MAAAC,GAAM,WAAA/B,IAAY,GAAA,GAAuB;AAC3H,QAAMgC,IAAUC,EAAWjD,CAAa;AACxC,MAAI,CAACgD;AACH,UAAM,IAAI,MAAM,wCAAwC;AAG1D,QAAM,EAAE,MAAArB,GAAM,cAAAD,GAAc,YAAAF,GAAY,UAAAlB,GAAU,SAAA4C,GAAS,UAAAnC,GAAU,SAAAoC,MAAYH,GAE3EI,IAAc;AAAA,IAClB,MAAMzD;AAAA,IACN,UAAUC;AAAA,IACV,OAAOC;AAAA,EAAA,GAWHwD,IAAc;AAAA,IAClB,OAAOvD;AAAA,IACP,QAAQ,GAAGC,EAAU,IAAIoD,IAVJ;AAAA,MACrB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,EAK8CA,CAAO,IAAI,EAAE,GAAG,KAAA;AAAA,EAAK,GAKnEf,IAAUU,IACZrD,IACA;AAAA,IACEC;AAAA,IACA0D,EAAYxC,CAAI;AAAA,IAChBmC,KAAQM,EAAYN,CAAI;AAAA,IACxBpC;AAAA,IACAK;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAE9B,MAAID;AACF,WACE,gBAAA0B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWL;AAAA,QACX,gBAAcV,MAAiBtB,IAAQ,SAAS;AAAA,QAChD,cAAY,UAAUA,CAAK;AAAA,MAAA;AAAA,IAAA;AAOjC,QAAMkD,IAAe9B,IAAa,IAAIA,IAAaE;AAEnD,SACE,gBAAAe;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAAd;AAAA,MACA,WAAWS;AAAA,MACX,SAASkB,MAAiBlD;AAAA,MAC1B,UAAU,MAAM;AAAA,MAAC;AAAA,MACjB,SAAS,MAAME,EAASF,CAAK;AAAA,MAC7B,cAAc,MAAM8C,EAAQ9C,CAAK;AAAA,MACjC,cAAY,UAAUA,CAAK;AAAA,IAAA;AAAA,EAAA;AAGjC;AAEO,MAAMmD,KAAS,OAAO,OAAOrD,IAAY;AAAA,EAC9C,MAAMwC;AACR,CAAC;"}
|
|
1
|
+
{"version":3,"file":"Rating.js","sources":["../../src/components/Rating.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useState } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dRating = 'rating'\nconst dRatingXs = 'rating-xs'\nconst dRatingSm = 'rating-sm'\nconst dRatingMd = 'rating-md'\nconst dRatingLg = 'rating-lg'\nconst dRatingXl = 'rating-xl'\nconst dRatingHalf = 'rating-half'\nconst dRatingHidden = 'rating-hidden'\nconst dMask = 'mask'\nconst dMaskStar = 'mask-star'\nconst dMaskStar2 = 'mask-star-2'\nconst dMaskHeart = 'mask-heart'\nconst dMaskHalf1 = 'mask-half-1'\nconst dMaskHalf2 = 'mask-half-2'\n\nexport interface RatingProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode\n value?: number\n defaultValue?: number\n onChange?: (value: number) => void\n onHoverChange?: (value: number) => void\n count?: number\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg'\n color?: string\n mask?: 'star' | 'star-2' | 'heart'\n allowClear?: boolean\n allowHalf?: boolean\n disabled?: boolean\n}\n\nexport interface RatingItemProps {\n value: number\n mask?: 'star' | 'star-2' | 'heart'\n color?: string\n hidden?: boolean\n half?: 'first' | 'second'\n className?: string\n}\n\ninterface RatingContextValue {\n name: string\n currentValue: number\n hoverValue: number\n onChange: (value: number) => void\n onHover: (value: number) => void\n size?: string\n disabled?: boolean\n halfGap?: 'none' | 'xs' | 'sm' | 'md' | 'lg'\n}\n\nconst RatingContext = createContext<RatingContextValue | null>(null)\n\nfunction RatingRoot({\n children,\n value,\n defaultValue = 0,\n onChange,\n onHoverChange,\n count = 5,\n size,\n gap = 'md',\n color = 'bg-warning',\n mask = 'star-2',\n allowClear = true,\n allowHalf = false,\n disabled = false,\n className = '',\n ...rest\n}: RatingProps) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [hoverValue, setHoverValue] = useState(0)\n const currentValue = value !== undefined ? value : internalValue\n const name = useId()\n\n const handleChange = (newValue: number) => {\n if (disabled) return\n // Allow clearing if clicking the same value and allowClear is true\n const finalValue = allowClear && newValue === currentValue ? 0 : newValue\n if (value === undefined) {\n setInternalValue(finalValue)\n }\n // Clear hover state so the clicked value shows immediately\n setHoverValue(0)\n onChange?.(finalValue)\n }\n\n const handleHover = (hoverVal: number) => {\n if (disabled) return\n setHoverValue(hoverVal)\n onHoverChange?.(hoverVal)\n }\n\n const sizeClasses = {\n xs: dRatingXs,\n sm: dRatingSm,\n md: dRatingMd,\n lg: dRatingLg,\n xl: dRatingXl,\n }\n\n const gapClasses = {\n none: 'gap-0',\n xs: 'gap-0.5',\n sm: 'gap-1',\n md: 'gap-2',\n lg: 'gap-3',\n }\n\n const classes = [\n dRating,\n // Half-star mode requires a size class to render correctly, default to md\n allowHalf ? sizeClasses[effectiveSize] : (effectiveSize && sizeClasses[effectiveSize]),\n allowHalf ? dRatingHalf : (gap && gapClasses[gap]),\n className,\n ].filter(Boolean).join(' ')\n\n // Auto-generate items if no children provided\n // Note: half-star mode requires mask-star-2 per DaisyUI\n const effectiveMask = allowHalf ? 'star-2' : mask\n const items = children || (\n <>\n {allowClear && <RatingItem value={0} hidden />}\n {allowHalf ? (\n // Half-star mode: each star is two inputs\n Array.from({ length: count }, (_, i) => (\n <React.Fragment key={i + 1}>\n <RatingItem value={i + 0.5} mask={effectiveMask} color={color} half=\"first\" />\n <RatingItem value={i + 1} mask={effectiveMask} color={color} half=\"second\" />\n </React.Fragment>\n ))\n ) : (\n // Standard mode: one input per star\n Array.from({ length: count }, (_, i) => (\n <RatingItem key={i + 1} value={i + 1} mask={effectiveMask} color={color} />\n ))\n )}\n </>\n )\n\n return (\n <RatingContext.Provider value={{ name, currentValue, hoverValue, onChange: handleChange, onHover: handleHover, size: effectiveSize, disabled, halfGap: allowHalf ? gap : undefined }}>\n <div\n role=\"radiogroup\"\n aria-label=\"Rating\"\n className={classes}\n data-value={currentValue}\n onMouseLeave={() => handleHover(0)}\n {...rest}\n >\n {items}\n </div>\n </RatingContext.Provider>\n )\n}\n\nfunction RatingItem({ value, mask = 'star-2', color = 'bg-warning', hidden = false, half, className = '' }: RatingItemProps) {\n const context = useContext(RatingContext)\n if (!context) {\n throw new Error('Rating.Item must be used within Rating')\n }\n\n const { name, currentValue, hoverValue, onChange, onHover, disabled, halfGap } = context\n\n const maskClasses = {\n star: dMaskStar,\n 'star-2': dMaskStar2,\n heart: dMaskHeart,\n }\n\n const halfGapClasses = {\n none: '',\n xs: 'mr-0.5',\n sm: 'mr-1',\n md: 'mr-2',\n lg: 'mr-3',\n }\n\n const halfClasses = {\n first: dMaskHalf1,\n second: `${dMaskHalf2} ${halfGap ? halfGapClasses[halfGap] : ''}`.trim(),\n }\n\n // Hidden items only get rating-hidden class (no mask)\n // Visible items get mask classes - DaisyUI CSS handles filled/unfilled state\n const classes = hidden\n ? dRatingHidden\n : [\n dMask,\n maskClasses[mask],\n half && halfClasses[half],\n color,\n className,\n ].filter(Boolean).join(' ')\n\n if (disabled) {\n return (\n <div\n className={classes}\n aria-current={currentValue === value ? 'true' : undefined}\n aria-label={`Rating ${value}`}\n />\n )\n }\n\n // Use hoverValue for checked state when hovering (for visual preview)\n // DaisyUI CSS fills all stars up to the checked one\n const displayValue = hoverValue > 0 ? hoverValue : currentValue\n\n return (\n <input\n type=\"radio\"\n name={name}\n className={classes}\n checked={displayValue === value}\n onChange={() => {}} // Controlled by onClick\n onClick={() => onChange(value)}\n onMouseEnter={() => onHover(value)}\n aria-label={`Rating ${value}`}\n />\n )\n}\n\nexport const Rating = Object.assign(RatingRoot, {\n Item: RatingItem,\n})\n"],"names":["dRating","dRatingXs","dRatingSm","dRatingMd","dRatingLg","dRatingXl","dRatingHalf","dRatingHidden","dMask","dMaskStar","dMaskStar2","dMaskHeart","dMaskHalf1","dMaskHalf2","RatingContext","createContext","RatingRoot","children","value","defaultValue","onChange","onHoverChange","count","size","gap","color","mask","allowClear","allowHalf","disabled","className","rest","componentSize","useConfig","effectiveSize","internalValue","setInternalValue","useState","hoverValue","setHoverValue","currentValue","name","useId","handleChange","newValue","finalValue","handleHover","hoverVal","sizeClasses","gapClasses","classes","effectiveMask","items","jsxs","Fragment","jsx","RatingItem","_","i","React","hidden","half","context","useContext","onHover","halfGap","maskClasses","halfClasses","displayValue","Rating"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import B from "@tiptap/starter-kit";
|
|
|
5
5
|
import w from "@tiptap/extension-underline";
|
|
6
6
|
import j from "@tiptap/extension-link";
|
|
7
7
|
import C from "@tiptap/extension-placeholder";
|
|
8
|
-
import { useConfig as S } from "
|
|
8
|
+
import { useConfig as S } from "../providers/ConfigProvider.js";
|
|
9
9
|
const $ = "btn", T = "btn-ghost", U = "btn-xs", q = "link", z = "link-primary", r = (e) => ({
|
|
10
10
|
xmlns: "http://www.w3.org/2000/svg",
|
|
11
11
|
fill: "none",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextEditor.js","sources":["../../src/components/RichTextEditor.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect } from 'react'\nimport { useEditor, EditorContent, Editor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter-kit'\nimport Underline from '@tiptap/extension-underline'\nimport Link from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dLink = 'link'\nconst dLinkPrimary = 'link-primary'\n\n// Inline toolbar icons (from Heroicons outline)\nconst iconProps = (size: number) => ({\n xmlns: 'http://www.w3.org/2000/svg',\n fill: 'none',\n viewBox: '0 0 24 24',\n strokeWidth: 1.5,\n stroke: 'currentColor',\n width: size,\n height: size,\n 'aria-hidden': true as const,\n})\n\nconst BoldIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.75 3.75h6.75a3.75 3.75 0 0 1 0 7.5H6.75V3.75ZM6.75 11.25h7.5a3.75 3.75 0 0 1 0 7.5h-7.5v-7.5Z\" />\n </svg>\n)\n\nconst ItalicIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.248 20.248h4.5m4.5 0h4.5m-7.5-16.5h4.5m4.5 0h4.5M9.748 3.748l-4.5 16.5\" />\n </svg>\n)\n\nconst UnderlineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.995 3.744v7.5a6 6 0 1 1-12 0v-7.5m-2.25 16.502h16.5\" />\n </svg>\n)\n\nconst StrikethroughIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 12a4.5 4.5 0 0 0 0 9c2.485 0 4.5-2.015 4.5-4.5M12 12V3m0 9H3m9 0h9m-4.5-4.5a4.5 4.5 0 0 0-9 0\" />\n </svg>\n)\n\nconst CodeBracketIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5\" />\n </svg>\n)\n\nconst H1Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501m4.501-8.627 2.25-1.5v10.126m0 0h-2.25m2.25 0h2.25\" />\n </svg>\n)\n\nconst H2Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 19.5H16.5v-1.609a2.25 2.25 0 0 1 1.244-2.012l2.89-1.445c.651-.326 1.116-.955 1.116-1.684 0-.498-.04-.987-.118-1.463-.135-.825-.835-1.422-1.668-1.489a15.202 15.202 0 0 0-3.464.12M2.243 4.492v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst H3Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.905 14.626a4.52 4.52 0 0 1 .738 3.603c-.154.695-.794 1.143-1.504 1.208a15.194 15.194 0 0 1-3.639-.104m4.405-4.707a4.52 4.52 0 0 0 .738-3.603c-.154-.696-.794-1.144-1.504-1.209a15.19 15.19 0 0 0-3.639.104m4.405 4.708H18M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst ListBulletIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0ZM3.75 12h.007v.008H3.75V12Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm-.375 5.25h.007v.008H3.75v-.008Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z\" />\n </svg>\n)\n\nconst NumberedListIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.242 5.992h12m-12 6.003h12m-12 5.999h12M4.117 7.495v-3.75H2.99m1.125 3.75H2.99m1.125 0H5.24m-1.92 2.577a1.125 1.125 0 1 1 1.591 1.59l-1.83 1.83h2.16M2.99 15.745h1.125a1.125 1.125 0 0 1 0 2.25H3.74m0-.002h.375a1.125 1.125 0 0 1 0 2.25H2.99\" />\n </svg>\n)\n\nconst Bars3BottomLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25H12\" />\n </svg>\n)\n\nconst CommandLineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\" />\n </svg>\n)\n\nconst MinusIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 12h14\" />\n </svg>\n)\n\nconst LinkIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244\" />\n </svg>\n)\n\nconst ArrowUturnLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3\" />\n </svg>\n)\n\nconst ArrowUturnRightIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3\" />\n </svg>\n)\n\nexport type ToolbarItem =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'code'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'codeBlock'\n | 'horizontalRule'\n | 'link'\n | 'undo'\n | 'redo'\n | '|'\n\nexport interface RichTextEditorProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Initial HTML content */\n value?: string\n /** Callback when content changes */\n onChange?: (html: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Toolbar items to display */\n toolbar?: ToolbarItem[]\n /** Hide the toolbar */\n hideToolbar?: boolean\n /** Make editor read-only */\n readOnly?: boolean\n /** Auto focus on mount */\n autoFocus?: boolean\n /** Minimum height of the editor */\n minHeight?: string | number\n /** Maximum height of the editor (enables scrolling) */\n maxHeight?: string | number\n /** Editor size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show border around editor */\n bordered?: boolean\n /** Callback with editor instance */\n onEditorReady?: (editor: Editor) => void\n 'data-testid'?: string\n}\n\nconst defaultToolbar: ToolbarItem[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n '|',\n 'heading1',\n 'heading2',\n '|',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n '|',\n 'link',\n 'code',\n 'codeBlock',\n '|',\n 'undo',\n 'redo',\n]\n\nconst sizeClasses = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n}\n\ninterface ToolbarButtonProps {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`\n ${dBtn} ${dBtnGhost} ${dBtnXs} px-2 min-h-8 h-8\n ${isActive ? 'bg-base-300 text-base-content' : 'text-base-content/70'}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n `}\n >\n {children}\n </button>\n)\n\nconst ToolbarDivider: React.FC = () => (\n <div className=\"w-px h-6 bg-base-300 mx-1\" />\n)\n\n// Map editor size to icon pixel size\nconst editorSizeToIconSize: Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n}\n\nconst EditorToolbar: React.FC<{\n editor: Editor | null\n toolbar: ToolbarItem[]\n editorSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n}> = ({ editor, toolbar, editorSize }) => {\n const iconSize = editorSizeToIconSize[editorSize]\n const setLink = useCallback(() => {\n if (!editor) return\n\n const previousUrl = editor.getAttributes('link').href\n const url = window.prompt('URL', previousUrl)\n\n if (url === null) return\n\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run()\n return\n }\n\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }, [editor])\n\n if (!editor) return null\n\n const renderToolbarItem = (item: ToolbarItem, index: number) => {\n if (item === '|') {\n return <ToolbarDivider key={`divider-${index}`} />\n }\n\n const toolbarActions: Record<\n Exclude<ToolbarItem, '|'>,\n { icon: React.FC<{ size: number }>; action: () => void; isActive: () => boolean; canExecute: () => boolean; title: string }\n > = {\n bold: {\n icon: BoldIcon,\n action: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive('bold'),\n canExecute: () => editor.can().chain().focus().toggleBold().run(),\n title: 'Bold',\n },\n italic: {\n icon: ItalicIcon,\n action: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive('italic'),\n canExecute: () => editor.can().chain().focus().toggleItalic().run(),\n title: 'Italic',\n },\n underline: {\n icon: UnderlineIcon,\n action: () => editor.chain().focus().toggleUnderline().run(),\n isActive: () => editor.isActive('underline'),\n canExecute: () => editor.can().chain().focus().toggleUnderline().run(),\n title: 'Underline',\n },\n strikethrough: {\n icon: StrikethroughIcon,\n action: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive('strike'),\n canExecute: () => editor.can().chain().focus().toggleStrike().run(),\n title: 'Strikethrough',\n },\n code: {\n icon: CodeBracketIcon,\n action: () => editor.chain().focus().toggleCode().run(),\n isActive: () => editor.isActive('code'),\n canExecute: () => editor.can().chain().focus().toggleCode().run(),\n title: 'Inline Code',\n },\n heading1: {\n icon: H1Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: () => editor.isActive('heading', { level: 1 }),\n canExecute: () => true,\n title: 'Heading 1',\n },\n heading2: {\n icon: H2Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: () => editor.isActive('heading', { level: 2 }),\n canExecute: () => true,\n title: 'Heading 2',\n },\n heading3: {\n icon: H3Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: () => editor.isActive('heading', { level: 3 }),\n canExecute: () => true,\n title: 'Heading 3',\n },\n bulletList: {\n icon: ListBulletIcon,\n action: () => editor.chain().focus().toggleBulletList().run(),\n isActive: () => editor.isActive('bulletList'),\n canExecute: () => true,\n title: 'Bullet List',\n },\n orderedList: {\n icon: NumberedListIcon,\n action: () => editor.chain().focus().toggleOrderedList().run(),\n isActive: () => editor.isActive('orderedList'),\n canExecute: () => true,\n title: 'Numbered List',\n },\n blockquote: {\n icon: Bars3BottomLeftIcon,\n action: () => editor.chain().focus().toggleBlockquote().run(),\n isActive: () => editor.isActive('blockquote'),\n canExecute: () => true,\n title: 'Blockquote',\n },\n codeBlock: {\n icon: CommandLineIcon,\n action: () => editor.chain().focus().toggleCodeBlock().run(),\n isActive: () => editor.isActive('codeBlock'),\n canExecute: () => true,\n title: 'Code Block',\n },\n horizontalRule: {\n icon: MinusIcon,\n action: () => editor.chain().focus().setHorizontalRule().run(),\n isActive: () => false,\n canExecute: () => true,\n title: 'Horizontal Rule',\n },\n link: {\n icon: LinkIcon,\n action: setLink,\n isActive: () => editor.isActive('link'),\n canExecute: () => true,\n title: 'Add Link',\n },\n undo: {\n icon: ArrowUturnLeftIcon,\n action: () => editor.chain().focus().undo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().undo().run(),\n title: 'Undo',\n },\n redo: {\n icon: ArrowUturnRightIcon,\n action: () => editor.chain().focus().redo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().redo().run(),\n title: 'Redo',\n },\n }\n\n const { icon: Icon, ...config } = toolbarActions[item]\n return (\n <ToolbarButton\n key={item}\n onClick={config.action}\n isActive={config.isActive()}\n disabled={!config.canExecute()}\n title={config.title}\n >\n <Icon size={iconSize} />\n </ToolbarButton>\n )\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-0.5 p-2 border-b border-base-300 bg-base-200/50\">\n {toolbar.map((item, index) => renderToolbarItem(item, index))}\n </div>\n )\n}\n\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n (\n {\n value = '',\n onChange,\n placeholder = 'Start typing...',\n toolbar = defaultToolbar,\n hideToolbar = false,\n readOnly = false,\n autoFocus = false,\n minHeight = 200,\n maxHeight,\n size,\n bordered = true,\n onEditorReady,\n className = '',\n 'data-testid': testId = 'rich-text-editor',\n ...rest\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n },\n }),\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: `${dLink} ${dLinkPrimary}`,\n },\n }),\n Placeholder.configure({\n placeholder,\n emptyEditorClass: 'is-editor-empty',\n }),\n ],\n content: value,\n editable: !readOnly,\n autofocus: autoFocus,\n onUpdate: ({ editor }) => {\n onChange?.(editor.getHTML())\n },\n editorProps: {\n attributes: {\n class: `prose prose-sm max-w-none focus:outline-none ${sizeClasses[effectiveSize]}`,\n },\n },\n })\n\n useEffect(() => {\n if (editor && onEditorReady) {\n onEditorReady(editor)\n }\n }, [editor, onEditorReady])\n\n // Sync value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value, false)\n }\n }, [value, editor])\n\n // Sync editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!readOnly)\n }\n }, [readOnly, editor])\n\n const minHeightStyle = typeof minHeight === 'number' ? `${minHeight}px` : minHeight\n const maxHeightStyle = maxHeight\n ? typeof maxHeight === 'number'\n ? `${maxHeight}px`\n : maxHeight\n : undefined\n\n return (\n <div\n ref={ref}\n className={`\n bg-base-100 rounded-lg overflow-hidden\n ${bordered ? 'border border-base-300' : ''}\n ${className}\n `}\n data-testid={testId}\n {...rest}\n >\n {!hideToolbar && <EditorToolbar editor={editor} toolbar={toolbar} editorSize={effectiveSize} />}\n <div\n className={`\n p-4 overflow-y-auto\n ${maxHeightStyle ? 'overflow-y-auto' : ''}\n `}\n style={{\n minHeight: minHeightStyle,\n maxHeight: maxHeightStyle,\n }}\n >\n <EditorContent\n editor={editor}\n className={`\n [&_.ProseMirror]:min-h-full [&_.ProseMirror]:outline-none\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:text-base-content/40\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none\n [&_.ProseMirror_h1]:text-2xl [&_.ProseMirror_h1]:font-bold [&_.ProseMirror_h1]:mt-4 [&_.ProseMirror_h1]:mb-2\n [&_.ProseMirror_h2]:text-xl [&_.ProseMirror_h2]:font-bold [&_.ProseMirror_h2]:mt-3 [&_.ProseMirror_h2]:mb-2\n [&_.ProseMirror_h3]:text-lg [&_.ProseMirror_h3]:font-bold [&_.ProseMirror_h3]:mt-2 [&_.ProseMirror_h3]:mb-1\n [&_.ProseMirror_p]:my-2\n [&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2\n [&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2\n [&_.ProseMirror_li]:my-1\n [&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-base-300\n [&_.ProseMirror_blockquote]:pl-4 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2\n [&_.ProseMirror_code]:bg-base-200 [&_.ProseMirror_code]:px-1 [&_.ProseMirror_code]:py-0.5\n [&_.ProseMirror_code]:rounded [&_.ProseMirror_code]:font-mono [&_.ProseMirror_code]:text-sm\n [&_.ProseMirror_pre]:bg-base-200 [&_.ProseMirror_pre]:p-4 [&_.ProseMirror_pre]:rounded-lg\n [&_.ProseMirror_pre]:my-2 [&_.ProseMirror_pre]:overflow-x-auto\n [&_.ProseMirror_pre_code]:bg-transparent [&_.ProseMirror_pre_code]:p-0\n [&_.ProseMirror_hr]:border-base-300 [&_.ProseMirror_hr]:my-4\n [&_.ProseMirror_a]:text-primary [&_.ProseMirror_a]:underline\n `}\n />\n </div>\n </div>\n )\n }\n)\n\nRichTextEditor.displayName = 'RichTextEditor'\n\nexport default RichTextEditor\n"],"names":["dBtn","dBtnGhost","dBtnXs","dLink","dLinkPrimary","iconProps","size","BoldIcon","jsx","ItalicIcon","UnderlineIcon","StrikethroughIcon","CodeBracketIcon","H1Icon","H2Icon","H3Icon","ListBulletIcon","NumberedListIcon","Bars3BottomLeftIcon","CommandLineIcon","MinusIcon","LinkIcon","ArrowUturnLeftIcon","ArrowUturnRightIcon","defaultToolbar","sizeClasses","ToolbarButton","onClick","isActive","disabled","title","children","ToolbarDivider","editorSizeToIconSize","EditorToolbar","editor","toolbar","editorSize","iconSize","setLink","useCallback","previousUrl","url","renderToolbarItem","item","index","toolbarActions","Icon","config","RichTextEditor","forwardRef","value","onChange","placeholder","hideToolbar","readOnly","autoFocus","minHeight","maxHeight","bordered","onEditorReady","className","testId","rest","ref","componentSize","useConfig","effectiveSize","useEditor","StarterKit","Underline","Link","Placeholder","useEffect","minHeightStyle","maxHeightStyle","jsxs","EditorContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RichTextEditor.js","sources":["../../src/components/RichTextEditor.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect } from 'react'\nimport { useEditor, EditorContent, Editor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter-kit'\nimport Underline from '@tiptap/extension-underline'\nimport Link from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dLink = 'link'\nconst dLinkPrimary = 'link-primary'\n\n// Inline toolbar icons (from Heroicons outline)\nconst iconProps = (size: number) => ({\n xmlns: 'http://www.w3.org/2000/svg',\n fill: 'none',\n viewBox: '0 0 24 24',\n strokeWidth: 1.5,\n stroke: 'currentColor',\n width: size,\n height: size,\n 'aria-hidden': true as const,\n})\n\nconst BoldIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.75 3.75h6.75a3.75 3.75 0 0 1 0 7.5H6.75V3.75ZM6.75 11.25h7.5a3.75 3.75 0 0 1 0 7.5h-7.5v-7.5Z\" />\n </svg>\n)\n\nconst ItalicIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.248 20.248h4.5m4.5 0h4.5m-7.5-16.5h4.5m4.5 0h4.5M9.748 3.748l-4.5 16.5\" />\n </svg>\n)\n\nconst UnderlineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.995 3.744v7.5a6 6 0 1 1-12 0v-7.5m-2.25 16.502h16.5\" />\n </svg>\n)\n\nconst StrikethroughIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 12a4.5 4.5 0 0 0 0 9c2.485 0 4.5-2.015 4.5-4.5M12 12V3m0 9H3m9 0h9m-4.5-4.5a4.5 4.5 0 0 0-9 0\" />\n </svg>\n)\n\nconst CodeBracketIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5\" />\n </svg>\n)\n\nconst H1Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501m4.501-8.627 2.25-1.5v10.126m0 0h-2.25m2.25 0h2.25\" />\n </svg>\n)\n\nconst H2Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 19.5H16.5v-1.609a2.25 2.25 0 0 1 1.244-2.012l2.89-1.445c.651-.326 1.116-.955 1.116-1.684 0-.498-.04-.987-.118-1.463-.135-.825-.835-1.422-1.668-1.489a15.202 15.202 0 0 0-3.464.12M2.243 4.492v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst H3Icon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20.905 14.626a4.52 4.52 0 0 1 .738 3.603c-.154.695-.794 1.143-1.504 1.208a15.194 15.194 0 0 1-3.639-.104m4.405-4.707a4.52 4.52 0 0 0 .738-3.603c-.154-.696-.794-1.144-1.504-1.209a15.19 15.19 0 0 0-3.639.104m4.405 4.708H18M2.243 4.493v7.5m0 0v7.502m0-7.501h10.5m0-7.5v7.5m0 0v7.501\" />\n </svg>\n)\n\nconst ListBulletIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0ZM3.75 12h.007v.008H3.75V12Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm-.375 5.25h.007v.008H3.75v-.008Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z\" />\n </svg>\n)\n\nconst NumberedListIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.242 5.992h12m-12 6.003h12m-12 5.999h12M4.117 7.495v-3.75H2.99m1.125 3.75H2.99m1.125 0H5.24m-1.92 2.577a1.125 1.125 0 1 1 1.591 1.59l-1.83 1.83h2.16M2.99 15.745h1.125a1.125 1.125 0 0 1 0 2.25H3.74m0-.002h.375a1.125 1.125 0 0 1 0 2.25H2.99\" />\n </svg>\n)\n\nconst Bars3BottomLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25H12\" />\n </svg>\n)\n\nconst CommandLineIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\" />\n </svg>\n)\n\nconst MinusIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 12h14\" />\n </svg>\n)\n\nconst LinkIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244\" />\n </svg>\n)\n\nconst ArrowUturnLeftIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3\" />\n </svg>\n)\n\nconst ArrowUturnRightIcon = ({ size }: { size: number }) => (\n <svg {...iconProps(size)}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3\" />\n </svg>\n)\n\nexport type ToolbarItem =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'code'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'codeBlock'\n | 'horizontalRule'\n | 'link'\n | 'undo'\n | 'redo'\n | '|'\n\nexport interface RichTextEditorProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Initial HTML content */\n value?: string\n /** Callback when content changes */\n onChange?: (html: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Toolbar items to display */\n toolbar?: ToolbarItem[]\n /** Hide the toolbar */\n hideToolbar?: boolean\n /** Make editor read-only */\n readOnly?: boolean\n /** Auto focus on mount */\n autoFocus?: boolean\n /** Minimum height of the editor */\n minHeight?: string | number\n /** Maximum height of the editor (enables scrolling) */\n maxHeight?: string | number\n /** Editor size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show border around editor */\n bordered?: boolean\n /** Callback with editor instance */\n onEditorReady?: (editor: Editor) => void\n 'data-testid'?: string\n}\n\nconst defaultToolbar: ToolbarItem[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n '|',\n 'heading1',\n 'heading2',\n '|',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n '|',\n 'link',\n 'code',\n 'codeBlock',\n '|',\n 'undo',\n 'redo',\n]\n\nconst sizeClasses = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n}\n\ninterface ToolbarButtonProps {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`\n ${dBtn} ${dBtnGhost} ${dBtnXs} px-2 min-h-8 h-8\n ${isActive ? 'bg-base-300 text-base-content' : 'text-base-content/70'}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n `}\n >\n {children}\n </button>\n)\n\nconst ToolbarDivider: React.FC = () => (\n <div className=\"w-px h-6 bg-base-300 mx-1\" />\n)\n\n// Map editor size to icon pixel size\nconst editorSizeToIconSize: Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n}\n\nconst EditorToolbar: React.FC<{\n editor: Editor | null\n toolbar: ToolbarItem[]\n editorSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n}> = ({ editor, toolbar, editorSize }) => {\n const iconSize = editorSizeToIconSize[editorSize]\n const setLink = useCallback(() => {\n if (!editor) return\n\n const previousUrl = editor.getAttributes('link').href\n const url = window.prompt('URL', previousUrl)\n\n if (url === null) return\n\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run()\n return\n }\n\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }, [editor])\n\n if (!editor) return null\n\n const renderToolbarItem = (item: ToolbarItem, index: number) => {\n if (item === '|') {\n return <ToolbarDivider key={`divider-${index}`} />\n }\n\n const toolbarActions: Record<\n Exclude<ToolbarItem, '|'>,\n { icon: React.FC<{ size: number }>; action: () => void; isActive: () => boolean; canExecute: () => boolean; title: string }\n > = {\n bold: {\n icon: BoldIcon,\n action: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive('bold'),\n canExecute: () => editor.can().chain().focus().toggleBold().run(),\n title: 'Bold',\n },\n italic: {\n icon: ItalicIcon,\n action: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive('italic'),\n canExecute: () => editor.can().chain().focus().toggleItalic().run(),\n title: 'Italic',\n },\n underline: {\n icon: UnderlineIcon,\n action: () => editor.chain().focus().toggleUnderline().run(),\n isActive: () => editor.isActive('underline'),\n canExecute: () => editor.can().chain().focus().toggleUnderline().run(),\n title: 'Underline',\n },\n strikethrough: {\n icon: StrikethroughIcon,\n action: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive('strike'),\n canExecute: () => editor.can().chain().focus().toggleStrike().run(),\n title: 'Strikethrough',\n },\n code: {\n icon: CodeBracketIcon,\n action: () => editor.chain().focus().toggleCode().run(),\n isActive: () => editor.isActive('code'),\n canExecute: () => editor.can().chain().focus().toggleCode().run(),\n title: 'Inline Code',\n },\n heading1: {\n icon: H1Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: () => editor.isActive('heading', { level: 1 }),\n canExecute: () => true,\n title: 'Heading 1',\n },\n heading2: {\n icon: H2Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: () => editor.isActive('heading', { level: 2 }),\n canExecute: () => true,\n title: 'Heading 2',\n },\n heading3: {\n icon: H3Icon,\n action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: () => editor.isActive('heading', { level: 3 }),\n canExecute: () => true,\n title: 'Heading 3',\n },\n bulletList: {\n icon: ListBulletIcon,\n action: () => editor.chain().focus().toggleBulletList().run(),\n isActive: () => editor.isActive('bulletList'),\n canExecute: () => true,\n title: 'Bullet List',\n },\n orderedList: {\n icon: NumberedListIcon,\n action: () => editor.chain().focus().toggleOrderedList().run(),\n isActive: () => editor.isActive('orderedList'),\n canExecute: () => true,\n title: 'Numbered List',\n },\n blockquote: {\n icon: Bars3BottomLeftIcon,\n action: () => editor.chain().focus().toggleBlockquote().run(),\n isActive: () => editor.isActive('blockquote'),\n canExecute: () => true,\n title: 'Blockquote',\n },\n codeBlock: {\n icon: CommandLineIcon,\n action: () => editor.chain().focus().toggleCodeBlock().run(),\n isActive: () => editor.isActive('codeBlock'),\n canExecute: () => true,\n title: 'Code Block',\n },\n horizontalRule: {\n icon: MinusIcon,\n action: () => editor.chain().focus().setHorizontalRule().run(),\n isActive: () => false,\n canExecute: () => true,\n title: 'Horizontal Rule',\n },\n link: {\n icon: LinkIcon,\n action: setLink,\n isActive: () => editor.isActive('link'),\n canExecute: () => true,\n title: 'Add Link',\n },\n undo: {\n icon: ArrowUturnLeftIcon,\n action: () => editor.chain().focus().undo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().undo().run(),\n title: 'Undo',\n },\n redo: {\n icon: ArrowUturnRightIcon,\n action: () => editor.chain().focus().redo().run(),\n isActive: () => false,\n canExecute: () => editor.can().chain().focus().redo().run(),\n title: 'Redo',\n },\n }\n\n const { icon: Icon, ...config } = toolbarActions[item]\n return (\n <ToolbarButton\n key={item}\n onClick={config.action}\n isActive={config.isActive()}\n disabled={!config.canExecute()}\n title={config.title}\n >\n <Icon size={iconSize} />\n </ToolbarButton>\n )\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-0.5 p-2 border-b border-base-300 bg-base-200/50\">\n {toolbar.map((item, index) => renderToolbarItem(item, index))}\n </div>\n )\n}\n\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n (\n {\n value = '',\n onChange,\n placeholder = 'Start typing...',\n toolbar = defaultToolbar,\n hideToolbar = false,\n readOnly = false,\n autoFocus = false,\n minHeight = 200,\n maxHeight,\n size,\n bordered = true,\n onEditorReady,\n className = '',\n 'data-testid': testId = 'rich-text-editor',\n ...rest\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2, 3],\n },\n }),\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: `${dLink} ${dLinkPrimary}`,\n },\n }),\n Placeholder.configure({\n placeholder,\n emptyEditorClass: 'is-editor-empty',\n }),\n ],\n content: value,\n editable: !readOnly,\n autofocus: autoFocus,\n onUpdate: ({ editor }) => {\n onChange?.(editor.getHTML())\n },\n editorProps: {\n attributes: {\n class: `prose prose-sm max-w-none focus:outline-none ${sizeClasses[effectiveSize]}`,\n },\n },\n })\n\n useEffect(() => {\n if (editor && onEditorReady) {\n onEditorReady(editor)\n }\n }, [editor, onEditorReady])\n\n // Sync value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value, false)\n }\n }, [value, editor])\n\n // Sync editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!readOnly)\n }\n }, [readOnly, editor])\n\n const minHeightStyle = typeof minHeight === 'number' ? `${minHeight}px` : minHeight\n const maxHeightStyle = maxHeight\n ? typeof maxHeight === 'number'\n ? `${maxHeight}px`\n : maxHeight\n : undefined\n\n return (\n <div\n ref={ref}\n className={`\n bg-base-100 rounded-lg overflow-hidden\n ${bordered ? 'border border-base-300' : ''}\n ${className}\n `}\n data-testid={testId}\n {...rest}\n >\n {!hideToolbar && <EditorToolbar editor={editor} toolbar={toolbar} editorSize={effectiveSize} />}\n <div\n className={`\n p-4 overflow-y-auto\n ${maxHeightStyle ? 'overflow-y-auto' : ''}\n `}\n style={{\n minHeight: minHeightStyle,\n maxHeight: maxHeightStyle,\n }}\n >\n <EditorContent\n editor={editor}\n className={`\n [&_.ProseMirror]:min-h-full [&_.ProseMirror]:outline-none\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:text-base-content/40\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0\n [&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none\n [&_.ProseMirror_h1]:text-2xl [&_.ProseMirror_h1]:font-bold [&_.ProseMirror_h1]:mt-4 [&_.ProseMirror_h1]:mb-2\n [&_.ProseMirror_h2]:text-xl [&_.ProseMirror_h2]:font-bold [&_.ProseMirror_h2]:mt-3 [&_.ProseMirror_h2]:mb-2\n [&_.ProseMirror_h3]:text-lg [&_.ProseMirror_h3]:font-bold [&_.ProseMirror_h3]:mt-2 [&_.ProseMirror_h3]:mb-1\n [&_.ProseMirror_p]:my-2\n [&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2\n [&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2\n [&_.ProseMirror_li]:my-1\n [&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-base-300\n [&_.ProseMirror_blockquote]:pl-4 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2\n [&_.ProseMirror_code]:bg-base-200 [&_.ProseMirror_code]:px-1 [&_.ProseMirror_code]:py-0.5\n [&_.ProseMirror_code]:rounded [&_.ProseMirror_code]:font-mono [&_.ProseMirror_code]:text-sm\n [&_.ProseMirror_pre]:bg-base-200 [&_.ProseMirror_pre]:p-4 [&_.ProseMirror_pre]:rounded-lg\n [&_.ProseMirror_pre]:my-2 [&_.ProseMirror_pre]:overflow-x-auto\n [&_.ProseMirror_pre_code]:bg-transparent [&_.ProseMirror_pre_code]:p-0\n [&_.ProseMirror_hr]:border-base-300 [&_.ProseMirror_hr]:my-4\n [&_.ProseMirror_a]:text-primary [&_.ProseMirror_a]:underline\n `}\n />\n </div>\n </div>\n )\n }\n)\n\nRichTextEditor.displayName = 'RichTextEditor'\n\nexport default RichTextEditor\n"],"names":["dBtn","dBtnGhost","dBtnXs","dLink","dLinkPrimary","iconProps","size","BoldIcon","jsx","ItalicIcon","UnderlineIcon","StrikethroughIcon","CodeBracketIcon","H1Icon","H2Icon","H3Icon","ListBulletIcon","NumberedListIcon","Bars3BottomLeftIcon","CommandLineIcon","MinusIcon","LinkIcon","ArrowUturnLeftIcon","ArrowUturnRightIcon","defaultToolbar","sizeClasses","ToolbarButton","onClick","isActive","disabled","title","children","ToolbarDivider","editorSizeToIconSize","EditorToolbar","editor","toolbar","editorSize","iconSize","setLink","useCallback","previousUrl","url","renderToolbarItem","item","index","toolbarActions","Icon","config","RichTextEditor","forwardRef","value","onChange","placeholder","hideToolbar","readOnly","autoFocus","minHeight","maxHeight","bordered","onEditorReady","className","testId","rest","ref","componentSize","useConfig","effectiveSize","useEditor","StarterKit","Underline","Link","Placeholder","useEffect","minHeightStyle","maxHeightStyle","jsxs","EditorContent"],"mappings":";;;;;;;;AASA,MAAMA,IAAO,OACPC,IAAY,aACZC,IAAS,UACTC,IAAQ,QACRC,IAAe,gBAGfC,IAAY,CAACC,OAAkB;AAAA,EACnC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAOA;AAAA,EACP,QAAQA;AAAA,EACR,eAAe;AACjB,IAEMC,IAAW,CAAC,EAAE,MAAAD,QAClB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,oGAAmG,GAC1J,GAGIC,IAAa,CAAC,EAAE,MAAAH,QACpB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,6EAA4E,GACnI,GAGIE,IAAgB,CAAC,EAAE,MAAAJ,QACvB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,2DAA0D,GACjH,GAGIG,IAAoB,CAAC,EAAE,MAAAL,QAC3B,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,qGAAoG,GAC3J,GAGII,IAAkB,CAAC,EAAE,MAAAN,QACzB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,0EAAyE,GAChI,GAGIK,IAAS,CAAC,EAAE,MAAAP,QAChB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,iHAAgH,GACvK,GAGIM,IAAS,CAAC,EAAE,MAAAR,QAChB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,uPAAsP,GAC7S,GAGIO,IAAS,CAAC,EAAE,MAAAT,QAChB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,4RAA2R,GAClV,GAGIQ,IAAiB,CAAC,EAAE,MAAAV,QACxB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,yRAAwR,GAC/U,GAGIS,IAAmB,CAAC,EAAE,MAAAX,QAC1B,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,oPAAmP,GAC1S,GAGIU,IAAsB,CAAC,EAAE,MAAAZ,QAC7B,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,8CAA6C,GACpG,GAGIW,IAAkB,CAAC,EAAE,MAAAb,QACzB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,yJAAwJ,GAC/M,GAGIY,IAAY,CAAC,EAAE,MAAAd,QACnB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,YAAW,GAClE,GAGIa,IAAW,CAAC,EAAE,MAAAf,QAClB,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,6KAA4K,GACnO,GAGIc,KAAqB,CAAC,EAAE,MAAAhB,QAC5B,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,8CAA6C,GACpG,GAGIe,KAAsB,CAAC,EAAE,MAAAjB,QAC7B,gBAAAE,EAAC,SAAK,GAAGH,EAAUC,CAAI,GACrB,UAAA,gBAAAE,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,6CAA4C,GACnG,GAmDIgB,KAAgC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,KAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAUMC,KAA8C,CAAC;AAAA,EACnD,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AACF,MACE,gBAAAvB;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAAmB;AAAA,IACA,UAAAE;AAAA,IACA,OAAAC;AAAA,IACA,WAAW;AAAA,QACP9B,CAAI,IAAIC,CAAS,IAAIC,CAAM;AAAA,QAC3B0B,IAAW,kCAAkC,sBAAsB;AAAA,QACnEC,IAAW,kCAAkC,mBAAmB;AAAA;AAAA,IAGnE,UAAAE;AAAA,EAAA;AACH,GAGIC,KAA2B,MAC/B,gBAAAxB,EAAC,OAAA,EAAI,WAAU,4BAAA,CAA4B,GAIvCyB,KAAyE;AAAA,EAC7E,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,KAID,CAAC,EAAE,QAAAC,GAAQ,SAAAC,GAAS,YAAAC,QAAiB;AACxC,QAAMC,IAAWL,GAAqBI,CAAU,GAC1CE,IAAUC,EAAY,MAAM;AAChC,QAAI,CAACL,EAAQ;AAEb,UAAMM,IAAcN,EAAO,cAAc,MAAM,EAAE,MAC3CO,IAAM,OAAO,OAAO,OAAOD,CAAW;AAE5C,QAAIC,MAAQ,MAEZ;AAAA,UAAIA,MAAQ,IAAI;AACd,QAAAP,EAAO,MAAA,EAAQ,MAAA,EAAQ,gBAAgB,MAAM,EAAE,UAAA,EAAY,IAAA;AAC3D;AAAA,MACF;AAEA,MAAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,gBAAgB,MAAM,EAAE,QAAQ,EAAE,MAAMO,EAAA,CAAK,EAAE,IAAA;AAAA;AAAA,EACxE,GAAG,CAACP,CAAM,CAAC;AAEX,MAAI,CAACA,EAAQ,QAAO;AAEpB,QAAMQ,IAAoB,CAACC,GAAmBC,MAAkB;AAC9D,QAAID,MAAS;AACX,aAAO,gBAAApC,EAACwB,IAAA,CAAA,GAAoB,WAAWa,CAAK,EAAI;AAGlD,UAAMC,IAGF;AAAA,MACF,MAAM;AAAA,QACJ,MAAMvC;AAAA,QACN,QAAQ,MAAM4B,EAAO,MAAA,EAAQ,QAAQ,WAAA,EAAa,IAAA;AAAA,QAClD,UAAU,MAAMA,EAAO,SAAS,MAAM;AAAA,QACtC,YAAY,MAAMA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA;AAAA,QAC5D,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,MAAM1B;AAAA,QACN,QAAQ,MAAM0B,EAAO,MAAA,EAAQ,QAAQ,aAAA,EAAe,IAAA;AAAA,QACpD,UAAU,MAAMA,EAAO,SAAS,QAAQ;AAAA,QACxC,YAAY,MAAMA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAAA,QAC9D,OAAO;AAAA,MAAA;AAAA,MAET,WAAW;AAAA,QACT,MAAMzB;AAAA,QACN,QAAQ,MAAMyB,EAAO,MAAA,EAAQ,QAAQ,gBAAA,EAAkB,IAAA;AAAA,QACvD,UAAU,MAAMA,EAAO,SAAS,WAAW;AAAA,QAC3C,YAAY,MAAMA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,IAAA;AAAA,QACjE,OAAO;AAAA,MAAA;AAAA,MAET,eAAe;AAAA,QACb,MAAMxB;AAAA,QACN,QAAQ,MAAMwB,EAAO,MAAA,EAAQ,QAAQ,aAAA,EAAe,IAAA;AAAA,QACpD,UAAU,MAAMA,EAAO,SAAS,QAAQ;AAAA,QACxC,YAAY,MAAMA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAAA,QAC9D,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,MAAMvB;AAAA,QACN,QAAQ,MAAMuB,EAAO,MAAA,EAAQ,QAAQ,WAAA,EAAa,IAAA;AAAA,QAClD,UAAU,MAAMA,EAAO,SAAS,MAAM;AAAA,QACtC,YAAY,MAAMA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA;AAAA,QAC5D,OAAO;AAAA,MAAA;AAAA,MAET,UAAU;AAAA,QACR,MAAMtB;AAAA,QACN,QAAQ,MAAMsB,EAAO,MAAA,EAAQ,MAAA,EAAQ,cAAc,EAAE,OAAO,EAAA,CAAG,EAAE,IAAA;AAAA,QACjE,UAAU,MAAMA,EAAO,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACvD,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,UAAU;AAAA,QACR,MAAMrB;AAAA,QACN,QAAQ,MAAMqB,EAAO,MAAA,EAAQ,MAAA,EAAQ,cAAc,EAAE,OAAO,EAAA,CAAG,EAAE,IAAA;AAAA,QACjE,UAAU,MAAMA,EAAO,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACvD,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,UAAU;AAAA,QACR,MAAMpB;AAAA,QACN,QAAQ,MAAMoB,EAAO,MAAA,EAAQ,MAAA,EAAQ,cAAc,EAAE,OAAO,EAAA,CAAG,EAAE,IAAA;AAAA,QACjE,UAAU,MAAMA,EAAO,SAAS,WAAW,EAAE,OAAO,GAAG;AAAA,QACvD,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,YAAY;AAAA,QACV,MAAMnB;AAAA,QACN,QAAQ,MAAMmB,EAAO,MAAA,EAAQ,QAAQ,iBAAA,EAAmB,IAAA;AAAA,QACxD,UAAU,MAAMA,EAAO,SAAS,YAAY;AAAA,QAC5C,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,aAAa;AAAA,QACX,MAAMlB;AAAA,QACN,QAAQ,MAAMkB,EAAO,MAAA,EAAQ,QAAQ,kBAAA,EAAoB,IAAA;AAAA,QACzD,UAAU,MAAMA,EAAO,SAAS,aAAa;AAAA,QAC7C,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,YAAY;AAAA,QACV,MAAMjB;AAAA,QACN,QAAQ,MAAMiB,EAAO,MAAA,EAAQ,QAAQ,iBAAA,EAAmB,IAAA;AAAA,QACxD,UAAU,MAAMA,EAAO,SAAS,YAAY;AAAA,QAC5C,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,WAAW;AAAA,QACT,MAAMhB;AAAA,QACN,QAAQ,MAAMgB,EAAO,MAAA,EAAQ,QAAQ,gBAAA,EAAkB,IAAA;AAAA,QACvD,UAAU,MAAMA,EAAO,SAAS,WAAW;AAAA,QAC3C,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,gBAAgB;AAAA,QACd,MAAMf;AAAA,QACN,QAAQ,MAAMe,EAAO,MAAA,EAAQ,QAAQ,kBAAA,EAAoB,IAAA;AAAA,QACzD,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,MAAMd;AAAA,QACN,QAAQkB;AAAA,QACR,UAAU,MAAMJ,EAAO,SAAS,MAAM;AAAA,QACtC,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,MAAMb;AAAA,QACN,QAAQ,MAAMa,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAO,IAAA;AAAA,QAC5C,UAAU,MAAM;AAAA,QAChB,YAAY,MAAMA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA;AAAA,QACtD,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,MAAMZ;AAAA,QACN,QAAQ,MAAMY,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAO,IAAA;AAAA,QAC5C,UAAU,MAAM;AAAA,QAChB,YAAY,MAAMA,EAAO,MAAM,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA;AAAA,QACtD,OAAO;AAAA,MAAA;AAAA,IACT,GAGI,EAAE,MAAMY,GAAM,GAAGC,EAAA,IAAWF,EAAeF,CAAI;AACrD,WACE,gBAAApC;AAAA,MAACkB;AAAA,MAAA;AAAA,QAEC,SAASsB,EAAO;AAAA,QAChB,UAAUA,EAAO,SAAA;AAAA,QACjB,UAAU,CAACA,EAAO,WAAA;AAAA,QAClB,OAAOA,EAAO;AAAA,QAEd,UAAA,gBAAAxC,EAACuC,GAAA,EAAK,MAAMT,EAAA,CAAU;AAAA,MAAA;AAAA,MANjBM;AAAA,IAAA;AAAA,EASX;AAEA,SACE,gBAAApC,EAAC,OAAA,EAAI,WAAU,mFACZ,UAAA4B,EAAQ,IAAI,CAACQ,GAAMC,MAAUF,EAAkBC,GAAMC,CAAK,CAAC,GAC9D;AAEJ,GAEaI,KAAiBC;AAAA,EAC5B,CACE;AAAA,IACE,OAAAC,IAAQ;AAAA,IACR,UAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,SAAAjB,IAAUZ;AAAA,IACV,aAAA8B,IAAc;AAAA,IACd,UAAAC,IAAW;AAAA,IACX,WAAAC,IAAY;AAAA,IACZ,WAAAC,IAAY;AAAA,IACZ,WAAAC;AAAA,IACA,MAAApD;AAAA,IACA,UAAAqD,IAAW;AAAA,IACX,eAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,eAAeC,IAAS;AAAA,IACxB,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgB7D,KAAQ2D,KAAiB,MAEzC9B,IAASiC,EAAU;AAAA,MACvB,YAAY;AAAA,QACVC,EAAW,UAAU;AAAA,UACnB,SAAS;AAAA,YACP,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,UAAA;AAAA,QAClB,CACD;AAAA,QACDC;AAAA,QACAC,EAAK,UAAU;AAAA,UACb,aAAa;AAAA,UACb,gBAAgB;AAAA,YACd,OAAO,GAAGpE,CAAK,IAAIC,CAAY;AAAA,UAAA;AAAA,QACjC,CACD;AAAA,QACDoE,EAAY,UAAU;AAAA,UACpB,aAAAnB;AAAA,UACA,kBAAkB;AAAA,QAAA,CACnB;AAAA,MAAA;AAAA,MAEH,SAASF;AAAA,MACT,UAAU,CAACI;AAAA,MACX,WAAWC;AAAA,MACX,UAAU,CAAC,EAAE,QAAArB,QAAa;AACxB,QAAAiB,IAAWjB,EAAO,SAAS;AAAA,MAC7B;AAAA,MACA,aAAa;AAAA,QACX,YAAY;AAAA,UACV,OAAO,gDAAgDV,GAAY0C,CAAa,CAAC;AAAA,QAAA;AAAA,MACnF;AAAA,IACF,CACD;AAED,IAAAM,EAAU,MAAM;AACd,MAAItC,KAAUyB,KACZA,EAAczB,CAAM;AAAA,IAExB,GAAG,CAACA,GAAQyB,CAAa,CAAC,GAG1Ba,EAAU,MAAM;AACd,MAAItC,KAAUgB,MAAUhB,EAAO,QAAA,KAC7BA,EAAO,SAAS,WAAWgB,GAAO,EAAK;AAAA,IAE3C,GAAG,CAACA,GAAOhB,CAAM,CAAC,GAGlBsC,EAAU,MAAM;AACd,MAAItC,KACFA,EAAO,YAAY,CAACoB,CAAQ;AAAA,IAEhC,GAAG,CAACA,GAAUpB,CAAM,CAAC;AAErB,UAAMuC,IAAiB,OAAOjB,KAAc,WAAW,GAAGA,CAAS,OAAOA,GACpEkB,IAAiBjB,IACnB,OAAOA,KAAc,WACnB,GAAGA,CAAS,OACZA,IACF;AAEJ,WACE,gBAAAkB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAZ;AAAA,QACA,WAAW;AAAA;AAAA,YAEPL,IAAW,2BAA2B,EAAE;AAAA,YACxCE,CAAS;AAAA;AAAA,QAEb,eAAaC;AAAA,QACZ,GAAGC;AAAA,QAEH,UAAA;AAAA,UAAA,CAACT,KAAe,gBAAA9C,EAAC0B,IAAA,EAAc,QAAAC,GAAgB,SAAAC,GAAkB,YAAY+B,GAAe;AAAA,UAC7F,gBAAA3D;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA;AAAA,cAEPmE,IAAiB,oBAAoB,EAAE;AAAA;AAAA,cAE3C,OAAO;AAAA,gBACL,WAAWD;AAAA,gBACX,WAAWC;AAAA,cAAA;AAAA,cAGb,UAAA,gBAAAnE;AAAA,gBAACqE;AAAA,gBAAA;AAAA,kBACC,QAAA1C;AAAA,kBACA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAwBb;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEAc,GAAe,cAAc;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as b, jsxs as B } from "react/jsx-runtime";
|
|
2
2
|
import { useState as j, useCallback as v, createContext as z, useContext as I } from "react";
|
|
3
|
-
import { useConfig as V } from "
|
|
3
|
+
import { useConfig as V } from "../providers/ConfigProvider.js";
|
|
4
4
|
const k = "join", g = "join-item", w = "btn", N = "btn-xs", D = "btn-sm", J = "btn-lg", X = "btn-xl", $ = "btn-active", x = z(null), y = () => {
|
|
5
5
|
const e = I(x);
|
|
6
6
|
if (!e)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Segmented.js","sources":["../../src/components/Segmented.tsx"],"sourcesContent":["import React, { useState, useCallback, createContext, useContext } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"Segmented.js","sources":["../../src/components/Segmented.tsx"],"sourcesContent":["import React, { useState, useCallback, createContext, useContext } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dBtn = 'btn'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dBtnActive = 'btn-active'\n\nexport type SegmentedValue = string | number\n\ninterface SegmentedContextValue {\n value?: SegmentedValue\n onChange?: (value: SegmentedValue) => void\n size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled: boolean\n}\n\nconst SegmentedContext = createContext<SegmentedContextValue | null>(null)\n\nconst useSegmentedContext = () => {\n const context = useContext(SegmentedContext)\n if (!context) {\n throw new Error('Segmented.Item must be used within a Segmented component')\n }\n return context\n}\n\nexport interface SegmentedItemProps {\n /** Option value */\n value: SegmentedValue\n /** Disable this option */\n disabled?: boolean\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Label content */\n children: React.ReactNode\n /** Additional CSS class */\n className?: string\n}\n\nconst sizeClasses = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n}\n\nconst SegmentedItem: React.FC<SegmentedItemProps> = ({\n value,\n disabled: itemDisabled = false,\n icon,\n children,\n className = '',\n}) => {\n const { value: selectedValue, onChange, size, disabled: groupDisabled } = useSegmentedContext()\n\n const isSelected = selectedValue === value\n const isDisabled = groupDisabled || itemDisabled\n\n const handleClick = () => {\n if (!isDisabled) {\n onChange?.(value)\n }\n }\n\n const buttonClasses = [\n dJoinItem,\n dBtn,\n sizeClasses[size],\n isSelected ? dBtnActive : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <button\n type=\"button\"\n className={buttonClasses}\n disabled={isDisabled}\n onClick={handleClick}\n aria-pressed={isSelected}\n data-testid={`segmented-item-${value}`}\n >\n {icon && <span className=\"mr-1\">{icon}</span>}\n {children}\n </button>\n )\n}\n\nexport interface SegmentedProps {\n /** Currently selected value (controlled) */\n value?: SegmentedValue\n /** Default selected value (uncontrolled) */\n defaultValue?: SegmentedValue\n /** Callback when selection changes */\n onChange?: (value: SegmentedValue) => void\n /** Size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Take full width of container */\n block?: boolean\n /** Disable all options */\n disabled?: boolean\n /** Additional CSS class */\n className?: string\n /** Segmented.Item children */\n children: React.ReactNode\n}\n\nexport const Segmented: React.FC<SegmentedProps> & { Item: typeof SegmentedItem } = ({\n value,\n defaultValue,\n onChange,\n size,\n block = false,\n disabled = false,\n className = '',\n children,\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const [internalValue, setInternalValue] = useState<SegmentedValue | undefined>(defaultValue)\n\n const isControlled = value !== undefined\n const currentValue = isControlled ? value : internalValue\n\n const handleChange = useCallback(\n (newValue: SegmentedValue) => {\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n },\n [isControlled, onChange]\n )\n\n const contextValue: SegmentedContextValue = {\n value: currentValue,\n onChange: handleChange,\n size: effectiveSize,\n disabled,\n }\n\n const containerClasses = [dJoin, block ? `w-full [&>.${dJoinItem}]:flex-1` : '', className]\n .filter(Boolean)\n .join(' ')\n\n return (\n <SegmentedContext.Provider value={contextValue}>\n <div className={containerClasses} role=\"group\" data-testid=\"segmented\">\n {children}\n </div>\n </SegmentedContext.Provider>\n )\n}\n\nSegmented.Item = SegmentedItem\n"],"names":["dJoin","dJoinItem","dBtn","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dBtnActive","SegmentedContext","createContext","useSegmentedContext","context","useContext","sizeClasses","SegmentedItem","value","itemDisabled","icon","children","className","selectedValue","onChange","size","groupDisabled","isSelected","isDisabled","handleClick","buttonClasses","jsxs","jsx","Segmented","defaultValue","block","disabled","componentSize","useConfig","effectiveSize","internalValue","setInternalValue","useState","isControlled","currentValue","handleChange","useCallback","newValue","contextValue","containerClasses"],"mappings":";;;AAIA,MAAMA,IAAQ,QACRC,IAAY,aACZC,IAAO,OACPC,IAAS,UACTC,IAAS,UACTC,IAAS,UACTC,IAAS,UACTC,IAAa,cAWbC,IAAmBC,EAA4C,IAAI,GAEnEC,IAAsB,MAAM;AAChC,QAAMC,IAAUC,EAAWJ,CAAgB;AAC3C,MAAI,CAACG;AACH,UAAM,IAAI,MAAM,0DAA0D;AAE5E,SAAOA;AACT,GAeME,IAAc;AAAA,EAClB,IAAIV;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAI;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN,GAEMQ,IAA8C,CAAC;AAAA,EACnD,OAAAC;AAAA,EACA,UAAUC,IAAe;AAAA,EACzB,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,MAAM;AACJ,QAAM,EAAE,OAAOC,GAAe,UAAAC,GAAU,MAAAC,GAAM,UAAUC,EAAA,IAAkBb,EAAA,GAEpEc,IAAaJ,MAAkBL,GAC/BU,IAAaF,KAAiBP,GAE9BU,IAAc,MAAM;AACxB,IAAKD,KACHJ,IAAWN,CAAK;AAAA,EAEpB,GAEMY,IAAgB;AAAA,IACpB1B;AAAA,IACAC;AAAA,IACAW,EAAYS,CAAI;AAAA,IAChBE,IAAajB,IAAa;AAAA,IAC1BY;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAWD;AAAA,MACX,UAAUF;AAAA,MACV,SAASC;AAAA,MACT,gBAAcF;AAAA,MACd,eAAa,kBAAkBT,CAAK;AAAA,MAEnC,UAAA;AAAA,QAAAE,KAAQ,gBAAAY,EAAC,QAAA,EAAK,WAAU,QAAQ,UAAAZ,GAAK;AAAA,QACrCC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP,GAqBaY,IAAuE,CAAC;AAAA,EACnF,OAAAf;AAAA,EACA,cAAAgB;AAAA,EACA,UAAAV;AAAA,EACA,MAAAC;AAAA,EACA,OAAAU,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,WAAAd,IAAY;AAAA,EACZ,UAAAD;AACF,MAAM;AACJ,QAAM,EAAE,eAAAgB,EAAA,IAAkBC,EAAA,GACpBC,IAAgBd,KAAQY,KAAiB,MAEzC,CAACG,GAAeC,CAAgB,IAAIC,EAAqCR,CAAY,GAErFS,IAAezB,MAAU,QACzB0B,IAAeD,IAAezB,IAAQsB,GAEtCK,IAAeC;AAAA,IACnB,CAACC,MAA6B;AAC5B,MAAKJ,KACHF,EAAiBM,CAAQ,GAE3BvB,IAAWuB,CAAQ;AAAA,IACrB;AAAA,IACA,CAACJ,GAAcnB,CAAQ;AAAA,EAAA,GAGnBwB,IAAsC;AAAA,IAC1C,OAAOJ;AAAA,IACP,UAAUC;AAAA,IACV,MAAMN;AAAA,IACN,UAAAH;AAAA,EAAA,GAGIa,IAAmB,CAAC9C,GAAOgC,IAAQ,cAAc/B,CAAS,aAAa,IAAIkB,CAAS,EACvF,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAU,EAACrB,EAAiB,UAAjB,EAA0B,OAAOqC,GAChC,UAAA,gBAAAhB,EAAC,OAAA,EAAI,WAAWiB,GAAkB,MAAK,SAAQ,eAAY,aACxD,UAAA5B,GACH,GACF;AAEJ;AAEAY,EAAU,OAAOhB;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as s, jsxs as C } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as E, useRef as v } from "react";
|
|
3
|
-
import { useConfig as X } from "
|
|
3
|
+
import { useConfig as X } from "../providers/ConfigProvider.js";
|
|
4
4
|
const o = "select", r = "select-bordered", $ = "select-ghost", F = "select-xs", G = "select-sm", I = "select-md", L = "select-lg", M = "select-xl", P = "select-neutral", W = "select-primary", k = "select-secondary", q = "select-accent", A = "select-info", D = "select-success", b = "select-warning", h = "select-error", H = "floating-label", J = E(
|
|
5
5
|
({
|
|
6
6
|
size: w,
|