@particle-academy/react-fancy 5.53.0 → 5.54.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 +82 -0
- package/README.md +3 -1
- package/dist/PdfViewer.types-BEk2Jq6p.d.ts +97 -0
- package/dist/PdfViewer.types-DyoUBa2g.d.cts +97 -0
- package/dist/accordion.cjs +3 -3
- package/dist/accordion.js +1 -1
- package/dist/autocomplete.cjs +2 -2
- package/dist/autocomplete.js +1 -1
- package/dist/chart.cjs +2 -2
- package/dist/chart.js +1 -1
- package/dist/{chunk-PRP5N7NY.js → chunk-35MF32VQ.js} +3 -3
- package/dist/{chunk-PRP5N7NY.js.map → chunk-35MF32VQ.js.map} +1 -1
- package/dist/{chunk-TJTC4WNY.cjs → chunk-4DGXL6JC.cjs} +3 -3
- package/dist/{chunk-TJTC4WNY.cjs.map → chunk-4DGXL6JC.cjs.map} +1 -1
- package/dist/{chunk-QAKIG43N.cjs → chunk-5IWKZ2WK.cjs} +3 -3
- package/dist/{chunk-QAKIG43N.cjs.map → chunk-5IWKZ2WK.cjs.map} +1 -1
- package/dist/chunk-7MDHCYEB.cjs +414 -0
- package/dist/chunk-7MDHCYEB.cjs.map +1 -0
- package/dist/{chunk-546K5LRX.cjs → chunk-CVDL6C2O.cjs} +3 -3
- package/dist/{chunk-546K5LRX.cjs.map → chunk-CVDL6C2O.cjs.map} +1 -1
- package/dist/{chunk-ZULMMW5W.js → chunk-EEFWVFKO.js} +3 -3
- package/dist/{chunk-ZULMMW5W.js.map → chunk-EEFWVFKO.js.map} +1 -1
- package/dist/{chunk-SONXLQPJ.cjs → chunk-EZA6GWZL.cjs} +7 -7
- package/dist/chunk-EZA6GWZL.cjs.map +1 -0
- package/dist/{chunk-45FDQ3R5.js → chunk-FRWOWDGX.js} +3 -3
- package/dist/{chunk-45FDQ3R5.js.map → chunk-FRWOWDGX.js.map} +1 -1
- package/dist/{chunk-36HG5JK6.cjs → chunk-GISORLGW.cjs} +3 -3
- package/dist/{chunk-36HG5JK6.cjs.map → chunk-GISORLGW.cjs.map} +1 -1
- package/dist/{chunk-BDUL42VO.cjs → chunk-GLGUQGAQ.cjs} +3 -3
- package/dist/{chunk-BDUL42VO.cjs.map → chunk-GLGUQGAQ.cjs.map} +1 -1
- package/dist/{chunk-A5DN2XNM.cjs → chunk-HTNQ5XUR.cjs} +3 -3
- package/dist/{chunk-A5DN2XNM.cjs.map → chunk-HTNQ5XUR.cjs.map} +1 -1
- package/dist/{chunk-ZKJLDBXA.cjs → chunk-ICI33QMY.cjs} +9 -9
- package/dist/{chunk-ZKJLDBXA.cjs.map → chunk-ICI33QMY.cjs.map} +1 -1
- package/dist/{chunk-JUQZMNPR.cjs → chunk-IEQK3LGI.cjs} +3 -3
- package/dist/{chunk-JUQZMNPR.cjs.map → chunk-IEQK3LGI.cjs.map} +1 -1
- package/dist/{chunk-MV6BK4WG.js → chunk-IUCYRQ4J.js} +6 -6
- package/dist/{chunk-MV6BK4WG.js.map → chunk-IUCYRQ4J.js.map} +1 -1
- package/dist/{chunk-N5XMBHX7.js → chunk-JXXUTPDH.js} +3 -3
- package/dist/{chunk-N5XMBHX7.js.map → chunk-JXXUTPDH.js.map} +1 -1
- package/dist/{chunk-WONP337S.cjs → chunk-JY7HPFOE.cjs} +6 -6
- package/dist/{chunk-WONP337S.cjs.map → chunk-JY7HPFOE.cjs.map} +1 -1
- package/dist/{chunk-4TVAHZ35.js → chunk-LZHGXRFD.js} +3 -3
- package/dist/{chunk-4TVAHZ35.js.map → chunk-LZHGXRFD.js.map} +1 -1
- package/dist/chunk-MORXQ5UM.js +412 -0
- package/dist/chunk-MORXQ5UM.js.map +1 -0
- package/dist/{chunk-D4QOV56U.js → chunk-MTTRPPHH.js} +3 -3
- package/dist/{chunk-D4QOV56U.js.map → chunk-MTTRPPHH.js.map} +1 -1
- package/dist/{chunk-Y7UE37QZ.js → chunk-NHGU2BWT.js} +3 -3
- package/dist/{chunk-Y7UE37QZ.js.map → chunk-NHGU2BWT.js.map} +1 -1
- package/dist/{chunk-VOHTL6WN.js → chunk-OC5OUZSD.js} +3 -3
- package/dist/{chunk-VOHTL6WN.js.map → chunk-OC5OUZSD.js.map} +1 -1
- package/dist/{chunk-3EWO5EBI.js → chunk-QGY5FPVM.js} +4 -4
- package/dist/{chunk-3EWO5EBI.js.map → chunk-QGY5FPVM.js.map} +1 -1
- package/dist/{chunk-E4TRDGSU.cjs → chunk-SLCR7A6W.cjs} +4 -4
- package/dist/{chunk-E4TRDGSU.cjs.map → chunk-SLCR7A6W.cjs.map} +1 -1
- package/dist/{chunk-OFNA5HS5.js → chunk-T45LBTXH.js} +3 -3
- package/dist/{chunk-OFNA5HS5.js.map → chunk-T45LBTXH.js.map} +1 -1
- package/dist/{chunk-XOYRJFMU.js → chunk-TKGMH5PA.js} +3 -3
- package/dist/{chunk-XOYRJFMU.js.map → chunk-TKGMH5PA.js.map} +1 -1
- package/dist/{chunk-A5RTALZJ.js → chunk-U4Y7ZXME.js} +7 -7
- package/dist/chunk-U4Y7ZXME.js.map +1 -0
- package/dist/{chunk-S3V2C4DW.cjs → chunk-UXYFM2XT.cjs} +4 -4
- package/dist/{chunk-S3V2C4DW.cjs.map → chunk-UXYFM2XT.cjs.map} +1 -1
- package/dist/{chunk-SW2MDI2E.cjs → chunk-VP7MT7LH.cjs} +5 -5
- package/dist/{chunk-SW2MDI2E.cjs.map → chunk-VP7MT7LH.cjs.map} +1 -1
- package/dist/{chunk-5DG4CAWS.js → chunk-YAPGHVBZ.js} +3 -3
- package/dist/{chunk-5DG4CAWS.js.map → chunk-YAPGHVBZ.js.map} +1 -1
- package/dist/{chunk-UVMIJCY3.js → chunk-YJHP5FVA.js} +7 -7
- package/dist/chunk-YJHP5FVA.js.map +1 -0
- package/dist/{chunk-3YA6FDVN.cjs → chunk-YJXP6AOL.cjs} +3 -3
- package/dist/{chunk-3YA6FDVN.cjs.map → chunk-YJXP6AOL.cjs.map} +1 -1
- package/dist/{chunk-QHN63FRP.cjs → chunk-YVTFODCJ.cjs} +3 -3
- package/dist/{chunk-QHN63FRP.cjs.map → chunk-YVTFODCJ.cjs.map} +1 -1
- package/dist/{chunk-3NIXNJ3I.js → chunk-ZASX5GO4.js} +3 -3
- package/dist/{chunk-3NIXNJ3I.js.map → chunk-ZASX5GO4.js.map} +1 -1
- package/dist/{chunk-LX23ZJDM.cjs → chunk-ZGDOWJKL.cjs} +7 -7
- package/dist/chunk-ZGDOWJKL.cjs.map +1 -0
- package/dist/content-renderer.cjs +4 -4
- package/dist/content-renderer.js +1 -1
- package/dist/editor.cjs +4 -4
- package/dist/editor.js +2 -2
- package/dist/{index-AesVUjQE.d.cts → index-Bd4br4sF.d.cts} +1 -1
- package/dist/{index-D3wJ8hrZ.d.ts → index-Bwrc9ktU.d.ts} +1 -1
- package/dist/index.cjs +71 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -2
- package/dist/index.d.ts +16 -2
- package/dist/index.js +32 -17
- package/dist/index.js.map +1 -1
- package/dist/inputs.cjs +4 -4
- package/dist/inputs.js +2 -2
- package/dist/json-editor.cjs +13 -13
- package/dist/json-editor.js +2 -2
- package/dist/kanban.cjs +3 -3
- package/dist/kanban.js +1 -1
- package/dist/media-viewer.cjs +3 -3
- package/dist/media-viewer.d.cts +2 -2
- package/dist/media-viewer.d.ts +2 -2
- package/dist/media-viewer.js +2 -2
- package/dist/menu.cjs +3 -3
- package/dist/menu.js +1 -1
- package/dist/mobile-menu.cjs +3 -3
- package/dist/mobile-menu.js +1 -1
- package/dist/multi-switch.cjs +2 -2
- package/dist/multi-switch.js +1 -1
- package/dist/navbar.cjs +3 -3
- package/dist/navbar.js +1 -1
- package/dist/pdf-viewer.cjs +2 -2
- package/dist/pdf-viewer.d.cts +13 -1
- package/dist/pdf-viewer.d.ts +13 -1
- package/dist/pdf-viewer.js +1 -1
- package/dist/select.cjs +2 -2
- package/dist/select.js +1 -1
- package/dist/sidebar.cjs +3 -3
- package/dist/sidebar.js +1 -1
- package/dist/table.cjs +11 -11
- package/dist/table.js +1 -1
- package/dist/timeline.cjs +4 -4
- package/dist/timeline.js +1 -1
- package/docs/PdfViewer.md +106 -4
- package/package.json +1 -1
- package/dist/PdfViewer.types-Bgn9EmZT.d.cts +0 -22
- package/dist/PdfViewer.types-xnPpdjJa.d.ts +0 -22
- package/dist/chunk-A5RTALZJ.js.map +0 -1
- package/dist/chunk-HRH5BIYG.js +0 -56
- package/dist/chunk-HRH5BIYG.js.map +0 -1
- package/dist/chunk-LX23ZJDM.cjs.map +0 -1
- package/dist/chunk-SONXLQPJ.cjs.map +0 -1
- package/dist/chunk-UVMIJCY3.js.map +0 -1
- package/dist/chunk-XM3W5ETT.cjs +0 -58
- package/dist/chunk-XM3W5ETT.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/inputs/Select/Select.tsx"],"names":["resolveOption","jsx","forwardRef","useId","useFieldMode","useInlineEdit","DisplayValue","Field","InputWrapper","jsxs","cn","inputBaseClasses","inputSizeClasses","dirtyClasses","errorClasses","useState","useEffect","useRef","useFloatingPosition","useCallback","useOutsideClick","useEscapeKey","useMemo","label","opt","Portal"],"mappings":"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","file":"chunk-BDUL42VO.cjs","sourcesContent":["import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { Field } from \"../Field\";\nimport { InputWrapper } from \"../InputWrapper\";\nimport { Portal } from \"../../Portal\";\nimport { useFloatingPosition } from \"../../../hooks/use-floating-position\";\nimport { useOutsideClick } from \"../../../hooks/use-outside-click\";\nimport { useEscapeKey } from \"../../../hooks/use-escape-key\";\nimport {\n dirtyClasses,\n errorClasses,\n inputBaseClasses,\n inputSizeClasses,\n resolveOption,\n} from \"../inputs.utils\";\nimport { useFieldMode } from \"../mode/FieldMode.context\";\nimport { DisplayValue } from \"../mode/DisplayValue\";\nimport { useInlineEdit } from \"../mode/useInlineEdit\";\nimport type { InputOption, InputOptionGroup } from \"../inputs.types\";\nimport type { SelectProps } from \"./Select.types\";\n\nfunction isOptionGroup(\n item: InputOption | InputOptionGroup,\n): item is InputOptionGroup {\n return typeof item === \"object\" && \"options\" in item;\n}\n\nfunction flattenOptions(list: (InputOption | InputOptionGroup)[]): InputOption[] {\n const flat: InputOption[] = [];\n for (const item of list) {\n if (isOptionGroup(item)) {\n flat.push(...item.options);\n } else {\n flat.push(item);\n }\n }\n return flat;\n}\n\nfunction renderNativeOption(option: InputOption, index: number) {\n const resolved = resolveOption(option);\n return (\n <option\n key={`${resolved.value}-${index}`}\n value={resolved.value as string}\n disabled={resolved.disabled}\n >\n {resolved.label}\n </option>\n );\n}\n\n// ── Native variant ──────────────────────────────────────────────────────\n\nconst NativeSelect = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n list,\n placeholder,\n prefix,\n suffix,\n prefixPosition,\n suffixPosition,\n mode,\n onValueChange,\n onChange,\n value,\n defaultValue,\n ...props\n },\n ref,\n ) => {\n const autoId = useId();\n const selectId = id ?? autoId;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n\n if (!showControl) {\n const current = (value ?? defaultValue) as string | undefined;\n const opt = flattenOptions(list)\n .map((o) => resolveOption(o))\n .find((o) => o.value === current);\n const display = (\n <DisplayValue\n size={size}\n leading={prefix}\n trailing={suffix}\n interactive={interactive}\n onActivate={enterEdit}\n >\n {opt?.label ?? current}\n </DisplayValue>\n );\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {display}\n </Field>\n );\n }\n return display;\n }\n\n // When a placeholder is provided but no value/defaultValue, default to \"\"\n // so the disabled placeholder <option> is the initial selection instead of\n // the browser auto-picking the first real option.\n const isControlled = value !== undefined;\n const resolvedDefault =\n !isControlled && defaultValue === undefined && placeholder ? \"\" : defaultValue;\n\n const select = (\n <InputWrapper\n prefix={prefix}\n suffix={suffix}\n prefixPosition={prefixPosition}\n suffixPosition={suffixPosition}\n size={size}\n >\n <select\n data-react-fancy-select=\"\"\n ref={ref}\n id={selectId}\n disabled={disabled}\n required={required}\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n \"w-full appearance-none bg-no-repeat bg-[length:16px] bg-[right_8px_center]\",\n \"bg-[url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22%236b7280%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20d%3D%22M5.23%207.21a.75.75%200%20011.06.02L10%2011.168l3.71-3.938a.75.75%200%20111.08%201.04l-4.25%204.5a.75.75%200%2001-1.08%200l-4.25-4.5a.75.75%200%2001.02-1.06z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E')]\",\n \"pr-8\",\n className,\n )}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n {...props}\n {...(isControlled ? { value } : { defaultValue: resolvedDefault })}\n autoFocus={interactive || props.autoFocus}\n onBlur={(e) => {\n props.onBlur?.(e);\n if (interactive) exitEdit();\n }}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {list.map((item, index) =>\n isOptionGroup(item) ? (\n <optgroup key={`group-${index}`} label={item.label}>\n {item.options.map((opt, optIndex) =>\n renderNativeOption(opt, optIndex),\n )}\n </optgroup>\n ) : (\n renderNativeOption(item, index)\n ),\n )}\n </select>\n </InputWrapper>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {select}\n </Field>\n );\n }\n\n return select;\n },\n);\n\nNativeSelect.displayName = \"NativeSelect\";\n\n// ── Listbox variant ─────────────────────────────────────────────────────\n\nconst ListboxSelect = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n list,\n placeholder = \"Select...\",\n multiple = false,\n values: controlledValues,\n defaultValues,\n onValueChange,\n onValuesChange,\n searchable = false,\n creatable = false,\n onCreate,\n createLabel = \"Create\",\n selectedSuffix = \"selected\",\n indicator = \"check\",\n mode,\n value: controlledSingleValue,\n defaultValue: defaultSingleValue,\n },\n _ref,\n ) => {\n const autoId = useId();\n const selectId = id ?? autoId;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n\n // Creatable implies a text input, which is also the search input.\n const textInputEnabled = searchable || creatable;\n\n // ── State ──────────────────────────────────────────────\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n const [createdOptions, setCreatedOptions] = useState<InputOption[]>([]);\n\n // Single-select state\n const [singleValue, setSingleValue] = useState<string>(\n (controlledSingleValue as string) ?? (defaultSingleValue as string) ?? \"\",\n );\n const currentSingle = (controlledSingleValue as string) ?? singleValue;\n\n // Multi-select state\n const [multiValues, setMultiValues] = useState<string[]>(\n controlledValues ?? defaultValues ?? [],\n );\n const currentMulti = controlledValues ?? multiValues;\n\n // Sync controlled values\n useEffect(() => {\n if (controlledValues) setMultiValues(controlledValues);\n }, [controlledValues]);\n useEffect(() => {\n if (controlledSingleValue !== undefined) setSingleValue(controlledSingleValue as string);\n }, [controlledSingleValue]);\n\n // ── Refs ───────────────────────────────────────────────\n const anchorRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n const position = useFloatingPosition(anchorRef, listRef, {\n placement: \"bottom-start\",\n offset: 4,\n enabled: open,\n });\n\n const close = useCallback(() => {\n setOpen(false);\n setSearch(\"\");\n setActiveIndex(-1);\n }, []);\n\n // Outside-click guards the dropdown (in a Portal) against its own clicks,\n // with the trigger button ignored since it toggles open/closed itself.\n useOutsideClick(listRef, close, open, anchorRef);\n useEscapeKey(close, open);\n\n // Focus text input on open\n useEffect(() => {\n if (open && textInputEnabled) {\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [open, textInputEnabled]);\n\n // ── Options ────────────────────────────────────────────\n const resolvedOptions = useMemo(() => {\n const base = flattenOptions(list).map(resolveOption);\n const created = createdOptions.map(resolveOption);\n return [...base, ...created];\n }, [list, createdOptions]);\n\n const filtered = search\n ? resolvedOptions.filter((o) =>\n o.label.toLowerCase().includes(search.toLowerCase()),\n )\n : resolvedOptions;\n\n // Exact-match check to decide whether to show the \"Create X\" row\n const canCreate =\n creatable &&\n search.trim().length > 0 &&\n !resolvedOptions.some(\n (o) =>\n o.label.toLowerCase() === search.trim().toLowerCase() ||\n o.value === search.trim(),\n );\n\n // ── Selection ──────────────────────────────────────────\n const isSelected = (value: string): boolean => {\n if (multiple) return currentMulti.includes(value);\n return currentSingle === value;\n };\n\n const toggleOption = useCallback(\n (value: string) => {\n if (multiple) {\n const next = currentMulti.includes(value)\n ? currentMulti.filter((v) => v !== value)\n : [...currentMulti, value];\n setMultiValues(next);\n onValuesChange?.(next);\n } else {\n setSingleValue(value);\n onValueChange?.(value);\n close();\n }\n },\n [multiple, currentMulti, onValuesChange, onValueChange, close],\n );\n\n const handleCreate = useCallback(() => {\n const label = search.trim();\n if (!label) return;\n const value = label;\n const newOption: InputOption = { value, label };\n setCreatedOptions((prev) => [...prev, newOption]);\n onCreate?.(label);\n setSearch(\"\");\n if (multiple) {\n const next = [...currentMulti, value];\n setMultiValues(next);\n onValuesChange?.(next);\n // Keep dropdown open for multi-select; refocus input\n requestAnimationFrame(() => searchRef.current?.focus());\n } else {\n setSingleValue(value);\n onValueChange?.(value);\n close();\n }\n }, [search, multiple, currentMulti, onCreate, onValuesChange, onValueChange, close]);\n\n // ── Display text ───────────────────────────────────────\n const getDisplayText = (): string => {\n if (multiple) {\n if (currentMulti.length === 0) return placeholder;\n if (currentMulti.length === 1) {\n const opt = resolvedOptions.find((o) => o.value === currentMulti[0]);\n return opt?.label ?? currentMulti[0];\n }\n return `${currentMulti.length} ${selectedSuffix}`;\n }\n if (!currentSingle) return placeholder;\n const opt = resolvedOptions.find((o) => o.value === currentSingle);\n return opt?.label ?? currentSingle;\n };\n\n const hasValue = multiple ? currentMulti.length > 0 : !!currentSingle;\n\n // ── Keyboard ───────────────────────────────────────────\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, filtered.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\") {\n if (activeIndex >= 0) {\n e.preventDefault();\n const item = filtered[activeIndex];\n if (item && !item.disabled) toggleOption(item.value as string);\n } else if (canCreate) {\n e.preventDefault();\n handleCreate();\n }\n }\n };\n\n // ── View mode ──────────────────────────────────────────\n if (!showControl) {\n const labels = multiple\n ? currentMulti.map(\n (v) => resolvedOptions.find((o) => o.value === v)?.label ?? v,\n )\n : currentSingle\n ? [resolvedOptions.find((o) => o.value === currentSingle)?.label ?? currentSingle]\n : [];\n const display = (\n <DisplayValue size={size} interactive={interactive} onActivate={enterEdit}>\n {labels.join(\", \")}\n </DisplayValue>\n );\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {display}\n </Field>\n );\n }\n return display;\n }\n\n // ── Render ─────────────────────────────────────────────\n const trigger = (\n <button\n ref={anchorRef}\n type=\"button\"\n id={selectId}\n disabled={disabled}\n autoFocus={interactive}\n onClick={() => setOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n data-react-fancy-select=\"\"\n data-variant=\"listbox\"\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n \"flex w-full cursor-pointer items-center justify-between gap-2 text-left\",\n !hasValue && \"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\",\n className,\n )}\n >\n <span className=\"truncate\">{getDisplayText()}</span>\n <svg\n className={cn(\"h-4 w-4 shrink-0 text-zinc-400 transition-transform\", open && \"rotate-180\")}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n );\n\n const dropdown = open && (\n <Portal>\n <div\n ref={listRef}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n className=\"fixed z-50 max-h-60 min-w-[8rem] overflow-y-auto rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] p-1 shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))] dark:shadow-zinc-950/50 fancy-scale-in\"\n style={{\n left: position.x,\n top: position.y,\n width: anchorRef.current?.offsetWidth,\n }}\n >\n {textInputEnabled && (\n <div className=\"px-2 pb-1 pt-1\">\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setActiveIndex(-1);\n }}\n onKeyDown={handleKeyDown}\n placeholder={creatable && !searchable ? \"Type to add…\" : \"Search…\"}\n className=\"w-full rounded-md border-0 bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] px-2.5 py-1.5 text-sm text-[color:var(--fancy-text,var(--color-zinc-900))] placeholder:text-[color:var(--fancy-text-faint,var(--color-zinc-400))] outline-none dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))] dark:placeholder:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\"\n />\n </div>\n )}\n\n {canCreate && (\n <button\n type=\"button\"\n onClick={handleCreate}\n className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-sm text-blue-600 hover:bg-blue-50 dark:text-blue-400 dark:hover:bg-blue-500/10\"\n >\n <svg className=\"h-4 w-4 shrink-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 3a.75.75 0 01.75.75v5.5h5.5a.75.75 0 010 1.5h-5.5v5.5a.75.75 0 01-1.5 0v-5.5h-5.5a.75.75 0 010-1.5h5.5v-5.5A.75.75 0 0110 3z\" clipRule=\"evenodd\" />\n </svg>\n <span className=\"truncate\">{createLabel} "{search.trim()}"</span>\n </button>\n )}\n\n {filtered.length === 0 && !canCreate ? (\n <div className=\"px-3 py-2 text-sm text-zinc-400\">No results found</div>\n ) : filtered.length === 0 ? null : (\n filtered.map((option, i) => {\n const selected = isSelected(option.value as string);\n return (\n <button\n key={option.value as string}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n disabled={option.disabled}\n onClick={() => toggleOption(option.value as string)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-sm transition-colors\",\n i === activeIndex\n ? \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\"\n : \"hover:bg-zinc-50 dark:hover:bg-zinc-800/50\",\n selected\n ? \"text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\"\n : \"text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\",\n option.disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n {/* Indicator */}\n {indicator === \"checkbox\" ? (\n <span\n className={cn(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border transition-colors\",\n selected\n ? \"border-blue-500 bg-blue-500 text-white dark:border-blue-400 dark:bg-blue-400\"\n : \"border-zinc-300 dark:border-zinc-600\",\n )}\n >\n {selected && (\n <svg className=\"h-3 w-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"2.5 6 5 8.5 9.5 3.5\" />\n </svg>\n )}\n </span>\n ) : (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n {selected && (\n <svg className=\"h-4 w-4 text-blue-500 dark:text-blue-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </span>\n )}\n\n {/* Label + description */}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label}</span>\n {option.description && (\n <span className=\"block truncate text-xs text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\">{option.description}</span>\n )}\n </span>\n </button>\n );\n })\n )}\n </div>\n </Portal>\n );\n\n const content = (\n <div\n className=\"relative\"\n onBlur={(e) => {\n // The popover is portaled (focus moves out of this wrapper), so only\n // exit edit when the dropdown is closed and focus has truly left.\n if (interactive && !open && !e.currentTarget.contains(e.relatedTarget as Node)) {\n exitEdit();\n }\n }}\n >\n {trigger}\n {dropdown}\n </div>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {content}\n </Field>\n );\n }\n\n return content;\n },\n);\n\nListboxSelect.displayName = \"ListboxSelect\";\n\n// ── Public component ────────────────────────────────────────────────────\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n (props, ref) => {\n const variant = props.variant ?? (props.multiple ? \"listbox\" : \"native\");\n\n if (variant === \"listbox\") {\n return <ListboxSelect {...props} ref={ref} />;\n }\n return <NativeSelect {...props} ref={ref} />;\n },\n);\n\nSelect.displayName = \"Select\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/inputs/Select/Select.tsx"],"names":["resolveOption","jsx","forwardRef","useId","useFieldMode","useInlineEdit","DisplayValue","Field","InputWrapper","jsxs","cn","inputBaseClasses","inputSizeClasses","dirtyClasses","errorClasses","useState","useEffect","useRef","useFloatingPosition","useCallback","useOutsideClick","useEscapeKey","useMemo","label","opt","Portal"],"mappings":"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","file":"chunk-GLGUQGAQ.cjs","sourcesContent":["import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { Field } from \"../Field\";\nimport { InputWrapper } from \"../InputWrapper\";\nimport { Portal } from \"../../Portal\";\nimport { useFloatingPosition } from \"../../../hooks/use-floating-position\";\nimport { useOutsideClick } from \"../../../hooks/use-outside-click\";\nimport { useEscapeKey } from \"../../../hooks/use-escape-key\";\nimport {\n dirtyClasses,\n errorClasses,\n inputBaseClasses,\n inputSizeClasses,\n resolveOption,\n} from \"../inputs.utils\";\nimport { useFieldMode } from \"../mode/FieldMode.context\";\nimport { DisplayValue } from \"../mode/DisplayValue\";\nimport { useInlineEdit } from \"../mode/useInlineEdit\";\nimport type { InputOption, InputOptionGroup } from \"../inputs.types\";\nimport type { SelectProps } from \"./Select.types\";\n\nfunction isOptionGroup(\n item: InputOption | InputOptionGroup,\n): item is InputOptionGroup {\n return typeof item === \"object\" && \"options\" in item;\n}\n\nfunction flattenOptions(list: (InputOption | InputOptionGroup)[]): InputOption[] {\n const flat: InputOption[] = [];\n for (const item of list) {\n if (isOptionGroup(item)) {\n flat.push(...item.options);\n } else {\n flat.push(item);\n }\n }\n return flat;\n}\n\nfunction renderNativeOption(option: InputOption, index: number) {\n const resolved = resolveOption(option);\n return (\n <option\n key={`${resolved.value}-${index}`}\n value={resolved.value as string}\n disabled={resolved.disabled}\n >\n {resolved.label}\n </option>\n );\n}\n\n// ── Native variant ──────────────────────────────────────────────────────\n\nconst NativeSelect = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n list,\n placeholder,\n prefix,\n suffix,\n prefixPosition,\n suffixPosition,\n mode,\n onValueChange,\n onChange,\n value,\n defaultValue,\n ...props\n },\n ref,\n ) => {\n const autoId = useId();\n const selectId = id ?? autoId;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n\n if (!showControl) {\n const current = (value ?? defaultValue) as string | undefined;\n const opt = flattenOptions(list)\n .map((o) => resolveOption(o))\n .find((o) => o.value === current);\n const display = (\n <DisplayValue\n size={size}\n leading={prefix}\n trailing={suffix}\n interactive={interactive}\n onActivate={enterEdit}\n >\n {opt?.label ?? current}\n </DisplayValue>\n );\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {display}\n </Field>\n );\n }\n return display;\n }\n\n // When a placeholder is provided but no value/defaultValue, default to \"\"\n // so the disabled placeholder <option> is the initial selection instead of\n // the browser auto-picking the first real option.\n const isControlled = value !== undefined;\n const resolvedDefault =\n !isControlled && defaultValue === undefined && placeholder ? \"\" : defaultValue;\n\n const select = (\n <InputWrapper\n prefix={prefix}\n suffix={suffix}\n prefixPosition={prefixPosition}\n suffixPosition={suffixPosition}\n size={size}\n >\n <select\n data-react-fancy-select=\"\"\n ref={ref}\n id={selectId}\n disabled={disabled}\n required={required}\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n \"w-full appearance-none bg-no-repeat bg-[length:16px] bg-[right_8px_center]\",\n \"bg-[url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22%236b7280%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20d%3D%22M5.23%207.21a.75.75%200%20011.06.02L10%2011.168l3.71-3.938a.75.75%200%20111.08%201.04l-4.25%204.5a.75.75%200%2001-1.08%200l-4.25-4.5a.75.75%200%2001.02-1.06z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E')]\",\n \"pr-8\",\n className,\n )}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n {...props}\n {...(isControlled ? { value } : { defaultValue: resolvedDefault })}\n autoFocus={interactive || props.autoFocus}\n onBlur={(e) => {\n props.onBlur?.(e);\n if (interactive) exitEdit();\n }}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {list.map((item, index) =>\n isOptionGroup(item) ? (\n <optgroup key={`group-${index}`} label={item.label}>\n {item.options.map((opt, optIndex) =>\n renderNativeOption(opt, optIndex),\n )}\n </optgroup>\n ) : (\n renderNativeOption(item, index)\n ),\n )}\n </select>\n </InputWrapper>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {select}\n </Field>\n );\n }\n\n return select;\n },\n);\n\nNativeSelect.displayName = \"NativeSelect\";\n\n// ── Listbox variant ─────────────────────────────────────────────────────\n\nconst ListboxSelect = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n list,\n placeholder = \"Select...\",\n multiple = false,\n values: controlledValues,\n defaultValues,\n onValueChange,\n onValuesChange,\n searchable = false,\n creatable = false,\n onCreate,\n createLabel = \"Create\",\n selectedSuffix = \"selected\",\n indicator = \"check\",\n mode,\n value: controlledSingleValue,\n defaultValue: defaultSingleValue,\n },\n _ref,\n ) => {\n const autoId = useId();\n const selectId = id ?? autoId;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n\n // Creatable implies a text input, which is also the search input.\n const textInputEnabled = searchable || creatable;\n\n // ── State ──────────────────────────────────────────────\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n const [createdOptions, setCreatedOptions] = useState<InputOption[]>([]);\n\n // Single-select state\n const [singleValue, setSingleValue] = useState<string>(\n (controlledSingleValue as string) ?? (defaultSingleValue as string) ?? \"\",\n );\n const currentSingle = (controlledSingleValue as string) ?? singleValue;\n\n // Multi-select state\n const [multiValues, setMultiValues] = useState<string[]>(\n controlledValues ?? defaultValues ?? [],\n );\n const currentMulti = controlledValues ?? multiValues;\n\n // Sync controlled values\n useEffect(() => {\n if (controlledValues) setMultiValues(controlledValues);\n }, [controlledValues]);\n useEffect(() => {\n if (controlledSingleValue !== undefined) setSingleValue(controlledSingleValue as string);\n }, [controlledSingleValue]);\n\n // ── Refs ───────────────────────────────────────────────\n const anchorRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n const position = useFloatingPosition(anchorRef, listRef, {\n placement: \"bottom-start\",\n offset: 4,\n enabled: open,\n });\n\n const close = useCallback(() => {\n setOpen(false);\n setSearch(\"\");\n setActiveIndex(-1);\n }, []);\n\n // Outside-click guards the dropdown (in a Portal) against its own clicks,\n // with the trigger button ignored since it toggles open/closed itself.\n useOutsideClick(listRef, close, open, anchorRef);\n useEscapeKey(close, open);\n\n // Focus text input on open\n useEffect(() => {\n if (open && textInputEnabled) {\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [open, textInputEnabled]);\n\n // ── Options ────────────────────────────────────────────\n const resolvedOptions = useMemo(() => {\n const base = flattenOptions(list).map(resolveOption);\n const created = createdOptions.map(resolveOption);\n return [...base, ...created];\n }, [list, createdOptions]);\n\n const filtered = search\n ? resolvedOptions.filter((o) =>\n o.label.toLowerCase().includes(search.toLowerCase()),\n )\n : resolvedOptions;\n\n // Exact-match check to decide whether to show the \"Create X\" row\n const canCreate =\n creatable &&\n search.trim().length > 0 &&\n !resolvedOptions.some(\n (o) =>\n o.label.toLowerCase() === search.trim().toLowerCase() ||\n o.value === search.trim(),\n );\n\n // ── Selection ──────────────────────────────────────────\n const isSelected = (value: string): boolean => {\n if (multiple) return currentMulti.includes(value);\n return currentSingle === value;\n };\n\n const toggleOption = useCallback(\n (value: string) => {\n if (multiple) {\n const next = currentMulti.includes(value)\n ? currentMulti.filter((v) => v !== value)\n : [...currentMulti, value];\n setMultiValues(next);\n onValuesChange?.(next);\n } else {\n setSingleValue(value);\n onValueChange?.(value);\n close();\n }\n },\n [multiple, currentMulti, onValuesChange, onValueChange, close],\n );\n\n const handleCreate = useCallback(() => {\n const label = search.trim();\n if (!label) return;\n const value = label;\n const newOption: InputOption = { value, label };\n setCreatedOptions((prev) => [...prev, newOption]);\n onCreate?.(label);\n setSearch(\"\");\n if (multiple) {\n const next = [...currentMulti, value];\n setMultiValues(next);\n onValuesChange?.(next);\n // Keep dropdown open for multi-select; refocus input\n requestAnimationFrame(() => searchRef.current?.focus());\n } else {\n setSingleValue(value);\n onValueChange?.(value);\n close();\n }\n }, [search, multiple, currentMulti, onCreate, onValuesChange, onValueChange, close]);\n\n // ── Display text ───────────────────────────────────────\n const getDisplayText = (): string => {\n if (multiple) {\n if (currentMulti.length === 0) return placeholder;\n if (currentMulti.length === 1) {\n const opt = resolvedOptions.find((o) => o.value === currentMulti[0]);\n return opt?.label ?? currentMulti[0];\n }\n return `${currentMulti.length} ${selectedSuffix}`;\n }\n if (!currentSingle) return placeholder;\n const opt = resolvedOptions.find((o) => o.value === currentSingle);\n return opt?.label ?? currentSingle;\n };\n\n const hasValue = multiple ? currentMulti.length > 0 : !!currentSingle;\n\n // ── Keyboard ───────────────────────────────────────────\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, filtered.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\") {\n if (activeIndex >= 0) {\n e.preventDefault();\n const item = filtered[activeIndex];\n if (item && !item.disabled) toggleOption(item.value as string);\n } else if (canCreate) {\n e.preventDefault();\n handleCreate();\n }\n }\n };\n\n // ── View mode ──────────────────────────────────────────\n if (!showControl) {\n const labels = multiple\n ? currentMulti.map(\n (v) => resolvedOptions.find((o) => o.value === v)?.label ?? v,\n )\n : currentSingle\n ? [resolvedOptions.find((o) => o.value === currentSingle)?.label ?? currentSingle]\n : [];\n const display = (\n <DisplayValue size={size} interactive={interactive} onActivate={enterEdit}>\n {labels.join(\", \")}\n </DisplayValue>\n );\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {display}\n </Field>\n );\n }\n return display;\n }\n\n // ── Render ─────────────────────────────────────────────\n const trigger = (\n <button\n ref={anchorRef}\n type=\"button\"\n id={selectId}\n disabled={disabled}\n autoFocus={interactive}\n onClick={() => setOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n data-react-fancy-select=\"\"\n data-variant=\"listbox\"\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n \"flex w-full cursor-pointer items-center justify-between gap-2 text-left\",\n !hasValue && \"text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\",\n className,\n )}\n >\n <span className=\"truncate\">{getDisplayText()}</span>\n <svg\n className={cn(\"h-4 w-4 shrink-0 text-zinc-400 transition-transform\", open && \"rotate-180\")}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n );\n\n const dropdown = open && (\n <Portal>\n <div\n ref={listRef}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n className=\"fixed z-50 max-h-60 min-w-[8rem] overflow-y-auto rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] p-1 shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))] dark:shadow-zinc-950/50 fancy-scale-in\"\n style={{\n left: position.x,\n top: position.y,\n width: anchorRef.current?.offsetWidth,\n }}\n >\n {textInputEnabled && (\n <div className=\"px-2 pb-1 pt-1\">\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setActiveIndex(-1);\n }}\n onKeyDown={handleKeyDown}\n placeholder={creatable && !searchable ? \"Type to add…\" : \"Search…\"}\n className=\"w-full rounded-md border-0 bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] px-2.5 py-1.5 text-sm text-[color:var(--fancy-text,var(--color-zinc-900))] placeholder:text-[color:var(--fancy-text-faint,var(--color-zinc-400))] outline-none dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))] dark:placeholder:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\"\n />\n </div>\n )}\n\n {canCreate && (\n <button\n type=\"button\"\n onClick={handleCreate}\n className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-sm text-blue-600 hover:bg-blue-50 dark:text-blue-400 dark:hover:bg-blue-500/10\"\n >\n <svg className=\"h-4 w-4 shrink-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 3a.75.75 0 01.75.75v5.5h5.5a.75.75 0 010 1.5h-5.5v5.5a.75.75 0 01-1.5 0v-5.5h-5.5a.75.75 0 010-1.5h5.5v-5.5A.75.75 0 0110 3z\" clipRule=\"evenodd\" />\n </svg>\n <span className=\"truncate\">{createLabel} "{search.trim()}"</span>\n </button>\n )}\n\n {filtered.length === 0 && !canCreate ? (\n <div className=\"px-3 py-2 text-sm text-zinc-400\">No results found</div>\n ) : filtered.length === 0 ? null : (\n filtered.map((option, i) => {\n const selected = isSelected(option.value as string);\n return (\n <button\n key={option.value as string}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n disabled={option.disabled}\n onClick={() => toggleOption(option.value as string)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-sm transition-colors\",\n i === activeIndex\n ? \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\"\n : \"hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))]\",\n selected\n ? \"text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\"\n : \"text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\",\n option.disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n {/* Indicator */}\n {indicator === \"checkbox\" ? (\n <span\n className={cn(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border transition-colors\",\n selected\n ? \"border-blue-500 bg-blue-500 text-white dark:border-blue-400 dark:bg-blue-400\"\n : \"border-zinc-300 dark:border-zinc-600\",\n )}\n >\n {selected && (\n <svg className=\"h-3 w-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"2.5 6 5 8.5 9.5 3.5\" />\n </svg>\n )}\n </span>\n ) : (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n {selected && (\n <svg className=\"h-4 w-4 text-blue-500 dark:text-blue-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </span>\n )}\n\n {/* Label + description */}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label}</span>\n {option.description && (\n <span className=\"block truncate text-xs text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\">{option.description}</span>\n )}\n </span>\n </button>\n );\n })\n )}\n </div>\n </Portal>\n );\n\n const content = (\n <div\n className=\"relative\"\n onBlur={(e) => {\n // The popover is portaled (focus moves out of this wrapper), so only\n // exit edit when the dropdown is closed and focus has truly left.\n if (interactive && !open && !e.currentTarget.contains(e.relatedTarget as Node)) {\n exitEdit();\n }\n }}\n >\n {trigger}\n {dropdown}\n </div>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={selectId}\n size={size}\n >\n {content}\n </Field>\n );\n }\n\n return content;\n },\n);\n\nListboxSelect.displayName = \"ListboxSelect\";\n\n// ── Public component ────────────────────────────────────────────────────\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n (props, ref) => {\n const variant = props.variant ?? (props.multiple ? \"listbox\" : \"native\");\n\n if (variant === \"listbox\") {\n return <ListboxSelect {...props} ref={ref} />;\n }\n return <NativeSelect {...props} ref={ref} />;\n },\n);\n\nSelect.displayName = \"Select\";\n"]}
|
|
@@ -152,7 +152,7 @@ function MobileMenuItem({
|
|
|
152
152
|
className: chunkZU5Q77OT_cjs.cn(
|
|
153
153
|
"flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-sm font-medium transition-colors",
|
|
154
154
|
"outline-none focus-visible:ring-2 focus-visible:ring-blue-500",
|
|
155
|
-
active ? "bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] text-[color:var(--fancy-text,var(--color-zinc-900))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]" : "text-zinc-600 hover:bg-zinc-50 hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-zinc-400 dark:hover:bg-zinc-800
|
|
155
|
+
active ? "bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] text-[color:var(--fancy-text,var(--color-zinc-900))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]" : "text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]",
|
|
156
156
|
disabled && "pointer-events-none opacity-50",
|
|
157
157
|
className
|
|
158
158
|
),
|
|
@@ -175,5 +175,5 @@ var MobileMenu = {
|
|
|
175
175
|
|
|
176
176
|
exports.MobileMenu = MobileMenu;
|
|
177
177
|
exports.useMobileMenu = useMobileMenu;
|
|
178
|
-
//# sourceMappingURL=chunk-
|
|
179
|
-
//# sourceMappingURL=chunk-
|
|
178
|
+
//# sourceMappingURL=chunk-HTNQ5XUR.cjs.map
|
|
179
|
+
//# sourceMappingURL=chunk-HTNQ5XUR.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/MobileMenu/MobileMenu.context.ts","../src/components/MobileMenu/MobileMenuFlyout.tsx","../src/components/MobileMenu/MobileMenuBottomBar.tsx","../src/components/MobileMenu/MobileMenuItem.tsx","../src/components/MobileMenu/MobileMenu.tsx"],"names":["createContext","useContext","useAnimation","useEscapeKey","useEffect","Portal","jsx","jsxs","cn","X"],"mappings":"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","file":"chunk-A5DN2XNM.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { MobileMenuContextValue } from \"./MobileMenu.types\";\n\nexport const MobileMenuContext = createContext<MobileMenuContextValue | null>(null);\n\nexport function useMobileMenu(): MobileMenuContextValue {\n const ctx = useContext(MobileMenuContext);\n if (!ctx) {\n throw new Error(\"useMobileMenu must be used within a <MobileMenu> component\");\n }\n return ctx;\n}\n","import { useEffect } from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useEscapeKey } from \"../../hooks\";\nimport { useAnimation } from \"../../hooks\";\nimport { Portal } from \"../Portal\";\nimport { MobileMenuContext } from \"./MobileMenu.context\";\nimport type { MobileMenuFlyoutProps } from \"./MobileMenu.types\";\n\nexport function MobileMenuFlyout({\n children,\n open,\n onClose,\n side = \"left\",\n title,\n className,\n}: MobileMenuFlyoutProps) {\n const isLeft = side === \"left\";\n\n const { mounted, className: animClass, ref } = useAnimation({\n open,\n enterClass: isLeft ? \"fancy-slide-in-left\" : \"fancy-slide-in-right\",\n exitClass: isLeft ? \"fancy-slide-out-left\" : \"fancy-slide-out-right\",\n });\n\n useEscapeKey(onClose, open);\n\n // Lock body scroll\n useEffect(() => {\n if (open) {\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }\n }, [open]);\n\n if (!mounted) return null;\n\n return (\n <Portal>\n <MobileMenuContext.Provider value={{ variant: \"flyout\" }}>\n <div data-react-fancy-mobile-menu-flyout=\"\" className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n <div\n className={cn(\n \"absolute inset-0 bg-black/40 transition-opacity\",\n open ? \"opacity-100\" : \"opacity-0\",\n )}\n onClick={onClose}\n />\n\n {/* Panel */}\n <div\n ref={ref as React.RefObject<HTMLDivElement>}\n className={cn(\n \"absolute top-0 flex h-full w-72 max-w-[80vw] flex-col bg-[color:var(--fancy-surface,var(--color-white))] shadow-xl dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n isLeft ? \"left-0\" : \"right-0\",\n animClass,\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-4 py-3 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\">\n {title && (\n <span className=\"text-sm font-semibold text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\">\n {title}\n </span>\n )}\n {!title && <span />}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-zinc-400 transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {children}\n </div>\n </div>\n </div>\n </MobileMenuContext.Provider>\n </Portal>\n );\n}\n\nMobileMenuFlyout.displayName = \"MobileMenuFlyout\";\n","import { cn } from \"../../utils/cn\";\nimport { MobileMenuContext } from \"./MobileMenu.context\";\nimport type { MobileMenuBottomBarProps } from \"./MobileMenu.types\";\n\nexport function MobileMenuBottomBar({ children, className }: MobileMenuBottomBarProps) {\n return (\n <MobileMenuContext.Provider value={{ variant: \"bottom-bar\" }}>\n <nav\n data-react-fancy-mobile-menu-bottom-bar=\"\"\n className={cn(\n \"fixed inset-x-0 bottom-0 z-40 flex items-stretch border-t border-[color:var(--fancy-border,var(--color-zinc-200))] bg-white/95 backdrop-blur-sm dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-zinc-900/95\",\n \"pb-[env(safe-area-inset-bottom)]\",\n className,\n )}\n >\n {children}\n </nav>\n </MobileMenuContext.Provider>\n );\n}\n\nMobileMenuBottomBar.displayName = \"MobileMenuBottomBar\";\n","import type { ElementType } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useMobileMenu } from \"./MobileMenu.context\";\nimport type { MobileMenuItemProps } from \"./MobileMenu.types\";\n\nexport function MobileMenuItem({\n children,\n href,\n as: As,\n icon,\n active = false,\n disabled = false,\n badge,\n onClick,\n className,\n ...rest\n}: MobileMenuItemProps) {\n const { variant } = useMobileMenu();\n const isBottomBar = variant === \"bottom-bar\";\n\n // See NavigableProps: link mode engages on `href` OR `as`. Keeping `onClick`\n // in link mode matters most here — a mobile item usually has to close the menu\n // as well as navigate, and it was silently dropped.\n const isLink = Boolean(href || As);\n const Tag = isLink ? ((As ?? \"a\") as ElementType) : \"button\";\n const tagProps = isLink\n ? { ...(href ? { href } : {}), onClick }\n : { type: \"button\" as const, onClick };\n\n if (isBottomBar) {\n return (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-mobile-menu-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"flex flex-1 flex-col items-center justify-center gap-0.5 py-1.5 text-xs font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-inset\",\n active\n ? \"text-blue-600 dark:text-blue-400\"\n : \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {icon && <span className=\"flex h-5 w-5 items-center justify-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n {badge && <span className=\"absolute right-1 top-0.5\">{badge}</span>}\n </Tag>\n );\n }\n\n // Flyout variant — same as a vertical menu item\n return (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-mobile-menu-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-sm font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n active\n ? \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] text-[color:var(--fancy-text,var(--color-zinc-900))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\"\n : \"text-zinc-600 hover:bg-zinc-50 hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-zinc-400 dark:hover:bg-zinc-800/50 dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 truncate text-left\">{children}</span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n </Tag>\n );\n}\n\nMobileMenuItem.displayName = \"MobileMenuItem\";\n","import { MobileMenuFlyout } from \"./MobileMenuFlyout\";\nimport { MobileMenuBottomBar } from \"./MobileMenuBottomBar\";\nimport { MobileMenuItem } from \"./MobileMenuItem\";\n\nexport const MobileMenu = {\n Flyout: MobileMenuFlyout,\n BottomBar: MobileMenuBottomBar,\n Item: MobileMenuItem,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/MobileMenu/MobileMenu.context.ts","../src/components/MobileMenu/MobileMenuFlyout.tsx","../src/components/MobileMenu/MobileMenuBottomBar.tsx","../src/components/MobileMenu/MobileMenuItem.tsx","../src/components/MobileMenu/MobileMenu.tsx"],"names":["createContext","useContext","useAnimation","useEscapeKey","useEffect","Portal","jsx","jsxs","cn","X"],"mappings":";;;;;;;;;;AAGO,IAAM,iBAAA,GAAoBA,oBAA6C,IAAI,CAAA;AAE3E,SAAS,aAAA,GAAwC;AACtD,EAAA,MAAM,GAAA,GAAMC,iBAAW,iBAAiB,CAAA;AACxC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,GAAA;AACT;ACFO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,KAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,SAAS,IAAA,KAAS,MAAA;AAExB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,GAAA,KAAQC,8BAAA,CAAa;AAAA,IAC1D,IAAA;AAAA,IACA,UAAA,EAAY,SAAS,qBAAA,GAAwB,sBAAA;AAAA,IAC7C,SAAA,EAAW,SAAS,sBAAA,GAAyB;AAAA,GAC9C,CAAA;AAED,EAAAC,8BAAA,CAAa,SAAS,IAAI,CAAA;AAG1B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,IAAA;AAAA,MACjC,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,sCACGC,wBAAA,EAAA,EACC,QAAA,kBAAAC,cAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,KAAA,EAAO,EAAE,OAAA,EAAS,QAAA,IAC5C,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,qCAAA,EAAoC,EAAA,EAAG,WAAU,oBAAA,EAEpD,QAAA,EAAA;AAAA,oBAAAD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWE,oBAAA;AAAA,UACT,iDAAA;AAAA,UACA,OAAO,aAAA,GAAgB;AAAA,SACzB;AAAA,QACA,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,oBAGAD,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWC,oBAAA;AAAA,UACT,oLAAA;AAAA,UACA,SAAS,QAAA,GAAW,SAAA;AAAA,UACpB,SAAA;AAAA,UACA;AAAA,SACF;AAAA,QAGA,QAAA,EAAA;AAAA,0BAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kLAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,oBACCD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2IAAA,EACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YAED,CAAC,KAAA,oBAASA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,4BACjBA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,gRAAA;AAAA,gBAEV,QAAA,kBAAAA,cAAA,CAACG,aAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,WAAA,EACF,CAAA;AAAA,0BAGAH,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,QAAA,EACH;AAAA;AAAA;AAAA;AACF,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AAEA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACvFxB,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAU,SAAA,EAAU,EAA6B;AACrF,EAAA,uBACEA,cAAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OAAO,EAAE,OAAA,EAAS,YAAA,EAAa,EACzD,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,yCAAA,EAAwC,EAAA;AAAA,MACxC,SAAA,EAAWE,oBAAA;AAAA,QACT,wOAAA;AAAA,QACA,kCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;AChB3B,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA,EAAI,EAAA;AAAA,EACJ,IAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA,EACX,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,aAAA,EAAc;AAClC,EAAA,MAAM,cAAc,OAAA,KAAY,YAAA;AAKhC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,MAAA,GAAW,EAAA,IAAM,GAAA,GAAuB,QAAA;AACpD,EAAA,MAAM,QAAA,GAAW,MAAA,GACb,EAAE,GAAI,OAAO,EAAE,IAAA,EAAK,GAAI,IAAK,OAAA,EAAQ,GACrC,EAAE,IAAA,EAAM,UAAmB,OAAA,EAAQ;AAEvC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACED,eAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACE,GAAG,QAAA;AAAA,QACH,GAAG,IAAA;AAAA,QACJ,mCAAA,EAAkC,EAAA;AAAA,QAClC,eAAa,MAAA,IAAU,MAAA;AAAA,QACvB,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,QAChC,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,SAAA,EAAWC,oBAAA;AAAA,UACT,uGAAA;AAAA,UACA,wFAAA;AAAA,UACA,SACI,kCAAA,GACA,iQAAA;AAAA,UACJ,QAAA,IAAY,gCAAA;AAAA,UACZ;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAA4C,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,0BAC1EA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAS,CAAA;AAAA,UACpC,yBAASA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KAC9D;AAAA,EAEJ;AAGA,EAAA,uBACEC,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACE,GAAG,QAAA;AAAA,MACH,GAAG,IAAA;AAAA,MACJ,mCAAA,EAAkC,EAAA;AAAA,MAClC,eAAa,MAAA,IAAU,MAAA;AAAA,MACvB,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,MAChC,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,SAAA,EAAWC,oBAAA;AAAA,QACT,6FAAA;AAAA,QACA,+DAAA;AAAA,QACA,SACI,uPAAA,GACA,obAAA;AAAA,QACJ,QAAA,IAAY,gCAAA;AAAA,QACZ;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAqD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBACnFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAA6B,QAAA,EAAS,CAAA;AAAA,QACrD,yBAASA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GAC9C;AAEJ;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA;;;AC7EtB,IAAM,UAAA,GAAa;AAAA,EACxB,MAAA,EAAQ,gBAAA;AAAA,EACR,SAAA,EAAW,mBAAA;AAAA,EACX,IAAA,EAAM;AACR","file":"chunk-HTNQ5XUR.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { MobileMenuContextValue } from \"./MobileMenu.types\";\n\nexport const MobileMenuContext = createContext<MobileMenuContextValue | null>(null);\n\nexport function useMobileMenu(): MobileMenuContextValue {\n const ctx = useContext(MobileMenuContext);\n if (!ctx) {\n throw new Error(\"useMobileMenu must be used within a <MobileMenu> component\");\n }\n return ctx;\n}\n","import { useEffect } from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useEscapeKey } from \"../../hooks\";\nimport { useAnimation } from \"../../hooks\";\nimport { Portal } from \"../Portal\";\nimport { MobileMenuContext } from \"./MobileMenu.context\";\nimport type { MobileMenuFlyoutProps } from \"./MobileMenu.types\";\n\nexport function MobileMenuFlyout({\n children,\n open,\n onClose,\n side = \"left\",\n title,\n className,\n}: MobileMenuFlyoutProps) {\n const isLeft = side === \"left\";\n\n const { mounted, className: animClass, ref } = useAnimation({\n open,\n enterClass: isLeft ? \"fancy-slide-in-left\" : \"fancy-slide-in-right\",\n exitClass: isLeft ? \"fancy-slide-out-left\" : \"fancy-slide-out-right\",\n });\n\n useEscapeKey(onClose, open);\n\n // Lock body scroll\n useEffect(() => {\n if (open) {\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }\n }, [open]);\n\n if (!mounted) return null;\n\n return (\n <Portal>\n <MobileMenuContext.Provider value={{ variant: \"flyout\" }}>\n <div data-react-fancy-mobile-menu-flyout=\"\" className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n <div\n className={cn(\n \"absolute inset-0 bg-black/40 transition-opacity\",\n open ? \"opacity-100\" : \"opacity-0\",\n )}\n onClick={onClose}\n />\n\n {/* Panel */}\n <div\n ref={ref as React.RefObject<HTMLDivElement>}\n className={cn(\n \"absolute top-0 flex h-full w-72 max-w-[80vw] flex-col bg-[color:var(--fancy-surface,var(--color-white))] shadow-xl dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n isLeft ? \"left-0\" : \"right-0\",\n animClass,\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-4 py-3 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\">\n {title && (\n <span className=\"text-sm font-semibold text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\">\n {title}\n </span>\n )}\n {!title && <span />}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-zinc-400 transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-2\">\n {children}\n </div>\n </div>\n </div>\n </MobileMenuContext.Provider>\n </Portal>\n );\n}\n\nMobileMenuFlyout.displayName = \"MobileMenuFlyout\";\n","import { cn } from \"../../utils/cn\";\nimport { MobileMenuContext } from \"./MobileMenu.context\";\nimport type { MobileMenuBottomBarProps } from \"./MobileMenu.types\";\n\nexport function MobileMenuBottomBar({ children, className }: MobileMenuBottomBarProps) {\n return (\n <MobileMenuContext.Provider value={{ variant: \"bottom-bar\" }}>\n <nav\n data-react-fancy-mobile-menu-bottom-bar=\"\"\n className={cn(\n \"fixed inset-x-0 bottom-0 z-40 flex items-stretch border-t border-[color:var(--fancy-border,var(--color-zinc-200))] bg-white/95 backdrop-blur-sm dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-zinc-900/95\",\n \"pb-[env(safe-area-inset-bottom)]\",\n className,\n )}\n >\n {children}\n </nav>\n </MobileMenuContext.Provider>\n );\n}\n\nMobileMenuBottomBar.displayName = \"MobileMenuBottomBar\";\n","import type { ElementType } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useMobileMenu } from \"./MobileMenu.context\";\nimport type { MobileMenuItemProps } from \"./MobileMenu.types\";\n\nexport function MobileMenuItem({\n children,\n href,\n as: As,\n icon,\n active = false,\n disabled = false,\n badge,\n onClick,\n className,\n ...rest\n}: MobileMenuItemProps) {\n const { variant } = useMobileMenu();\n const isBottomBar = variant === \"bottom-bar\";\n\n // See NavigableProps: link mode engages on `href` OR `as`. Keeping `onClick`\n // in link mode matters most here — a mobile item usually has to close the menu\n // as well as navigate, and it was silently dropped.\n const isLink = Boolean(href || As);\n const Tag = isLink ? ((As ?? \"a\") as ElementType) : \"button\";\n const tagProps = isLink\n ? { ...(href ? { href } : {}), onClick }\n : { type: \"button\" as const, onClick };\n\n if (isBottomBar) {\n return (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-mobile-menu-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"flex flex-1 flex-col items-center justify-center gap-0.5 py-1.5 text-xs font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-inset\",\n active\n ? \"text-blue-600 dark:text-blue-400\"\n : \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {icon && <span className=\"flex h-5 w-5 items-center justify-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n {badge && <span className=\"absolute right-1 top-0.5\">{badge}</span>}\n </Tag>\n );\n }\n\n // Flyout variant — same as a vertical menu item\n return (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-mobile-menu-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-sm font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n active\n ? \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] text-[color:var(--fancy-text,var(--color-zinc-900))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\"\n : \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 truncate text-left\">{children}</span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n </Tag>\n );\n}\n\nMobileMenuItem.displayName = \"MobileMenuItem\";\n","import { MobileMenuFlyout } from \"./MobileMenuFlyout\";\nimport { MobileMenuBottomBar } from \"./MobileMenuBottomBar\";\nimport { MobileMenuItem } from \"./MobileMenuItem\";\n\nexport const MobileMenu = {\n Flyout: MobileMenuFlyout,\n BottomBar: MobileMenuBottomBar,\n Item: MobileMenuItem,\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk5IWKZ2WK_cjs = require('./chunk-5IWKZ2WK.cjs');
|
|
4
4
|
var chunkG7227RTY_cjs = require('./chunk-G7227RTY.cjs');
|
|
5
5
|
var chunkL3V3BYVS_cjs = require('./chunk-L3V3BYVS.cjs');
|
|
6
6
|
var chunkX2FC7ODX_cjs = require('./chunk-X2FC7ODX.cjs');
|
|
@@ -130,7 +130,7 @@ function EditorContent({ className, maxHeight, sourceClassName }) {
|
|
|
130
130
|
}
|
|
131
131
|
}, [contentRef, _initialHtml, showSource]);
|
|
132
132
|
const extClasses = react.useMemo(
|
|
133
|
-
() =>
|
|
133
|
+
() => chunk5IWKZ2WK_cjs.extensionEditorClasses(extensions),
|
|
134
134
|
[extensions]
|
|
135
135
|
);
|
|
136
136
|
if (showSource) {
|
|
@@ -162,7 +162,7 @@ function EditorContent({ className, maxHeight, sourceClassName }) {
|
|
|
162
162
|
className: chunkZU5Q77OT_cjs.cn(
|
|
163
163
|
"min-h-[120px] flex-auto overflow-y-auto px-4 py-3 text-sm outline-none",
|
|
164
164
|
"focus:outline-none",
|
|
165
|
-
|
|
165
|
+
chunk5IWKZ2WK_cjs.proseClasses,
|
|
166
166
|
extClasses,
|
|
167
167
|
"empty:before:content-[attr(data-placeholder)] empty:before:text-zinc-400 empty:before:pointer-events-none",
|
|
168
168
|
className
|
|
@@ -174,7 +174,7 @@ EditorContent.displayName = "EditorContent";
|
|
|
174
174
|
function toHtml(value, outputFormat, unsafe, valueFormat = "auto") {
|
|
175
175
|
if (!value) return "";
|
|
176
176
|
const raw = (() => {
|
|
177
|
-
const format = valueFormat !== "auto" ? valueFormat : outputFormat === "html" ? "html" :
|
|
177
|
+
const format = valueFormat !== "auto" ? valueFormat : outputFormat === "html" ? "html" : chunk5IWKZ2WK_cjs.detectFormat(value);
|
|
178
178
|
if (format === "html") return value;
|
|
179
179
|
return marked.marked.parse(value, { async: false }).trim();
|
|
180
180
|
})();
|
|
@@ -222,12 +222,12 @@ function EditorRoot({
|
|
|
222
222
|
[isView, outputFormat, unsafe, valueFormat, showSource, externalSeed]
|
|
223
223
|
);
|
|
224
224
|
const extensions = react.useMemo(
|
|
225
|
-
() =>
|
|
225
|
+
() => chunk5IWKZ2WK_cjs.mergeExtensions(instanceExtensions),
|
|
226
226
|
[instanceExtensions]
|
|
227
227
|
);
|
|
228
228
|
const getOutputValue = react.useCallback(
|
|
229
229
|
(html) => {
|
|
230
|
-
return outputFormat === "markdown" ?
|
|
230
|
+
return outputFormat === "markdown" ? chunk5IWKZ2WK_cjs.htmlToMarkdown(html) : html;
|
|
231
231
|
},
|
|
232
232
|
[outputFormat]
|
|
233
233
|
);
|
|
@@ -306,7 +306,7 @@ function EditorRoot({
|
|
|
306
306
|
className
|
|
307
307
|
),
|
|
308
308
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
309
|
-
|
|
309
|
+
chunk5IWKZ2WK_cjs.ContentRenderer,
|
|
310
310
|
{
|
|
311
311
|
value,
|
|
312
312
|
format: valueFormat !== "auto" ? valueFormat : outputFormat,
|
|
@@ -343,5 +343,5 @@ var Editor = Object.assign(EditorRoot, {
|
|
|
343
343
|
|
|
344
344
|
exports.Editor = Editor;
|
|
345
345
|
exports.useEditor = useEditor;
|
|
346
|
-
//# sourceMappingURL=chunk-
|
|
347
|
-
//# sourceMappingURL=chunk-
|
|
346
|
+
//# sourceMappingURL=chunk-ICI33QMY.cjs.map
|
|
347
|
+
//# sourceMappingURL=chunk-ICI33QMY.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Editor/Editor.context.ts","../src/components/Editor/EditorSourceToggle.tsx","../src/components/Editor/EditorToolbar.tsx","../src/components/Editor/EditorToolbarSeparator.tsx","../src/components/Editor/EditorContent.tsx","../src/components/Editor/Editor.tsx"],"names":["createContext","useContext","jsx","cn","jsxs","Fragment","useRef","useEffect","useMemo","extensionEditorClasses","CodeView","proseClasses","detectFormat","marked","sanitizeHtml","useControllableState","useFieldMode","useState","mergeExtensions","useCallback","htmlToMarkdown","ContentRenderer"],"mappings":"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","file":"chunk-ZKJLDBXA.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { RenderExtension } from \"../ContentRenderer/extensions\";\n\nexport interface EditorContextValue {\n contentRef: RefObject<HTMLDivElement | null>;\n exec: (command: string, arg?: string) => void;\n insertText: (text: string) => void;\n wrapSelection: (before: string, after: string) => void;\n outputFormat: \"html\" | \"markdown\";\n lineSpacing: number;\n placeholder?: string;\n /** Merged render extensions (global + instance). */\n extensions: RenderExtension[];\n /** Whether the raw-source view (textarea) is showing instead of the rich-text surface. */\n showSource: boolean;\n /** Toggle/set the raw-source view. */\n setShowSource: (showSource: boolean) => void;\n /** Initial HTML content to load into the editor on mount */\n _initialHtml: string;\n /** @internal Called by EditorContent on input events */\n _onInput: () => void;\n /** @internal Raw source value (`value` in `outputFormat`), for the source textarea. */\n _sourceValue: string;\n /** @internal Commit an edit made directly in the source textarea. */\n _onSourceInput: (value: string) => void;\n}\n\nexport const EditorContext = createContext<EditorContextValue | null>(null);\n\nexport function useEditor(): EditorContextValue {\n const ctx = useContext(EditorContext);\n if (!ctx) {\n throw new Error(\"useEditor must be used within an <Editor> component\");\n }\n return ctx;\n}\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport type { EditorSourceToggleProps } from \"./Editor.types\";\n\n/**\n * Toolbar button that reveals the raw HTML/Markdown behind the editor. Reads\n * `showSource` / `setShowSource` from context, so it works in the default\n * toolbar and in any custom toolbar composed with `useEditor()`.\n */\nexport function EditorSourceToggle({\n className,\n icon = \"</>\",\n title = \"Source\",\n activeTitle = \"Rich text\",\n}: EditorSourceToggleProps) {\n const { showSource, setShowSource } = useEditor();\n\n return (\n <button\n type=\"button\"\n onClick={() => setShowSource(!showSource)}\n title={showSource ? activeTitle : title}\n aria-pressed={showSource}\n data-react-fancy-editor-source-toggle=\"\"\n className={cn(\n \"inline-flex h-8 items-center justify-center rounded-md px-2 font-mono text-xs transition-colors\",\n showSource\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n className,\n )}\n >\n {icon}\n </button>\n );\n}\n\nEditorSourceToggle.displayName = \"EditorSourceToggle\";\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport type { EditorToolbarProps } from \"./Editor.types\";\n\nconst DEFAULT_ACTIONS = [\n { icon: \"B\", label: \"Bold\", command: \"bold\" },\n { icon: \"I\", label: \"Italic\", command: \"italic\" },\n { icon: \"U\", label: \"Underline\", command: \"underline\" },\n { icon: \"S\", label: \"Strikethrough\", command: \"strikeThrough\" },\n];\n\nexport function EditorToolbar({\n actions = DEFAULT_ACTIONS,\n onAction,\n children,\n className,\n showSourceToggle = true,\n}: EditorToolbarProps) {\n const { exec, showSource } = useEditor();\n\n return (\n <div\n data-react-fancy-editor-toolbar=\"\"\n className={cn(\n \"flex shrink-0 items-center gap-0.5 border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 py-1.5 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {children ?? (\n <>\n {actions.map((action) => (\n <button\n key={`${action.command}-${action.commandArg ?? \"\"}`}\n type=\"button\"\n // Rich-text commands don't apply to the raw-source textarea.\n disabled={showSource}\n onClick={() => {\n if (onAction) {\n onAction(action.command);\n } else {\n exec(action.command, action.commandArg);\n }\n }}\n title={action.label}\n className={cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-sm transition-colors\",\n action.active\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n showSource && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n {action.icon}\n </button>\n ))}\n {showSourceToggle && <EditorSourceToggle className=\"ml-auto\" />}\n </>\n )}\n </div>\n );\n}\n\nEditorToolbar.displayName = \"EditorToolbar\";\n","export function EditorToolbarSeparator() {\n return (\n <span\n data-react-fancy-editor-toolbar-separator=\"\"\n className=\"mx-1 h-5 w-px bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n />\n );\n}\n\nEditorToolbarSeparator.displayName = \"EditorToolbarSeparator\";\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CodeView } from \"../CodeView\";\nimport { useEditor } from \"./Editor.context\";\nimport { proseClasses, extensionEditorClasses } from \"./editor.utils\";\nimport type { EditorContentProps } from \"./Editor.types\";\n\nexport function EditorContent({ className, maxHeight, sourceClassName }: EditorContentProps) {\n const {\n contentRef,\n lineSpacing,\n placeholder,\n extensions,\n outputFormat,\n showSource,\n _initialHtml,\n _onInput,\n _sourceValue,\n _onSourceInput,\n } = useEditor();\n // Tracks which seed HTML is currently in the contentEditable. Seeding on the\n // seed VALUE (not a one-shot boolean) re-seeds when the source view rewrites\n // `value`, while still never re-seeding on plain keystrokes — typing leaves\n // `_initialHtml` untouched, so `seededHtml.current === _initialHtml` holds.\n const seededHtml = useRef<string | null>(null);\n\n useEffect(() => {\n // Source view replaces the contentEditable in the tree, so it unmounts.\n // Forget what we seeded — the div that returns is a fresh, empty one and\n // must always be re-seeded, even if `value` was left untouched.\n if (showSource) {\n seededHtml.current = null;\n return;\n }\n const el = contentRef.current;\n if (el && seededHtml.current !== _initialHtml) {\n el.innerHTML = _initialHtml;\n seededHtml.current = _initialHtml;\n }\n }, [contentRef, _initialHtml, showSource]);\n\n const extClasses = useMemo(\n () => extensionEditorClasses(extensions),\n [extensions],\n );\n\n if (showSource) {\n // Raw-source view — a syntax-highlighted code surface (HTML highlighted;\n // markdown/plain un-highlighted), built on the shared fancy-file-commons\n // primitives. It's a DIRECT child of the flex-column editor root (no\n // wrapper — a nested flex box collapses the fill), so `flex-auto` makes it\n // fill the editor body when height-constrained and grow with content\n // (≥ minHeight) when not. `maxHeight` caps + scrolls.\n return (\n <CodeView\n value={_sourceValue}\n onChange={_onSourceInput}\n language={outputFormat === \"html\" ? \"html\" : \"plaintext\"}\n placeholder={placeholder}\n maxHeight={maxHeight}\n className={cn(\"min-h-0 flex-auto\", sourceClassName)}\n />\n );\n }\n\n return (\n <div\n ref={contentRef}\n contentEditable\n suppressContentEditableWarning\n data-react-fancy-editor-content=\"\"\n data-placeholder={placeholder}\n onInput={_onInput}\n style={{\n lineHeight: lineSpacing,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n className={cn(\n \"min-h-[120px] flex-auto overflow-y-auto px-4 py-3 text-sm outline-none\",\n \"focus:outline-none\",\n proseClasses,\n extClasses,\n \"empty:before:content-[attr(data-placeholder)] empty:before:text-zinc-400 empty:before:pointer-events-none\",\n className,\n )}\n />\n );\n}\n\nEditorContent.displayName = \"EditorContent\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { marked } from \"marked\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport { useControllableState } from \"../../hooks\";\nimport { EditorContext } from \"./Editor.context\";\nimport { EditorToolbar } from \"./EditorToolbar\";\nimport { EditorToolbarSeparator } from \"./EditorToolbarSeparator\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport { EditorContent } from \"./EditorContent\";\nimport { htmlToMarkdown, detectFormat } from \"./editor.utils\";\nimport { mergeExtensions } from \"../ContentRenderer/extensions\";\nimport { ContentRenderer } from \"../ContentRenderer/ContentRenderer\";\nimport { useFieldMode } from \"../inputs/mode/FieldMode.context\";\nimport type { EditorProps } from \"./Editor.types\";\n\nfunction toHtml(\n value: string,\n outputFormat: \"html\" | \"markdown\",\n unsafe: boolean,\n valueFormat: \"markdown\" | \"html\" | \"auto\" = \"auto\",\n): string {\n if (!value) return \"\";\n const raw = (() => {\n // An explicit valueFormat is authoritative — the sniff misclassifies\n // markdown that merely MENTIONS HTML-ish snippets (`<code>`, `<table`),\n // collapsing it into an innerHTML wall of text (#10).\n const format =\n valueFormat !== \"auto\"\n ? valueFormat\n : outputFormat === \"html\"\n ? \"html\"\n : detectFormat(value);\n if (format === \"html\") return value;\n return (marked.parse(value, { async: false }) as string).trim();\n })();\n return unsafe ? raw : sanitizeHtml(raw);\n}\n\nfunction EditorRoot({\n children,\n className,\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n outputFormat = \"html\",\n valueFormat = \"auto\",\n lineSpacing = 1.6,\n placeholder,\n mode: modeProp,\n extensions: instanceExtensions,\n unsafe = false,\n showSource: showSourceProp,\n defaultShowSource = false,\n onShowSourceChange,\n}: EditorProps) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [value, setValue] = useControllableState(controlledValue, defaultValue, onChange);\n const [showSource, setShowSource] = useControllableState(\n showSourceProp,\n defaultShowSource,\n onShowSourceChange,\n );\n // View/edit mode — same resolution as the inputs: prop → <Form> context → \"edit\".\n const mode = useFieldMode(modeProp);\n const isView = mode === \"view\";\n\n // The value this editor last emitted through `onChange`. An incoming `value`\n // equal to it is our own keystroke echoing back; anything else came from\n // OUTSIDE — an async load, a host reset, a form repopulating.\n const lastEmitted = useRef<string | null>(null);\n\n // Bumped only on an external `value` change, so the seed memo below recomputes\n // for those and stays put while the user types. Without this, `value` was\n // excluded from the deps to avoid re-seeding on keystrokes, which also meant a\n // value arriving after mount was silently dropped and the editor stayed blank\n // forever (#15).\n const [externalSeed, setExternalSeed] = useState(0);\n useEffect(() => {\n if (value !== lastEmitted.current) setExternalSeed((n) => n + 1);\n }, [value]);\n\n const initialHtml = useMemo(\n () => toHtml(value, outputFormat, unsafe, valueFormat),\n // Seed the contentEditable from the LIVE value when (re)entering edit mode —\n // and when returning from the raw-source view, which may have rewritten the\n // value out from under the rich-text surface. `value` itself stays out of\n // the deps so typing never re-seeds (which would fight the caret);\n // `externalSeed` covers the externally-driven case instead.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isView, outputFormat, unsafe, valueFormat, showSource, externalSeed],\n );\n\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const getOutputValue = useCallback(\n (html: string): string => {\n return outputFormat === \"markdown\" ? htmlToMarkdown(html) : html;\n },\n [outputFormat],\n );\n\n const handleInput = useCallback(() => {\n const el = contentRef.current;\n if (!el) return;\n const next = getOutputValue(el.innerHTML);\n // Record what we emitted BEFORE publishing it, so the value coming back in\n // is recognised as our own and does not trigger a re-seed mid-keystroke.\n lastEmitted.current = next;\n setValue(next);\n }, [setValue, getOutputValue]);\n\n const exec = useCallback(\n (command: string, arg?: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(command, false, arg);\n handleInput();\n },\n [handleInput],\n );\n\n const insertText = useCallback(\n (text: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, text);\n handleInput();\n },\n [handleInput],\n );\n\n // The source textarea edits `value` directly — it is already the canonical\n // source in `outputFormat` (html or markdown), so no conversion round-trip.\n const handleSourceInput = useCallback(\n (next: string) => {\n // Also an internal emission — record it so typing in the source view is\n // not mistaken for an external change on every keystroke.\n lastEmitted.current = next;\n setValue(next);\n },\n [setValue],\n );\n\n const wrapSelection = useCallback(\n (before: string, after: string) => {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const selectedText = range.toString();\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, `${before}${selectedText}${after}`);\n handleInput();\n },\n [handleInput],\n );\n\n const contextValue = {\n contentRef,\n exec,\n insertText,\n wrapSelection,\n outputFormat,\n lineSpacing,\n placeholder,\n extensions,\n showSource,\n setShowSource,\n _initialHtml: initialHtml,\n _onInput: handleInput,\n _sourceValue: value,\n _onSourceInput: handleSourceInput,\n };\n\n // View mode — render the value read-only through ContentRenderer, matching the\n // editor's own format (markdown/html), instead of the editable toolbar+content\n // tree. Driven by `mode` / a `<Form mode=\"view\">`, exactly like the inputs.\n if (isView) {\n return (\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"view\"\n className={cn(\n \"overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n <ContentRenderer\n value={value}\n format={valueFormat !== \"auto\" ? valueFormat : outputFormat}\n lineSpacing={lineSpacing}\n extensions={instanceExtensions}\n unsafe={unsafe}\n className=\"px-4 py-3\"\n />\n </div>\n );\n }\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"edit\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n {children}\n </div>\n </EditorContext.Provider>\n );\n}\n\nconst ToolbarWithSeparator = Object.assign(EditorToolbar, {\n Separator: EditorToolbarSeparator,\n});\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: ToolbarWithSeparator,\n Content: EditorContent,\n SourceToggle: EditorSourceToggle,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Editor/Editor.context.ts","../src/components/Editor/EditorSourceToggle.tsx","../src/components/Editor/EditorToolbar.tsx","../src/components/Editor/EditorToolbarSeparator.tsx","../src/components/Editor/EditorContent.tsx","../src/components/Editor/Editor.tsx"],"names":["createContext","useContext","jsx","cn","jsxs","Fragment","useRef","useEffect","useMemo","extensionEditorClasses","CodeView","proseClasses","detectFormat","marked","sanitizeHtml","useControllableState","useFieldMode","useState","mergeExtensions","useCallback","htmlToMarkdown","ContentRenderer"],"mappings":"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","file":"chunk-ICI33QMY.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { RenderExtension } from \"../ContentRenderer/extensions\";\n\nexport interface EditorContextValue {\n contentRef: RefObject<HTMLDivElement | null>;\n exec: (command: string, arg?: string) => void;\n insertText: (text: string) => void;\n wrapSelection: (before: string, after: string) => void;\n outputFormat: \"html\" | \"markdown\";\n lineSpacing: number;\n placeholder?: string;\n /** Merged render extensions (global + instance). */\n extensions: RenderExtension[];\n /** Whether the raw-source view (textarea) is showing instead of the rich-text surface. */\n showSource: boolean;\n /** Toggle/set the raw-source view. */\n setShowSource: (showSource: boolean) => void;\n /** Initial HTML content to load into the editor on mount */\n _initialHtml: string;\n /** @internal Called by EditorContent on input events */\n _onInput: () => void;\n /** @internal Raw source value (`value` in `outputFormat`), for the source textarea. */\n _sourceValue: string;\n /** @internal Commit an edit made directly in the source textarea. */\n _onSourceInput: (value: string) => void;\n}\n\nexport const EditorContext = createContext<EditorContextValue | null>(null);\n\nexport function useEditor(): EditorContextValue {\n const ctx = useContext(EditorContext);\n if (!ctx) {\n throw new Error(\"useEditor must be used within an <Editor> component\");\n }\n return ctx;\n}\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport type { EditorSourceToggleProps } from \"./Editor.types\";\n\n/**\n * Toolbar button that reveals the raw HTML/Markdown behind the editor. Reads\n * `showSource` / `setShowSource` from context, so it works in the default\n * toolbar and in any custom toolbar composed with `useEditor()`.\n */\nexport function EditorSourceToggle({\n className,\n icon = \"</>\",\n title = \"Source\",\n activeTitle = \"Rich text\",\n}: EditorSourceToggleProps) {\n const { showSource, setShowSource } = useEditor();\n\n return (\n <button\n type=\"button\"\n onClick={() => setShowSource(!showSource)}\n title={showSource ? activeTitle : title}\n aria-pressed={showSource}\n data-react-fancy-editor-source-toggle=\"\"\n className={cn(\n \"inline-flex h-8 items-center justify-center rounded-md px-2 font-mono text-xs transition-colors\",\n showSource\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n className,\n )}\n >\n {icon}\n </button>\n );\n}\n\nEditorSourceToggle.displayName = \"EditorSourceToggle\";\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport type { EditorToolbarProps } from \"./Editor.types\";\n\nconst DEFAULT_ACTIONS = [\n { icon: \"B\", label: \"Bold\", command: \"bold\" },\n { icon: \"I\", label: \"Italic\", command: \"italic\" },\n { icon: \"U\", label: \"Underline\", command: \"underline\" },\n { icon: \"S\", label: \"Strikethrough\", command: \"strikeThrough\" },\n];\n\nexport function EditorToolbar({\n actions = DEFAULT_ACTIONS,\n onAction,\n children,\n className,\n showSourceToggle = true,\n}: EditorToolbarProps) {\n const { exec, showSource } = useEditor();\n\n return (\n <div\n data-react-fancy-editor-toolbar=\"\"\n className={cn(\n \"flex shrink-0 items-center gap-0.5 border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 py-1.5 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {children ?? (\n <>\n {actions.map((action) => (\n <button\n key={`${action.command}-${action.commandArg ?? \"\"}`}\n type=\"button\"\n // Rich-text commands don't apply to the raw-source textarea.\n disabled={showSource}\n onClick={() => {\n if (onAction) {\n onAction(action.command);\n } else {\n exec(action.command, action.commandArg);\n }\n }}\n title={action.label}\n className={cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-sm transition-colors\",\n action.active\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n showSource && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n {action.icon}\n </button>\n ))}\n {showSourceToggle && <EditorSourceToggle className=\"ml-auto\" />}\n </>\n )}\n </div>\n );\n}\n\nEditorToolbar.displayName = \"EditorToolbar\";\n","export function EditorToolbarSeparator() {\n return (\n <span\n data-react-fancy-editor-toolbar-separator=\"\"\n className=\"mx-1 h-5 w-px bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n />\n );\n}\n\nEditorToolbarSeparator.displayName = \"EditorToolbarSeparator\";\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CodeView } from \"../CodeView\";\nimport { useEditor } from \"./Editor.context\";\nimport { proseClasses, extensionEditorClasses } from \"./editor.utils\";\nimport type { EditorContentProps } from \"./Editor.types\";\n\nexport function EditorContent({ className, maxHeight, sourceClassName }: EditorContentProps) {\n const {\n contentRef,\n lineSpacing,\n placeholder,\n extensions,\n outputFormat,\n showSource,\n _initialHtml,\n _onInput,\n _sourceValue,\n _onSourceInput,\n } = useEditor();\n // Tracks which seed HTML is currently in the contentEditable. Seeding on the\n // seed VALUE (not a one-shot boolean) re-seeds when the source view rewrites\n // `value`, while still never re-seeding on plain keystrokes — typing leaves\n // `_initialHtml` untouched, so `seededHtml.current === _initialHtml` holds.\n const seededHtml = useRef<string | null>(null);\n\n useEffect(() => {\n // Source view replaces the contentEditable in the tree, so it unmounts.\n // Forget what we seeded — the div that returns is a fresh, empty one and\n // must always be re-seeded, even if `value` was left untouched.\n if (showSource) {\n seededHtml.current = null;\n return;\n }\n const el = contentRef.current;\n if (el && seededHtml.current !== _initialHtml) {\n el.innerHTML = _initialHtml;\n seededHtml.current = _initialHtml;\n }\n }, [contentRef, _initialHtml, showSource]);\n\n const extClasses = useMemo(\n () => extensionEditorClasses(extensions),\n [extensions],\n );\n\n if (showSource) {\n // Raw-source view — a syntax-highlighted code surface (HTML highlighted;\n // markdown/plain un-highlighted), built on the shared fancy-file-commons\n // primitives. It's a DIRECT child of the flex-column editor root (no\n // wrapper — a nested flex box collapses the fill), so `flex-auto` makes it\n // fill the editor body when height-constrained and grow with content\n // (≥ minHeight) when not. `maxHeight` caps + scrolls.\n return (\n <CodeView\n value={_sourceValue}\n onChange={_onSourceInput}\n language={outputFormat === \"html\" ? \"html\" : \"plaintext\"}\n placeholder={placeholder}\n maxHeight={maxHeight}\n className={cn(\"min-h-0 flex-auto\", sourceClassName)}\n />\n );\n }\n\n return (\n <div\n ref={contentRef}\n contentEditable\n suppressContentEditableWarning\n data-react-fancy-editor-content=\"\"\n data-placeholder={placeholder}\n onInput={_onInput}\n style={{\n lineHeight: lineSpacing,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n className={cn(\n \"min-h-[120px] flex-auto overflow-y-auto px-4 py-3 text-sm outline-none\",\n \"focus:outline-none\",\n proseClasses,\n extClasses,\n \"empty:before:content-[attr(data-placeholder)] empty:before:text-zinc-400 empty:before:pointer-events-none\",\n className,\n )}\n />\n );\n}\n\nEditorContent.displayName = \"EditorContent\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { marked } from \"marked\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport { useControllableState } from \"../../hooks\";\nimport { EditorContext } from \"./Editor.context\";\nimport { EditorToolbar } from \"./EditorToolbar\";\nimport { EditorToolbarSeparator } from \"./EditorToolbarSeparator\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport { EditorContent } from \"./EditorContent\";\nimport { htmlToMarkdown, detectFormat } from \"./editor.utils\";\nimport { mergeExtensions } from \"../ContentRenderer/extensions\";\nimport { ContentRenderer } from \"../ContentRenderer/ContentRenderer\";\nimport { useFieldMode } from \"../inputs/mode/FieldMode.context\";\nimport type { EditorProps } from \"./Editor.types\";\n\nfunction toHtml(\n value: string,\n outputFormat: \"html\" | \"markdown\",\n unsafe: boolean,\n valueFormat: \"markdown\" | \"html\" | \"auto\" = \"auto\",\n): string {\n if (!value) return \"\";\n const raw = (() => {\n // An explicit valueFormat is authoritative — the sniff misclassifies\n // markdown that merely MENTIONS HTML-ish snippets (`<code>`, `<table`),\n // collapsing it into an innerHTML wall of text (#10).\n const format =\n valueFormat !== \"auto\"\n ? valueFormat\n : outputFormat === \"html\"\n ? \"html\"\n : detectFormat(value);\n if (format === \"html\") return value;\n return (marked.parse(value, { async: false }) as string).trim();\n })();\n return unsafe ? raw : sanitizeHtml(raw);\n}\n\nfunction EditorRoot({\n children,\n className,\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n outputFormat = \"html\",\n valueFormat = \"auto\",\n lineSpacing = 1.6,\n placeholder,\n mode: modeProp,\n extensions: instanceExtensions,\n unsafe = false,\n showSource: showSourceProp,\n defaultShowSource = false,\n onShowSourceChange,\n}: EditorProps) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [value, setValue] = useControllableState(controlledValue, defaultValue, onChange);\n const [showSource, setShowSource] = useControllableState(\n showSourceProp,\n defaultShowSource,\n onShowSourceChange,\n );\n // View/edit mode — same resolution as the inputs: prop → <Form> context → \"edit\".\n const mode = useFieldMode(modeProp);\n const isView = mode === \"view\";\n\n // The value this editor last emitted through `onChange`. An incoming `value`\n // equal to it is our own keystroke echoing back; anything else came from\n // OUTSIDE — an async load, a host reset, a form repopulating.\n const lastEmitted = useRef<string | null>(null);\n\n // Bumped only on an external `value` change, so the seed memo below recomputes\n // for those and stays put while the user types. Without this, `value` was\n // excluded from the deps to avoid re-seeding on keystrokes, which also meant a\n // value arriving after mount was silently dropped and the editor stayed blank\n // forever (#15).\n const [externalSeed, setExternalSeed] = useState(0);\n useEffect(() => {\n if (value !== lastEmitted.current) setExternalSeed((n) => n + 1);\n }, [value]);\n\n const initialHtml = useMemo(\n () => toHtml(value, outputFormat, unsafe, valueFormat),\n // Seed the contentEditable from the LIVE value when (re)entering edit mode —\n // and when returning from the raw-source view, which may have rewritten the\n // value out from under the rich-text surface. `value` itself stays out of\n // the deps so typing never re-seeds (which would fight the caret);\n // `externalSeed` covers the externally-driven case instead.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isView, outputFormat, unsafe, valueFormat, showSource, externalSeed],\n );\n\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const getOutputValue = useCallback(\n (html: string): string => {\n return outputFormat === \"markdown\" ? htmlToMarkdown(html) : html;\n },\n [outputFormat],\n );\n\n const handleInput = useCallback(() => {\n const el = contentRef.current;\n if (!el) return;\n const next = getOutputValue(el.innerHTML);\n // Record what we emitted BEFORE publishing it, so the value coming back in\n // is recognised as our own and does not trigger a re-seed mid-keystroke.\n lastEmitted.current = next;\n setValue(next);\n }, [setValue, getOutputValue]);\n\n const exec = useCallback(\n (command: string, arg?: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(command, false, arg);\n handleInput();\n },\n [handleInput],\n );\n\n const insertText = useCallback(\n (text: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, text);\n handleInput();\n },\n [handleInput],\n );\n\n // The source textarea edits `value` directly — it is already the canonical\n // source in `outputFormat` (html or markdown), so no conversion round-trip.\n const handleSourceInput = useCallback(\n (next: string) => {\n // Also an internal emission — record it so typing in the source view is\n // not mistaken for an external change on every keystroke.\n lastEmitted.current = next;\n setValue(next);\n },\n [setValue],\n );\n\n const wrapSelection = useCallback(\n (before: string, after: string) => {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const selectedText = range.toString();\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, `${before}${selectedText}${after}`);\n handleInput();\n },\n [handleInput],\n );\n\n const contextValue = {\n contentRef,\n exec,\n insertText,\n wrapSelection,\n outputFormat,\n lineSpacing,\n placeholder,\n extensions,\n showSource,\n setShowSource,\n _initialHtml: initialHtml,\n _onInput: handleInput,\n _sourceValue: value,\n _onSourceInput: handleSourceInput,\n };\n\n // View mode — render the value read-only through ContentRenderer, matching the\n // editor's own format (markdown/html), instead of the editable toolbar+content\n // tree. Driven by `mode` / a `<Form mode=\"view\">`, exactly like the inputs.\n if (isView) {\n return (\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"view\"\n className={cn(\n \"overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n <ContentRenderer\n value={value}\n format={valueFormat !== \"auto\" ? valueFormat : outputFormat}\n lineSpacing={lineSpacing}\n extensions={instanceExtensions}\n unsafe={unsafe}\n className=\"px-4 py-3\"\n />\n </div>\n );\n }\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"edit\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n {children}\n </div>\n </EditorContext.Provider>\n );\n}\n\nconst ToolbarWithSeparator = Object.assign(EditorToolbar, {\n Separator: EditorToolbarSeparator,\n});\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: ToolbarWithSeparator,\n Content: EditorContent,\n SourceToggle: EditorSourceToggle,\n});\n"]}
|
|
@@ -195,7 +195,7 @@ function KanbanColumn({
|
|
|
195
195
|
className
|
|
196
196
|
),
|
|
197
197
|
children: [
|
|
198
|
-
title && /* @__PURE__ */ jsxRuntime.jsxs("h3", { className: "mb-3 flex items-center gap-2 text-sm font-semibold text-zinc-600 dark:text-zinc-400", children: [
|
|
198
|
+
title && /* @__PURE__ */ jsxRuntime.jsxs("h3", { className: "mb-3 flex items-center gap-2 text-sm font-semibold text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]", children: [
|
|
199
199
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1", children: title }),
|
|
200
200
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
201
201
|
"span",
|
|
@@ -360,5 +360,5 @@ var Kanban = Object.assign(KanbanRoot, {
|
|
|
360
360
|
|
|
361
361
|
exports.Kanban = Kanban;
|
|
362
362
|
exports.useKanban = useKanban;
|
|
363
|
-
//# sourceMappingURL=chunk-
|
|
364
|
-
//# sourceMappingURL=chunk-
|
|
363
|
+
//# sourceMappingURL=chunk-IEQK3LGI.cjs.map
|
|
364
|
+
//# sourceMappingURL=chunk-IEQK3LGI.cjs.map
|