@particle-academy/react-fancy 5.31.0 → 5.33.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 +94 -0
- package/LICENSE +21 -0
- package/dist/accordion-panel.cjs +8 -8
- package/dist/accordion-panel.js +2 -2
- package/dist/autocomplete.cjs +3 -3
- package/dist/autocomplete.js +2 -2
- package/dist/carousel.cjs +8 -8
- package/dist/carousel.js +2 -2
- package/dist/checkbox-group.cjs +3 -3
- package/dist/checkbox-group.js +2 -2
- package/dist/checkbox.cjs +3 -3
- package/dist/checkbox.js +2 -2
- package/dist/{chunk-7MSIREUY.cjs → chunk-23FTDEGR.cjs} +59 -27
- package/dist/chunk-23FTDEGR.cjs.map +1 -0
- package/dist/{chunk-TQFQUNV3.js → chunk-2KAJ4L7C.js} +3 -3
- package/dist/{chunk-TQFQUNV3.js.map → chunk-2KAJ4L7C.js.map} +1 -1
- package/dist/{chunk-L5KKMJ2Q.js → chunk-2VIDYJUG.js} +3 -3
- package/dist/{chunk-L5KKMJ2Q.js.map → chunk-2VIDYJUG.js.map} +1 -1
- package/dist/{chunk-NH5XJ6VD.js → chunk-2XAVAPDA.js} +58 -27
- package/dist/chunk-2XAVAPDA.js.map +1 -0
- package/dist/{chunk-3EIB7RPD.cjs → chunk-3Q4NSAEA.cjs} +4 -4
- package/dist/{chunk-3EIB7RPD.cjs.map → chunk-3Q4NSAEA.cjs.map} +1 -1
- package/dist/{chunk-H6F6ZWAG.js → chunk-4HRD4S25.js} +3 -3
- package/dist/{chunk-H6F6ZWAG.js.map → chunk-4HRD4S25.js.map} +1 -1
- package/dist/{chunk-LY7PZEF4.cjs → chunk-6IBBAOQC.cjs} +4 -4
- package/dist/{chunk-LY7PZEF4.cjs.map → chunk-6IBBAOQC.cjs.map} +1 -1
- package/dist/{chunk-RFLPFQFF.js → chunk-BMTTSBHF.js} +3 -3
- package/dist/{chunk-RFLPFQFF.js.map → chunk-BMTTSBHF.js.map} +1 -1
- package/dist/{chunk-ASCATIDJ.js → chunk-BQ77ZWFM.js} +6 -6
- package/dist/{chunk-ASCATIDJ.js.map → chunk-BQ77ZWFM.js.map} +1 -1
- package/dist/{chunk-JM2H642B.cjs → chunk-BVRPDMB7.cjs} +4 -4
- package/dist/{chunk-JM2H642B.cjs.map → chunk-BVRPDMB7.cjs.map} +1 -1
- package/dist/{chunk-JDRKYYXP.cjs → chunk-BZDXX6E3.cjs} +4 -4
- package/dist/{chunk-JDRKYYXP.cjs.map → chunk-BZDXX6E3.cjs.map} +1 -1
- package/dist/{chunk-VUKIFFWK.cjs → chunk-BZZDHDMK.cjs} +5 -5
- package/dist/{chunk-VUKIFFWK.cjs.map → chunk-BZZDHDMK.cjs.map} +1 -1
- package/dist/{chunk-6SO2ZX3J.cjs → chunk-DHIUMQLP.cjs} +4 -4
- package/dist/{chunk-6SO2ZX3J.cjs.map → chunk-DHIUMQLP.cjs.map} +1 -1
- package/dist/chunk-EDYAXGUM.js +27 -0
- package/dist/chunk-EDYAXGUM.js.map +1 -0
- package/dist/{chunk-MRRKDRZU.js → chunk-EIUS2K72.js} +3 -3
- package/dist/{chunk-MRRKDRZU.js.map → chunk-EIUS2K72.js.map} +1 -1
- package/dist/{chunk-6PF5ENWM.js → chunk-F2GAZZVS.js} +3 -3
- package/dist/{chunk-6PF5ENWM.js.map → chunk-F2GAZZVS.js.map} +1 -1
- package/dist/{chunk-VME5743O.js → chunk-FNEPZ33A.js} +3 -3
- package/dist/{chunk-VME5743O.js.map → chunk-FNEPZ33A.js.map} +1 -1
- package/dist/{chunk-JP4C3ROX.js → chunk-FNJDMGJ3.js} +3 -3
- package/dist/{chunk-JP4C3ROX.js.map → chunk-FNJDMGJ3.js.map} +1 -1
- package/dist/{chunk-UA2C2U3M.cjs → chunk-FPZYPD3N.cjs} +4 -4
- package/dist/{chunk-UA2C2U3M.cjs.map → chunk-FPZYPD3N.cjs.map} +1 -1
- package/dist/{chunk-SX4CSO6C.js → chunk-FSRPZYZZ.js} +3 -3
- package/dist/{chunk-SX4CSO6C.js.map → chunk-FSRPZYZZ.js.map} +1 -1
- package/dist/{chunk-IRD6UXDK.cjs → chunk-FVTCPERB.cjs} +5 -5
- package/dist/{chunk-IRD6UXDK.cjs.map → chunk-FVTCPERB.cjs.map} +1 -1
- package/dist/{chunk-FUG3OCGP.js → chunk-G73TVXDQ.js} +3 -3
- package/dist/{chunk-FUG3OCGP.js.map → chunk-G73TVXDQ.js.map} +1 -1
- package/dist/{chunk-LHNC42J3.cjs → chunk-IPNJMHJ3.cjs} +4 -4
- package/dist/{chunk-LHNC42J3.cjs.map → chunk-IPNJMHJ3.cjs.map} +1 -1
- package/dist/{chunk-PIFJECFU.js → chunk-LBU3T2LF.js} +3 -3
- package/dist/{chunk-PIFJECFU.js.map → chunk-LBU3T2LF.js.map} +1 -1
- package/dist/{chunk-YAJYIRQL.cjs → chunk-LLA33GKC.cjs} +4 -4
- package/dist/{chunk-YAJYIRQL.cjs.map → chunk-LLA33GKC.cjs.map} +1 -1
- package/dist/{chunk-HIOMHITU.cjs → chunk-LQFQ2UKU.cjs} +5 -5
- package/dist/{chunk-HIOMHITU.cjs.map → chunk-LQFQ2UKU.cjs.map} +1 -1
- package/dist/{chunk-6ZDXG5VC.js → chunk-NBAHXZHJ.js} +3 -3
- package/dist/{chunk-6ZDXG5VC.js.map → chunk-NBAHXZHJ.js.map} +1 -1
- package/dist/{chunk-IUT3Q2EC.js → chunk-NE3Z4AWP.js} +3 -3
- package/dist/{chunk-IUT3Q2EC.js.map → chunk-NE3Z4AWP.js.map} +1 -1
- package/dist/{chunk-MIUSTEIV.js → chunk-O2ZHORSC.js} +3 -3
- package/dist/{chunk-MIUSTEIV.js.map → chunk-O2ZHORSC.js.map} +1 -1
- package/dist/{chunk-L2FPIFMN.js → chunk-OC75GWX5.js} +3 -3
- package/dist/{chunk-L2FPIFMN.js.map → chunk-OC75GWX5.js.map} +1 -1
- package/dist/{chunk-GKEWT3DW.js → chunk-OTCLBINT.js} +3 -3
- package/dist/{chunk-GKEWT3DW.js.map → chunk-OTCLBINT.js.map} +1 -1
- package/dist/{chunk-XXBW4EUO.js → chunk-P7Q2YIIS.js} +3 -3
- package/dist/{chunk-XXBW4EUO.js.map → chunk-P7Q2YIIS.js.map} +1 -1
- package/dist/{chunk-YTXBU6QC.cjs → chunk-QBNR5IVM.cjs} +4 -4
- package/dist/{chunk-YTXBU6QC.cjs.map → chunk-QBNR5IVM.cjs.map} +1 -1
- package/dist/{chunk-I3RPL3GE.js → chunk-RUSRAKKA.js} +3 -3
- package/dist/{chunk-I3RPL3GE.js.map → chunk-RUSRAKKA.js.map} +1 -1
- package/dist/{chunk-ZTC3EQFZ.cjs → chunk-S5KUYX3Z.cjs} +4 -4
- package/dist/{chunk-ZTC3EQFZ.cjs.map → chunk-S5KUYX3Z.cjs.map} +1 -1
- package/dist/chunk-SNHU2AI4.cjs +29 -0
- package/dist/chunk-SNHU2AI4.cjs.map +1 -0
- package/dist/{chunk-JV6RDIA6.cjs → chunk-T45XK5GN.cjs} +7 -7
- package/dist/{chunk-JV6RDIA6.cjs.map → chunk-T45XK5GN.cjs.map} +1 -1
- package/dist/{chunk-RKG2Q2HT.cjs → chunk-U7PFHQBN.cjs} +4 -4
- package/dist/{chunk-RKG2Q2HT.cjs.map → chunk-U7PFHQBN.cjs.map} +1 -1
- package/dist/{chunk-LAQGBLIU.cjs → chunk-VKXNCYLE.cjs} +14 -5
- package/dist/chunk-VKXNCYLE.cjs.map +1 -0
- package/dist/{chunk-3FG5K7A7.js → chunk-VYHZEQIG.js} +3 -3
- package/dist/{chunk-3FG5K7A7.js.map → chunk-VYHZEQIG.js.map} +1 -1
- package/dist/{chunk-32HCJ5GD.js → chunk-W6RDAZJC.js} +14 -5
- package/dist/chunk-W6RDAZJC.js.map +1 -0
- package/dist/{chunk-N6K2CTSU.cjs → chunk-WIS4QRGK.cjs} +4 -4
- package/dist/{chunk-N6K2CTSU.cjs.map → chunk-WIS4QRGK.cjs.map} +1 -1
- package/dist/{chunk-2LBRS6Z4.js → chunk-XDJSFGXW.js} +3 -3
- package/dist/{chunk-2LBRS6Z4.js.map → chunk-XDJSFGXW.js.map} +1 -1
- package/dist/{chunk-6LOV75CN.cjs → chunk-XK5WHQ3O.cjs} +4 -4
- package/dist/{chunk-6LOV75CN.cjs.map → chunk-XK5WHQ3O.cjs.map} +1 -1
- package/dist/{chunk-B5KK7NYP.cjs → chunk-Y52NXM73.cjs} +4 -4
- package/dist/{chunk-B5KK7NYP.cjs.map → chunk-Y52NXM73.cjs.map} +1 -1
- package/dist/{chunk-YLDYGT5O.js → chunk-YD4SXA6K.js} +3 -3
- package/dist/{chunk-YLDYGT5O.js.map → chunk-YD4SXA6K.js.map} +1 -1
- package/dist/{chunk-NR346SKH.cjs → chunk-YMDYDUBH.cjs} +4 -4
- package/dist/{chunk-NR346SKH.cjs.map → chunk-YMDYDUBH.cjs.map} +1 -1
- package/dist/{chunk-SCGE6DCE.cjs → chunk-YMU3SS6D.cjs} +14 -14
- package/dist/{chunk-SCGE6DCE.cjs.map → chunk-YMU3SS6D.cjs.map} +1 -1
- package/dist/{chunk-PWLBHNOA.cjs → chunk-Z3NSPDTW.cjs} +4 -4
- package/dist/{chunk-PWLBHNOA.cjs.map → chunk-Z3NSPDTW.cjs.map} +1 -1
- package/dist/{chunk-BJYTI2ID.cjs → chunk-ZUQUL53P.cjs} +4 -4
- package/dist/{chunk-BJYTI2ID.cjs.map → chunk-ZUQUL53P.cjs.map} +1 -1
- package/dist/color-picker.cjs +3 -3
- package/dist/color-picker.js +2 -2
- package/dist/composer.cjs +3 -3
- package/dist/composer.d.cts +2 -50
- package/dist/composer.d.ts +2 -50
- package/dist/composer.js +2 -2
- package/dist/date-picker.cjs +3 -3
- package/dist/date-picker.js +2 -2
- package/dist/editor.cjs +4 -4
- package/dist/editor.js +2 -2
- package/dist/emoji-select.cjs +3 -3
- package/dist/emoji-select.js +2 -2
- package/dist/file-browser.cjs +6 -6
- package/dist/file-browser.js +2 -2
- package/dist/file-upload.cjs +3 -3
- package/dist/file-upload.js +1 -1
- package/dist/index-C8PKWA_5.d.cts +153 -0
- package/dist/index-C8PKWA_5.d.ts +153 -0
- package/dist/index.cjs +78 -74
- package/dist/index.d.cts +34 -1
- package/dist/index.d.ts +34 -1
- package/dist/index.js +25 -25
- package/dist/input.cjs +3 -3
- package/dist/input.js +2 -2
- package/dist/inputs.cjs +17 -17
- package/dist/inputs.js +9 -9
- package/dist/json-editor.cjs +17 -17
- package/dist/json-editor.js +6 -6
- package/dist/mobile-menu.cjs +1 -1
- package/dist/mobile-menu.js +1 -1
- package/dist/multi-switch.cjs +3 -3
- package/dist/multi-switch.js +2 -2
- package/dist/otp-input.cjs +3 -3
- package/dist/otp-input.js +2 -2
- package/dist/pillbox.cjs +3 -3
- package/dist/pillbox.js +2 -2
- package/dist/radio-group.cjs +3 -3
- package/dist/radio-group.js +2 -2
- package/dist/sidebar.cjs +4 -4
- package/dist/sidebar.js +2 -2
- package/dist/slider.cjs +3 -3
- package/dist/slider.js +2 -2
- package/dist/switch.cjs +3 -3
- package/dist/switch.js +2 -2
- package/dist/table.cjs +12 -12
- package/dist/table.js +2 -2
- package/dist/tabs.cjs +4 -4
- package/dist/tabs.js +2 -2
- package/dist/time-picker.cjs +3 -3
- package/dist/time-picker.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-32HCJ5GD.js.map +0 -1
- package/dist/chunk-6FQGMVF2.js +0 -25
- package/dist/chunk-6FQGMVF2.js.map +0 -1
- package/dist/chunk-7MSIREUY.cjs.map +0 -1
- package/dist/chunk-LAQGBLIU.cjs.map +0 -1
- package/dist/chunk-NH5XJ6VD.js.map +0 -1
- package/dist/chunk-OUOEQZHY.cjs +0 -27
- package/dist/chunk-OUOEQZHY.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/FileUpload/FileUpload.context.ts","../src/components/FileUpload/FileUploadDropzone.tsx","../src/components/FileUpload/FileUploadList.tsx","../src/components/FileUpload/matchesAccept.ts","../src/components/FileUpload/FileUpload.tsx"],"names":["createContext","useContext","useState","useRef","useCallback","jsxs","cn","jsx","Fragment","Upload","useMemo","useEffect","File","X"],"mappings":"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","file":"chunk-VKXNCYLE.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { FileUploadContextValue } from \"./FileUpload.types\";\n\nexport const FileUploadContext =\n createContext<FileUploadContextValue | null>(null);\n\nexport function useFileUpload(): FileUploadContextValue {\n const ctx = useContext(FileUploadContext);\n if (!ctx) {\n throw new Error(\n \"FileUpload compound components must be used within <FileUpload>\",\n );\n }\n return ctx;\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { Upload } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileUpload } from \"./FileUpload.context\";\nimport type { FileUploadDropzoneProps } from \"./FileUpload.types\";\n\nexport function FileUploadDropzone({\n children,\n className,\n}: FileUploadDropzoneProps) {\n const { addFiles, disabled, accept, multiple } = useFileUpload();\n const [dragOver, setDragOver] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n if (disabled) return;\n addFiles(e.dataTransfer.files);\n },\n [addFiles, disabled],\n );\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback(() => setDragOver(false), []);\n\n return (\n <div\n data-react-fancy-file-upload-dropzone=\"\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => !disabled && inputRef.current?.click()}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center rounded-xl border-2 border-dashed p-8 text-center transition-colors\",\n dragOver\n ? \"border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-950\"\n : \"border-zinc-300 hover:border-zinc-400 dark:border-zinc-700 dark:hover:border-zinc-500\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={(e) => {\n if (e.target.files) addFiles(e.target.files);\n\n // Reset, or choosing the SAME file again fires no `change` event at\n // all and the gesture is simply dead — \"remove it, then re-add it\"\n // and \"retry the import that just failed\" both stop working. The\n // component never sees those files to reject them; it is not asked.\n e.target.value = \"\";\n }}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n />\n {children ?? (\n <>\n <Upload size={32} strokeWidth={1.5} className=\"mb-2 text-zinc-400\" />\n <p className=\"text-sm text-zinc-500\">\n Drop files here or click to browse\n </p>\n </>\n )}\n </div>\n );\n}\n\nFileUploadDropzone.displayName = \"FileUploadDropzone\";\n","import { useEffect, useMemo } from \"react\";\nimport { File, X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileUpload } from \"./FileUpload.context\";\nimport type { FileUploadListProps } from \"./FileUpload.types\";\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getExtension(name: string): string {\n const parts = name.split(\".\");\n return parts.length > 1 ? parts.pop()!.toUpperCase() : \"\";\n}\n\nfunction ThumbnailItem({ file, index, onRemove }: { file: File; index: number; onRemove: (i: number) => void }) {\n const isImage = file.type.startsWith(\"image/\");\n const objectUrl = useMemo(() => (isImage ? URL.createObjectURL(file) : null), [file, isImage]);\n\n useEffect(() => {\n return () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [objectUrl]);\n\n return (\n <div className=\"group relative flex w-20 flex-col items-center gap-1\">\n <div className=\"relative h-20 w-20 overflow-hidden rounded-lg border border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-800\">\n {isImage && objectUrl ? (\n <img src={objectUrl} alt={file.name} className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full flex-col items-center justify-center gap-1\">\n <File size={20} className=\"text-zinc-400\" />\n <span className=\"text-[10px] font-medium text-zinc-500\">{getExtension(file.name)}</span>\n </div>\n )}\n <button\n type=\"button\"\n onClick={() => onRemove(index)}\n className=\"absolute top-1 right-1 flex h-5 w-5 items-center justify-center rounded-full bg-black/60 text-white opacity-0 transition-opacity hover:bg-black/80 group-hover:opacity-100\"\n aria-label={`Remove ${file.name}`}\n >\n <X size={10} />\n </button>\n </div>\n <span className=\"w-full truncate text-center text-xs text-zinc-500\">{file.name}</span>\n </div>\n );\n}\n\nexport function FileUploadList({ thumbnail, className }: FileUploadListProps) {\n const { files, removeFile } = useFileUpload();\n\n if (files.length === 0) return null;\n\n if (thumbnail) {\n return (\n <div data-react-fancy-file-upload-list=\"\" className={cn(\"mt-3 flex flex-wrap gap-3\", className)}>\n {files.map((file, i) => (\n <ThumbnailItem key={`${file.name}-${i}`} file={file} index={i} onRemove={removeFile} />\n ))}\n </div>\n );\n }\n\n return (\n <ul data-react-fancy-file-upload-list=\"\" className={cn(\"mt-3 space-y-2\", className)}>\n {files.map((file, i) => (\n <li\n key={`${file.name}-${i}`}\n className=\"flex items-center gap-3 rounded-lg border border-zinc-200 px-3 py-2 text-sm dark:border-zinc-700\"\n >\n <File size={16} className=\"shrink-0 text-zinc-400\" />\n <span className=\"flex-1 truncate\">{file.name}</span>\n <span className=\"shrink-0 text-xs text-zinc-400\">\n {formatSize(file.size)}\n </span>\n <button\n type=\"button\"\n onClick={() => removeFile(i)}\n className=\"shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n aria-label={`Remove ${file.name}`}\n >\n <X size={14} />\n </button>\n </li>\n ))}\n </ul>\n );\n}\n\nFileUploadList.displayName = \"FileUploadList\";\n","/**\n * Does a file satisfy an `accept` string?\n *\n * The browser enforces `accept` in the FILE PICKER only. A drag-and-drop never\n * opens a picker, so on the drop path this is the only thing standing between an\n * image-only dropzone and a dropped executable. Forwarding the attribute to the\n * hidden input is half the job; this is the other half.\n *\n * Follows the HTML `accept` grammar: a comma-separated list of extensions\n * (`.csv`), exact MIME types (`text/plain`) and type wildcards (`image/*`).\n * Matching is case-insensitive, because a drop reports whatever the OS says and\n * `TEXT/PLAIN` is a real thing to receive.\n *\n * A dropped file often carries an EMPTY `type` — the OS may not know it and\n * `File.type` is a hint, never a guarantee. That is why extension rules are\n * checked against the name and not the type: an `accept=\".csv\"` zone has to work\n * for a .csv whose type is `\"\"`, which is the common case rather than the edge.\n */\nexport function matchesAccept(file: File, accept: string): boolean {\n const rules = accept\n .split(\",\")\n .map((rule) => rule.trim().toLowerCase())\n .filter(Boolean);\n\n // An accept string that lists nothing constrains nothing. Failing closed here\n // would turn `accept=\"\"` into a dropzone that silently swallows every file.\n if (rules.length === 0) return true;\n\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n\n return rules.some((rule) => {\n if (rule.startsWith(\".\")) return name.endsWith(rule);\n if (rule.endsWith(\"/*\")) return type.startsWith(rule.slice(0, -1));\n return type === rule;\n });\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { FileUploadContext } from \"./FileUpload.context\";\nimport { FileUploadDropzone } from \"./FileUploadDropzone\";\nimport { FileUploadList } from \"./FileUploadList\";\nimport { matchesAccept } from \"./matchesAccept\";\nimport type { FileUploadProps } from \"./FileUpload.types\";\n\nfunction FileUploadRoot({\n children,\n value,\n onChange,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n disabled = false,\n className,\n}: FileUploadProps) {\n const [internalFiles, setInternalFiles] = useState<File[]>([]);\n const files = value ?? internalFiles;\n\n const addFiles = useCallback(\n (newFiles: FileList | File[]) => {\n let toAdd = Array.from(newFiles);\n\n // `accept` is enforced HERE, not only on the input: the input's attribute\n // governs the picker, and a drop never opens one.\n if (accept) {\n toAdd = toAdd.filter((f) => matchesAccept(f, accept));\n }\n\n if (maxSize) {\n toAdd = toAdd.filter((f) => f.size <= maxSize);\n }\n\n /*\n * `multiple={false}` REPLACES; `maxFiles` refuses the overflow.\n *\n * These used to be the same rule — a cap of one, first-wins — on the\n * reasoning that the two props must not disagree about what a single-file\n * upload means. But they are different statements:\n *\n * - `maxFiles={n}` is a QUOTA. Dropping five files into a three-file\n * field should keep three, not the last three.\n * - `multiple={false}` is a FIELD SHAPE: this input holds one file. Its\n * analogue is a radio group, where choosing again MOVES the selection.\n *\n * Under the old rule a single-file field could never change its mind: the\n * second choice computed `[old, new].slice(0, 1)` and discarded the new\n * file in silence. The YouGene estate worked around it by remounting the\n * component with a `key`, which is the shape of a bug rather than a\n * preference.\n */\n if (multiple === false) {\n /*\n * The FIRST of the incoming batch, not the last.\n *\n * Two separate questions hide here, and only one of them was the bug:\n *\n * - ACROSS gestures — choose a file, then choose another. The second\n * must win, or the field cannot change its mind. That is the fix.\n * - WITHIN one gesture — drop two files at once onto a single-file\n * field. Which one wins is arbitrary, and taking the first is what\n * has always shipped; there is no replacement intent in a single\n * ambiguous drop.\n *\n * Taking `slice(-1)` would have answered both with \"the last\", quietly\n * changing the second. The existing drop test caught it.\n */\n const replacement = toAdd.slice(0, 1);\n // Nothing survived the accept/size filters — leave the field alone\n // rather than clearing a file the user never asked to remove.\n const next = replacement.length > 0 ? replacement : files;\n\n if (value === undefined) setInternalFiles(next);\n onChange?.(next);\n\n return;\n }\n\n const updated = [...files, ...toAdd];\n const limited = maxFiles ? updated.slice(0, maxFiles) : updated;\n\n if (value === undefined) setInternalFiles(limited);\n onChange?.(limited);\n },\n [accept, files, maxFiles, maxSize, multiple, onChange, value],\n );\n\n const removeFile = useCallback(\n (index: number) => {\n const updated = files.filter((_, i) => i !== index);\n if (value === undefined) setInternalFiles(updated);\n onChange?.(updated);\n },\n [files, onChange, value],\n );\n\n const ctx = useMemo(\n () => ({ files, addFiles, removeFile, disabled, accept, multiple }),\n [files, addFiles, removeFile, disabled, accept, multiple],\n );\n\n return (\n <FileUploadContext.Provider value={ctx}>\n <div data-react-fancy-file-upload=\"\" className={cn(className)}>{children}</div>\n </FileUploadContext.Provider>\n );\n}\n\nexport const FileUpload = Object.assign(FileUploadRoot, {\n Dropzone: FileUploadDropzone,\n List: FileUploadList,\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EMOJI_DATA, EMOJI_CATEGORY_ORDER, applyTone, SKIN_TONES } from './chunk-45BBNJQD.js';
|
|
2
|
-
import { useControllableState } from './chunk-
|
|
2
|
+
import { useControllableState } from './chunk-EDYAXGUM.js';
|
|
3
3
|
import { cn } from './chunk-MMW2JGKZ.js';
|
|
4
4
|
import { useState, useRef, useCallback, useMemo, useEffect } from 'react';
|
|
5
5
|
import { createPortal } from 'react-dom';
|
|
@@ -286,5 +286,5 @@ function TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeav
|
|
|
286
286
|
}
|
|
287
287
|
|
|
288
288
|
export { EmojiSelect };
|
|
289
|
-
//# sourceMappingURL=chunk-
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
289
|
+
//# sourceMappingURL=chunk-VYHZEQIG.js.map
|
|
290
|
+
//# sourceMappingURL=chunk-VYHZEQIG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/EmojiSelect/EmojiSelect.tsx"],"names":[],"mappings":"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","file":"chunk-3FG5K7A7.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { EMOJI_CATEGORY_ORDER, EMOJI_DATA, type EmojiCategoryKey, type EmojiEntry } from \"../../data/emoji-data\";\nimport { applyTone, SKIN_TONES, type SkinTone } from \"../../data/emoji-utils\";\nimport type { EmojiSelectProps } from \"./EmojiSelect.types\";\n\nconst TONE_STORAGE_KEY = \"fancy:emoji-tone\";\nconst LONG_PRESS_MS = 400;\nconst HOVER_INTENT_MS = 120;\nconst HOVER_LEAVE_GRACE_MS = 220;\n\ntype ToneTarget = {\n emoji: EmojiEntry;\n rect: { left: number; top: number; width: number };\n};\n\n// Deliberately no hover-capability gate. We use `pointerType` on pointer events so touch\n// inputs never trigger the hover path (they go through long-press instead), and mouse/pen\n// inputs always work regardless of what `(hover: hover)` resolves to in the current env.\n\nfunction readStoredTone(): SkinTone | null {\n if (typeof window === \"undefined\") return null;\n try {\n const v = window.localStorage?.getItem(TONE_STORAGE_KEY);\n return (SKIN_TONES as readonly string[]).includes(v ?? \"\") ? (v as SkinTone) : null;\n } catch {\n return null;\n }\n}\n\nexport function EmojiSelect({ value, defaultValue, onChange, placeholder = \"Search emojis...\", className }: EmojiSelectProps) {\n const [selected, setSelected] = useControllableState(value, defaultValue ?? \"\", onChange);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<EmojiCategoryKey>(\"smileys\");\n const [tone, setToneState] = useState<SkinTone | null>(() => readStoredTone());\n const [toneTarget, setToneTarget] = useState<ToneTarget | null>(null);\n const leaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setTone = useCallback((t: SkinTone | null) => {\n setToneState(t);\n if (typeof window === \"undefined\") return;\n try {\n if (t) window.localStorage?.setItem(TONE_STORAGE_KEY, t);\n else window.localStorage?.removeItem(TONE_STORAGE_KEY);\n } catch {}\n }, []);\n\n const filtered = useMemo(() => {\n if (!query) return null;\n const lower = query.toLowerCase();\n const hits: EmojiEntry[] = [];\n for (const group of Object.values(EMOJI_DATA)) {\n for (const e of group.emojis) {\n if (e.name.includes(lower)) hits.push(e);\n }\n }\n return hits;\n }, [query]);\n\n const closePicker = useCallback(() => setToneTarget(null), []);\n\n const openPicker = useCallback((target: ToneTarget) => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n setToneTarget(target);\n }, []);\n\n const scheduleClose = useCallback(() => {\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\n leaveTimer.current = setTimeout(closePicker, HOVER_LEAVE_GRACE_MS);\n }, [closePicker]);\n\n const cancelClose = useCallback(() => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n }, []);\n\n const pick = (emoji: EmojiEntry) => {\n const char = emoji.skinTones && tone ? applyTone(emoji.char, tone) : emoji.char;\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n const pickTone = (emoji: EmojiEntry, t: SkinTone) => {\n setTone(t);\n const char = applyTone(emoji.char, t);\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n useEffect(() => {\n if (!open) closePicker();\n }, [open, closePicker]);\n\n return (\n <div className={cn(\"relative inline-block\", className)} data-react-fancy-emoji-select=\"\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg border border-zinc-300 px-3 py-2 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24]\"\n onClick={() => setOpen((v) => !v)}\n >\n {selected ? <span className=\"text-xl\">{selected}</span> : <span className=\"text-zinc-400\">Pick emoji</span>}\n </button>\n\n {open && (\n <div className=\"absolute z-50 mt-1 w-80 rounded-lg border border-zinc-200 bg-white p-2 shadow-lg dark:border-zinc-700 dark:bg-zinc-800 fancy-fade-in\">\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"mb-2 w-full rounded-md border border-zinc-200 px-2 py-1 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100\"\n autoFocus\n />\n\n {!query && (\n <div className=\"mb-2 flex gap-1 overflow-x-auto border-b border-zinc-100 pb-2 dark:border-zinc-700\">\n {EMOJI_CATEGORY_ORDER.map((key) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setActiveCategory(key)}\n className={cn(\n \"shrink-0 rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\",\n activeCategory === key && \"bg-zinc-100 dark:bg-zinc-700\",\n )}\n aria-label={EMOJI_DATA[key].label}\n >\n {EMOJI_DATA[key].icon}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto\">\n {query ? (\n <EmojiGrid\n emojis={filtered ?? []}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n ) : (\n <div>\n <div className=\"px-1 py-1 text-xs font-semibold uppercase text-zinc-500\">\n {EMOJI_DATA[activeCategory].label}\n </div>\n <EmojiGrid\n emojis={EMOJI_DATA[activeCategory].emojis}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {toneTarget && typeof document !== \"undefined\" &&\n createPortal(\n <TonePopover\n target={toneTarget}\n onPickBase={() => pick(toneTarget.emoji)}\n onPickTone={(t) => pickTone(toneTarget.emoji, t)}\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype GridProps = {\n emojis: EmojiEntry[];\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: (emoji: EmojiEntry) => void;\n};\n\nfunction EmojiGrid({ emojis, tone, openPicker, scheduleClose, cancelClose, onPick }: GridProps) {\n return (\n <div className=\"grid grid-cols-8 gap-0.5\">\n {emojis.map((emoji) => (\n <EmojiCell\n key={emoji.char}\n emoji={emoji}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={() => onPick(emoji)}\n />\n ))}\n </div>\n );\n}\n\ntype CellProps = {\n emoji: EmojiEntry;\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: () => void;\n};\n\nfunction EmojiCell({ emoji, tone, openPicker, scheduleClose, cancelClose, onPick }: CellProps) {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressed = useRef(false);\n\n const tonable = !!emoji.skinTones;\n const displayChar = tonable && tone ? applyTone(emoji.char, tone) : emoji.char;\n\n useEffect(() => () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n }, []);\n\n const triggerOpen = () => {\n const node = buttonRef.current;\n if (!node) return;\n const r = node.getBoundingClientRect();\n openPicker({ emoji, rect: { left: r.left, top: r.top, width: r.width } });\n };\n\n const handlePointerEnter = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType === \"touch\") return;\n cancelClose();\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n hoverTimer.current = setTimeout(triggerOpen, HOVER_INTENT_MS);\n };\n\n const handlePointerLeave = (e: React.PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n if (hoverTimer.current) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (tonable) scheduleClose();\n };\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType !== \"touch\") return;\n longPressed.current = false;\n longPressTimer.current = setTimeout(() => {\n longPressed.current = true;\n triggerOpen();\n }, LONG_PRESS_MS);\n };\n const handlePointerUp = () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n };\n\n const handleClick = () => {\n if (longPressed.current) {\n longPressed.current = false;\n return;\n }\n onPick();\n };\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n className=\"relative rounded p-1 text-xl hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={emoji.name}\n title={emoji.name}\n >\n {displayChar}\n {tonable && (\n <span className=\"absolute right-0.5 bottom-0.5 h-1 w-1 rounded-full bg-amber-400\" aria-hidden />\n )}\n </button>\n );\n}\n\ntype PopoverProps = {\n target: ToneTarget;\n onPickBase: () => void;\n onPickTone: (tone: SkinTone) => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n};\n\nfunction TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeave }: PopoverProps) {\n const { emoji, rect } = target;\n if (!emoji.skinTones) return null;\n\n const centerX = rect.left + rect.width / 2;\n const top = rect.top;\n const POPOVER_HEIGHT_APPROX = 44;\n const flipDown = top < POPOVER_HEIGHT_APPROX + 8;\n\n const style: React.CSSProperties = flipDown\n ? { position: \"fixed\", left: centerX, top: top + 32, transform: \"translateX(-50%)\" }\n : { position: \"fixed\", left: centerX, top: top - 4, transform: \"translate(-50%, -100%)\" };\n\n return (\n <div\n style={{ ...style, zIndex: 9999 }}\n className=\"flex gap-0.5 rounded-md border border-zinc-200 bg-white p-1 shadow-lg dark:border-zinc-700 dark:bg-zinc-800\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <button\n type=\"button\"\n onClick={onPickBase}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} (no tone)`}\n >\n {emoji.char}\n </button>\n {SKIN_TONES.map((t, i) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => onPickTone(t)}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} ${t} skin tone`}\n >\n {emoji.skinTones![i]}\n </button>\n ))}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/EmojiSelect/EmojiSelect.tsx"],"names":[],"mappings":"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","file":"chunk-VYHZEQIG.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { EMOJI_CATEGORY_ORDER, EMOJI_DATA, type EmojiCategoryKey, type EmojiEntry } from \"../../data/emoji-data\";\nimport { applyTone, SKIN_TONES, type SkinTone } from \"../../data/emoji-utils\";\nimport type { EmojiSelectProps } from \"./EmojiSelect.types\";\n\nconst TONE_STORAGE_KEY = \"fancy:emoji-tone\";\nconst LONG_PRESS_MS = 400;\nconst HOVER_INTENT_MS = 120;\nconst HOVER_LEAVE_GRACE_MS = 220;\n\ntype ToneTarget = {\n emoji: EmojiEntry;\n rect: { left: number; top: number; width: number };\n};\n\n// Deliberately no hover-capability gate. We use `pointerType` on pointer events so touch\n// inputs never trigger the hover path (they go through long-press instead), and mouse/pen\n// inputs always work regardless of what `(hover: hover)` resolves to in the current env.\n\nfunction readStoredTone(): SkinTone | null {\n if (typeof window === \"undefined\") return null;\n try {\n const v = window.localStorage?.getItem(TONE_STORAGE_KEY);\n return (SKIN_TONES as readonly string[]).includes(v ?? \"\") ? (v as SkinTone) : null;\n } catch {\n return null;\n }\n}\n\nexport function EmojiSelect({ value, defaultValue, onChange, placeholder = \"Search emojis...\", className }: EmojiSelectProps) {\n const [selected, setSelected] = useControllableState(value, defaultValue ?? \"\", onChange);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<EmojiCategoryKey>(\"smileys\");\n const [tone, setToneState] = useState<SkinTone | null>(() => readStoredTone());\n const [toneTarget, setToneTarget] = useState<ToneTarget | null>(null);\n const leaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setTone = useCallback((t: SkinTone | null) => {\n setToneState(t);\n if (typeof window === \"undefined\") return;\n try {\n if (t) window.localStorage?.setItem(TONE_STORAGE_KEY, t);\n else window.localStorage?.removeItem(TONE_STORAGE_KEY);\n } catch {}\n }, []);\n\n const filtered = useMemo(() => {\n if (!query) return null;\n const lower = query.toLowerCase();\n const hits: EmojiEntry[] = [];\n for (const group of Object.values(EMOJI_DATA)) {\n for (const e of group.emojis) {\n if (e.name.includes(lower)) hits.push(e);\n }\n }\n return hits;\n }, [query]);\n\n const closePicker = useCallback(() => setToneTarget(null), []);\n\n const openPicker = useCallback((target: ToneTarget) => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n setToneTarget(target);\n }, []);\n\n const scheduleClose = useCallback(() => {\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\n leaveTimer.current = setTimeout(closePicker, HOVER_LEAVE_GRACE_MS);\n }, [closePicker]);\n\n const cancelClose = useCallback(() => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n }, []);\n\n const pick = (emoji: EmojiEntry) => {\n const char = emoji.skinTones && tone ? applyTone(emoji.char, tone) : emoji.char;\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n const pickTone = (emoji: EmojiEntry, t: SkinTone) => {\n setTone(t);\n const char = applyTone(emoji.char, t);\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n useEffect(() => {\n if (!open) closePicker();\n }, [open, closePicker]);\n\n return (\n <div className={cn(\"relative inline-block\", className)} data-react-fancy-emoji-select=\"\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg border border-zinc-300 px-3 py-2 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24]\"\n onClick={() => setOpen((v) => !v)}\n >\n {selected ? <span className=\"text-xl\">{selected}</span> : <span className=\"text-zinc-400\">Pick emoji</span>}\n </button>\n\n {open && (\n <div className=\"absolute z-50 mt-1 w-80 rounded-lg border border-zinc-200 bg-white p-2 shadow-lg dark:border-zinc-700 dark:bg-zinc-800 fancy-fade-in\">\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"mb-2 w-full rounded-md border border-zinc-200 px-2 py-1 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100\"\n autoFocus\n />\n\n {!query && (\n <div className=\"mb-2 flex gap-1 overflow-x-auto border-b border-zinc-100 pb-2 dark:border-zinc-700\">\n {EMOJI_CATEGORY_ORDER.map((key) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setActiveCategory(key)}\n className={cn(\n \"shrink-0 rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\",\n activeCategory === key && \"bg-zinc-100 dark:bg-zinc-700\",\n )}\n aria-label={EMOJI_DATA[key].label}\n >\n {EMOJI_DATA[key].icon}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto\">\n {query ? (\n <EmojiGrid\n emojis={filtered ?? []}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n ) : (\n <div>\n <div className=\"px-1 py-1 text-xs font-semibold uppercase text-zinc-500\">\n {EMOJI_DATA[activeCategory].label}\n </div>\n <EmojiGrid\n emojis={EMOJI_DATA[activeCategory].emojis}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {toneTarget && typeof document !== \"undefined\" &&\n createPortal(\n <TonePopover\n target={toneTarget}\n onPickBase={() => pick(toneTarget.emoji)}\n onPickTone={(t) => pickTone(toneTarget.emoji, t)}\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype GridProps = {\n emojis: EmojiEntry[];\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: (emoji: EmojiEntry) => void;\n};\n\nfunction EmojiGrid({ emojis, tone, openPicker, scheduleClose, cancelClose, onPick }: GridProps) {\n return (\n <div className=\"grid grid-cols-8 gap-0.5\">\n {emojis.map((emoji) => (\n <EmojiCell\n key={emoji.char}\n emoji={emoji}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={() => onPick(emoji)}\n />\n ))}\n </div>\n );\n}\n\ntype CellProps = {\n emoji: EmojiEntry;\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: () => void;\n};\n\nfunction EmojiCell({ emoji, tone, openPicker, scheduleClose, cancelClose, onPick }: CellProps) {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressed = useRef(false);\n\n const tonable = !!emoji.skinTones;\n const displayChar = tonable && tone ? applyTone(emoji.char, tone) : emoji.char;\n\n useEffect(() => () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n }, []);\n\n const triggerOpen = () => {\n const node = buttonRef.current;\n if (!node) return;\n const r = node.getBoundingClientRect();\n openPicker({ emoji, rect: { left: r.left, top: r.top, width: r.width } });\n };\n\n const handlePointerEnter = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType === \"touch\") return;\n cancelClose();\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n hoverTimer.current = setTimeout(triggerOpen, HOVER_INTENT_MS);\n };\n\n const handlePointerLeave = (e: React.PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n if (hoverTimer.current) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (tonable) scheduleClose();\n };\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType !== \"touch\") return;\n longPressed.current = false;\n longPressTimer.current = setTimeout(() => {\n longPressed.current = true;\n triggerOpen();\n }, LONG_PRESS_MS);\n };\n const handlePointerUp = () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n };\n\n const handleClick = () => {\n if (longPressed.current) {\n longPressed.current = false;\n return;\n }\n onPick();\n };\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n className=\"relative rounded p-1 text-xl hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={emoji.name}\n title={emoji.name}\n >\n {displayChar}\n {tonable && (\n <span className=\"absolute right-0.5 bottom-0.5 h-1 w-1 rounded-full bg-amber-400\" aria-hidden />\n )}\n </button>\n );\n}\n\ntype PopoverProps = {\n target: ToneTarget;\n onPickBase: () => void;\n onPickTone: (tone: SkinTone) => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n};\n\nfunction TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeave }: PopoverProps) {\n const { emoji, rect } = target;\n if (!emoji.skinTones) return null;\n\n const centerX = rect.left + rect.width / 2;\n const top = rect.top;\n const POPOVER_HEIGHT_APPROX = 44;\n const flipDown = top < POPOVER_HEIGHT_APPROX + 8;\n\n const style: React.CSSProperties = flipDown\n ? { position: \"fixed\", left: centerX, top: top + 32, transform: \"translateX(-50%)\" }\n : { position: \"fixed\", left: centerX, top: top - 4, transform: \"translate(-50%, -100%)\" };\n\n return (\n <div\n style={{ ...style, zIndex: 9999 }}\n className=\"flex gap-0.5 rounded-md border border-zinc-200 bg-white p-1 shadow-lg dark:border-zinc-700 dark:bg-zinc-800\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <button\n type=\"button\"\n onClick={onPickBase}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} (no tone)`}\n >\n {emoji.char}\n </button>\n {SKIN_TONES.map((t, i) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => onPickTone(t)}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} ${t} skin tone`}\n >\n {emoji.skinTones![i]}\n </button>\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -55,7 +55,10 @@ function FileUploadDropzone({
|
|
|
55
55
|
ref: inputRef,
|
|
56
56
|
type: "file",
|
|
57
57
|
className: "hidden",
|
|
58
|
-
onChange: (e) =>
|
|
58
|
+
onChange: (e) => {
|
|
59
|
+
if (e.target.files) addFiles(e.target.files);
|
|
60
|
+
e.target.value = "";
|
|
61
|
+
},
|
|
59
62
|
accept,
|
|
60
63
|
multiple,
|
|
61
64
|
disabled
|
|
@@ -172,9 +175,15 @@ function FileUploadRoot({
|
|
|
172
175
|
if (maxSize) {
|
|
173
176
|
toAdd = toAdd.filter((f) => f.size <= maxSize);
|
|
174
177
|
}
|
|
175
|
-
|
|
178
|
+
if (multiple === false) {
|
|
179
|
+
const replacement = toAdd.slice(0, 1);
|
|
180
|
+
const next = replacement.length > 0 ? replacement : files;
|
|
181
|
+
if (value === void 0) setInternalFiles(next);
|
|
182
|
+
onChange?.(next);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
176
185
|
const updated = [...files, ...toAdd];
|
|
177
|
-
const limited =
|
|
186
|
+
const limited = maxFiles ? updated.slice(0, maxFiles) : updated;
|
|
178
187
|
if (value === void 0) setInternalFiles(limited);
|
|
179
188
|
onChange?.(limited);
|
|
180
189
|
},
|
|
@@ -200,5 +209,5 @@ var FileUpload = Object.assign(FileUploadRoot, {
|
|
|
200
209
|
});
|
|
201
210
|
|
|
202
211
|
export { FileUpload, useFileUpload };
|
|
203
|
-
//# sourceMappingURL=chunk-
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
212
|
+
//# sourceMappingURL=chunk-W6RDAZJC.js.map
|
|
213
|
+
//# sourceMappingURL=chunk-W6RDAZJC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/FileUpload/FileUpload.context.ts","../src/components/FileUpload/FileUploadDropzone.tsx","../src/components/FileUpload/FileUploadList.tsx","../src/components/FileUpload/matchesAccept.ts","../src/components/FileUpload/FileUpload.tsx"],"names":["jsxs","jsx","useState","useCallback","useMemo"],"mappings":"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","file":"chunk-W6RDAZJC.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { FileUploadContextValue } from \"./FileUpload.types\";\n\nexport const FileUploadContext =\n createContext<FileUploadContextValue | null>(null);\n\nexport function useFileUpload(): FileUploadContextValue {\n const ctx = useContext(FileUploadContext);\n if (!ctx) {\n throw new Error(\n \"FileUpload compound components must be used within <FileUpload>\",\n );\n }\n return ctx;\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { Upload } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileUpload } from \"./FileUpload.context\";\nimport type { FileUploadDropzoneProps } from \"./FileUpload.types\";\n\nexport function FileUploadDropzone({\n children,\n className,\n}: FileUploadDropzoneProps) {\n const { addFiles, disabled, accept, multiple } = useFileUpload();\n const [dragOver, setDragOver] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n if (disabled) return;\n addFiles(e.dataTransfer.files);\n },\n [addFiles, disabled],\n );\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback(() => setDragOver(false), []);\n\n return (\n <div\n data-react-fancy-file-upload-dropzone=\"\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => !disabled && inputRef.current?.click()}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center rounded-xl border-2 border-dashed p-8 text-center transition-colors\",\n dragOver\n ? \"border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-950\"\n : \"border-zinc-300 hover:border-zinc-400 dark:border-zinc-700 dark:hover:border-zinc-500\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={(e) => {\n if (e.target.files) addFiles(e.target.files);\n\n // Reset, or choosing the SAME file again fires no `change` event at\n // all and the gesture is simply dead — \"remove it, then re-add it\"\n // and \"retry the import that just failed\" both stop working. The\n // component never sees those files to reject them; it is not asked.\n e.target.value = \"\";\n }}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n />\n {children ?? (\n <>\n <Upload size={32} strokeWidth={1.5} className=\"mb-2 text-zinc-400\" />\n <p className=\"text-sm text-zinc-500\">\n Drop files here or click to browse\n </p>\n </>\n )}\n </div>\n );\n}\n\nFileUploadDropzone.displayName = \"FileUploadDropzone\";\n","import { useEffect, useMemo } from \"react\";\nimport { File, X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileUpload } from \"./FileUpload.context\";\nimport type { FileUploadListProps } from \"./FileUpload.types\";\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getExtension(name: string): string {\n const parts = name.split(\".\");\n return parts.length > 1 ? parts.pop()!.toUpperCase() : \"\";\n}\n\nfunction ThumbnailItem({ file, index, onRemove }: { file: File; index: number; onRemove: (i: number) => void }) {\n const isImage = file.type.startsWith(\"image/\");\n const objectUrl = useMemo(() => (isImage ? URL.createObjectURL(file) : null), [file, isImage]);\n\n useEffect(() => {\n return () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [objectUrl]);\n\n return (\n <div className=\"group relative flex w-20 flex-col items-center gap-1\">\n <div className=\"relative h-20 w-20 overflow-hidden rounded-lg border border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-800\">\n {isImage && objectUrl ? (\n <img src={objectUrl} alt={file.name} className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full flex-col items-center justify-center gap-1\">\n <File size={20} className=\"text-zinc-400\" />\n <span className=\"text-[10px] font-medium text-zinc-500\">{getExtension(file.name)}</span>\n </div>\n )}\n <button\n type=\"button\"\n onClick={() => onRemove(index)}\n className=\"absolute top-1 right-1 flex h-5 w-5 items-center justify-center rounded-full bg-black/60 text-white opacity-0 transition-opacity hover:bg-black/80 group-hover:opacity-100\"\n aria-label={`Remove ${file.name}`}\n >\n <X size={10} />\n </button>\n </div>\n <span className=\"w-full truncate text-center text-xs text-zinc-500\">{file.name}</span>\n </div>\n );\n}\n\nexport function FileUploadList({ thumbnail, className }: FileUploadListProps) {\n const { files, removeFile } = useFileUpload();\n\n if (files.length === 0) return null;\n\n if (thumbnail) {\n return (\n <div data-react-fancy-file-upload-list=\"\" className={cn(\"mt-3 flex flex-wrap gap-3\", className)}>\n {files.map((file, i) => (\n <ThumbnailItem key={`${file.name}-${i}`} file={file} index={i} onRemove={removeFile} />\n ))}\n </div>\n );\n }\n\n return (\n <ul data-react-fancy-file-upload-list=\"\" className={cn(\"mt-3 space-y-2\", className)}>\n {files.map((file, i) => (\n <li\n key={`${file.name}-${i}`}\n className=\"flex items-center gap-3 rounded-lg border border-zinc-200 px-3 py-2 text-sm dark:border-zinc-700\"\n >\n <File size={16} className=\"shrink-0 text-zinc-400\" />\n <span className=\"flex-1 truncate\">{file.name}</span>\n <span className=\"shrink-0 text-xs text-zinc-400\">\n {formatSize(file.size)}\n </span>\n <button\n type=\"button\"\n onClick={() => removeFile(i)}\n className=\"shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n aria-label={`Remove ${file.name}`}\n >\n <X size={14} />\n </button>\n </li>\n ))}\n </ul>\n );\n}\n\nFileUploadList.displayName = \"FileUploadList\";\n","/**\n * Does a file satisfy an `accept` string?\n *\n * The browser enforces `accept` in the FILE PICKER only. A drag-and-drop never\n * opens a picker, so on the drop path this is the only thing standing between an\n * image-only dropzone and a dropped executable. Forwarding the attribute to the\n * hidden input is half the job; this is the other half.\n *\n * Follows the HTML `accept` grammar: a comma-separated list of extensions\n * (`.csv`), exact MIME types (`text/plain`) and type wildcards (`image/*`).\n * Matching is case-insensitive, because a drop reports whatever the OS says and\n * `TEXT/PLAIN` is a real thing to receive.\n *\n * A dropped file often carries an EMPTY `type` — the OS may not know it and\n * `File.type` is a hint, never a guarantee. That is why extension rules are\n * checked against the name and not the type: an `accept=\".csv\"` zone has to work\n * for a .csv whose type is `\"\"`, which is the common case rather than the edge.\n */\nexport function matchesAccept(file: File, accept: string): boolean {\n const rules = accept\n .split(\",\")\n .map((rule) => rule.trim().toLowerCase())\n .filter(Boolean);\n\n // An accept string that lists nothing constrains nothing. Failing closed here\n // would turn `accept=\"\"` into a dropzone that silently swallows every file.\n if (rules.length === 0) return true;\n\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n\n return rules.some((rule) => {\n if (rule.startsWith(\".\")) return name.endsWith(rule);\n if (rule.endsWith(\"/*\")) return type.startsWith(rule.slice(0, -1));\n return type === rule;\n });\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { FileUploadContext } from \"./FileUpload.context\";\nimport { FileUploadDropzone } from \"./FileUploadDropzone\";\nimport { FileUploadList } from \"./FileUploadList\";\nimport { matchesAccept } from \"./matchesAccept\";\nimport type { FileUploadProps } from \"./FileUpload.types\";\n\nfunction FileUploadRoot({\n children,\n value,\n onChange,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n disabled = false,\n className,\n}: FileUploadProps) {\n const [internalFiles, setInternalFiles] = useState<File[]>([]);\n const files = value ?? internalFiles;\n\n const addFiles = useCallback(\n (newFiles: FileList | File[]) => {\n let toAdd = Array.from(newFiles);\n\n // `accept` is enforced HERE, not only on the input: the input's attribute\n // governs the picker, and a drop never opens one.\n if (accept) {\n toAdd = toAdd.filter((f) => matchesAccept(f, accept));\n }\n\n if (maxSize) {\n toAdd = toAdd.filter((f) => f.size <= maxSize);\n }\n\n /*\n * `multiple={false}` REPLACES; `maxFiles` refuses the overflow.\n *\n * These used to be the same rule — a cap of one, first-wins — on the\n * reasoning that the two props must not disagree about what a single-file\n * upload means. But they are different statements:\n *\n * - `maxFiles={n}` is a QUOTA. Dropping five files into a three-file\n * field should keep three, not the last three.\n * - `multiple={false}` is a FIELD SHAPE: this input holds one file. Its\n * analogue is a radio group, where choosing again MOVES the selection.\n *\n * Under the old rule a single-file field could never change its mind: the\n * second choice computed `[old, new].slice(0, 1)` and discarded the new\n * file in silence. The YouGene estate worked around it by remounting the\n * component with a `key`, which is the shape of a bug rather than a\n * preference.\n */\n if (multiple === false) {\n /*\n * The FIRST of the incoming batch, not the last.\n *\n * Two separate questions hide here, and only one of them was the bug:\n *\n * - ACROSS gestures — choose a file, then choose another. The second\n * must win, or the field cannot change its mind. That is the fix.\n * - WITHIN one gesture — drop two files at once onto a single-file\n * field. Which one wins is arbitrary, and taking the first is what\n * has always shipped; there is no replacement intent in a single\n * ambiguous drop.\n *\n * Taking `slice(-1)` would have answered both with \"the last\", quietly\n * changing the second. The existing drop test caught it.\n */\n const replacement = toAdd.slice(0, 1);\n // Nothing survived the accept/size filters — leave the field alone\n // rather than clearing a file the user never asked to remove.\n const next = replacement.length > 0 ? replacement : files;\n\n if (value === undefined) setInternalFiles(next);\n onChange?.(next);\n\n return;\n }\n\n const updated = [...files, ...toAdd];\n const limited = maxFiles ? updated.slice(0, maxFiles) : updated;\n\n if (value === undefined) setInternalFiles(limited);\n onChange?.(limited);\n },\n [accept, files, maxFiles, maxSize, multiple, onChange, value],\n );\n\n const removeFile = useCallback(\n (index: number) => {\n const updated = files.filter((_, i) => i !== index);\n if (value === undefined) setInternalFiles(updated);\n onChange?.(updated);\n },\n [files, onChange, value],\n );\n\n const ctx = useMemo(\n () => ({ files, addFiles, removeFile, disabled, accept, multiple }),\n [files, addFiles, removeFile, disabled, accept, multiple],\n );\n\n return (\n <FileUploadContext.Provider value={ctx}>\n <div data-react-fancy-file-upload=\"\" className={cn(className)}>{children}</div>\n </FileUploadContext.Provider>\n );\n}\n\nexport const FileUpload = Object.assign(FileUploadRoot, {\n Dropzone: FileUploadDropzone,\n List: FileUploadList,\n});\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkXCZZVRBY_cjs = require('./chunk-XCZZVRBY.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkSNHU2AI4_cjs = require('./chunk-SNHU2AI4.cjs');
|
|
5
5
|
var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
|
|
6
6
|
var react = require('react');
|
|
7
7
|
var reactDom = require('react-dom');
|
|
@@ -21,7 +21,7 @@ function readStoredTone() {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
function EmojiSelect({ value, defaultValue, onChange, placeholder = "Search emojis...", className }) {
|
|
24
|
-
const [selected, setSelected] =
|
|
24
|
+
const [selected, setSelected] = chunkSNHU2AI4_cjs.useControllableState(value, defaultValue ?? "", onChange);
|
|
25
25
|
const [open, setOpen] = react.useState(false);
|
|
26
26
|
const [query, setQuery] = react.useState("");
|
|
27
27
|
const [activeCategory, setActiveCategory] = react.useState("smileys");
|
|
@@ -288,5 +288,5 @@ function TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeav
|
|
|
288
288
|
}
|
|
289
289
|
|
|
290
290
|
exports.EmojiSelect = EmojiSelect;
|
|
291
|
-
//# sourceMappingURL=chunk-
|
|
292
|
-
//# sourceMappingURL=chunk-
|
|
291
|
+
//# sourceMappingURL=chunk-WIS4QRGK.cjs.map
|
|
292
|
+
//# sourceMappingURL=chunk-WIS4QRGK.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/EmojiSelect/EmojiSelect.tsx"],"names":["SKIN_TONES","useControllableState","useState","useRef","useCallback","useMemo","EMOJI_DATA","applyTone","useEffect","jsxs","cn","jsx","EMOJI_CATEGORY_ORDER","createPortal"],"mappings":"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","file":"chunk-N6K2CTSU.cjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { EMOJI_CATEGORY_ORDER, EMOJI_DATA, type EmojiCategoryKey, type EmojiEntry } from \"../../data/emoji-data\";\nimport { applyTone, SKIN_TONES, type SkinTone } from \"../../data/emoji-utils\";\nimport type { EmojiSelectProps } from \"./EmojiSelect.types\";\n\nconst TONE_STORAGE_KEY = \"fancy:emoji-tone\";\nconst LONG_PRESS_MS = 400;\nconst HOVER_INTENT_MS = 120;\nconst HOVER_LEAVE_GRACE_MS = 220;\n\ntype ToneTarget = {\n emoji: EmojiEntry;\n rect: { left: number; top: number; width: number };\n};\n\n// Deliberately no hover-capability gate. We use `pointerType` on pointer events so touch\n// inputs never trigger the hover path (they go through long-press instead), and mouse/pen\n// inputs always work regardless of what `(hover: hover)` resolves to in the current env.\n\nfunction readStoredTone(): SkinTone | null {\n if (typeof window === \"undefined\") return null;\n try {\n const v = window.localStorage?.getItem(TONE_STORAGE_KEY);\n return (SKIN_TONES as readonly string[]).includes(v ?? \"\") ? (v as SkinTone) : null;\n } catch {\n return null;\n }\n}\n\nexport function EmojiSelect({ value, defaultValue, onChange, placeholder = \"Search emojis...\", className }: EmojiSelectProps) {\n const [selected, setSelected] = useControllableState(value, defaultValue ?? \"\", onChange);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<EmojiCategoryKey>(\"smileys\");\n const [tone, setToneState] = useState<SkinTone | null>(() => readStoredTone());\n const [toneTarget, setToneTarget] = useState<ToneTarget | null>(null);\n const leaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setTone = useCallback((t: SkinTone | null) => {\n setToneState(t);\n if (typeof window === \"undefined\") return;\n try {\n if (t) window.localStorage?.setItem(TONE_STORAGE_KEY, t);\n else window.localStorage?.removeItem(TONE_STORAGE_KEY);\n } catch {}\n }, []);\n\n const filtered = useMemo(() => {\n if (!query) return null;\n const lower = query.toLowerCase();\n const hits: EmojiEntry[] = [];\n for (const group of Object.values(EMOJI_DATA)) {\n for (const e of group.emojis) {\n if (e.name.includes(lower)) hits.push(e);\n }\n }\n return hits;\n }, [query]);\n\n const closePicker = useCallback(() => setToneTarget(null), []);\n\n const openPicker = useCallback((target: ToneTarget) => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n setToneTarget(target);\n }, []);\n\n const scheduleClose = useCallback(() => {\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\n leaveTimer.current = setTimeout(closePicker, HOVER_LEAVE_GRACE_MS);\n }, [closePicker]);\n\n const cancelClose = useCallback(() => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n }, []);\n\n const pick = (emoji: EmojiEntry) => {\n const char = emoji.skinTones && tone ? applyTone(emoji.char, tone) : emoji.char;\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n const pickTone = (emoji: EmojiEntry, t: SkinTone) => {\n setTone(t);\n const char = applyTone(emoji.char, t);\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n useEffect(() => {\n if (!open) closePicker();\n }, [open, closePicker]);\n\n return (\n <div className={cn(\"relative inline-block\", className)} data-react-fancy-emoji-select=\"\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg border border-zinc-300 px-3 py-2 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24]\"\n onClick={() => setOpen((v) => !v)}\n >\n {selected ? <span className=\"text-xl\">{selected}</span> : <span className=\"text-zinc-400\">Pick emoji</span>}\n </button>\n\n {open && (\n <div className=\"absolute z-50 mt-1 w-80 rounded-lg border border-zinc-200 bg-white p-2 shadow-lg dark:border-zinc-700 dark:bg-zinc-800 fancy-fade-in\">\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"mb-2 w-full rounded-md border border-zinc-200 px-2 py-1 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100\"\n autoFocus\n />\n\n {!query && (\n <div className=\"mb-2 flex gap-1 overflow-x-auto border-b border-zinc-100 pb-2 dark:border-zinc-700\">\n {EMOJI_CATEGORY_ORDER.map((key) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setActiveCategory(key)}\n className={cn(\n \"shrink-0 rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\",\n activeCategory === key && \"bg-zinc-100 dark:bg-zinc-700\",\n )}\n aria-label={EMOJI_DATA[key].label}\n >\n {EMOJI_DATA[key].icon}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto\">\n {query ? (\n <EmojiGrid\n emojis={filtered ?? []}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n ) : (\n <div>\n <div className=\"px-1 py-1 text-xs font-semibold uppercase text-zinc-500\">\n {EMOJI_DATA[activeCategory].label}\n </div>\n <EmojiGrid\n emojis={EMOJI_DATA[activeCategory].emojis}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {toneTarget && typeof document !== \"undefined\" &&\n createPortal(\n <TonePopover\n target={toneTarget}\n onPickBase={() => pick(toneTarget.emoji)}\n onPickTone={(t) => pickTone(toneTarget.emoji, t)}\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype GridProps = {\n emojis: EmojiEntry[];\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: (emoji: EmojiEntry) => void;\n};\n\nfunction EmojiGrid({ emojis, tone, openPicker, scheduleClose, cancelClose, onPick }: GridProps) {\n return (\n <div className=\"grid grid-cols-8 gap-0.5\">\n {emojis.map((emoji) => (\n <EmojiCell\n key={emoji.char}\n emoji={emoji}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={() => onPick(emoji)}\n />\n ))}\n </div>\n );\n}\n\ntype CellProps = {\n emoji: EmojiEntry;\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: () => void;\n};\n\nfunction EmojiCell({ emoji, tone, openPicker, scheduleClose, cancelClose, onPick }: CellProps) {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressed = useRef(false);\n\n const tonable = !!emoji.skinTones;\n const displayChar = tonable && tone ? applyTone(emoji.char, tone) : emoji.char;\n\n useEffect(() => () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n }, []);\n\n const triggerOpen = () => {\n const node = buttonRef.current;\n if (!node) return;\n const r = node.getBoundingClientRect();\n openPicker({ emoji, rect: { left: r.left, top: r.top, width: r.width } });\n };\n\n const handlePointerEnter = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType === \"touch\") return;\n cancelClose();\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n hoverTimer.current = setTimeout(triggerOpen, HOVER_INTENT_MS);\n };\n\n const handlePointerLeave = (e: React.PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n if (hoverTimer.current) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (tonable) scheduleClose();\n };\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType !== \"touch\") return;\n longPressed.current = false;\n longPressTimer.current = setTimeout(() => {\n longPressed.current = true;\n triggerOpen();\n }, LONG_PRESS_MS);\n };\n const handlePointerUp = () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n };\n\n const handleClick = () => {\n if (longPressed.current) {\n longPressed.current = false;\n return;\n }\n onPick();\n };\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n className=\"relative rounded p-1 text-xl hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={emoji.name}\n title={emoji.name}\n >\n {displayChar}\n {tonable && (\n <span className=\"absolute right-0.5 bottom-0.5 h-1 w-1 rounded-full bg-amber-400\" aria-hidden />\n )}\n </button>\n );\n}\n\ntype PopoverProps = {\n target: ToneTarget;\n onPickBase: () => void;\n onPickTone: (tone: SkinTone) => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n};\n\nfunction TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeave }: PopoverProps) {\n const { emoji, rect } = target;\n if (!emoji.skinTones) return null;\n\n const centerX = rect.left + rect.width / 2;\n const top = rect.top;\n const POPOVER_HEIGHT_APPROX = 44;\n const flipDown = top < POPOVER_HEIGHT_APPROX + 8;\n\n const style: React.CSSProperties = flipDown\n ? { position: \"fixed\", left: centerX, top: top + 32, transform: \"translateX(-50%)\" }\n : { position: \"fixed\", left: centerX, top: top - 4, transform: \"translate(-50%, -100%)\" };\n\n return (\n <div\n style={{ ...style, zIndex: 9999 }}\n className=\"flex gap-0.5 rounded-md border border-zinc-200 bg-white p-1 shadow-lg dark:border-zinc-700 dark:bg-zinc-800\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <button\n type=\"button\"\n onClick={onPickBase}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} (no tone)`}\n >\n {emoji.char}\n </button>\n {SKIN_TONES.map((t, i) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => onPickTone(t)}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} ${t} skin tone`}\n >\n {emoji.skinTones![i]}\n </button>\n ))}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/EmojiSelect/EmojiSelect.tsx"],"names":["SKIN_TONES","useControllableState","useState","useRef","useCallback","useMemo","EMOJI_DATA","applyTone","useEffect","jsxs","cn","jsx","EMOJI_CATEGORY_ORDER","createPortal"],"mappings":"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","file":"chunk-WIS4QRGK.cjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { EMOJI_CATEGORY_ORDER, EMOJI_DATA, type EmojiCategoryKey, type EmojiEntry } from \"../../data/emoji-data\";\nimport { applyTone, SKIN_TONES, type SkinTone } from \"../../data/emoji-utils\";\nimport type { EmojiSelectProps } from \"./EmojiSelect.types\";\n\nconst TONE_STORAGE_KEY = \"fancy:emoji-tone\";\nconst LONG_PRESS_MS = 400;\nconst HOVER_INTENT_MS = 120;\nconst HOVER_LEAVE_GRACE_MS = 220;\n\ntype ToneTarget = {\n emoji: EmojiEntry;\n rect: { left: number; top: number; width: number };\n};\n\n// Deliberately no hover-capability gate. We use `pointerType` on pointer events so touch\n// inputs never trigger the hover path (they go through long-press instead), and mouse/pen\n// inputs always work regardless of what `(hover: hover)` resolves to in the current env.\n\nfunction readStoredTone(): SkinTone | null {\n if (typeof window === \"undefined\") return null;\n try {\n const v = window.localStorage?.getItem(TONE_STORAGE_KEY);\n return (SKIN_TONES as readonly string[]).includes(v ?? \"\") ? (v as SkinTone) : null;\n } catch {\n return null;\n }\n}\n\nexport function EmojiSelect({ value, defaultValue, onChange, placeholder = \"Search emojis...\", className }: EmojiSelectProps) {\n const [selected, setSelected] = useControllableState(value, defaultValue ?? \"\", onChange);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<EmojiCategoryKey>(\"smileys\");\n const [tone, setToneState] = useState<SkinTone | null>(() => readStoredTone());\n const [toneTarget, setToneTarget] = useState<ToneTarget | null>(null);\n const leaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const setTone = useCallback((t: SkinTone | null) => {\n setToneState(t);\n if (typeof window === \"undefined\") return;\n try {\n if (t) window.localStorage?.setItem(TONE_STORAGE_KEY, t);\n else window.localStorage?.removeItem(TONE_STORAGE_KEY);\n } catch {}\n }, []);\n\n const filtered = useMemo(() => {\n if (!query) return null;\n const lower = query.toLowerCase();\n const hits: EmojiEntry[] = [];\n for (const group of Object.values(EMOJI_DATA)) {\n for (const e of group.emojis) {\n if (e.name.includes(lower)) hits.push(e);\n }\n }\n return hits;\n }, [query]);\n\n const closePicker = useCallback(() => setToneTarget(null), []);\n\n const openPicker = useCallback((target: ToneTarget) => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n setToneTarget(target);\n }, []);\n\n const scheduleClose = useCallback(() => {\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\n leaveTimer.current = setTimeout(closePicker, HOVER_LEAVE_GRACE_MS);\n }, [closePicker]);\n\n const cancelClose = useCallback(() => {\n if (leaveTimer.current) {\n clearTimeout(leaveTimer.current);\n leaveTimer.current = null;\n }\n }, []);\n\n const pick = (emoji: EmojiEntry) => {\n const char = emoji.skinTones && tone ? applyTone(emoji.char, tone) : emoji.char;\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n const pickTone = (emoji: EmojiEntry, t: SkinTone) => {\n setTone(t);\n const char = applyTone(emoji.char, t);\n setSelected(char);\n setOpen(false);\n setQuery(\"\");\n closePicker();\n };\n\n useEffect(() => {\n if (!open) closePicker();\n }, [open, closePicker]);\n\n return (\n <div className={cn(\"relative inline-block\", className)} data-react-fancy-emoji-select=\"\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2 rounded-lg border border-zinc-300 px-3 py-2 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24]\"\n onClick={() => setOpen((v) => !v)}\n >\n {selected ? <span className=\"text-xl\">{selected}</span> : <span className=\"text-zinc-400\">Pick emoji</span>}\n </button>\n\n {open && (\n <div className=\"absolute z-50 mt-1 w-80 rounded-lg border border-zinc-200 bg-white p-2 shadow-lg dark:border-zinc-700 dark:bg-zinc-800 fancy-fade-in\">\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"mb-2 w-full rounded-md border border-zinc-200 px-2 py-1 text-sm transition-[border-color,box-shadow] duration-150 dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100\"\n autoFocus\n />\n\n {!query && (\n <div className=\"mb-2 flex gap-1 overflow-x-auto border-b border-zinc-100 pb-2 dark:border-zinc-700\">\n {EMOJI_CATEGORY_ORDER.map((key) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setActiveCategory(key)}\n className={cn(\n \"shrink-0 rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\",\n activeCategory === key && \"bg-zinc-100 dark:bg-zinc-700\",\n )}\n aria-label={EMOJI_DATA[key].label}\n >\n {EMOJI_DATA[key].icon}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto\">\n {query ? (\n <EmojiGrid\n emojis={filtered ?? []}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n ) : (\n <div>\n <div className=\"px-1 py-1 text-xs font-semibold uppercase text-zinc-500\">\n {EMOJI_DATA[activeCategory].label}\n </div>\n <EmojiGrid\n emojis={EMOJI_DATA[activeCategory].emojis}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={pick}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {toneTarget && typeof document !== \"undefined\" &&\n createPortal(\n <TonePopover\n target={toneTarget}\n onPickBase={() => pick(toneTarget.emoji)}\n onPickTone={(t) => pickTone(toneTarget.emoji, t)}\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype GridProps = {\n emojis: EmojiEntry[];\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: (emoji: EmojiEntry) => void;\n};\n\nfunction EmojiGrid({ emojis, tone, openPicker, scheduleClose, cancelClose, onPick }: GridProps) {\n return (\n <div className=\"grid grid-cols-8 gap-0.5\">\n {emojis.map((emoji) => (\n <EmojiCell\n key={emoji.char}\n emoji={emoji}\n tone={tone}\n openPicker={openPicker}\n scheduleClose={scheduleClose}\n cancelClose={cancelClose}\n onPick={() => onPick(emoji)}\n />\n ))}\n </div>\n );\n}\n\ntype CellProps = {\n emoji: EmojiEntry;\n tone: SkinTone | null;\n openPicker: (target: ToneTarget) => void;\n scheduleClose: () => void;\n cancelClose: () => void;\n onPick: () => void;\n};\n\nfunction EmojiCell({ emoji, tone, openPicker, scheduleClose, cancelClose, onPick }: CellProps) {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressed = useRef(false);\n\n const tonable = !!emoji.skinTones;\n const displayChar = tonable && tone ? applyTone(emoji.char, tone) : emoji.char;\n\n useEffect(() => () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n }, []);\n\n const triggerOpen = () => {\n const node = buttonRef.current;\n if (!node) return;\n const r = node.getBoundingClientRect();\n openPicker({ emoji, rect: { left: r.left, top: r.top, width: r.width } });\n };\n\n const handlePointerEnter = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType === \"touch\") return;\n cancelClose();\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n hoverTimer.current = setTimeout(triggerOpen, HOVER_INTENT_MS);\n };\n\n const handlePointerLeave = (e: React.PointerEvent) => {\n if (e.pointerType === \"touch\") return;\n if (hoverTimer.current) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (tonable) scheduleClose();\n };\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!tonable || e.pointerType !== \"touch\") return;\n longPressed.current = false;\n longPressTimer.current = setTimeout(() => {\n longPressed.current = true;\n triggerOpen();\n }, LONG_PRESS_MS);\n };\n const handlePointerUp = () => {\n if (longPressTimer.current) clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n };\n\n const handleClick = () => {\n if (longPressed.current) {\n longPressed.current = false;\n return;\n }\n onPick();\n };\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n className=\"relative rounded p-1 text-xl hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={emoji.name}\n title={emoji.name}\n >\n {displayChar}\n {tonable && (\n <span className=\"absolute right-0.5 bottom-0.5 h-1 w-1 rounded-full bg-amber-400\" aria-hidden />\n )}\n </button>\n );\n}\n\ntype PopoverProps = {\n target: ToneTarget;\n onPickBase: () => void;\n onPickTone: (tone: SkinTone) => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n};\n\nfunction TonePopover({ target, onPickBase, onPickTone, onMouseEnter, onMouseLeave }: PopoverProps) {\n const { emoji, rect } = target;\n if (!emoji.skinTones) return null;\n\n const centerX = rect.left + rect.width / 2;\n const top = rect.top;\n const POPOVER_HEIGHT_APPROX = 44;\n const flipDown = top < POPOVER_HEIGHT_APPROX + 8;\n\n const style: React.CSSProperties = flipDown\n ? { position: \"fixed\", left: centerX, top: top + 32, transform: \"translateX(-50%)\" }\n : { position: \"fixed\", left: centerX, top: top - 4, transform: \"translate(-50%, -100%)\" };\n\n return (\n <div\n style={{ ...style, zIndex: 9999 }}\n className=\"flex gap-0.5 rounded-md border border-zinc-200 bg-white p-1 shadow-lg dark:border-zinc-700 dark:bg-zinc-800\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <button\n type=\"button\"\n onClick={onPickBase}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} (no tone)`}\n >\n {emoji.char}\n </button>\n {SKIN_TONES.map((t, i) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => onPickTone(t)}\n className=\"rounded p-1 text-lg hover:bg-zinc-100 dark:hover:bg-zinc-700\"\n aria-label={`${emoji.name} ${t} skin tone`}\n >\n {emoji.skinTones![i]}\n </button>\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useInlineEdit } from './chunk-OL53XYHF.js';
|
|
2
2
|
import { useFieldMode } from './chunk-NRXK42LO.js';
|
|
3
|
-
import { useControllableState } from './chunk-
|
|
3
|
+
import { useControllableState } from './chunk-EDYAXGUM.js';
|
|
4
4
|
import { cn } from './chunk-MMW2JGKZ.js';
|
|
5
5
|
import { forwardRef, useRef, useCallback } from 'react';
|
|
6
6
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -138,5 +138,5 @@ var OtpInput = forwardRef(
|
|
|
138
138
|
OtpInput.displayName = "OtpInput";
|
|
139
139
|
|
|
140
140
|
export { OtpInput };
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
141
|
+
//# sourceMappingURL=chunk-XDJSFGXW.js.map
|
|
142
|
+
//# sourceMappingURL=chunk-XDJSFGXW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/OtpInput/OtpInput.tsx"],"names":["OtpInput"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/OtpInput/OtpInput.tsx"],"names":["OtpInput"],"mappings":"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","file":"chunk-XDJSFGXW.js","sourcesContent":["import { forwardRef, useCallback, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { useFieldMode } from \"../inputs/mode/FieldMode.context\";\nimport { useInlineEdit } from \"../inputs/mode/useInlineEdit\";\nimport type { OtpInputProps } from \"./OtpInput.types\";\n\nexport const OtpInput = forwardRef<HTMLDivElement, OtpInputProps>(\n function OtpInput(\n {\n length = 6,\n value: controlledValue,\n onChange,\n disabled = false,\n autoFocus = false,\n className,\n mode,\n },\n ref,\n ) {\n const [value, setValue] = useControllableState(\n controlledValue,\n \"\",\n onChange,\n );\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n\n const focusInput = useCallback(\n (index: number) => {\n const clamped = Math.max(0, Math.min(index, length - 1));\n inputsRef.current[clamped]?.focus();\n },\n [length],\n );\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n const digit = char.replace(/[^0-9]/g, \"\");\n if (!digit) return;\n\n const chars = value.padEnd(length, \" \").split(\"\");\n chars[index] = digit[0];\n const newValue = chars.join(\"\").trimEnd();\n setValue(newValue);\n\n if (index < length - 1) {\n focusInput(index + 1);\n }\n },\n [value, length, setValue, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\") {\n e.preventDefault();\n const chars = value.padEnd(length, \" \").split(\"\");\n if (chars[index]?.trim()) {\n chars[index] = \" \";\n setValue(chars.join(\"\").trimEnd());\n } else if (index > 0) {\n chars[index - 1] = \" \";\n setValue(chars.join(\"\").trimEnd());\n focusInput(index - 1);\n }\n } else if (e.key === \"ArrowLeft\") {\n focusInput(index - 1);\n } else if (e.key === \"ArrowRight\") {\n focusInput(index + 1);\n }\n },\n [value, length, setValue, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData(\"text\").replace(/[^0-9]/g, \"\");\n const newValue = pasted.slice(0, length);\n setValue(newValue);\n focusInput(Math.min(newValue.length, length - 1));\n },\n [length, setValue, focusInput],\n );\n\n if (!showControl) {\n return (\n <div\n data-react-fancy-otp-input=\"\"\n data-mode=\"view\"\n ref={ref}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n title={interactive ? \"Click to edit\" : undefined}\n onClick={interactive ? enterEdit : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n enterEdit();\n }\n }\n : undefined\n }\n className={cn(\n \"font-mono text-lg tracking-[0.4em] text-zinc-900 dark:text-zinc-100\",\n interactive &&\n \"cursor-pointer rounded-md outline-none transition-opacity hover:opacity-80 focus-visible:ring-2 focus-visible:ring-blue-500/40\",\n className,\n )}\n >\n {value || \"—\"}\n </div>\n );\n }\n\n return (\n <div\n data-react-fancy-otp-input=\"\"\n ref={ref}\n className={cn(\"flex gap-2\", className)}\n onBlur={(e) => {\n if (interactive && !e.currentTarget.contains(e.relatedTarget as Node)) exitEdit();\n }}\n >\n {Array.from({ length }, (_, i) => (\n <input\n key={i}\n ref={(el) => {\n inputsRef.current[i] = el;\n }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={value[i] ?? \"\"}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={(e) => e.target.select()}\n disabled={disabled}\n autoFocus={(autoFocus || interactive) && i === 0}\n className=\"h-12 w-10 rounded-lg border border-zinc-200 bg-white text-center text-lg font-medium text-zinc-900 outline-none transition-[border-color,box-shadow] duration-150 focus:border-blue-500 focus:ring-2 focus:ring-blue-500/40 dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100 dark:focus:border-blue-400 dark:focus:ring-blue-400/20\"\n aria-label={`Digit ${i + 1}`}\n />\n ))}\n </div>\n );\n },\n);\n\nOtpInput.displayName = \"OtpInput\";\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkKJ22KE56_cjs = require('./chunk-KJ22KE56.cjs');
|
|
4
4
|
var chunkL3V3BYVS_cjs = require('./chunk-L3V3BYVS.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunkSNHU2AI4_cjs = require('./chunk-SNHU2AI4.cjs');
|
|
6
6
|
var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
|
|
7
7
|
var react = require('react');
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -17,7 +17,7 @@ var OtpInput = react.forwardRef(
|
|
|
17
17
|
className,
|
|
18
18
|
mode
|
|
19
19
|
}, ref) {
|
|
20
|
-
const [value, setValue] =
|
|
20
|
+
const [value, setValue] = chunkSNHU2AI4_cjs.useControllableState(
|
|
21
21
|
controlledValue,
|
|
22
22
|
"",
|
|
23
23
|
onChange
|
|
@@ -140,5 +140,5 @@ var OtpInput = react.forwardRef(
|
|
|
140
140
|
OtpInput.displayName = "OtpInput";
|
|
141
141
|
|
|
142
142
|
exports.OtpInput = OtpInput;
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
144
|
-
//# sourceMappingURL=chunk-
|
|
143
|
+
//# sourceMappingURL=chunk-XK5WHQ3O.cjs.map
|
|
144
|
+
//# sourceMappingURL=chunk-XK5WHQ3O.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/OtpInput/OtpInput.tsx"],"names":["forwardRef","OtpInput","useControllableState","useFieldMode","useInlineEdit","useRef","useCallback","jsx","cn"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/OtpInput/OtpInput.tsx"],"names":["forwardRef","OtpInput","useControllableState","useFieldMode","useInlineEdit","useRef","useCallback","jsx","cn"],"mappings":"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","file":"chunk-XK5WHQ3O.cjs","sourcesContent":["import { forwardRef, useCallback, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { useFieldMode } from \"../inputs/mode/FieldMode.context\";\nimport { useInlineEdit } from \"../inputs/mode/useInlineEdit\";\nimport type { OtpInputProps } from \"./OtpInput.types\";\n\nexport const OtpInput = forwardRef<HTMLDivElement, OtpInputProps>(\n function OtpInput(\n {\n length = 6,\n value: controlledValue,\n onChange,\n disabled = false,\n autoFocus = false,\n className,\n mode,\n },\n ref,\n ) {\n const [value, setValue] = useControllableState(\n controlledValue,\n \"\",\n onChange,\n );\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n\n const focusInput = useCallback(\n (index: number) => {\n const clamped = Math.max(0, Math.min(index, length - 1));\n inputsRef.current[clamped]?.focus();\n },\n [length],\n );\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n const digit = char.replace(/[^0-9]/g, \"\");\n if (!digit) return;\n\n const chars = value.padEnd(length, \" \").split(\"\");\n chars[index] = digit[0];\n const newValue = chars.join(\"\").trimEnd();\n setValue(newValue);\n\n if (index < length - 1) {\n focusInput(index + 1);\n }\n },\n [value, length, setValue, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\") {\n e.preventDefault();\n const chars = value.padEnd(length, \" \").split(\"\");\n if (chars[index]?.trim()) {\n chars[index] = \" \";\n setValue(chars.join(\"\").trimEnd());\n } else if (index > 0) {\n chars[index - 1] = \" \";\n setValue(chars.join(\"\").trimEnd());\n focusInput(index - 1);\n }\n } else if (e.key === \"ArrowLeft\") {\n focusInput(index - 1);\n } else if (e.key === \"ArrowRight\") {\n focusInput(index + 1);\n }\n },\n [value, length, setValue, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData(\"text\").replace(/[^0-9]/g, \"\");\n const newValue = pasted.slice(0, length);\n setValue(newValue);\n focusInput(Math.min(newValue.length, length - 1));\n },\n [length, setValue, focusInput],\n );\n\n if (!showControl) {\n return (\n <div\n data-react-fancy-otp-input=\"\"\n data-mode=\"view\"\n ref={ref}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n title={interactive ? \"Click to edit\" : undefined}\n onClick={interactive ? enterEdit : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n enterEdit();\n }\n }\n : undefined\n }\n className={cn(\n \"font-mono text-lg tracking-[0.4em] text-zinc-900 dark:text-zinc-100\",\n interactive &&\n \"cursor-pointer rounded-md outline-none transition-opacity hover:opacity-80 focus-visible:ring-2 focus-visible:ring-blue-500/40\",\n className,\n )}\n >\n {value || \"—\"}\n </div>\n );\n }\n\n return (\n <div\n data-react-fancy-otp-input=\"\"\n ref={ref}\n className={cn(\"flex gap-2\", className)}\n onBlur={(e) => {\n if (interactive && !e.currentTarget.contains(e.relatedTarget as Node)) exitEdit();\n }}\n >\n {Array.from({ length }, (_, i) => (\n <input\n key={i}\n ref={(el) => {\n inputsRef.current[i] = el;\n }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={value[i] ?? \"\"}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={(e) => e.target.select()}\n disabled={disabled}\n autoFocus={(autoFocus || interactive) && i === 0}\n className=\"h-12 w-10 rounded-lg border border-zinc-200 bg-white text-center text-lg font-medium text-zinc-900 outline-none transition-[border-color,box-shadow] duration-150 focus:border-blue-500 focus:ring-2 focus:ring-blue-500/40 dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100 dark:focus:border-blue-400 dark:focus:ring-blue-400/20\"\n aria-label={`Digit ${i + 1}`}\n />\n ))}\n </div>\n );\n },\n);\n\nOtpInput.displayName = \"OtpInput\";\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var chunkYLGTDBB2_cjs = require('./chunk-YLGTDBB2.cjs');
|
|
4
4
|
var chunkKJ22KE56_cjs = require('./chunk-KJ22KE56.cjs');
|
|
5
5
|
var chunkL3V3BYVS_cjs = require('./chunk-L3V3BYVS.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunkSNHU2AI4_cjs = require('./chunk-SNHU2AI4.cjs');
|
|
7
7
|
var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
|
|
8
8
|
var react = require('react');
|
|
9
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -59,7 +59,7 @@ var Switch = react.forwardRef(
|
|
|
59
59
|
const switchId = id ?? autoId;
|
|
60
60
|
const resolvedMode = chunkL3V3BYVS_cjs.useFieldMode(mode);
|
|
61
61
|
const { showControl, interactive, enterEdit, exitEdit } = chunkKJ22KE56_cjs.useInlineEdit(resolvedMode, disabled);
|
|
62
|
-
const [checked, setChecked] =
|
|
62
|
+
const [checked, setChecked] = chunkSNHU2AI4_cjs.useControllableState(
|
|
63
63
|
controlledChecked,
|
|
64
64
|
defaultChecked,
|
|
65
65
|
onCheckedChange
|
|
@@ -165,5 +165,5 @@ var Switch = react.forwardRef(
|
|
|
165
165
|
Switch.displayName = "Switch";
|
|
166
166
|
|
|
167
167
|
exports.Switch = Switch;
|
|
168
|
-
//# sourceMappingURL=chunk-
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
168
|
+
//# sourceMappingURL=chunk-Y52NXM73.cjs.map
|
|
169
|
+
//# sourceMappingURL=chunk-Y52NXM73.cjs.map
|