@dev-dga/react 0.12.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +14 -8
- package/dist/{chunk-WRUVDZRI.js → chunk-4S2DSEXR.js} +4 -4
- package/dist/{chunk-GCOBDP4W.js → chunk-AR7K3D3Z.js} +9 -1
- package/dist/chunk-AR7K3D3Z.js.map +1 -0
- package/dist/{chunk-7GWM7F5C.js → chunk-BC2DJQ3Y.js} +23 -14
- package/dist/chunk-BC2DJQ3Y.js.map +1 -0
- package/dist/{chunk-DWCTUNFU.cjs → chunk-H7DMDBAG.cjs} +7 -2
- package/dist/chunk-H7DMDBAG.cjs.map +1 -0
- package/dist/{chunk-JAMYRBHS.js → chunk-J53OY747.js} +5 -5
- package/dist/{chunk-4WXBRKGZ.cjs → chunk-J7HSAVFF.cjs} +5 -5
- package/dist/{chunk-4WXBRKGZ.cjs.map → chunk-J7HSAVFF.cjs.map} +1 -1
- package/dist/{chunk-NJIQJHJS.js → chunk-MECGQLHL.js} +4 -4
- package/dist/{chunk-K27GNXBF.cjs → chunk-NGDKAG2O.cjs} +4 -4
- package/dist/{chunk-K27GNXBF.cjs.map → chunk-NGDKAG2O.cjs.map} +1 -1
- package/dist/{chunk-A4HS7CYD.cjs → chunk-NQGMWK5C.cjs} +10 -2
- package/dist/chunk-NQGMWK5C.cjs.map +1 -0
- package/dist/{chunk-GXF5IZEX.cjs → chunk-P7WYXL4A.cjs} +3 -3
- package/dist/{chunk-GXF5IZEX.cjs.map → chunk-P7WYXL4A.cjs.map} +1 -1
- package/dist/{chunk-6CDZ7ZBG.js → chunk-SQ7NQVEK.js} +7 -2
- package/dist/chunk-SQ7NQVEK.js.map +1 -0
- package/dist/{chunk-3JHIEAJG.cjs → chunk-SZ2AUE62.cjs} +33 -24
- package/dist/chunk-SZ2AUE62.cjs.map +1 -0
- package/dist/{chunk-7GAELGEB.cjs → chunk-TGM4JFWI.cjs} +3 -3
- package/dist/{chunk-7GAELGEB.cjs.map → chunk-TGM4JFWI.cjs.map} +1 -1
- package/dist/{chunk-SJN37JUC.cjs → chunk-TQLZL5MI.cjs} +29 -20
- package/dist/chunk-TQLZL5MI.cjs.map +1 -0
- package/dist/{chunk-EZRPCQSP.js → chunk-WLJHHTE2.js} +7 -7
- package/dist/{chunk-P7XKSXHH.js → chunk-XIJKAUCN.js} +20 -11
- package/dist/chunk-XIJKAUCN.js.map +1 -0
- package/dist/components/Card/Card.cjs +3 -3
- package/dist/components/Card/Card.js +2 -2
- package/dist/components/Card/index.cjs +3 -3
- package/dist/components/Card/index.js +2 -2
- package/dist/components/Chip/Chip.cjs +2 -2
- package/dist/components/Chip/Chip.js +1 -1
- package/dist/components/Chip/index.cjs +2 -2
- package/dist/components/Chip/index.js +1 -1
- package/dist/components/DatePicker/DatePicker.cjs +3 -3
- package/dist/components/DatePicker/DatePicker.js +2 -2
- package/dist/components/DatePicker/index.cjs +3 -3
- package/dist/components/DatePicker/index.js +2 -2
- package/dist/components/DateRangePicker/DateRangePicker.cjs +3 -3
- package/dist/components/DateRangePicker/DateRangePicker.js +2 -2
- package/dist/components/DateRangePicker/index.cjs +3 -3
- package/dist/components/DateRangePicker/index.js +2 -2
- package/dist/components/FileUpload/FileUpload.cjs +3 -3
- package/dist/components/FileUpload/FileUpload.js +2 -2
- package/dist/components/FileUpload/index.cjs +3 -3
- package/dist/components/FileUpload/index.js +2 -2
- package/dist/components/Filtration/Filtration.cjs +4 -4
- package/dist/components/Filtration/Filtration.js +3 -3
- package/dist/components/Filtration/index.cjs +4 -4
- package/dist/components/Filtration/index.js +3 -3
- package/dist/components/SearchBox/SearchBox.cjs +3 -3
- package/dist/components/SearchBox/SearchBox.js +2 -2
- package/dist/components/SearchBox/index.cjs +3 -3
- package/dist/components/SearchBox/index.js +2 -2
- package/dist/index.cjs +44 -44
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +67 -67
- package/dist/internal/calendar/calendar-core.cjs +6 -2
- package/dist/internal/calendar/calendar-core.cjs.map +1 -1
- package/dist/internal/calendar/calendar-core.js +7 -3
- package/dist/internal/calendar/index.cjs +6 -2
- package/dist/internal/calendar/index.cjs.map +1 -1
- package/dist/internal/calendar/index.js +7 -3
- package/package.json +3 -3
- package/dist/chunk-3JHIEAJG.cjs.map +0 -1
- package/dist/chunk-6CDZ7ZBG.js.map +0 -1
- package/dist/chunk-7GWM7F5C.js.map +0 -1
- package/dist/chunk-A4HS7CYD.cjs.map +0 -1
- package/dist/chunk-DWCTUNFU.cjs.map +0 -1
- package/dist/chunk-GCOBDP4W.js.map +0 -1
- package/dist/chunk-P7XKSXHH.js.map +0 -1
- package/dist/chunk-SJN37JUC.cjs.map +0 -1
- /package/dist/{chunk-WRUVDZRI.js.map → chunk-4S2DSEXR.js.map} +0 -0
- /package/dist/{chunk-JAMYRBHS.js.map → chunk-J53OY747.js.map} +0 -0
- /package/dist/{chunk-NJIQJHJS.js.map → chunk-MECGQLHL.js.map} +0 -0
- /package/dist/{chunk-EZRPCQSP.js.map → chunk-WLJHHTE2.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-K27GNXBF.cjs","../src/components/FileUpload/FileUpload.tsx"],"names":[],"mappings":"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","file":"/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-K27GNXBF.cjs","sourcesContent":[null,"'use client';\n\nimport { useRef, useState, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport { useFieldA11y, FieldMessage } from '../../field';\nimport { Button } from '../Button';\nimport { Spinner } from '../Spinner';\nimport { Upload, Check, Exclamation, Close } from '../../internal/icons';\n\ntype FileStatus = 'uploading' | 'success' | 'error';\n\n/** Reason codes attached to a rejected file. */\ntype RejectionCode = 'file-too-large' | 'file-invalid-type' | 'too-many-files';\n\n/**\n * A controlled file entry. The consumer owns this array and is responsible for\n * performing the actual upload, updating `status`, and assigning a stable `id`\n * (used as the React key and the `onRemove` target).\n */\ninterface UploadFile {\n /** Stable, consumer-assigned id. Used as the React key and remove target. */\n id: string;\n /** The native File. */\n file: File;\n /** Defaults to `'uploading'`. Drives the per-row indicator. */\n status?: FileStatus;\n /** Shown in the row's second line (red) while `status === 'error'`. */\n error?: string;\n}\n\ninterface FileRejection {\n file: File;\n errors: RejectionCode[];\n}\n\ninterface FileUploadProps extends Omit<\n React.ComponentProps<'input'>,\n | 'onChange'\n | 'type'\n | 'accept'\n | 'multiple'\n | 'required'\n | 'disabled'\n | 'className'\n | 'id'\n | 'children'\n | 'title'\n> {\n variant?: 'dropzone' | 'button';\n\n /** Controlled list of files to render. The consumer is the source of truth. */\n files: UploadFile[];\n /** Called with the files that passed validation. The consumer wraps each in\n * an {@link UploadFile} (assigning an `id`) and starts the upload. */\n onFilesAdded: (accepted: File[]) => void;\n /** Called with files that failed validation. Never enter `files`. */\n onFilesRejected?: (rejections: FileRejection[]) => void;\n /** Per-row remove handler. Omit to hide the remove button. */\n onRemove?: (id: string) => void;\n\n /** Native `accept` string (e.g. `'image/*,.pdf'`). Also drives validation. */\n accept?: string;\n /** Maximum size per file, in bytes. */\n maxSize?: number;\n /** Maximum total files (existing + incoming). When `multiple` is false this\n * is forced to 1. */\n maxFiles?: number;\n /** Allow selecting/dropping more than one file. Defaults to true. */\n multiple?: boolean;\n /** Disables the drop zone / button and the picker. */\n disabled?: boolean;\n /** Marks the field required: renders the asterisk and sets the input's\n * `required` attribute. */\n required?: boolean;\n\n /** Visible field label, auto-associated to the input. */\n label?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n buttonLabel?: ReactNode;\n /** Message shown below the field when `error` is true. */\n errorMessage?: ReactNode;\n /** Marks the field invalid: sets `aria-invalid` and error styling. */\n error?: boolean;\n\n /** Accessible label for the per-row remove button. Defaults to `'Remove'`. */\n removeLabel?: string;\n\n id?: string;\n className?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nfunction matchesAccept(file: File, accept?: string): boolean {\n if (!accept) return true;\n const tokens = accept\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0) return true;\n\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token);\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, token.indexOf('/') + 1));\n return type === token;\n });\n}\n\ninterface ValidationConfig {\n accept?: string;\n maxSize?: number;\n maxFiles?: number;\n /** Files already in the list — counts against `maxFiles`. */\n currentCount: number;\n}\n\nfunction splitFiles(incoming: File[], config: ValidationConfig) {\n const { accept, maxSize, maxFiles, currentCount } = config;\n const accepted: File[] = [];\n const rejections: FileRejection[] = [];\n\n for (const file of incoming) {\n const errors: RejectionCode[] = [];\n if (!matchesAccept(file, accept)) errors.push('file-invalid-type');\n if (maxSize != null && file.size > maxSize) errors.push('file-too-large');\n\n if (errors.length > 0) {\n rejections.push({ file, errors });\n continue;\n }\n // Count last: only an otherwise-valid file consumes a slot.\n if (maxFiles != null && currentCount + accepted.length >= maxFiles) {\n rejections.push({ file, errors: ['too-many-files'] });\n continue;\n }\n accepted.push(file);\n }\n\n return { accepted, rejections };\n}\n\nfunction FileRow({\n item,\n onRemove,\n removeLabel,\n}: {\n item: UploadFile;\n onRemove?: (id: string) => void;\n removeLabel: string;\n}) {\n const status = item.status ?? 'uploading';\n return (\n <li\n data-slot=\"file-upload-item\"\n data-status={status}\n className={cn(\n 'ddga-file-upload__file',\n status === 'error' && 'ddga-file-upload__file--error',\n )}\n >\n <div className=\"ddga-file-upload__file-main\">\n {status === 'uploading' ? (\n <span className=\"ddga-file-upload__file-indicator ddga-file-upload__file-indicator--loading\">\n <Spinner aria-label={`Uploading ${item.file.name}`} />\n </span>\n ) : (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'ddga-file-upload__file-indicator',\n `ddga-file-upload__file-indicator--${status}`,\n )}\n >\n {status === 'success' ? <Check /> : <Exclamation />}\n </span>\n )}\n\n <span className=\"ddga-file-upload__file-name\" dir=\"auto\" title={item.file.name}>\n {item.file.name}\n </span>\n\n {onRemove && (\n <button\n type=\"button\"\n className=\"ddga-file-upload__file-remove\"\n aria-label={`${removeLabel}: ${item.file.name}`}\n onClick={() => onRemove(item.id)}\n >\n <Close aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {status === 'error' && item.error && (\n <div className=\"ddga-file-upload__file-error-row\">\n <span role=\"alert\" className=\"ddga-file-upload__file-error\">\n {item.error}\n </span>\n </div>\n )}\n </li>\n );\n}\n\nfunction FileUpload({\n variant = 'dropzone',\n files,\n onFilesAdded,\n onFilesRejected,\n onRemove,\n accept,\n maxSize,\n maxFiles,\n multiple = true,\n disabled = false,\n required,\n label,\n title = 'Drag and drop files here to upload',\n description,\n buttonLabel = 'Browse Files',\n errorMessage,\n error,\n removeLabel = 'Remove',\n id: externalId,\n className,\n ...props\n}: FileUploadProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const { fieldId, errorId, helperId, hasErrorMessage, controlProps } = useFieldA11y({\n name: 'FileUpload',\n id: externalId,\n label,\n error,\n errorMessage,\n helperText: description,\n 'aria-label': props['aria-label'],\n 'aria-labelledby': props['aria-labelledby'],\n });\n\n const effectiveMaxFiles = multiple ? maxFiles : 1;\n\n function process(incoming: File[]) {\n if (disabled || incoming.length === 0) return;\n const { accepted, rejections } = splitFiles(incoming, {\n accept,\n maxSize,\n maxFiles: effectiveMaxFiles,\n currentCount: files.length,\n });\n if (accepted.length > 0) onFilesAdded(accepted);\n if (rejections.length > 0) onFilesRejected?.(rejections);\n }\n\n function openPicker() {\n if (!disabled) inputRef.current?.click();\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n process(Array.from(event.target.files ?? []));\n // Reset so re-selecting the same file re-fires change.\n event.target.value = '';\n }\n\n function handleDrop(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n process(Array.from(event.dataTransfer.files));\n }\n\n function handleDragOver(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n if (!disabled) setIsDragging(true);\n }\n\n function handleDragLeave(event: React.DragEvent<HTMLDivElement>) {\n // Ignore dragleave bubbling from descendants.\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setIsDragging(false);\n }\n }\n\n const labelNode = label && (\n <label htmlFor={fieldId} className=\"ddga-file-upload__label\">\n {required && (\n <span aria-hidden=\"true\" className=\"ddga-file-upload__required\">\n *\n </span>\n )}\n {label}\n </label>\n );\n\n const descriptionNode = description && (\n <span id={helperId} className=\"ddga-file-upload__description\">\n {description}\n </span>\n );\n\n const fileInput = (\n <input\n {...props}\n {...controlProps}\n ref={inputRef}\n type=\"file\"\n tabIndex={-1}\n className=\"ddga-file-upload__input\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n required={required}\n onChange={handleInputChange}\n // Guard the openPicker() recursion: the programmatic input.click() would\n // bubble back to the dropzone's onClick.\n onClick={(event) => event.stopPropagation()}\n data-slot=\"file-upload-input\"\n />\n );\n\n // SDGA Single: the file row replaces the trigger once the one file is chosen.\n const showTrigger = variant === 'dropzone' || multiple || files.length === 0;\n\n return (\n <div\n data-slot=\"file-upload-field\"\n data-variant={variant}\n className={cn('ddga-field', 'ddga-file-upload', className)}\n >\n {variant === 'dropzone' ? (\n <>\n {labelNode}\n <div\n data-slot=\"file-upload-dropzone\"\n className=\"ddga-file-upload__dropzone\"\n data-dragging={isDragging || undefined}\n data-disabled={disabled || undefined}\n aria-disabled={disabled || undefined}\n onClick={openPicker}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <svg className=\"ddga-file-upload__border\" aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"100%\" height=\"100%\" rx=\"4\" ry=\"4\" />\n </svg>\n <Upload className=\"ddga-file-upload__icon\" aria-hidden=\"true\" />\n <div className=\"ddga-file-upload__copy\">\n <span className=\"ddga-file-upload__title\">{title}</span>\n {descriptionNode}\n </div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"md\"\n disabled={disabled}\n className=\"ddga-file-upload__browse\"\n onClick={(event) => {\n event.stopPropagation();\n openPicker();\n }}\n >\n {buttonLabel}\n </Button>\n {fileInput}\n </div>\n </>\n ) : (\n <>\n <div className=\"ddga-file-upload__header\">\n {labelNode}\n {descriptionNode}\n </div>\n {showTrigger && (\n <Button\n type=\"button\"\n variant=\"black\"\n size=\"md\"\n disabled={disabled}\n className=\"ddga-file-upload__browse\"\n onClick={openPicker}\n >\n {buttonLabel}\n </Button>\n )}\n {fileInput}\n </>\n )}\n\n {hasErrorMessage && (\n <FieldMessage id={errorId} variant=\"error\">\n {errorMessage}\n </FieldMessage>\n )}\n\n {files.length > 0 && (\n <ul data-slot=\"file-upload-list\" className=\"ddga-file-upload__list\">\n {files.map((item) => (\n <FileRow key={item.id} item={item} onRemove={onRemove} removeLabel={removeLabel} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nexport { FileUpload };\nexport type { FileUploadProps, UploadFile, FileRejection, FileStatus, RejectionCode };\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-NGDKAG2O.cjs","../src/components/FileUpload/FileUpload.tsx"],"names":[],"mappings":"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","file":"/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-NGDKAG2O.cjs","sourcesContent":[null,"'use client';\n\nimport { useRef, useState, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport { useFieldA11y, FieldMessage } from '../../field';\nimport { Button } from '../Button';\nimport { Spinner } from '../Spinner';\nimport { Upload, Check, Exclamation, Close } from '../../internal/icons';\n\ntype FileStatus = 'uploading' | 'success' | 'error';\n\n/** Reason codes attached to a rejected file. */\ntype RejectionCode = 'file-too-large' | 'file-invalid-type' | 'too-many-files';\n\n/**\n * A controlled file entry. The consumer owns this array and is responsible for\n * performing the actual upload, updating `status`, and assigning a stable `id`\n * (used as the React key and the `onRemove` target).\n */\ninterface UploadFile {\n /** Stable, consumer-assigned id. Used as the React key and remove target. */\n id: string;\n /** The native File. */\n file: File;\n /** Defaults to `'uploading'`. Drives the per-row indicator. */\n status?: FileStatus;\n /** Shown in the row's second line (red) while `status === 'error'`. */\n error?: string;\n}\n\ninterface FileRejection {\n file: File;\n errors: RejectionCode[];\n}\n\ninterface FileUploadProps extends Omit<\n React.ComponentProps<'input'>,\n | 'onChange'\n | 'type'\n | 'accept'\n | 'multiple'\n | 'required'\n | 'disabled'\n | 'className'\n | 'id'\n | 'children'\n | 'title'\n> {\n variant?: 'dropzone' | 'button';\n\n /** Controlled list of files to render. The consumer is the source of truth. */\n files: UploadFile[];\n /** Called with the files that passed validation. The consumer wraps each in\n * an {@link UploadFile} (assigning an `id`) and starts the upload. */\n onFilesAdded: (accepted: File[]) => void;\n /** Called with files that failed validation. Never enter `files`. */\n onFilesRejected?: (rejections: FileRejection[]) => void;\n /** Per-row remove handler. Omit to hide the remove button. */\n onRemove?: (id: string) => void;\n\n /** Native `accept` string (e.g. `'image/*,.pdf'`). Also drives validation. */\n accept?: string;\n /** Maximum size per file, in bytes. */\n maxSize?: number;\n /** Maximum total files (existing + incoming). When `multiple` is false this\n * is forced to 1. */\n maxFiles?: number;\n /** Allow selecting/dropping more than one file. Defaults to true. */\n multiple?: boolean;\n /** Disables the drop zone / button and the picker. */\n disabled?: boolean;\n /** Marks the field required: renders the asterisk and sets the input's\n * `required` attribute. */\n required?: boolean;\n\n /** Visible field label, auto-associated to the input. */\n label?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n buttonLabel?: ReactNode;\n /** Message shown below the field when `error` is true. */\n errorMessage?: ReactNode;\n /** Marks the field invalid: sets `aria-invalid` and error styling. */\n error?: boolean;\n\n /** Accessible label for the per-row remove button. Defaults to `'Remove'`. */\n removeLabel?: string;\n\n id?: string;\n className?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nfunction matchesAccept(file: File, accept?: string): boolean {\n if (!accept) return true;\n const tokens = accept\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0) return true;\n\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token);\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, token.indexOf('/') + 1));\n return type === token;\n });\n}\n\ninterface ValidationConfig {\n accept?: string;\n maxSize?: number;\n maxFiles?: number;\n /** Files already in the list — counts against `maxFiles`. */\n currentCount: number;\n}\n\nfunction splitFiles(incoming: File[], config: ValidationConfig) {\n const { accept, maxSize, maxFiles, currentCount } = config;\n const accepted: File[] = [];\n const rejections: FileRejection[] = [];\n\n for (const file of incoming) {\n const errors: RejectionCode[] = [];\n if (!matchesAccept(file, accept)) errors.push('file-invalid-type');\n if (maxSize != null && file.size > maxSize) errors.push('file-too-large');\n\n if (errors.length > 0) {\n rejections.push({ file, errors });\n continue;\n }\n // Count last: only an otherwise-valid file consumes a slot.\n if (maxFiles != null && currentCount + accepted.length >= maxFiles) {\n rejections.push({ file, errors: ['too-many-files'] });\n continue;\n }\n accepted.push(file);\n }\n\n return { accepted, rejections };\n}\n\nfunction FileRow({\n item,\n onRemove,\n removeLabel,\n}: {\n item: UploadFile;\n onRemove?: (id: string) => void;\n removeLabel: string;\n}) {\n const status = item.status ?? 'uploading';\n return (\n <li\n data-slot=\"file-upload-item\"\n data-status={status}\n className={cn(\n 'ddga-file-upload__file',\n status === 'error' && 'ddga-file-upload__file--error',\n )}\n >\n <div className=\"ddga-file-upload__file-main\">\n {status === 'uploading' ? (\n <span className=\"ddga-file-upload__file-indicator ddga-file-upload__file-indicator--loading\">\n <Spinner aria-label={`Uploading ${item.file.name}`} />\n </span>\n ) : (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'ddga-file-upload__file-indicator',\n `ddga-file-upload__file-indicator--${status}`,\n )}\n >\n {status === 'success' ? <Check /> : <Exclamation />}\n </span>\n )}\n\n <span className=\"ddga-file-upload__file-name\" dir=\"auto\" title={item.file.name}>\n {item.file.name}\n </span>\n\n {onRemove && (\n <button\n type=\"button\"\n className=\"ddga-file-upload__file-remove\"\n aria-label={`${removeLabel}: ${item.file.name}`}\n onClick={() => onRemove(item.id)}\n >\n <Close aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {status === 'error' && item.error && (\n <div className=\"ddga-file-upload__file-error-row\">\n <span role=\"alert\" className=\"ddga-file-upload__file-error\">\n {item.error}\n </span>\n </div>\n )}\n </li>\n );\n}\n\nfunction FileUpload({\n variant = 'dropzone',\n files,\n onFilesAdded,\n onFilesRejected,\n onRemove,\n accept,\n maxSize,\n maxFiles,\n multiple = true,\n disabled = false,\n required,\n label,\n title = 'Drag and drop files here to upload',\n description,\n buttonLabel = 'Browse Files',\n errorMessage,\n error,\n removeLabel = 'Remove',\n id: externalId,\n className,\n ...props\n}: FileUploadProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const { fieldId, errorId, helperId, hasErrorMessage, controlProps } = useFieldA11y({\n name: 'FileUpload',\n id: externalId,\n label,\n error,\n errorMessage,\n helperText: description,\n 'aria-label': props['aria-label'],\n 'aria-labelledby': props['aria-labelledby'],\n });\n\n const effectiveMaxFiles = multiple ? maxFiles : 1;\n\n function process(incoming: File[]) {\n if (disabled || incoming.length === 0) return;\n const { accepted, rejections } = splitFiles(incoming, {\n accept,\n maxSize,\n maxFiles: effectiveMaxFiles,\n currentCount: files.length,\n });\n if (accepted.length > 0) onFilesAdded(accepted);\n if (rejections.length > 0) onFilesRejected?.(rejections);\n }\n\n function openPicker() {\n if (!disabled) inputRef.current?.click();\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n process(Array.from(event.target.files ?? []));\n // Reset so re-selecting the same file re-fires change.\n event.target.value = '';\n }\n\n function handleDrop(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n process(Array.from(event.dataTransfer.files));\n }\n\n function handleDragOver(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n if (!disabled) setIsDragging(true);\n }\n\n function handleDragLeave(event: React.DragEvent<HTMLDivElement>) {\n // Ignore dragleave bubbling from descendants.\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setIsDragging(false);\n }\n }\n\n const labelNode = label && (\n <label htmlFor={fieldId} className=\"ddga-file-upload__label\">\n {required && (\n <span aria-hidden=\"true\" className=\"ddga-file-upload__required\">\n *\n </span>\n )}\n {label}\n </label>\n );\n\n const descriptionNode = description && (\n <span id={helperId} className=\"ddga-file-upload__description\">\n {description}\n </span>\n );\n\n const fileInput = (\n <input\n {...props}\n {...controlProps}\n ref={inputRef}\n type=\"file\"\n tabIndex={-1}\n className=\"ddga-file-upload__input\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n required={required}\n onChange={handleInputChange}\n // Guard the openPicker() recursion: the programmatic input.click() would\n // bubble back to the dropzone's onClick.\n onClick={(event) => event.stopPropagation()}\n data-slot=\"file-upload-input\"\n />\n );\n\n // SDGA Single: the file row replaces the trigger once the one file is chosen.\n const showTrigger = variant === 'dropzone' || multiple || files.length === 0;\n\n return (\n <div\n data-slot=\"file-upload-field\"\n data-variant={variant}\n className={cn('ddga-field', 'ddga-file-upload', className)}\n >\n {variant === 'dropzone' ? (\n <>\n {labelNode}\n <div\n data-slot=\"file-upload-dropzone\"\n className=\"ddga-file-upload__dropzone\"\n data-dragging={isDragging || undefined}\n data-disabled={disabled || undefined}\n aria-disabled={disabled || undefined}\n onClick={openPicker}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <svg className=\"ddga-file-upload__border\" aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"100%\" height=\"100%\" rx=\"4\" ry=\"4\" />\n </svg>\n <Upload className=\"ddga-file-upload__icon\" aria-hidden=\"true\" />\n <div className=\"ddga-file-upload__copy\">\n <span className=\"ddga-file-upload__title\">{title}</span>\n {descriptionNode}\n </div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"md\"\n disabled={disabled}\n className=\"ddga-file-upload__browse\"\n onClick={(event) => {\n event.stopPropagation();\n openPicker();\n }}\n >\n {buttonLabel}\n </Button>\n {fileInput}\n </div>\n </>\n ) : (\n <>\n <div className=\"ddga-file-upload__header\">\n {labelNode}\n {descriptionNode}\n </div>\n {showTrigger && (\n <Button\n type=\"button\"\n variant=\"black\"\n size=\"md\"\n disabled={disabled}\n className=\"ddga-file-upload__browse\"\n onClick={openPicker}\n >\n {buttonLabel}\n </Button>\n )}\n {fileInput}\n </>\n )}\n\n {hasErrorMessage && (\n <FieldMessage id={errorId} variant=\"error\">\n {errorMessage}\n </FieldMessage>\n )}\n\n {files.length > 0 && (\n <ul data-slot=\"file-upload-list\" className=\"ddga-file-upload__list\">\n {files.map((item) => (\n <FileRow key={item.id} item={item} onRemove={onRemove} removeLabel={removeLabel} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nexport { FileUpload };\nexport type { FileUploadProps, UploadFile, FileRejection, FileStatus, RejectionCode };\n"]}
|
|
@@ -39,6 +39,12 @@ function composeLocale(dgaLocale, calendar) {
|
|
|
39
39
|
}
|
|
40
40
|
return isArabic ? `${base}-u-nu-latn` : base;
|
|
41
41
|
}
|
|
42
|
+
function weekdayStyleForLocale(locale) {
|
|
43
|
+
return locale.startsWith("ar") ? "narrow" : "short";
|
|
44
|
+
}
|
|
45
|
+
function formatWeekdayLabel(day, locale) {
|
|
46
|
+
return locale.startsWith("ar") ? day : day.slice(0, 2);
|
|
47
|
+
}
|
|
42
48
|
function secondaryDayNumber(date, mainCalendar) {
|
|
43
49
|
const other = mainCalendar === "hijri" ? GREGORIAN : ISLAMIC_UMALQURA;
|
|
44
50
|
return _date.toCalendar.call(void 0, date, other).day;
|
|
@@ -206,5 +212,7 @@ function renderDayContent(primary, opts) {
|
|
|
206
212
|
|
|
207
213
|
|
|
208
214
|
|
|
209
|
-
|
|
210
|
-
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
exports.dateToCalendarDate = dateToCalendarDate; exports.calendarDateToDate = calendarDateToDate; exports.composeLocale = composeLocale; exports.weekdayStyleForLocale = weekdayStyleForLocale; exports.formatWeekdayLabel = formatWeekdayLabel; exports.secondaryDayNumber = secondaryDayNumber; exports.useCalendarChrome = useCalendarChrome; exports.usePressedState = usePressedState; exports.CalendarSystemToggle = CalendarSystemToggle; exports.CalendarNavHeader = CalendarNavHeader; exports.renderDayContent = renderDayContent;
|
|
218
|
+
//# sourceMappingURL=chunk-NQGMWK5C.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-NQGMWK5C.cjs","../src/internal/calendar/calendar-core.tsx"],"names":[],"mappings":"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","file":"/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-NQGMWK5C.cjs","sourcesContent":[null,"'use client';\n\n// Shared Calendar core consumed by both DatePicker (single date) and\n// DateRangePicker (date range). Everything here is calendar-system /\n// month-year-navigation / day-rendering logic that is identical regardless of\n// whether one date or a range is being selected — extracted so the two pickers\n// stay in lockstep on Hijri handling, Latin digits, and locale composition.\n//\n// NOT exported from the public barrel. Pickers import from here directly.\n\nimport { useContext, useMemo, useState, type ReactNode } from 'react';\nimport {\n CalendarStateContext as AriaCalendarStateContext,\n RangeCalendarStateContext as AriaRangeCalendarStateContext,\n} from 'react-aria-components';\nimport {\n CalendarDate,\n GregorianCalendar,\n IslamicUmalquraCalendar,\n toCalendar,\n type DateValue,\n} from '@internationalized/date';\nimport { ArrowLeft, ArrowRight, ChevronDown } from '../icons';\nimport { DgaContext } from '../../providers/DgaContext';\n\n// ─── Types ─── //\n\nexport type CalendarSystem = 'gregorian' | 'hijri';\n\nexport interface CalendarLabels {\n gregorian: string;\n hijri: string;\n}\n\n// Locale-aware accessible names for the calendar chrome's controls. Defaulted\n// in `useCalendarChrome` (Arabic when the DGA locale is `ar`) so a screen reader\n// in an Arabic UI doesn't announce these controls in English.\nexport interface CalendarA11yLabels {\n /** Accessible name for the popover trigger button. */\n openCalendar: string;\n /** Accessible name for the Gregorian↔Hijri tablist. */\n calendarSystem: string;\n}\n\n// ─── Date ↔ CalendarDate (Gregorian) normalization ─── //\n\n// Public APIs are `Date`-based so consumers don't take a dep on\n// `@internationalized/date`. Internally everything round-trips through a\n// Gregorian `CalendarDate` so the Hijri toggle is purely a *display* concern —\n// the stored value is always the same absolute day, regardless of which\n// calendar the user was looking at when they picked it.\n\nconst GREGORIAN = new GregorianCalendar();\nconst ISLAMIC_UMALQURA = new IslamicUmalquraCalendar();\n\nexport function dateToCalendarDate(date: Date | null | undefined): CalendarDate | null {\n if (!date) return null;\n // Extract LOCAL Y/M/D, not UTC. The contract is date-only; converting\n // through UTC would shift the day across timezone boundaries.\n return new CalendarDate(date.getFullYear(), date.getMonth() + 1, date.getDate());\n}\n\nexport function calendarDateToDate(value: DateValue | null | undefined): Date | null {\n if (!value) return null;\n // Defensive: if a non-Gregorian CalendarDate ever reaches here, convert.\n // Today the contract is Gregorian-only.\n const greg =\n value.calendar.identifier === 'gregory' ? value : toCalendar(value, new GregorianCalendar());\n return new Date(greg.year, greg.month - 1, greg.day);\n}\n\n// ─── Locale composition (DGA locale + optional calendar override) ─── //\n\nexport function composeLocale(dgaLocale: string, calendar: CalendarSystem): string {\n // Promote a bare 'ar'/'en' from DgaProvider to a regional tag so react-aria\n // picks the right defaults (week start, weekday names). 'ar-SA' matches the\n // DGA target audience; 'en-US' is the conventional English default.\n const base = dgaLocale === 'ar' ? 'ar-SA' : dgaLocale === 'en' ? 'en-US' : dgaLocale;\n // DGA convention: Latin digits (0–9) at all times, regardless of calendar or\n // UI language. Without this, `ar-*` locales default to Arabic-Indic numerals\n // (٠–٩) on segments + calendar cells, which makes month/year dropdowns and\n // cross-calendar comparisons harder to read. The Unicode `-u-` extension\n // carries both calendar and numbering-system keys when both apply.\n const isArabic = base.startsWith('ar');\n if (calendar === 'hijri') {\n return isArabic ? `${base}-u-ca-islamic-umalqura-nu-latn` : `${base}-u-ca-islamic-umalqura`;\n }\n return isArabic ? `${base}-u-nu-latn` : base;\n}\n\n// ─── Weekday header labels (SDGA 2-letter row) ─── //\n\n// SDGA 2-letter weekday row: Latin `short` (Sun/Mon…) slices to 2; Arabic `short` all share the \"ال\" article prefix (a blind slice collapses them to identical), so Arabic uses `narrow` (distinct single letters ح ن ث…) untouched. Keep the two fns coupled.\nexport function weekdayStyleForLocale(locale: string): 'narrow' | 'short' {\n return locale.startsWith('ar') ? 'narrow' : 'short';\n}\n\nexport function formatWeekdayLabel(day: string, locale: string): string {\n return locale.startsWith('ar') ? day : day.slice(0, 2);\n}\n\n// ─── Secondary-calendar helper ─── //\n\nexport function secondaryDayNumber(date: DateValue, mainCalendar: CalendarSystem): number {\n const other = mainCalendar === 'hijri' ? GREGORIAN : ISLAMIC_UMALQURA;\n return toCalendar(date, other).day;\n}\n\n// ─── Shared chrome hook (locale, portal, chevrons, labels) ─── //\n\n// Consolidates the DgaContext-derived bits both pickers need: the composed\n// react-aria locale, the body-portal container (theme inheritance), the\n// direction-swapped prev/next chevrons, and locale-aware default labels.\nexport function useCalendarChrome(calendarSystem: CalendarSystem, calendarLabels?: CalendarLabels) {\n const dgaCtx = useContext(DgaContext);\n const dgaLocale = dgaCtx?.locale ?? 'en';\n const dir = dgaCtx?.dir ?? 'ltr';\n\n const locale = useMemo(\n () => composeLocale(dgaLocale, calendarSystem),\n [dgaLocale, calendarSystem],\n );\n\n // react-aria's Popover renders to a portal under <body> by default. Re-anchor\n // it under DgaProvider's body-mounted portal so data-theme, theme vars, and\n // .ddga-theme-* classes inherit into the dropdown. Falls back to <body> when\n // used standalone (no provider).\n const portalContainer = (dgaCtx?.portalEl ?? dgaCtx?.rootEl ?? undefined) as Element | undefined;\n\n // In RTL, \"previous\" sits visually on the right and points right; \"next\" sits\n // on the left and points left. Swapping the icon components (rather than\n // CSS-flipping) is robust because it doesn't rely on the portal inheriting dir.\n const PrevArrow = dir === 'rtl' ? ArrowRight : ArrowLeft;\n const NextArrow = dir === 'rtl' ? ArrowLeft : ArrowRight;\n\n const resolvedLabels = useMemo<CalendarLabels>(() => {\n if (calendarLabels) return calendarLabels;\n return dgaLocale.startsWith('ar')\n ? { gregorian: 'ميلادي', hijri: 'هجري' }\n : { gregorian: 'Gregorian', hijri: 'Hijri' };\n }, [calendarLabels, dgaLocale]);\n\n const navLabels = useMemo(\n () =>\n dgaLocale.startsWith('ar')\n ? { month: 'الشهر', year: 'السنة' }\n : { month: 'Month', year: 'Year' },\n [dgaLocale],\n );\n\n const a11yLabels = useMemo<CalendarA11yLabels>(\n () =>\n dgaLocale.startsWith('ar')\n ? { openCalendar: 'فتح التقويم', calendarSystem: 'نظام التقويم' }\n : { openCalendar: 'Open calendar', calendarSystem: 'Calendar system' },\n [dgaLocale],\n );\n\n return {\n dgaLocale,\n dir,\n locale,\n portalContainer,\n PrevArrow,\n NextArrow,\n resolvedLabels,\n navLabels,\n a11yLabels,\n };\n}\n\n// ─── Pressed state (reliable on a react-aria Group) ─── //\n\n// CSS `:active` is unreliable on the picker trigger: it's a react-aria Group of\n// DateSegments + a Button whose usePress handling (preventDefault / pointer\n// capture) makes `:active` fire inconsistently depending on where you press.\n// Track pressed in JS via CAPTURE-phase pointer events (which fire on the Group\n// before any child can swallow them) and expose it as `data-pressed`. Spread\n// `pressHandlers` onto the trigger Group; gate the CSS with `[data-pressed]`.\nexport function usePressedState() {\n const [pressed, setPressed] = useState(false);\n return {\n pressed,\n pressHandlers: {\n onPointerDownCapture: () => setPressed(true),\n onPointerUpCapture: () => setPressed(false),\n onPointerCancelCapture: () => setPressed(false),\n onPointerLeave: () => setPressed(false),\n },\n };\n}\n\n// ─── Calendar-system toggle (Gregorian ↔ Hijri) ─── //\n\ninterface CalendarSystemToggleProps {\n value: CalendarSystem;\n onChange: (next: CalendarSystem) => void;\n labels: CalendarLabels;\n /** Localized accessible name for the tablist (from `useCalendarChrome`). */\n groupLabel: string;\n}\n\nexport function CalendarSystemToggle({\n value,\n onChange,\n labels,\n groupLabel,\n}: CalendarSystemToggleProps) {\n return (\n <div\n role=\"tablist\"\n aria-label={groupLabel}\n className=\"ddga-calendar-toggle\"\n data-slot=\"calendar-toggle\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={value === 'gregorian'}\n className=\"ddga-calendar-toggle__button\"\n data-active={value === 'gregorian' ? '' : undefined}\n onClick={() => onChange('gregorian')}\n >\n {labels.gregorian}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={value === 'hijri'}\n className=\"ddga-calendar-toggle__button\"\n data-active={value === 'hijri' ? '' : undefined}\n onClick={() => onChange('hijri')}\n >\n {labels.hijri}\n </button>\n </div>\n );\n}\n\n// ─── Calendar nav header (month + year dropdowns) ─── //\n\n// Rendered inside <Calendar>/<RangeCalendar> so it can consume the calendar\n// state context. Both single and range calendars expose the same\n// `focusedDate`/`setFocusedDate`/`minValue`/`maxValue` surface (CalendarStateBase),\n// so we read whichever context is populated — the component is calendar-kind\n// agnostic. Hooking the state directly keeps the dropdowns in sync with the\n// prev/next buttons and keyboard navigation automatically.\ninterface CalendarNavHeaderProps {\n locale: string;\n monthLabel: string;\n yearLabel: string;\n}\n\nexport function CalendarNavHeader({ locale, monthLabel, yearLabel }: CalendarNavHeaderProps) {\n // A given subtree lives inside exactly one of these; the other is null.\n const rangeState = useContext(AriaRangeCalendarStateContext);\n const singleState = useContext(AriaCalendarStateContext);\n const state = rangeState ?? singleState;\n\n // Pull state fields with safe fallbacks so the hooks below stay unconditional\n // (rules-of-hooks). Rendering still bails when state is null.\n const focusedDate = state?.focusedDate ?? null;\n const focusedYear = focusedDate?.year ?? 0;\n const focusedCalendar = focusedDate?.calendar ?? GREGORIAN;\n const minValue = state?.minValue ?? null;\n const maxValue = state?.maxValue ?? null;\n\n // Localized month names in the active calendar. Hijri months translate\n // correctly because the locale string carries `-u-ca-islamic-umalqura`.\n const monthNames = useMemo(() => {\n if (!focusedDate) return [];\n const fmt = new Intl.DateTimeFormat(locale, { month: 'long' });\n return Array.from({ length: 12 }, (_, i) => {\n const cd = new CalendarDate(focusedCalendar, focusedYear, i + 1, 1);\n const greg = toCalendar(cd, GREGORIAN);\n const js = new Date(greg.year, greg.month - 1, greg.day);\n return fmt.format(js);\n });\n }, [locale, focusedDate, focusedCalendar, focusedYear]);\n\n // Year range. min/maxValue are in the consumer's calendar (Gregorian); convert\n // to the focused calendar's year. Defaults span 100 years back to 30 forward.\n const yearOptions = useMemo(() => {\n if (!focusedDate) return [];\n const minY = minValue ? toCalendar(minValue, focusedCalendar).year : focusedYear - 100;\n const maxY = maxValue ? toCalendar(maxValue, focusedCalendar).year : focusedYear + 30;\n const start = Math.min(minY, focusedYear);\n const end = Math.max(maxY, focusedYear);\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n }, [focusedDate, focusedCalendar, focusedYear, minValue, maxValue]);\n\n if (!state || !focusedDate) return null;\n\n return (\n <div className=\"ddga-calendar__nav-selects\" data-slot=\"calendar-nav\">\n <select\n aria-label={monthLabel}\n className=\"ddga-calendar__select ddga-calendar__month-select\"\n data-slot=\"calendar-month-select\"\n value={focusedDate.month}\n onChange={(e) => state.setFocusedDate(focusedDate.set({ month: Number(e.target.value) }))}\n >\n {monthNames.map((name, i) => (\n <option key={i + 1} value={i + 1}>\n {name}\n </option>\n ))}\n </select>\n <span className=\"ddga-calendar__year-chip\">\n <select\n aria-label={yearLabel}\n className=\"ddga-calendar__select ddga-calendar__year-select\"\n data-slot=\"calendar-year-select\"\n value={focusedDate.year}\n onChange={(e) => state.setFocusedDate(focusedDate.set({ year: Number(e.target.value) }))}\n >\n {yearOptions.map((y) => (\n <option key={y} value={y}>\n {y}\n </option>\n ))}\n </select>\n <ChevronDown aria-hidden=\"true\" className=\"ddga-calendar__year-chevron\" />\n </span>\n </div>\n );\n}\n\n// ─── Day-cell content (primary number + optional secondary calendar number) ─── //\n\n// The visual content rendered inside a day cell, shared by both pickers. Takes\n// the already-formatted primary text (react-aria's `formattedDate`, or a bare\n// day number for the single picker's outside-month button) and stacks the other\n// calendar's day number beneath it when `showSecondary` is on.\nexport function renderDayContent(\n primary: ReactNode,\n opts: { showSecondary: boolean; date: DateValue; calendarSystem: CalendarSystem },\n): ReactNode {\n if (!opts.showSecondary) return primary;\n return (\n <>\n <span className=\"ddga-calendar__cell-primary\">{primary}</span>\n <span aria-hidden=\"true\" className=\"ddga-calendar__cell-secondary\">\n {secondaryDayNumber(opts.date, opts.calendarSystem)}\n </span>\n </>\n );\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var _chunk5NENDJOMcjs = require('./chunk-5NENDJOM.cjs');
|
|
4
3
|
|
|
4
|
+
var _chunkYS2JJ73Mcjs = require('./chunk-YS2JJ73M.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunk5NENDJOMcjs = require('./chunk-5NENDJOM.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
var _chunkV6MXOJQ4cjs = require('./chunk-V6MXOJQ4.cjs');
|
|
@@ -261,4 +261,4 @@ function CardExpandableContent({ asChild, className, ...props }) {
|
|
|
261
261
|
|
|
262
262
|
|
|
263
263
|
exports.cardVariants = cardVariants; exports.Card = Card; exports.CardImage = CardImage; exports.CardHeader = CardHeader; exports.CardIcon = CardIcon; exports.CardTitle = CardTitle; exports.CardDescription = CardDescription; exports.CardContent = CardContent; exports.CardFooter = CardFooter; exports.CardExpandableContent = CardExpandableContent;
|
|
264
|
-
//# sourceMappingURL=chunk-
|
|
264
|
+
//# sourceMappingURL=chunk-P7WYXL4A.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-GXF5IZEX.cjs","../src/components/Card/Card.tsx"],"names":[],"mappings":"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","file":"/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-GXF5IZEX.cjs","sourcesContent":[null,"'use client';\n\nimport { useState, useId, useContext, createContext } from 'react';\nimport { Slot as SlotPrimitive } from 'radix-ui';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { Check, ChevronDown } from '../../internal/icons';\nimport { Button } from '../Button';\n\nconst cardVariants = cva('ddga-card', {\n variants: {\n variant: {\n default: 'ddga-card--default',\n outline: 'ddga-card--outline',\n elevated: 'ddga-card--elevated',\n plain: 'ddga-card--plain',\n filled: 'ddga-card--filled',\n gradient: 'ddga-card--gradient',\n ghost: 'ddga-card--ghost',\n },\n padding: {\n sm: 'ddga-card--padding-sm',\n md: 'ddga-card--padding-md',\n lg: 'ddga-card--padding-lg',\n },\n orientation: {\n vertical: 'ddga-card--vertical',\n horizontal: 'ddga-card--horizontal',\n },\n interactive: {\n true: 'ddga-card--interactive',\n },\n },\n defaultVariants: {\n variant: 'default',\n padding: 'md',\n orientation: 'vertical',\n },\n});\n\n// Shares expanded state + content id between the chevron toggle and CardExpandableContent.\nconst CardContext = createContext<{ expanded: boolean; contentId: string } | null>(null);\n\ninterface CardProps extends React.ComponentProps<'div'>, VariantProps<typeof cardVariants> {\n /** Render as the single child element instead of a `<div>` (see Button). */\n asChild?: boolean;\n /**\n * DGA Disabled state — mutes the surface (gray-200 bg / gray-400 text + icon)\n * and marks the card `aria-disabled`. Suppresses Selectable toggling.\n */\n disabled?: boolean;\n /**\n * DGA Type=Selectable — the whole card becomes a checkbox (`role=\"checkbox\"`,\n * Space toggles) with a checkbox indicator at the top inline-end. Controlled\n * via `selected` or uncontrolled via `defaultSelected`. Ignores `asChild`.\n */\n selectable?: boolean;\n /** Controlled selected state (Selectable). */\n selected?: boolean;\n /** Uncontrolled initial selected state (Selectable). */\n defaultSelected?: boolean;\n /** Fires with the next selected value when the user toggles a Selectable card. */\n onSelectedChange?: (selected: boolean) => void;\n /**\n * DGA Type=Expandable — renders a chevron toggle (icon-only Subtle button) at\n * the bottom inline-end that shows/hides a `<CardExpandableContent>` region.\n * Controlled via `expanded` or uncontrolled via `defaultExpanded`.\n */\n expandable?: boolean;\n /** Controlled expanded state (Expandable). */\n expanded?: boolean;\n /** Uncontrolled initial expanded state (Expandable). */\n defaultExpanded?: boolean;\n /** Fires with the next expanded value when the user toggles an Expandable card. */\n onExpandedChange?: (expanded: boolean) => void;\n /** Accessible label for the expand/collapse toggle. Default `'Toggle details'`. */\n expandLabel?: string;\n}\n\ntype CardSectionProps = React.ComponentProps<'div'> & { asChild?: boolean };\n\ntype CardIconProps = CardSectionProps & {\n /**\n * Render the DGA Platforms Code \"Featured Icon\" treatment — a 48px brand-light\n * circle around the glyph (vs the bare inline icon). Pair with the SDGA Card\n * pattern (featured icon → title → content → footer).\n */\n featured?: boolean;\n};\n\ninterface CardTitleProps extends React.ComponentProps<'h3'> {\n /** Override the heading element (e.g. render an `<h2>` or `<a>`). */\n asChild?: boolean;\n}\n\ntype CardDescriptionProps = React.ComponentProps<'p'> & { asChild?: boolean };\n\ninterface CardImageProps extends React.ComponentProps<'img'> {\n /**\n * Aspect ratio of the image in vertical orientation (e.g. `'16/9'`, `'4/3'`,\n * `'1/1'`). Default `'16/9'`. Ignored in horizontal orientation — the image\n * fills the card's full height there.\n */\n aspectRatio?: string;\n}\n\nfunction Card({\n variant,\n padding,\n orientation,\n interactive,\n asChild,\n disabled,\n selectable,\n selected,\n defaultSelected,\n onSelectedChange,\n expandable,\n expanded,\n defaultExpanded,\n onExpandedChange,\n expandLabel = 'Toggle details',\n className,\n children,\n onClick,\n onKeyDown,\n ...props\n}: CardProps) {\n // Dev-only: a selectable card is a `role=\"checkbox\"`, which takes its name\n // from aria-label/aria-labelledby (not its text content).\n if (process.env.NODE_ENV === 'development' && selectable) {\n if (!props['aria-label'] && !props['aria-labelledby']) {\n console.warn(\n '[@dev-dga/react] A selectable Card renders as a checkbox and needs an ' +\n 'aria-label or aria-labelledby for screen-reader users.',\n );\n }\n }\n\n const [internalSelected, setInternalSelected] = useState(defaultSelected ?? false);\n const isSelected = selected ?? internalSelected;\n const toggleSelected = () => {\n if (disabled) return;\n const next = !isSelected;\n if (selected === undefined) setInternalSelected(next);\n onSelectedChange?.(next);\n };\n\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded ?? false);\n const isExpanded = expanded ?? internalExpanded;\n const contentId = useId();\n const toggleExpanded = () => {\n if (disabled) return;\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n // Selectable/Expandable add sibling elements, so the card can't be a Slot\n // (Slot needs exactly one child). They are mutually exclusive DGA Types.\n const hasExtras = selectable || expandable;\n const Comp = asChild && !hasExtras ? SlotPrimitive.Slot : 'div';\n\n const selectableProps = selectable\n ? {\n role: 'checkbox' as const,\n 'aria-checked': isSelected,\n 'aria-disabled': disabled || undefined,\n tabIndex: disabled ? -1 : 0,\n 'data-state': isSelected ? ('checked' as const) : ('unchecked' as const),\n onClick: (e: React.MouseEvent<HTMLDivElement>) => {\n toggleSelected();\n onClick?.(e);\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === ' ') {\n e.preventDefault();\n toggleSelected();\n }\n onKeyDown?.(e);\n },\n }\n : // A bare `interactive` card (no asChild wrapper) is a whole-card click target →\n // make it keyboard-operable and announced as a button, else it's mouse-only.\n interactive && !expandable && !asChild\n ? {\n role: 'button' as const,\n 'aria-disabled': disabled || undefined,\n tabIndex: disabled ? -1 : 0,\n onClick,\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!disabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n e.currentTarget.click();\n }\n onKeyDown?.(e);\n },\n }\n : { onClick, onKeyDown };\n\n const card = (\n <Comp\n data-slot=\"card\"\n data-orientation={orientation ?? 'vertical'}\n data-disabled={disabled || undefined}\n data-expanded={expandable ? isExpanded : undefined}\n aria-disabled={disabled && !selectable ? true : undefined}\n className={cn(\n cardVariants({ variant, padding, orientation, interactive }),\n disabled && 'ddga-card--disabled',\n selectable && 'ddga-card--selectable',\n expandable && 'ddga-card--expandable',\n className,\n )}\n {...selectableProps}\n {...props}\n >\n {hasExtras ? (\n <>\n {selectable && (\n <span className=\"ddga-card__select-indicator\" aria-hidden>\n <span\n className=\"ddga-card__checkbox\"\n data-state={isSelected ? 'checked' : 'unchecked'}\n >\n {isSelected && <Check className=\"ddga-card__checkbox-check\" />}\n </span>\n </span>\n )}\n {children}\n {expandable && (\n <div className=\"ddga-card__expand-row\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={expandLabel}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n disabled={disabled}\n onClick={toggleExpanded}\n >\n <ChevronDown\n className={cn('ddga-card__chevron', isExpanded && 'ddga-card__chevron--up')}\n />\n </Button>\n </div>\n )}\n </>\n ) : (\n // Plain card: pass children straight through so `asChild` (Slot) still\n // receives a single element.\n children\n )}\n </Comp>\n );\n\n return expandable ? (\n <CardContext.Provider value={{ expanded: isExpanded, contentId }}>{card}</CardContext.Provider>\n ) : (\n card\n );\n}\n\nfunction CardImage({ aspectRatio = '16/9', className, style, ...props }: CardImageProps) {\n return (\n <img\n data-slot=\"card-image\"\n className={cn('ddga-card__image', className)}\n style={\n {\n '--ddga-card-image-aspect': aspectRatio,\n ...style,\n } as React.CSSProperties\n }\n {...props}\n />\n );\n}\n\nfunction CardHeader({ asChild, className, ...props }: CardSectionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return <Comp data-slot=\"card-header\" className={cn('ddga-card__header', className)} {...props} />;\n}\n\n// Decorative (`aria-hidden`) by default; pass `aria-hidden={false}` when the icon is the sole label.\nfunction CardIcon({ asChild, featured, className, ...props }: CardIconProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return (\n <Comp\n data-slot=\"card-icon\"\n aria-hidden\n className={cn('ddga-card__icon', featured && 'ddga-card__icon--featured', className)}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ asChild, className, ...props }: CardTitleProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'h3';\n return <Comp data-slot=\"card-title\" className={cn('ddga-card__title', className)} {...props} />;\n}\n\nfunction CardDescription({ asChild, className, ...props }: CardDescriptionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'p';\n return (\n <Comp\n data-slot=\"card-description\"\n className={cn('ddga-card__description', className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ asChild, className, ...props }: CardSectionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return (\n <Comp data-slot=\"card-content\" className={cn('ddga-card__content', className)} {...props} />\n );\n}\n\nfunction CardFooter({ asChild, className, ...props }: CardSectionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return <Comp data-slot=\"card-footer\" className={cn('ddga-card__footer', className)} {...props} />;\n}\n\n// The collapsible region of an Expandable card — reads the Card's expanded state\n// via context; `hidden` removes it from layout + a11y tree when collapsed.\nfunction CardExpandableContent({ asChild, className, ...props }: CardSectionProps) {\n const ctx = useContext(CardContext);\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return (\n <Comp\n data-slot=\"card-expandable-content\"\n id={ctx?.contentId}\n hidden={ctx ? !ctx.expanded : undefined}\n className={cn('ddga-card__expandable-content', className)}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardImage,\n CardIcon,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardExpandableContent,\n cardVariants,\n};\nexport type {\n CardProps,\n CardImageProps,\n CardSectionProps,\n CardIconProps,\n CardTitleProps,\n CardDescriptionProps,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-P7WYXL4A.cjs","../src/components/Card/Card.tsx"],"names":[],"mappings":"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","file":"/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-P7WYXL4A.cjs","sourcesContent":[null,"'use client';\n\nimport { useState, useId, useContext, createContext } from 'react';\nimport { Slot as SlotPrimitive } from 'radix-ui';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { Check, ChevronDown } from '../../internal/icons';\nimport { Button } from '../Button';\n\nconst cardVariants = cva('ddga-card', {\n variants: {\n variant: {\n default: 'ddga-card--default',\n outline: 'ddga-card--outline',\n elevated: 'ddga-card--elevated',\n plain: 'ddga-card--plain',\n filled: 'ddga-card--filled',\n gradient: 'ddga-card--gradient',\n ghost: 'ddga-card--ghost',\n },\n padding: {\n sm: 'ddga-card--padding-sm',\n md: 'ddga-card--padding-md',\n lg: 'ddga-card--padding-lg',\n },\n orientation: {\n vertical: 'ddga-card--vertical',\n horizontal: 'ddga-card--horizontal',\n },\n interactive: {\n true: 'ddga-card--interactive',\n },\n },\n defaultVariants: {\n variant: 'default',\n padding: 'md',\n orientation: 'vertical',\n },\n});\n\n// Shares expanded state + content id between the chevron toggle and CardExpandableContent.\nconst CardContext = createContext<{ expanded: boolean; contentId: string } | null>(null);\n\ninterface CardProps extends React.ComponentProps<'div'>, VariantProps<typeof cardVariants> {\n /** Render as the single child element instead of a `<div>` (see Button). */\n asChild?: boolean;\n /**\n * DGA Disabled state — mutes the surface (gray-200 bg / gray-400 text + icon)\n * and marks the card `aria-disabled`. Suppresses Selectable toggling.\n */\n disabled?: boolean;\n /**\n * DGA Type=Selectable — the whole card becomes a checkbox (`role=\"checkbox\"`,\n * Space toggles) with a checkbox indicator at the top inline-end. Controlled\n * via `selected` or uncontrolled via `defaultSelected`. Ignores `asChild`.\n */\n selectable?: boolean;\n /** Controlled selected state (Selectable). */\n selected?: boolean;\n /** Uncontrolled initial selected state (Selectable). */\n defaultSelected?: boolean;\n /** Fires with the next selected value when the user toggles a Selectable card. */\n onSelectedChange?: (selected: boolean) => void;\n /**\n * DGA Type=Expandable — renders a chevron toggle (icon-only Subtle button) at\n * the bottom inline-end that shows/hides a `<CardExpandableContent>` region.\n * Controlled via `expanded` or uncontrolled via `defaultExpanded`.\n */\n expandable?: boolean;\n /** Controlled expanded state (Expandable). */\n expanded?: boolean;\n /** Uncontrolled initial expanded state (Expandable). */\n defaultExpanded?: boolean;\n /** Fires with the next expanded value when the user toggles an Expandable card. */\n onExpandedChange?: (expanded: boolean) => void;\n /** Accessible label for the expand/collapse toggle. Default `'Toggle details'`. */\n expandLabel?: string;\n}\n\ntype CardSectionProps = React.ComponentProps<'div'> & { asChild?: boolean };\n\ntype CardIconProps = CardSectionProps & {\n /**\n * Render the DGA Platforms Code \"Featured Icon\" treatment — a 48px brand-light\n * circle around the glyph (vs the bare inline icon). Pair with the SDGA Card\n * pattern (featured icon → title → content → footer).\n */\n featured?: boolean;\n};\n\ninterface CardTitleProps extends React.ComponentProps<'h3'> {\n /** Override the heading element (e.g. render an `<h2>` or `<a>`). */\n asChild?: boolean;\n}\n\ntype CardDescriptionProps = React.ComponentProps<'p'> & { asChild?: boolean };\n\ninterface CardImageProps extends React.ComponentProps<'img'> {\n /**\n * Aspect ratio of the image in vertical orientation (e.g. `'16/9'`, `'4/3'`,\n * `'1/1'`). Default `'16/9'`. Ignored in horizontal orientation — the image\n * fills the card's full height there.\n */\n aspectRatio?: string;\n}\n\nfunction Card({\n variant,\n padding,\n orientation,\n interactive,\n asChild,\n disabled,\n selectable,\n selected,\n defaultSelected,\n onSelectedChange,\n expandable,\n expanded,\n defaultExpanded,\n onExpandedChange,\n expandLabel = 'Toggle details',\n className,\n children,\n onClick,\n onKeyDown,\n ...props\n}: CardProps) {\n // Dev-only: a selectable card is a `role=\"checkbox\"`, which takes its name\n // from aria-label/aria-labelledby (not its text content).\n if (process.env.NODE_ENV === 'development' && selectable) {\n if (!props['aria-label'] && !props['aria-labelledby']) {\n console.warn(\n '[@dev-dga/react] A selectable Card renders as a checkbox and needs an ' +\n 'aria-label or aria-labelledby for screen-reader users.',\n );\n }\n }\n\n const [internalSelected, setInternalSelected] = useState(defaultSelected ?? false);\n const isSelected = selected ?? internalSelected;\n const toggleSelected = () => {\n if (disabled) return;\n const next = !isSelected;\n if (selected === undefined) setInternalSelected(next);\n onSelectedChange?.(next);\n };\n\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded ?? false);\n const isExpanded = expanded ?? internalExpanded;\n const contentId = useId();\n const toggleExpanded = () => {\n if (disabled) return;\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n // Selectable/Expandable add sibling elements, so the card can't be a Slot\n // (Slot needs exactly one child). They are mutually exclusive DGA Types.\n const hasExtras = selectable || expandable;\n const Comp = asChild && !hasExtras ? SlotPrimitive.Slot : 'div';\n\n const selectableProps = selectable\n ? {\n role: 'checkbox' as const,\n 'aria-checked': isSelected,\n 'aria-disabled': disabled || undefined,\n tabIndex: disabled ? -1 : 0,\n 'data-state': isSelected ? ('checked' as const) : ('unchecked' as const),\n onClick: (e: React.MouseEvent<HTMLDivElement>) => {\n toggleSelected();\n onClick?.(e);\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === ' ') {\n e.preventDefault();\n toggleSelected();\n }\n onKeyDown?.(e);\n },\n }\n : // A bare `interactive` card (no asChild wrapper) is a whole-card click target →\n // make it keyboard-operable and announced as a button, else it's mouse-only.\n interactive && !expandable && !asChild\n ? {\n role: 'button' as const,\n 'aria-disabled': disabled || undefined,\n tabIndex: disabled ? -1 : 0,\n onClick,\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!disabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n e.currentTarget.click();\n }\n onKeyDown?.(e);\n },\n }\n : { onClick, onKeyDown };\n\n const card = (\n <Comp\n data-slot=\"card\"\n data-orientation={orientation ?? 'vertical'}\n data-disabled={disabled || undefined}\n data-expanded={expandable ? isExpanded : undefined}\n aria-disabled={disabled && !selectable ? true : undefined}\n className={cn(\n cardVariants({ variant, padding, orientation, interactive }),\n disabled && 'ddga-card--disabled',\n selectable && 'ddga-card--selectable',\n expandable && 'ddga-card--expandable',\n className,\n )}\n {...selectableProps}\n {...props}\n >\n {hasExtras ? (\n <>\n {selectable && (\n <span className=\"ddga-card__select-indicator\" aria-hidden>\n <span\n className=\"ddga-card__checkbox\"\n data-state={isSelected ? 'checked' : 'unchecked'}\n >\n {isSelected && <Check className=\"ddga-card__checkbox-check\" />}\n </span>\n </span>\n )}\n {children}\n {expandable && (\n <div className=\"ddga-card__expand-row\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={expandLabel}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n disabled={disabled}\n onClick={toggleExpanded}\n >\n <ChevronDown\n className={cn('ddga-card__chevron', isExpanded && 'ddga-card__chevron--up')}\n />\n </Button>\n </div>\n )}\n </>\n ) : (\n // Plain card: pass children straight through so `asChild` (Slot) still\n // receives a single element.\n children\n )}\n </Comp>\n );\n\n return expandable ? (\n <CardContext.Provider value={{ expanded: isExpanded, contentId }}>{card}</CardContext.Provider>\n ) : (\n card\n );\n}\n\nfunction CardImage({ aspectRatio = '16/9', className, style, ...props }: CardImageProps) {\n return (\n <img\n data-slot=\"card-image\"\n className={cn('ddga-card__image', className)}\n style={\n {\n '--ddga-card-image-aspect': aspectRatio,\n ...style,\n } as React.CSSProperties\n }\n {...props}\n />\n );\n}\n\nfunction CardHeader({ asChild, className, ...props }: CardSectionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return <Comp data-slot=\"card-header\" className={cn('ddga-card__header', className)} {...props} />;\n}\n\n// Decorative (`aria-hidden`) by default; pass `aria-hidden={false}` when the icon is the sole label.\nfunction CardIcon({ asChild, featured, className, ...props }: CardIconProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return (\n <Comp\n data-slot=\"card-icon\"\n aria-hidden\n className={cn('ddga-card__icon', featured && 'ddga-card__icon--featured', className)}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ asChild, className, ...props }: CardTitleProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'h3';\n return <Comp data-slot=\"card-title\" className={cn('ddga-card__title', className)} {...props} />;\n}\n\nfunction CardDescription({ asChild, className, ...props }: CardDescriptionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'p';\n return (\n <Comp\n data-slot=\"card-description\"\n className={cn('ddga-card__description', className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ asChild, className, ...props }: CardSectionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return (\n <Comp data-slot=\"card-content\" className={cn('ddga-card__content', className)} {...props} />\n );\n}\n\nfunction CardFooter({ asChild, className, ...props }: CardSectionProps) {\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return <Comp data-slot=\"card-footer\" className={cn('ddga-card__footer', className)} {...props} />;\n}\n\n// The collapsible region of an Expandable card — reads the Card's expanded state\n// via context; `hidden` removes it from layout + a11y tree when collapsed.\nfunction CardExpandableContent({ asChild, className, ...props }: CardSectionProps) {\n const ctx = useContext(CardContext);\n const Comp = asChild ? SlotPrimitive.Slot : 'div';\n return (\n <Comp\n data-slot=\"card-expandable-content\"\n id={ctx?.contentId}\n hidden={ctx ? !ctx.expanded : undefined}\n className={cn('ddga-card__expandable-content', className)}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardImage,\n CardIcon,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardExpandableContent,\n cardVariants,\n};\nexport type {\n CardProps,\n CardImageProps,\n CardSectionProps,\n CardIconProps,\n CardTitleProps,\n CardDescriptionProps,\n};\n"]}
|
|
@@ -20,6 +20,10 @@ var chipVariants = cva("ddga-chip", {
|
|
|
20
20
|
},
|
|
21
21
|
rounded: {
|
|
22
22
|
true: "ddga-chip--rounded"
|
|
23
|
+
},
|
|
24
|
+
/** For chips on a colored/dark surface: a white-ramp pill with ink text (SDGA On-color). */
|
|
25
|
+
onColor: {
|
|
26
|
+
true: "ddga-chip--on-color"
|
|
23
27
|
}
|
|
24
28
|
},
|
|
25
29
|
defaultVariants: {
|
|
@@ -31,6 +35,7 @@ function Chip({
|
|
|
31
35
|
variant,
|
|
32
36
|
size,
|
|
33
37
|
rounded,
|
|
38
|
+
onColor,
|
|
34
39
|
selected,
|
|
35
40
|
defaultSelected = false,
|
|
36
41
|
onSelectedChange,
|
|
@@ -56,7 +61,7 @@ function Chip({
|
|
|
56
61
|
"aria-disabled": disabled || void 0,
|
|
57
62
|
"data-slot": "chip",
|
|
58
63
|
"aria-pressed": isSelected,
|
|
59
|
-
className: cn(chipVariants({ variant, size, rounded }), className),
|
|
64
|
+
className: cn(chipVariants({ variant, size, rounded, onColor }), className),
|
|
60
65
|
onClick: (e) => {
|
|
61
66
|
if (disabled) {
|
|
62
67
|
e.preventDefault();
|
|
@@ -82,4 +87,4 @@ export {
|
|
|
82
87
|
chipVariants,
|
|
83
88
|
Chip
|
|
84
89
|
};
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
90
|
+
//# sourceMappingURL=chunk-SQ7NQVEK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Chip/Chip.tsx"],"sourcesContent":["'use client';\n\nimport { useState, type ReactNode } from 'react';\nimport { Slot as SlotPrimitive } from 'radix-ui';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst chipVariants = cva('ddga-chip', {\n variants: {\n variant: {\n primary: 'ddga-chip--primary',\n neutral: 'ddga-chip--neutral',\n },\n size: {\n sm: 'ddga-chip--sm',\n md: 'ddga-chip--md',\n lg: 'ddga-chip--lg',\n },\n rounded: {\n true: 'ddga-chip--rounded',\n },\n /** For chips on a colored/dark surface: a white-ramp pill with ink text (SDGA On-color). */\n onColor: {\n true: 'ddga-chip--on-color',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n});\n\ninterface ChipProps\n extends Omit<React.ComponentProps<'button'>, 'onChange'>, VariantProps<typeof chipVariants> {\n /** Controlled selected state — drives `aria-pressed` and the filled treatment. */\n selected?: boolean;\n /** Uncontrolled initial selected state. */\n defaultSelected?: boolean;\n /** Called with the next selected value when the chip toggles. */\n onSelectedChange?: (selected: boolean) => void;\n /** Leading icon (inherits the chip text colour; 14px, 16px at `lg`). */\n leadingIcon?: ReactNode;\n /** Trailing icon. */\n trailingIcon?: ReactNode;\n /** Render as the child element (Radix `Slot`) — e.g. wrap a router link. */\n asChild?: boolean;\n}\n\n/**\n * Interactive selectable chip (SDGA \"Chip\") — a toggle button, distinct from the\n * static `Tag` (SDGA \"Tags\"). Selecting fills the chip (`#1B8354` primary / gray-700 neutral).\n */\nfunction Chip({\n variant,\n size,\n rounded,\n onColor,\n selected,\n defaultSelected = false,\n onSelectedChange,\n leadingIcon,\n trailingIcon,\n asChild,\n className,\n children,\n disabled,\n onClick,\n type = 'button',\n ...props\n}: ChipProps) {\n const isControlled = selected !== undefined;\n const [internal, setInternal] = useState(defaultSelected);\n const isSelected = isControlled ? selected : internal;\n const Comp = asChild ? SlotPrimitive.Slot : 'button';\n\n return (\n <Comp\n // type/native disabled only apply to <button>; in asChild mode lean on\n // aria-disabled + tabIndex (CSS matches [aria-disabled='true'] too).\n {...(asChild ? {} : { type, disabled })}\n {...(asChild && disabled ? { tabIndex: -1 } : {})}\n aria-disabled={disabled || undefined}\n data-slot=\"chip\"\n aria-pressed={isSelected}\n className={cn(chipVariants({ variant, size, rounded, onColor }), className)}\n onClick={(e) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n if (e.defaultPrevented) return;\n const next = !isSelected;\n if (!isControlled) setInternal(next);\n onSelectedChange?.(next);\n }}\n {...props}\n >\n {leadingIcon != null && (\n <span className=\"ddga-chip__icon\" aria-hidden=\"true\">\n {leadingIcon}\n </span>\n )}\n {asChild ? (\n <SlotPrimitive.Slottable>{children}</SlotPrimitive.Slottable>\n ) : (\n children != null && <span className=\"ddga-chip__label\">{children}</span>\n )}\n {trailingIcon != null && (\n <span className=\"ddga-chip__icon\" aria-hidden=\"true\">\n {trailingIcon}\n </span>\n )}\n </Comp>\n );\n}\n\nexport { Chip, chipVariants };\nexport type { ChipProps };\n"],"mappings":";;;;;AAEA,SAAS,gBAAgC;AACzC,SAAS,QAAQ,qBAAqB;AACtC,SAAS,WAA8B;AAwEnC,SAuBI,KAvBJ;AArEJ,IAAM,eAAe,IAAI,aAAa;AAAA,EACpC,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA;AAAA,IAEA,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF,CAAC;AAsBD,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAAc;AACZ,QAAM,eAAe,aAAa;AAClC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,eAAe;AACxD,QAAM,aAAa,eAAe,WAAW;AAC7C,QAAM,OAAO,UAAU,cAAc,OAAO;AAE5C,SACE;AAAA,IAAC;AAAA;AAAA,MAGE,GAAI,UAAU,CAAC,IAAI,EAAE,MAAM,SAAS;AAAA,MACpC,GAAI,WAAW,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;AAAA,MAC/C,iBAAe,YAAY;AAAA,MAC3B,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,aAAa,EAAE,SAAS,MAAM,SAAS,QAAQ,CAAC,GAAG,SAAS;AAAA,MAC1E,SAAS,CAAC,MAAM;AACd,YAAI,UAAU;AACZ,YAAE,eAAe;AACjB;AAAA,QACF;AACA,kBAAU,CAAC;AACX,YAAI,EAAE,iBAAkB;AACxB,cAAM,OAAO,CAAC;AACd,YAAI,CAAC,aAAc,aAAY,IAAI;AACnC,2BAAmB,IAAI;AAAA,MACzB;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,uBAAe,QACd,oBAAC,UAAK,WAAU,mBAAkB,eAAY,QAC3C,uBACH;AAAA,QAED,UACC,oBAAC,cAAc,WAAd,EAAyB,UAAS,IAEnC,YAAY,QAAQ,oBAAC,UAAK,WAAU,oBAAoB,UAAS;AAAA,QAElE,gBAAgB,QACf,oBAAC,UAAK,WAAU,mBAAkB,eAAY,QAC3C,wBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var _chunkNQGMWK5Ccjs = require('./chunk-NQGMWK5C.cjs');
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
var _chunkV6MXOJQ4cjs = require('./chunk-V6MXOJQ4.cjs');
|
|
@@ -79,11 +81,11 @@ function CalendarDayCell({ date, showSecondary, calendarSystem }) {
|
|
|
79
81
|
"data-selected": isSelected ? "" : void 0,
|
|
80
82
|
"data-slot": "date-picker-day-cell",
|
|
81
83
|
onClick: handleSelect,
|
|
82
|
-
children:
|
|
84
|
+
children: _chunkNQGMWK5Ccjs.renderDayContent.call(void 0, date.day, { showSecondary, date, calendarSystem })
|
|
83
85
|
}
|
|
84
86
|
) });
|
|
85
87
|
}
|
|
86
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactariacomponents.CalendarCell, { date, className: "ddga-calendar__cell", children: ({ formattedDate }) =>
|
|
88
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactariacomponents.CalendarCell, { date, className: "ddga-calendar__cell", children: ({ formattedDate }) => _chunkNQGMWK5Ccjs.renderDayContent.call(void 0, formattedDate, { showSecondary, date, calendarSystem }) });
|
|
87
89
|
}
|
|
88
90
|
function DatePicker({
|
|
89
91
|
value: controlledValue,
|
|
@@ -113,14 +115,14 @@ function DatePicker({
|
|
|
113
115
|
}) {
|
|
114
116
|
const isValueControlled = controlledValue !== void 0;
|
|
115
117
|
const [internalValue, setInternalValue] = _react.useState.call(void 0,
|
|
116
|
-
() =>
|
|
118
|
+
() => _chunkNQGMWK5Ccjs.dateToCalendarDate.call(void 0, defaultValue)
|
|
117
119
|
);
|
|
118
|
-
const value = isValueControlled ?
|
|
120
|
+
const value = isValueControlled ? _chunkNQGMWK5Ccjs.dateToCalendarDate.call(void 0, controlledValue) : internalValue;
|
|
119
121
|
const handleAriaChange = _react.useCallback.call(void 0,
|
|
120
122
|
(next) => {
|
|
121
123
|
const nextCD = next ? new (0, _date.CalendarDate)(next.year, next.month, next.day) : null;
|
|
122
124
|
if (!isValueControlled) setInternalValue(nextCD);
|
|
123
|
-
_optionalChain([onChange, 'optionalCall', _3 => _3(
|
|
125
|
+
_optionalChain([onChange, 'optionalCall', _3 => _3(_chunkNQGMWK5Ccjs.calendarDateToDate.call(void 0, nextCD))]);
|
|
124
126
|
},
|
|
125
127
|
[isValueControlled, onChange]
|
|
126
128
|
);
|
|
@@ -143,10 +145,10 @@ function DatePicker({
|
|
|
143
145
|
resolvedLabels,
|
|
144
146
|
navLabels,
|
|
145
147
|
a11yLabels
|
|
146
|
-
} =
|
|
147
|
-
const { pressed, pressHandlers } =
|
|
148
|
-
const ariaMinValue = _react.useMemo.call(void 0, () => _nullishCoalesce(
|
|
149
|
-
const ariaMaxValue = _react.useMemo.call(void 0, () => _nullishCoalesce(
|
|
148
|
+
} = _chunkNQGMWK5Ccjs.useCalendarChrome.call(void 0, calendarSystem, calendarLabels);
|
|
149
|
+
const { pressed, pressHandlers } = _chunkNQGMWK5Ccjs.usePressedState.call(void 0, );
|
|
150
|
+
const ariaMinValue = _react.useMemo.call(void 0, () => _nullishCoalesce(_chunkNQGMWK5Ccjs.dateToCalendarDate.call(void 0, minValue), () => ( void 0)), [minValue]);
|
|
151
|
+
const ariaMaxValue = _react.useMemo.call(void 0, () => _nullishCoalesce(_chunkNQGMWK5Ccjs.dateToCalendarDate.call(void 0, maxValue), () => ( void 0)), [maxValue]);
|
|
150
152
|
const dialogAriaLabel = _nullishCoalesce(ariaLabel, () => ( (typeof label === "string" ? label : ariaLabelledBy ? void 0 : dgaLocale.startsWith("ar") ? "\u0627\u0644\u062A\u0627\u0631\u064A\u062E" : "Date")));
|
|
151
153
|
const showToggle = showCalendarToggle && !isCalendarControlled;
|
|
152
154
|
const hasError = !!error;
|
|
@@ -236,7 +238,7 @@ function DatePicker({
|
|
|
236
238
|
"aria-labelledby": ariaLabelledBy,
|
|
237
239
|
children: [
|
|
238
240
|
showToggle && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
239
|
-
|
|
241
|
+
_chunkNQGMWK5Ccjs.CalendarSystemToggle,
|
|
240
242
|
{
|
|
241
243
|
value: calendarSystem,
|
|
242
244
|
onChange: setCalendar,
|
|
@@ -247,7 +249,7 @@ function DatePicker({
|
|
|
247
249
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _reactariacomponents.Calendar, { className: "ddga-calendar", "data-slot": "date-picker-calendar", children: [
|
|
248
250
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "header", { className: "ddga-calendar__header", children: [
|
|
249
251
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
250
|
-
|
|
252
|
+
_chunkNQGMWK5Ccjs.CalendarNavHeader,
|
|
251
253
|
{
|
|
252
254
|
locale: ariaLocale,
|
|
253
255
|
monthLabel: navLabels.month,
|
|
@@ -275,17 +277,24 @@ function DatePicker({
|
|
|
275
277
|
)
|
|
276
278
|
] })
|
|
277
279
|
] }),
|
|
278
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
280
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
281
|
+
_reactariacomponents.CalendarGrid,
|
|
282
|
+
{
|
|
283
|
+
className: "ddga-calendar__grid",
|
|
284
|
+
weekdayStyle: _chunkNQGMWK5Ccjs.weekdayStyleForLocale.call(void 0, dgaLocale),
|
|
285
|
+
children: [
|
|
286
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactariacomponents.CalendarGridHeader, { children: (day) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactariacomponents.CalendarHeaderCell, { className: "ddga-calendar__weekday", children: _chunkNQGMWK5Ccjs.formatWeekdayLabel.call(void 0, day, dgaLocale) }) }),
|
|
287
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactariacomponents.CalendarGridBody, { children: (date) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
288
|
+
CalendarDayCell,
|
|
289
|
+
{
|
|
290
|
+
date,
|
|
291
|
+
showSecondary: showSecondaryCalendar,
|
|
292
|
+
calendarSystem
|
|
293
|
+
}
|
|
294
|
+
) })
|
|
295
|
+
]
|
|
296
|
+
}
|
|
297
|
+
)
|
|
289
298
|
] })
|
|
290
299
|
]
|
|
291
300
|
}
|
|
@@ -302,4 +311,4 @@ function DatePicker({
|
|
|
302
311
|
|
|
303
312
|
|
|
304
313
|
exports.datePickerTriggerVariants = datePickerTriggerVariants; exports.datePickerVariants = datePickerVariants; exports.DatePicker = DatePicker;
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
314
|
+
//# sourceMappingURL=chunk-SZ2AUE62.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-SZ2AUE62.cjs","../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"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","file":"/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-SZ2AUE62.cjs","sourcesContent":[null,"'use client';\n\nimport { useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\nimport {\n Button as AriaButton,\n Calendar as AriaCalendar,\n CalendarCell as AriaCalendarCell,\n CalendarGrid as AriaCalendarGrid,\n CalendarGridBody as AriaCalendarGridBody,\n CalendarGridHeader as AriaCalendarGridHeader,\n CalendarHeaderCell as AriaCalendarHeaderCell,\n CalendarStateContext as AriaCalendarStateContext,\n DateInput as AriaDateInput,\n DatePicker as AriaDatePicker,\n DateSegment as AriaDateSegment,\n Dialog as AriaDialog,\n FieldError as AriaFieldError,\n Group as AriaGroup,\n I18nProvider,\n Label as AriaLabel,\n Popover as AriaPopover,\n Text as AriaText,\n} from 'react-aria-components';\nimport { CalendarDate, type DateValue } from '@internationalized/date';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport {\n CalendarNavHeader,\n CalendarSystemToggle,\n calendarDateToDate,\n dateToCalendarDate,\n formatWeekdayLabel,\n renderDayContent,\n useCalendarChrome,\n usePressedState,\n weekdayStyleForLocale,\n type CalendarLabels,\n type CalendarSystem,\n} from '../../internal/calendar';\n\n// ─── 1. Variants ─── //\n\n// Applied to the Group (the trigger row). Heights match Input/Select sm/md so\n// a DatePicker lines up with other fields in a form row.\nconst datePickerTriggerVariants = cva('ddga-date-picker-trigger', {\n variants: {\n size: {\n md: 'ddga-date-picker-trigger--md',\n lg: 'ddga-date-picker-trigger--lg',\n },\n variant: {\n default: 'ddga-date-picker-trigger--default',\n 'filled-lighter': 'ddga-date-picker-trigger--filled-lighter',\n 'filled-darker': 'ddga-date-picker-trigger--filled-darker',\n },\n error: {\n true: 'ddga-date-picker-trigger--error',\n },\n },\n defaultVariants: {\n size: 'lg',\n variant: 'default',\n },\n});\n\n// Passthrough alias so the barrel `*Variants` convention holds across\n// components. Same value, different name.\nconst datePickerVariants = datePickerTriggerVariants;\n\n// ─── 2. Types ─── //\n\ninterface DatePickerProps extends VariantProps<typeof datePickerTriggerVariants> {\n /** Currently selected date (controlled). Local Y/M/D. */\n value?: Date | null;\n /** Initial value when uncontrolled. */\n defaultValue?: Date | null;\n /** Fires whenever the user picks a day. `null` when cleared. */\n onChange?: (value: Date | null) => void;\n /** Earliest pickable date (inclusive). */\n minValue?: Date;\n /** Latest pickable date (inclusive). */\n maxValue?: Date;\n /** Visible label above the trigger. */\n label?: ReactNode;\n /** Hint shown below the trigger. Hidden while an error message is showing. */\n helperText?: ReactNode;\n /** Message shown below the trigger when `error` is true. */\n errorMessage?: ReactNode;\n /** Marks the field invalid — sets `aria-invalid` and error styling. */\n error?: boolean;\n /** Marks the field required — adds the asterisk + `aria-required`. */\n required?: boolean;\n /** Disables the trigger entirely. */\n disabled?: boolean;\n /** Read-only: value is shown but not editable (segments + calendar locked). */\n readOnly?: boolean;\n /** Caller-supplied id for the field. */\n id?: string;\n /** Forwarded to the Group (the trigger row), matching Input/Select. */\n className?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n /**\n * Calendar system (controlled). Omit to let the user toggle freely with\n * the in-popover switch.\n */\n calendar?: CalendarSystem;\n /** Initial calendar system when uncontrolled. Defaults to `'gregorian'`. */\n defaultCalendar?: CalendarSystem;\n /** Fires whenever the calendar system toggles. */\n onCalendarChange?: (calendar: CalendarSystem) => void;\n /**\n * Show the Gregorian↔Hijri toggle inside the popover. Defaults to `true`,\n * but is forced off when `calendar` is controlled — a toggle that ignores\n * its click is a worse footgun than no toggle.\n */\n showCalendarToggle?: boolean;\n /** Override the toggle labels. Defaults are locale-aware (English / Arabic). */\n calendarLabels?: CalendarLabels;\n /**\n * When `true`, each day cell also shows the *other* calendar's day number\n * as small secondary text (e.g., Hijri active → Gregorian day shown small\n * underneath). Helps users cross-reference dates between calendar systems\n * without round-tripping the toggle. Defaults to `false`.\n */\n showSecondaryCalendar?: boolean;\n}\n\n// ─── 3. Outside-month cell wrapper (single-date only) ─── //\n\n// react-aria marks outside-month cells as disabled by design — the standard\n// Calendar UX uses arrows / dropdowns / keyboard for cross-month navigation.\n// But many DGA flows want one-click selection of an adjacent month's day, so\n// we render a parallel <button> for those cells that bypasses the disabled\n// state, drives `setFocusedDate` + `selectDate` manually, and preserves the\n// rest of react-aria's a11y wiring for inside-month cells.\n//\n// This lives in DatePicker (not the shared core) because its `isSelected` check\n// reads `state.value` as a single CalendarDate — that doesn't generalize to a\n// range, where `state.value` is `{ start, end }`. DateRangePicker uses\n// react-aria's default outside-month behavior instead.\nfunction CalendarDayCell({ date, showSecondary, calendarSystem }: CalendarDayCellProps) {\n const state = useContext(AriaCalendarStateContext);\n\n // Visible range start tells us the \"current\" month being shown. Anything\n // with a different (year, month) pair is outside-month.\n const start = state?.visibleRange.start;\n const isOutside = !!start && (date.year !== start.year || date.month !== start.month);\n\n // For outside-month cells, also confirm they're inside min/max bounds —\n // otherwise they should genuinely render disabled. `state.isInvalid` is\n // bounds-only (min/max); `isCellDisabled` also marks outside-month as\n // disabled internally, which would block our wrapper from activating.\n const isOutOfBounds = state ? state.isInvalid(date) : false;\n\n if (state && isOutside && !isOutOfBounds) {\n const selected = state.value;\n const isSelected =\n !!selected &&\n selected.year === date.year &&\n selected.month === date.month &&\n selected.day === date.day;\n\n const handleSelect = () => {\n // Update focused-month first so the visible page jumps, then commit the\n // selection. React batches these into one re-render.\n state.setFocusedDate(date);\n state.selectDate(date);\n };\n\n return (\n <td role=\"gridcell\">\n <button\n type=\"button\"\n // Outside the keyboard nav chain (react-aria's inside-month cells own\n // that). Mouse users get the shortcut; keyboard users navigate via\n // arrows or the month/year dropdowns.\n tabIndex={-1}\n className=\"ddga-calendar__cell\"\n data-outside-month=\"\"\n data-selected={isSelected ? '' : undefined}\n data-slot=\"date-picker-day-cell\"\n onClick={handleSelect}\n >\n {renderDayContent(date.day, { showSecondary, date, calendarSystem })}\n </button>\n </td>\n );\n }\n\n return (\n <AriaCalendarCell date={date} className=\"ddga-calendar__cell\">\n {({ formattedDate }) =>\n renderDayContent(formattedDate, { showSecondary, date, calendarSystem })\n }\n </AriaCalendarCell>\n );\n}\n\ninterface CalendarDayCellProps {\n date: CalendarDate;\n showSecondary: boolean;\n calendarSystem: CalendarSystem;\n}\n\n// ─── 4. Component ─── //\n\nfunction DatePicker({\n value: controlledValue,\n defaultValue,\n onChange,\n minValue,\n maxValue,\n label,\n helperText,\n errorMessage,\n error,\n required,\n disabled,\n readOnly,\n size,\n variant,\n id,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n calendar: controlledCalendar,\n defaultCalendar = 'gregorian',\n onCalendarChange,\n showCalendarToggle = true,\n calendarLabels,\n showSecondaryCalendar = false,\n}: DatePickerProps) {\n // ─ value: controlled or uncontrolled, always Gregorian internally ─\n const isValueControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState<CalendarDate | null>(() =>\n dateToCalendarDate(defaultValue),\n );\n const value = isValueControlled ? dateToCalendarDate(controlledValue) : internalValue;\n\n const handleAriaChange = useCallback(\n (next: DateValue | null) => {\n const nextCD = next ? new CalendarDate(next.year, next.month, next.day) : null;\n if (!isValueControlled) setInternalValue(nextCD);\n onChange?.(calendarDateToDate(nextCD));\n },\n [isValueControlled, onChange],\n );\n\n // ─ calendar system: controlled or uncontrolled ─\n const isCalendarControlled = controlledCalendar !== undefined;\n const [internalCalendar, setInternalCalendar] = useState<CalendarSystem>(defaultCalendar);\n const calendarSystem = isCalendarControlled ? controlledCalendar : internalCalendar;\n\n const setCalendar = useCallback(\n (next: CalendarSystem) => {\n if (!isCalendarControlled) setInternalCalendar(next);\n onCalendarChange?.(next);\n },\n [isCalendarControlled, onCalendarChange],\n );\n\n // ─ Shared chrome (locale, portal, chevrons, labels) ─\n const {\n dgaLocale,\n locale: ariaLocale,\n portalContainer,\n PrevArrow,\n NextArrow,\n resolvedLabels,\n navLabels,\n a11yLabels,\n } = useCalendarChrome(calendarSystem, calendarLabels);\n const { pressed, pressHandlers } = usePressedState();\n\n // ─ Bounds ─\n const ariaMinValue = useMemo(() => dateToCalendarDate(minValue) ?? undefined, [minValue]);\n const ariaMaxValue = useMemo(() => dateToCalendarDate(maxValue) ?? undefined, [maxValue]);\n\n // ─ Popover aria-label fallback ─\n // Dialog requires an accessible name; derive from the field label when\n // possible (string-only), else fall back to a generic so a11y stays valid\n // even when consumers compose a rich label node.\n const dialogAriaLabel =\n ariaLabel ??\n (typeof label === 'string'\n ? label\n : ariaLabelledBy\n ? undefined\n : dgaLocale.startsWith('ar')\n ? 'التاريخ'\n : 'Date');\n\n // ─ Toggle visibility ─\n const showToggle = showCalendarToggle && !isCalendarControlled;\n\n // ─ Derived field-message visibility (mirrors useFieldA11y rules) ─\n const hasError = !!error;\n const hasErrorMessage = hasError && errorMessage != null && errorMessage !== '';\n const hasHelper = !hasErrorMessage && helperText != null && helperText !== '';\n\n return (\n <I18nProvider locale={ariaLocale}>\n <AriaDatePicker\n value={value}\n onChange={handleAriaChange}\n minValue={ariaMinValue}\n maxValue={ariaMaxValue}\n isRequired={required}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isInvalid={hasError}\n shouldCloseOnSelect\n id={id}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n className=\"ddga-field\"\n data-slot=\"date-picker-field\"\n >\n {label && (\n <AriaLabel className=\"ddga-date-picker__label\">\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"ddga-date-picker__required\">\n *\n </span>\n )}\n </AriaLabel>\n )}\n <AriaGroup\n data-slot=\"date-picker-trigger\"\n data-readonly={readOnly ? '' : undefined}\n data-pressed={pressed ? '' : undefined}\n {...pressHandlers}\n className={cn(datePickerTriggerVariants({ size, variant, error: hasError }), className)}\n >\n <AriaDateInput className=\"ddga-date-picker__input\" data-slot=\"date-picker-input\">\n {(segment) => (\n <AriaDateSegment\n segment={segment}\n className=\"ddga-date-picker__segment\"\n data-slot=\"date-picker-segment\"\n />\n )}\n </AriaDateInput>\n {/* SDGA field has no calendar icon — the field itself opens the\n calendar. The button is the (iconless) click surface filling the\n field's trailing space; segments stay editable. */}\n <AriaButton\n className=\"ddga-date-picker__open\"\n aria-label={a11yLabels.openCalendar}\n data-slot=\"date-picker-trigger-button\"\n />\n </AriaGroup>\n {hasHelper && (\n <AriaText\n slot=\"description\"\n className=\"ddga-field__message ddga-field__message--helper\"\n data-slot=\"field-helper\"\n >\n {helperText}\n </AriaText>\n )}\n {hasErrorMessage && (\n <AriaFieldError\n className=\"ddga-field__message ddga-field__message--error\"\n data-slot=\"field-error\"\n >\n {errorMessage}\n </AriaFieldError>\n )}\n <AriaPopover\n UNSTABLE_portalContainer={portalContainer}\n className=\"ddga-calendar-popover\"\n data-slot=\"date-picker-popover\"\n offset={6}\n // Keep some breathing room from the viewport edge so the popover\n // doesn't butt up against the bottom of the iframe in short\n // containers (the Storybook canvas case). Combined with the inner\n // Dialog's overflow:auto, the calendar will scroll if it can't fit.\n containerPadding={12}\n >\n <AriaDialog\n className=\"ddga-calendar-dialog\"\n data-slot=\"date-picker-dialog\"\n aria-label={dialogAriaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {showToggle && (\n <CalendarSystemToggle\n value={calendarSystem}\n onChange={setCalendar}\n labels={resolvedLabels}\n groupLabel={a11yLabels.calendarSystem}\n />\n )}\n <AriaCalendar className=\"ddga-calendar\" data-slot=\"date-picker-calendar\">\n <header className=\"ddga-calendar__header\">\n <CalendarNavHeader\n locale={ariaLocale}\n monthLabel={navLabels.month}\n yearLabel={navLabels.year}\n />\n <div className=\"ddga-calendar__nav-group\">\n <AriaButton\n slot=\"previous\"\n className=\"ddga-calendar__nav\"\n data-slot=\"date-picker-calendar-prev\"\n >\n <PrevArrow aria-hidden=\"true\" />\n </AriaButton>\n <AriaButton\n slot=\"next\"\n className=\"ddga-calendar__nav\"\n data-slot=\"date-picker-calendar-next\"\n >\n <NextArrow aria-hidden=\"true\" />\n </AriaButton>\n </div>\n </header>\n <AriaCalendarGrid\n className=\"ddga-calendar__grid\"\n weekdayStyle={weekdayStyleForLocale(dgaLocale)}\n >\n <AriaCalendarGridHeader>\n {(day) => (\n <AriaCalendarHeaderCell className=\"ddga-calendar__weekday\">\n {formatWeekdayLabel(day, dgaLocale)}\n </AriaCalendarHeaderCell>\n )}\n </AriaCalendarGridHeader>\n <AriaCalendarGridBody>\n {(date) => (\n <CalendarDayCell\n date={date}\n showSecondary={showSecondaryCalendar}\n calendarSystem={calendarSystem}\n />\n )}\n </AriaCalendarGridBody>\n </AriaCalendarGrid>\n </AriaCalendar>\n </AriaDialog>\n </AriaPopover>\n </AriaDatePicker>\n </I18nProvider>\n );\n}\n\n// ─── 5. Exports ─── //\n\nexport { DatePicker, datePickerTriggerVariants, datePickerVariants };\nexport type { DatePickerProps, CalendarSystem, CalendarLabels };\n"]}
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
var _chunkEQINOHB6cjs = require('./chunk-EQINOHB6.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var _chunk5NENDJOMcjs = require('./chunk-5NENDJOM.cjs');
|
|
7
6
|
|
|
8
7
|
|
|
9
8
|
|
|
9
|
+
var _chunkYS2JJ73Mcjs = require('./chunk-YS2JJ73M.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunk5NENDJOMcjs = require('./chunk-5NENDJOM.cjs');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
var _chunkV6MXOJQ4cjs = require('./chunk-V6MXOJQ4.cjs');
|
|
@@ -127,4 +127,4 @@ function SearchBox({
|
|
|
127
127
|
|
|
128
128
|
|
|
129
129
|
exports.SearchBox = SearchBox;
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
130
|
+
//# sourceMappingURL=chunk-TGM4JFWI.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-TGM4JFWI.cjs","../src/components/SearchBox/SearchBox.tsx"],"names":[],"mappings":"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","file":"/home/devdhaif/work/react/dga-dev/packages/react/dist/chunk-TGM4JFWI.cjs","sourcesContent":[null,"'use client';\n\nimport { useCallback, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport { TextInput, type TextInputProps } from '../TextInput';\nimport { Button } from '../Button';\nimport { SearchGlyph, Close, Mic, HelpCircleGlyph } from '../../internal/icons';\n\n// SearchBox composes TextInput — it reuses TextInput's field a11y (label /\n// helper / error), state + fill styles and adornment slots — and adds the SDGA\n// Search Box chrome: a leading magnifier, the voice-search mic (SDGA's trailing\n// icon), Escape-to-clear, `onSearch`, and an off-spec clear (×). It is a form\n// control, so (like TextInput) it does NOT take `asChild`.\ninterface SearchBoxProps extends Omit<TextInputProps, 'startAdornment' | 'endAdornment' | 'type'> {\n /** Fires on Enter with the current query string. */\n onSearch?: (value: string) => void;\n /** Show the SDGA voice-search mic while the field is empty. Default `true`. */\n voiceSearch?: boolean;\n /** Fires when the voice-search mic is activated, with the current query. */\n onVoiceSearch?: (value: string) => void;\n /** Fires when the field is cleared (clear button or Escape). */\n onClear?: () => void;\n /** Show the clear (×) button while the field has a value. Default `true`. */\n clearable?: boolean;\n /** Accessible label for the clear button. Default `'Clear search'`. */\n clearLabel?: string;\n /** Accessible label for the voice-search mic. Default `'Search by voice'`. */\n voiceLabel?: string;\n}\n\n// Set the value via the native setter (bypasses React's value tracker) + dispatch `input`,\n// so clear() fires onChange identically in controlled and uncontrolled mode.\nfunction setNativeInputValue(el: HTMLInputElement, value: string) {\n const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;\n setter?.call(el, value);\n el.dispatchEvent(new Event('input', { bubbles: true }));\n}\n\nfunction SearchBox({\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onSearch,\n voiceSearch = true,\n onVoiceSearch,\n onClear,\n clearable = true,\n clearLabel = 'Clear search',\n voiceLabel = 'Search by voice',\n helperIcon = <HelpCircleGlyph width={16} height={16} aria-hidden=\"true\" />,\n disabled,\n readOnly,\n className,\n ref,\n ...rest\n}: SearchBoxProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // We need the input node internally (clear() refocuses it), but consumers can\n // also pass a `ref` (TextInputProps advertises it). Merge both onto one\n // callback so neither clobbers the other.\n const setRefs = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n // Internally controlled: we always feed `value` to the inner input so the\n // clear button's visibility tracks the current text in both modes.\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string>(\n defaultValue != null ? String(defaultValue) : '',\n );\n const currentValue = isControlled ? String(value ?? '') : internal;\n\n const isLocked = !!disabled || !!readOnly;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternal(event.target.value);\n onChange?.(event);\n };\n\n const clear = () => {\n if (isLocked) return;\n const el = inputRef.current;\n if (!el) return;\n setNativeInputValue(el, '');\n el.focus();\n onClear?.();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (event.key === 'Enter') {\n onSearch?.(currentValue);\n } else if (event.key === 'Escape' && currentValue.length > 0 && !isLocked) {\n // First Escape clears the query; stop it here so a parent overlay\n // (Modal/Popover) only closes on a second, now-empty Escape.\n event.preventDefault();\n event.stopPropagation();\n clear();\n }\n };\n\n const showClear = clearable && currentValue.length > 0 && !isLocked;\n const showVoice = voiceSearch && !showClear;\n\n const trailing = showClear ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={clearLabel}\n data-slot=\"search-box-clear\"\n onClick={clear}\n >\n <Close aria-hidden=\"true\" />\n </Button>\n ) : showVoice ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={voiceLabel}\n data-slot=\"search-box-voice\"\n disabled={isLocked}\n onClick={() => onVoiceSearch?.(currentValue)}\n >\n <Mic aria-hidden=\"true\" />\n </Button>\n ) : undefined;\n\n return (\n <TextInput\n {...rest}\n ref={setRefs}\n type=\"search\"\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n readOnly={readOnly}\n helperIcon={helperIcon}\n className={cn('ddga-search-box', className)}\n startAdornment={<SearchGlyph data-slot=\"search-box-icon\" aria-hidden=\"true\" />}\n endAdornment={trailing}\n />\n );\n}\n\nexport { SearchBox };\nexport type { SearchBoxProps };\n"]}
|