@solibo/solibo-ui 1.0.29 → 1.1.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.
Files changed (138) hide show
  1. package/dist/assets/index15.css +1 -1
  2. package/dist/assets/index18.css +1 -1
  3. package/dist/assets/index47.css +1 -1
  4. package/dist/components/aside/index.cjs +1 -1
  5. package/dist/components/aside/index.cjs.map +1 -1
  6. package/dist/components/aside/index.js +1 -1
  7. package/dist/components/aside/index.js.map +1 -1
  8. package/dist/components/avatar/index.cjs +1 -1
  9. package/dist/components/avatar/index.cjs.map +1 -1
  10. package/dist/components/avatar/index.js +1 -1
  11. package/dist/components/avatar/index.js.map +1 -1
  12. package/dist/components/badge/index.cjs +1 -1
  13. package/dist/components/badge/index.cjs.map +1 -1
  14. package/dist/components/badge/index.js +9 -9
  15. package/dist/components/badge/index.js.map +1 -1
  16. package/dist/components/button/index.cjs +1 -1
  17. package/dist/components/button/index.cjs.map +1 -1
  18. package/dist/components/button/index.js +7 -7
  19. package/dist/components/button/index.js.map +1 -1
  20. package/dist/components/checkbox/index.cjs +1 -1
  21. package/dist/components/checkbox/index.cjs.map +1 -1
  22. package/dist/components/checkbox/index.js +2 -2
  23. package/dist/components/checkbox/index.js.map +1 -1
  24. package/dist/components/chip/index.cjs +1 -1
  25. package/dist/components/chip/index.cjs.map +1 -1
  26. package/dist/components/chip/index.js +4 -4
  27. package/dist/components/chip/index.js.map +1 -1
  28. package/dist/components/collapsible/index.cjs +1 -1
  29. package/dist/components/collapsible/index.cjs.map +1 -1
  30. package/dist/components/collapsible/index.js +5 -5
  31. package/dist/components/collapsible/index.js.map +1 -1
  32. package/dist/components/controls/index.cjs +1 -1
  33. package/dist/components/controls/index.js +1 -1
  34. package/dist/components/croppable/index.cjs +1 -1
  35. package/dist/components/croppable/index.cjs.map +1 -1
  36. package/dist/components/croppable/index.js +21 -21
  37. package/dist/components/croppable/index.js.map +1 -1
  38. package/dist/components/dialog/index.cjs +1 -1
  39. package/dist/components/dialog/index.cjs.map +1 -1
  40. package/dist/components/dialog/index.js +13 -13
  41. package/dist/components/dialog/index.js.map +1 -1
  42. package/dist/components/dropdown/index.cjs +1 -1
  43. package/dist/components/dropdown/index.cjs.map +1 -1
  44. package/dist/components/dropdown/index.js +43 -43
  45. package/dist/components/dropdown/index.js.map +1 -1
  46. package/dist/components/dropzone/index.cjs +1 -1
  47. package/dist/components/dropzone/index.cjs.map +1 -1
  48. package/dist/components/dropzone/index.js +16 -16
  49. package/dist/components/dropzone/index.js.map +1 -1
  50. package/dist/components/editor/index.cjs +2 -2
  51. package/dist/components/editor/index.cjs.map +1 -1
  52. package/dist/components/editor/index.js +473 -473
  53. package/dist/components/editor/index.js.map +1 -1
  54. package/dist/components/file/index.cjs +1 -1
  55. package/dist/components/file/index.cjs.map +1 -1
  56. package/dist/components/file/index.js +34 -34
  57. package/dist/components/file/index.js.map +1 -1
  58. package/dist/components/header/index.cjs +1 -1
  59. package/dist/components/header/index.js +25 -25
  60. package/dist/components/icon/index.cjs +1 -1
  61. package/dist/components/icon/index.cjs.map +1 -1
  62. package/dist/components/icon/index.js +16 -16
  63. package/dist/components/icon/index.js.map +1 -1
  64. package/dist/components/input/index.cjs +1 -1
  65. package/dist/components/input/index.js +2 -2
  66. package/dist/components/list/index.cjs +1 -1
  67. package/dist/components/list/index.js +13 -13
  68. package/dist/components/menu/index.cjs +1 -1
  69. package/dist/components/menu/index.cjs.map +1 -1
  70. package/dist/components/menu/index.js +18 -18
  71. package/dist/components/menu/index.js.map +1 -1
  72. package/dist/components/message/index.cjs +1 -1
  73. package/dist/components/message/index.cjs.map +1 -1
  74. package/dist/components/message/index.js +20 -20
  75. package/dist/components/message/index.js.map +1 -1
  76. package/dist/components/messages/index.cjs +1 -1
  77. package/dist/components/messages/index.cjs.map +1 -1
  78. package/dist/components/messages/index.js +70 -39
  79. package/dist/components/messages/index.js.map +1 -1
  80. package/dist/components/nav/index.cjs +1 -1
  81. package/dist/components/nav/index.cjs.map +1 -1
  82. package/dist/components/nav/index.js +2 -2
  83. package/dist/components/nav/index.js.map +1 -1
  84. package/dist/components/portal/index.cjs +1 -1
  85. package/dist/components/portal/index.cjs.map +1 -1
  86. package/dist/components/portal/index.js +7 -7
  87. package/dist/components/portal/index.js.map +1 -1
  88. package/dist/components/search/index.cjs +1 -1
  89. package/dist/components/search/index.cjs.map +1 -1
  90. package/dist/components/search/index.js +3 -3
  91. package/dist/components/search/index.js.map +1 -1
  92. package/dist/components/select/index.cjs +1 -1
  93. package/dist/components/select/index.js +2 -2
  94. package/dist/components/table/index.cjs +1 -1
  95. package/dist/components/table/index.cjs.map +1 -1
  96. package/dist/components/table/index.js +11 -11
  97. package/dist/components/table/index.js.map +1 -1
  98. package/dist/components/toast/index.cjs +1 -1
  99. package/dist/components/toast/index.cjs.map +1 -1
  100. package/dist/components/toast/index.js +6 -6
  101. package/dist/components/toast/index.js.map +1 -1
  102. package/dist/components/tooltip/index.cjs +1 -1
  103. package/dist/components/tooltip/index.cjs.map +1 -1
  104. package/dist/components/tooltip/index.js +6 -6
  105. package/dist/components/tooltip/index.js.map +1 -1
  106. package/dist/icons-B_uIKmIp.cjs +2 -0
  107. package/dist/icons-B_uIKmIp.cjs.map +1 -0
  108. package/dist/icons-Dm2kyF0g.js +211 -0
  109. package/dist/icons-Dm2kyF0g.js.map +1 -0
  110. package/dist/{index-BAxpgMzb.js → index-DycOZMJl.js} +7 -7
  111. package/dist/index-DycOZMJl.js.map +1 -0
  112. package/dist/index-Y3jsTJhs.cjs +2 -0
  113. package/dist/index-Y3jsTJhs.cjs.map +1 -0
  114. package/dist/{index-DMGGDV9J.js → index-m3slpD7c.js} +3 -3
  115. package/dist/index-m3slpD7c.js.map +1 -0
  116. package/dist/index-rXfEqyt5.cjs +2 -0
  117. package/dist/index-rXfEqyt5.cjs.map +1 -0
  118. package/dist/index.cjs +1 -1
  119. package/dist/index.d.ts +161 -129
  120. package/dist/index.js +2 -2
  121. package/dist/{menu-popover-D1ALaiV5.cjs → menu-popover-CM3v5s-5.cjs} +2 -2
  122. package/dist/menu-popover-CM3v5s-5.cjs.map +1 -0
  123. package/dist/{menu-popover-DQHDIw-8.js → menu-popover-DOkciab5.js} +19 -19
  124. package/dist/menu-popover-DOkciab5.js.map +1 -0
  125. package/dist/tokens.json +1 -1
  126. package/package.json +3 -1
  127. package/dist/icons-BkaMeh-J.js +0 -176
  128. package/dist/icons-BkaMeh-J.js.map +0 -1
  129. package/dist/icons-Lq3pr85X.cjs +0 -2
  130. package/dist/icons-Lq3pr85X.cjs.map +0 -1
  131. package/dist/index-BAxpgMzb.js.map +0 -1
  132. package/dist/index-BOiGSTKz.cjs +0 -2
  133. package/dist/index-BOiGSTKz.cjs.map +0 -1
  134. package/dist/index-BlnG4Rbh.cjs +0 -2
  135. package/dist/index-BlnG4Rbh.cjs.map +0 -1
  136. package/dist/index-DMGGDV9J.js.map +0 -1
  137. package/dist/menu-popover-D1ALaiV5.cjs.map +0 -1
  138. package/dist/menu-popover-DQHDIw-8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/croppable/crop-image.ts","../../../src/components/croppable/index.tsx"],"sourcesContent":["export type CroppableTransform = {\n offset: { x: number; y: number };\n zoom: number;\n};\n\nexport const MAX_ZOOM = 10;\nexport const MIN_ZOOM = 0.1;\n\nconst IMAGE_EXPORT_QUALITY = 0.92;\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.min(max, Math.max(min, value));\n\nconst loadImage = (file: File) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const url = URL.createObjectURL(file);\n const image = new globalThis.Image();\n\n image.onload = () => {\n URL.revokeObjectURL(url);\n resolve(image);\n };\n image.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error('croppable-image-load-failed'));\n };\n\n image.src = url;\n });\n\nexport const createCroppedFile = async ({\n file,\n fill,\n transform,\n viewport,\n}: {\n file: File;\n fill: 'width' | 'height' | 'none';\n transform: CroppableTransform;\n viewport: { width: number; height: number };\n}) => {\n const image = await loadImage(file);\n const widthRatio = viewport.width / image.naturalWidth;\n const heightRatio = viewport.height / image.naturalHeight;\n const coverRatio = Math.max(widthRatio, heightRatio);\n const baseWidth = image.naturalWidth * coverRatio;\n const baseHeight = image.naturalHeight * coverRatio;\n const minZoom =\n fill === 'width'\n ? Math.max(MIN_ZOOM, widthRatio / coverRatio)\n : fill === 'height'\n ? Math.max(MIN_ZOOM, heightRatio / coverRatio)\n : MIN_ZOOM;\n const zoom = clamp(transform.zoom, minZoom, MAX_ZOOM);\n const scale = coverRatio * zoom;\n const renderedWidth = baseWidth * zoom;\n const renderedHeight = baseHeight * zoom;\n const left = (viewport.width - renderedWidth) / 2 + transform.offset.x;\n const top = (viewport.height - renderedHeight) / 2 + transform.offset.y;\n const sourceX = clamp(-left / scale, 0, image.naturalWidth);\n const sourceY = clamp(-top / scale, 0, image.naturalHeight);\n const sourceWidth = clamp(viewport.width / scale, 1, Math.max(1, image.naturalWidth - sourceX));\n const sourceHeight = clamp(\n viewport.height / scale,\n 1,\n Math.max(1, image.naturalHeight - sourceY)\n );\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (!context) {\n throw new Error('croppable-image-context-missing');\n }\n\n canvas.width = Math.max(1, Math.round(sourceWidth));\n canvas.height = Math.max(1, Math.round(sourceHeight));\n context.drawImage(\n image,\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n 0,\n 0,\n canvas.width,\n canvas.height\n );\n\n const outputType = file.type.startsWith('image/') ? file.type : 'image/jpeg';\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, outputType, IMAGE_EXPORT_QUALITY);\n });\n\n if (!blob) {\n throw new Error('croppable-image-export-failed');\n }\n\n return new globalThis.File([blob], file.name, {\n lastModified: Date.now(),\n type: blob.type || outputType,\n });\n};\n","import cx from 'classix';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../button';\nimport { Figure } from '../figure';\nimport { Icon } from '../icon';\nimport {\n clamp,\n createCroppedFile,\n type CroppableTransform,\n MAX_ZOOM,\n MIN_ZOOM,\n} from './crop-image';\nimport styles from './styles.module.css';\n\nexport type { CroppableTransform } from './crop-image';\n\nexport type CroppableProps = {\n children?: React.ReactNode;\n fill?: 'width' | 'height' | 'none';\n height?: number;\n image?: string | null;\n label?: string;\n onCroppableChange?: (rect: DOMRect) => void;\n onFileChange?: (file: File | null) => void;\n onImageChange?: (file: File | null) => void;\n onTransformChange?: (transform: CroppableTransform) => void;\n standalone?: boolean;\n transform?: CroppableTransform;\n};\n\nconst DEFAULT_HEIGHT = 192;\nconst DEFAULT_TRANSFORM: CroppableTransform = { offset: { x: 0, y: 0 }, zoom: 1 };\nconst EMPTY_STATE_LABEL = 'Select image';\nexport const Croppable = ({\n children,\n fill = 'none',\n height,\n image,\n label,\n onCroppableChange,\n onFileChange,\n onImageChange,\n onTransformChange,\n transform,\n standalone,\n}: CroppableProps) => {\n const activePointerId = useRef<number | null>(null);\n const animationFrameRef = useRef<number | null>(null);\n const dragStartRef = useRef<{ x: number; y: number; originX: number; originY: number } | null>(\n null\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const onImageChangeRef = useRef(onImageChange);\n const objectUrlRef = useRef<string | null>(null);\n const pendingRef = useRef<{\n zoom: number;\n offset: { x: number; y: number };\n anchor: { x: number; y: number } | null;\n } | null>(null);\n const pinchDistance = useRef<number | null>(null);\n const pointers = useRef<Map<number, { x: number; y: number }>>(new Map());\n const transformRef = useRef<CroppableTransform>(DEFAULT_TRANSFORM);\n const viewportRef = useRef<HTMLDivElement>(null);\n\n const [imageSize, setImageSize] = useState<{ width: number; height: number } | null>(null);\n const [imageSrc, setImageSrc] = useState<string | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [draftTransform, setDraftTransform] = useState<CroppableTransform>(DEFAULT_TRANSFORM);\n const [sourceFile, setSourceFile] = useState<File | null>(null);\n const [viewportSize, setViewportSize] = useState({ width: 0, height: 0 });\n\n const getBaseMetrics = () => {\n const width = viewportSize.width;\n const height = viewportSize.height;\n\n if (!width || !height) return { width: 0, height: 0, minZoom: MIN_ZOOM };\n if (!imageSize) return { width, height, minZoom: MIN_ZOOM };\n\n const scaleX = width / imageSize.width;\n const scaleY = height / imageSize.height;\n const cover = Math.max(scaleX, scaleY);\n\n const rawMinZoom = fill === 'width' ? scaleX / cover : fill === 'height' ? scaleY / cover : 0;\n\n return {\n width: imageSize.width * cover,\n height: imageSize.height * cover,\n minZoom: Math.max(MIN_ZOOM, rawMinZoom),\n };\n };\n\n const baseMetrics = getBaseMetrics();\n const minZoom = baseMetrics.minZoom;\n\n const currentTransform = transform ?? draftTransform;\n const clampedZoom = clamp(currentTransform.zoom, minZoom, MAX_ZOOM);\n const displayImage = imageSrc ?? image ?? null;\n const hasPresetImage = !children && !!image && !imageSrc && !sourceFile;\n const canTransform = !hasPresetImage;\n const content =\n children ??\n (displayImage ? (\n <img\n alt=''\n draggable={false}\n onLoad={(event) => {\n const img = event.currentTarget;\n if (img.naturalWidth && img.naturalHeight) {\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n }\n }}\n src={displayImage}\n />\n ) : null);\n const isEmpty = content == null;\n\n const clampOffset = (next: { x: number; y: number }, zoomToUse: number) => {\n const { maxX, maxY } = getClampBounds(zoomToUse);\n return {\n x: clamp(next.x, -maxX, maxX),\n y: clamp(next.y, -maxY, maxY),\n };\n };\n\n const getViewportVectorFromClient = (clientX: number, clientY: number) => {\n const node = viewportRef.current;\n if (!node) return null;\n const rect = node.getBoundingClientRect();\n const x = clientX - rect.left - rect.width / 2;\n const y = clientY - rect.top - rect.height / 2;\n return { x, y };\n };\n\n const computeAnchoredOffset = (\n currentOffset: { x: number; y: number },\n currentZoom: number,\n nextZoom: number,\n anchorVec: { x: number; y: number }\n ) => {\n const z0 = clamp(currentZoom, minZoom, MAX_ZOOM);\n const z1 = clamp(nextZoom, minZoom, MAX_ZOOM);\n if (z0 === 0) return currentOffset;\n const r = z1 / z0;\n return {\n x: (1 - r) * anchorVec.x + r * currentOffset.x,\n y: (1 - r) * anchorVec.y + r * currentOffset.y,\n };\n };\n\n const commitTransform = (\n nextZoom: number,\n nextOffset: { x: number; y: number },\n anchorVec?: { x: number; y: number } | null\n ) => {\n const z0 = transformRef.current.zoom;\n const z1 = clamp(nextZoom, minZoom, MAX_ZOOM);\n const currentOffset = transformRef.current.offset;\n const anchoredOffset = anchorVec\n ? computeAnchoredOffset(currentOffset, z0, z1, anchorVec)\n : nextOffset;\n const clampedOffset = clampOffset(anchoredOffset, z1);\n transformRef.current = { zoom: z1, offset: clampedOffset };\n\n if (!transform) {\n setDraftTransform({ zoom: z1, offset: clampedOffset });\n }\n onTransformChange?.({ zoom: z1, offset: clampedOffset });\n };\n\n const scheduleTransform = (\n nextZoom: number,\n nextOffset: { x: number; y: number },\n anchorVec?: { x: number; y: number } | null\n ) => {\n pendingRef.current = {\n zoom: nextZoom,\n offset: nextOffset,\n anchor: anchorVec ?? null,\n };\n\n if (animationFrameRef.current != null) return;\n\n animationFrameRef.current = window.requestAnimationFrame(() => {\n animationFrameRef.current = null;\n\n const pending = pendingRef.current;\n pendingRef.current = null;\n\n const z = pending?.zoom ?? transformRef.current.zoom;\n const o = pending?.offset ?? transformRef.current.offset;\n const a = pending?.anchor ?? null;\n\n commitTransform(z, o, a);\n });\n };\n\n const handleWheel: React.WheelEventHandler<HTMLDivElement> = (event) => {\n if (isEmpty || !canTransform) return;\n\n const sensitivity = event.ctrlKey ? 0.001 : 0.00025;\n const next = transformRef.current.zoom * Math.exp(-event.deltaY * sensitivity);\n\n const anchor = getViewportVectorFromClient(event.clientX, event.clientY);\n scheduleTransform(next, transformRef.current.offset, anchor);\n };\n\n const getClampBounds = (zoomToUse: number) => {\n const width = viewportSize.width;\n const height = viewportSize.height;\n if (!width || !height) return { maxX: 0, maxY: 0 };\n const z = clamp(zoomToUse, minZoom, MAX_ZOOM);\n const scaledWidth = baseMetrics.width * z;\n const scaledHeight = baseMetrics.height * z;\n const maxX = Math.max(0, (scaledWidth - width) / 2);\n const maxY = Math.max(0, (scaledHeight - height) / 2);\n return { maxX, maxY };\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n const input = event.target;\n const file = input.files?.[0] ?? null;\n\n if (objectUrlRef.current) {\n URL.revokeObjectURL(objectUrlRef.current);\n objectUrlRef.current = null;\n }\n\n if (!file) {\n setImageSrc(null);\n setSourceFile(null);\n onFileChange?.(null);\n input.value = '';\n return;\n }\n\n const url = URL.createObjectURL(file);\n objectUrlRef.current = url;\n setImageSrc(url);\n setImageSize(null);\n setSourceFile(file);\n scheduleTransform(DEFAULT_TRANSFORM.zoom, DEFAULT_TRANSFORM.offset);\n transformRef.current = DEFAULT_TRANSFORM;\n onFileChange?.(file);\n input.value = '';\n };\n\n const handlePointerDown: React.PointerEventHandler<HTMLDivElement> = (event) => {\n if (isEmpty || !canTransform || (event.pointerType === 'mouse' && event.button !== 0)) return;\n\n event.currentTarget.setPointerCapture(event.pointerId);\n\n if (event.pointerType === 'touch') {\n const points = pointers.current;\n points.set(event.pointerId, { x: event.clientX, y: event.clientY });\n if (points.size === 2) {\n dragStartRef.current = null;\n activePointerId.current = null;\n setIsDragging(false);\n const [first, second] = Array.from(points.values());\n pinchDistance.current = Math.hypot(first.x - second.x, first.y - second.y);\n return;\n }\n }\n\n activePointerId.current = event.pointerId;\n dragStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n originX: transformRef.current.offset.x,\n originY: transformRef.current.offset.y,\n };\n };\n\n const handlePointerMove: React.PointerEventHandler<HTMLDivElement> = (event) => {\n if (isEmpty || !canTransform) return;\n\n if (event.pointerType === 'touch') {\n const points = pointers.current;\n if (!points.has(event.pointerId)) return;\n points.set(event.pointerId, { x: event.clientX, y: event.clientY });\n if (points.size === 2) {\n const [first, second] = Array.from(points.values());\n const dx = first.x - second.x;\n const dy = first.y - second.y;\n const distance = Math.hypot(dx, dy);\n const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };\n if (pinchDistance.current) {\n const ratio = distance / pinchDistance.current;\n const nextZoom = transformRef.current.zoom * ratio;\n const anchor = getViewportVectorFromClient(center.x, center.y);\n scheduleTransform(nextZoom, transformRef.current.offset, anchor);\n }\n pinchDistance.current = distance;\n return;\n }\n }\n\n if (activePointerId.current !== event.pointerId || !dragStartRef.current || !canDrag) return;\n const dx = event.clientX - dragStartRef.current.x;\n const dy = event.clientY - dragStartRef.current.y;\n const distance = Math.abs(dx) + Math.abs(dy);\n if (!isDragging && distance > 2) setIsDragging(true);\n if (distance <= 1) return;\n scheduleTransform(transformRef.current.zoom, {\n x: dragStartRef.current.originX + dx,\n y: dragStartRef.current.originY + dy,\n });\n };\n\n const handlePointerUp: React.PointerEventHandler<HTMLDivElement> = (event) => {\n if (event.pointerType === 'touch') {\n pointers.current.delete(event.pointerId);\n if (pointers.current.size < 2) pinchDistance.current = null;\n }\n\n if (activePointerId.current === event.pointerId) {\n activePointerId.current = null;\n dragStartRef.current = null;\n setIsDragging(false);\n }\n };\n\n useEffect(() => {\n if (!transform) return;\n\n const z = clamp(transform.zoom, minZoom, MAX_ZOOM);\n transformRef.current = { zoom: z, offset: clampOffset(transform.offset, z) };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [transform, viewportSize.width, viewportSize.height, imageSize?.width, imageSize?.height]);\n\n useEffect(() => {\n return () => {\n if (objectUrlRef.current) URL.revokeObjectURL(objectUrlRef.current);\n };\n }, []);\n\n useEffect(() => {\n const node = viewportRef.current;\n if (!node) return;\n\n const update = () => {\n const rect = node.getBoundingClientRect();\n setViewportSize((prev) =>\n prev.width === rect.width && prev.height === rect.height\n ? prev\n : { width: rect.width, height: rect.height }\n );\n if (onCroppableChange) onCroppableChange(rect);\n };\n\n update();\n\n const handleScroll = () => update();\n window.addEventListener('scroll', handleScroll, true);\n\n if (typeof ResizeObserver === 'undefined') {\n const handleResize = () => update();\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }\n\n const observer = new ResizeObserver(() => update());\n observer.observe(node);\n return () => {\n observer.disconnect();\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [onCroppableChange]);\n\n useEffect(() => {\n if (transform) return;\n\n const current = transformRef.current.offset;\n const clamped = clampOffset(current, clampedZoom);\n\n if (current.x === clamped.x && current.y === clamped.y) return;\n\n transformRef.current = { zoom: transformRef.current.zoom, offset: clamped };\n setDraftTransform((prev) => ({ ...prev, offset: clamped }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clampedZoom, imageSize, viewportSize.width, viewportSize.height]);\n\n useEffect(() => {\n if (!displayImage) {\n setImageSize(null);\n }\n }, [displayImage]);\n\n useEffect(() => {\n onImageChangeRef.current = onImageChange;\n }, [onImageChange]);\n\n useEffect(() => {\n if (!onImageChange) return;\n\n if (!sourceFile || !viewportSize.width || !viewportSize.height || children) {\n onImageChangeRef.current?.(null);\n return;\n }\n\n let isActive = true;\n const timeout = window.setTimeout(() => {\n createCroppedFile({\n file: sourceFile,\n fill,\n transform: {\n zoom: clampedZoom,\n offset: currentTransform.offset,\n },\n viewport: viewportSize,\n })\n .then((nextFile) => {\n if (isActive) {\n onImageChangeRef.current?.(nextFile);\n }\n })\n .catch(() => {\n if (isActive) {\n onImageChangeRef.current?.(null);\n }\n });\n }, 75);\n\n return () => {\n isActive = false;\n window.clearTimeout(timeout);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [children, clampedZoom, currentTransform.offset, fill, sourceFile, viewportSize]);\n\n useEffect(() => {\n return () => {\n if (animationFrameRef.current != null) {\n window.cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n };\n }, []);\n\n const clampBounds = getClampBounds(clampedZoom);\n const canDrag = !isEmpty && canTransform && (clampBounds.maxX > 0 || clampBounds.maxY > 0);\n const openFilePicker = () => inputRef.current?.click();\n const handleSelectImageClick: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n event.stopPropagation();\n openFilePicker();\n };\n\n return (\n <div\n className={cx(styles.croppable, standalone && styles.standalone)}\n onClick={() => {\n if (isEmpty) openFilePicker();\n }}\n >\n <input\n accept='image/*'\n onChange={handleInputChange}\n ref={inputRef}\n type='file'\n />\n <div\n className={styles.viewport}\n ref={viewportRef}\n onDragStart={(event) => event.preventDefault()}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onWheel={handleWheel}\n style={\n {\n '--croppable-height': `${height ?? DEFAULT_HEIGHT}px`,\n '--croppable-zoom': clampedZoom,\n '--croppable-x': `${currentTransform.offset.x}px`,\n '--croppable-y': `${currentTransform.offset.y}px`,\n ...(imageSize\n ? {\n '--croppable-image-width': `${baseMetrics.width}px`,\n '--croppable-image-height': `${baseMetrics.height}px`,\n }\n : null),\n } as React.CSSProperties\n }\n >\n {isEmpty ? (\n <div className={styles.empty}>\n <Figure>\n <Icon\n name='image'\n size='large'\n />\n </Figure>\n <Button onClick={handleSelectImageClick}>{label ?? EMPTY_STATE_LABEL}</Button>\n </div>\n ) : (\n <div\n className={cx(\n styles.media,\n canDrag && styles.draggable,\n canDrag && isDragging && styles.dragging\n )}\n >\n <div className={cx(styles.inner)}>{content}</div>\n {hasPresetImage && (\n <div className={styles.overlay}>\n <div className={styles.empty}>\n <Figure>\n <Icon\n name='image'\n size='large'\n />\n </Figure>\n <Button onClick={handleSelectImageClick}>{label ?? EMPTY_STATE_LABEL}</Button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["MAX_ZOOM","MIN_ZOOM","IMAGE_EXPORT_QUALITY","clamp","value","min","max","Math","loadImage","file","Promise","resolve","reject","url","URL","createObjectURL","image","globalThis","Image","onload","revokeObjectURL","onerror","Error","src","createCroppedFile","fill","transform","viewport","widthRatio","width","naturalWidth","heightRatio","height","naturalHeight","coverRatio","baseWidth","baseHeight","minZoom","zoom","scale","renderedWidth","renderedHeight","left","offset","x","top","y","sourceX","sourceY","sourceWidth","sourceHeight","canvas","document","createElement","context","getContext","round","drawImage","outputType","type","startsWith","blob","toBlob","File","name","lastModified","Date","now","DEFAULT_HEIGHT","DEFAULT_TRANSFORM","EMPTY_STATE_LABEL","Croppable","children","label","onCroppableChange","onFileChange","onImageChange","onTransformChange","standalone","activePointerId","useRef","animationFrameRef","dragStartRef","inputRef","onImageChangeRef","objectUrlRef","pendingRef","pinchDistance","pointers","Map","transformRef","viewportRef","imageSize","setImageSize","useState","imageSrc","setImageSrc","isDragging","setIsDragging","draftTransform","setDraftTransform","sourceFile","setSourceFile","viewportSize","setViewportSize","baseMetrics","getBaseMetrics","scaleX","scaleY","cover","rawMinZoom","currentTransform","clampedZoom","displayImage","hasPresetImage","canTransform","content","jsx","event","img","currentTarget","isEmpty","clampOffset","next","zoomToUse","maxX","maxY","getClampBounds","getViewportVectorFromClient","clientX","clientY","node","current","rect","getBoundingClientRect","computeAnchoredOffset","currentOffset","currentZoom","nextZoom","anchorVec","z0","z1","r","commitTransform","nextOffset","anchoredOffset","clampedOffset","scheduleTransform","anchor","window","requestAnimationFrame","pending","z","o","a","handleWheel","sensitivity","ctrlKey","exp","deltaY","scaledWidth","scaledHeight","handleInputChange","input","target","files","handlePointerDown","pointerType","button","setPointerCapture","pointerId","points","set","size","first","second","Array","from","values","hypot","originX","originY","handlePointerMove","has","dx","dy","distance","center","ratio","canDrag","abs","handlePointerUp","delete","useEffect","update","prev","handleScroll","addEventListener","ResizeObserver","handleResize","removeEventListener","observer","observe","disconnect","clamped","isActive","timeout","setTimeout","then","nextFile","catch","clearTimeout","cancelAnimationFrame","clampBounds","openFilePicker","click","handleSelectImageClick","preventDefault","stopPropagation","jsxs","cx","styles","croppable","empty","Figure","Icon","Button","media","draggable","dragging","inner","overlay"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/croppable/crop-image.ts","../../../src/components/croppable/index.tsx"],"sourcesContent":["export type CroppableTransform = {\n offset: { x: number; y: number };\n zoom: number;\n};\n\nexport const MAX_ZOOM = 10;\nexport const MIN_ZOOM = 0.1;\n\nconst IMAGE_EXPORT_QUALITY = 0.92;\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.min(max, Math.max(min, value));\n\nconst loadImage = (file: File) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const url = URL.createObjectURL(file);\n const image = new globalThis.Image();\n\n image.onload = () => {\n URL.revokeObjectURL(url);\n resolve(image);\n };\n image.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error('croppable-image-load-failed'));\n };\n\n image.src = url;\n });\n\nexport const createCroppedFile = async ({\n file,\n fill,\n transform,\n viewport,\n}: {\n file: File;\n fill: 'width' | 'height' | 'none';\n transform: CroppableTransform;\n viewport: { width: number; height: number };\n}) => {\n const image = await loadImage(file);\n const widthRatio = viewport.width / image.naturalWidth;\n const heightRatio = viewport.height / image.naturalHeight;\n const coverRatio = Math.max(widthRatio, heightRatio);\n const baseWidth = image.naturalWidth * coverRatio;\n const baseHeight = image.naturalHeight * coverRatio;\n const minZoom =\n fill === 'width'\n ? Math.max(MIN_ZOOM, widthRatio / coverRatio)\n : fill === 'height'\n ? Math.max(MIN_ZOOM, heightRatio / coverRatio)\n : MIN_ZOOM;\n const zoom = clamp(transform.zoom, minZoom, MAX_ZOOM);\n const scale = coverRatio * zoom;\n const renderedWidth = baseWidth * zoom;\n const renderedHeight = baseHeight * zoom;\n const left = (viewport.width - renderedWidth) / 2 + transform.offset.x;\n const top = (viewport.height - renderedHeight) / 2 + transform.offset.y;\n const sourceX = clamp(-left / scale, 0, image.naturalWidth);\n const sourceY = clamp(-top / scale, 0, image.naturalHeight);\n const sourceWidth = clamp(viewport.width / scale, 1, Math.max(1, image.naturalWidth - sourceX));\n const sourceHeight = clamp(\n viewport.height / scale,\n 1,\n Math.max(1, image.naturalHeight - sourceY)\n );\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (!context) {\n throw new Error('croppable-image-context-missing');\n }\n\n canvas.width = Math.max(1, Math.round(sourceWidth));\n canvas.height = Math.max(1, Math.round(sourceHeight));\n context.drawImage(\n image,\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n 0,\n 0,\n canvas.width,\n canvas.height\n );\n\n const outputType = file.type.startsWith('image/') ? file.type : 'image/jpeg';\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, outputType, IMAGE_EXPORT_QUALITY);\n });\n\n if (!blob) {\n throw new Error('croppable-image-export-failed');\n }\n\n return new globalThis.File([blob], file.name, {\n lastModified: Date.now(),\n type: blob.type || outputType,\n });\n};\n","import cx from 'classix';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../button';\nimport { Figure } from '../figure';\nimport { Icon } from '../icon';\nimport {\n clamp,\n createCroppedFile,\n type CroppableTransform,\n MAX_ZOOM,\n MIN_ZOOM,\n} from './crop-image';\nimport styles from './styles.module.css';\n\nexport type { CroppableTransform } from './crop-image';\n\nexport type CroppableProps = {\n children?: React.ReactNode;\n fill?: 'width' | 'height' | 'none';\n height?: number;\n image?: string | null;\n label?: string;\n onCroppableChange?: (rect: DOMRect) => void;\n onFileChange?: (file: File | null) => void;\n onImageChange?: (file: File | null) => void;\n onTransformChange?: (transform: CroppableTransform) => void;\n standalone?: boolean;\n transform?: CroppableTransform;\n};\n\nconst DEFAULT_HEIGHT = 192;\nconst DEFAULT_TRANSFORM: CroppableTransform = { offset: { x: 0, y: 0 }, zoom: 1 };\nconst EMPTY_STATE_LABEL = 'Select image';\nexport const Croppable = ({\n children,\n fill = 'none',\n height,\n image,\n label,\n onCroppableChange,\n onFileChange,\n onImageChange,\n onTransformChange,\n transform,\n standalone,\n}: CroppableProps) => {\n const activePointerId = useRef<number | null>(null);\n const animationFrameRef = useRef<number | null>(null);\n const dragStartRef = useRef<{ x: number; y: number; originX: number; originY: number } | null>(\n null\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const onImageChangeRef = useRef(onImageChange);\n const objectUrlRef = useRef<string | null>(null);\n const pendingRef = useRef<{\n zoom: number;\n offset: { x: number; y: number };\n anchor: { x: number; y: number } | null;\n } | null>(null);\n const pinchDistance = useRef<number | null>(null);\n const pointers = useRef<Map<number, { x: number; y: number }>>(new Map());\n const transformRef = useRef<CroppableTransform>(DEFAULT_TRANSFORM);\n const viewportRef = useRef<HTMLDivElement>(null);\n\n const [imageSize, setImageSize] = useState<{ width: number; height: number } | null>(null);\n const [imageSrc, setImageSrc] = useState<string | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [draftTransform, setDraftTransform] = useState<CroppableTransform>(DEFAULT_TRANSFORM);\n const [sourceFile, setSourceFile] = useState<File | null>(null);\n const [viewportSize, setViewportSize] = useState({ width: 0, height: 0 });\n\n const getBaseMetrics = () => {\n const width = viewportSize.width;\n const height = viewportSize.height;\n\n if (!width || !height) return { width: 0, height: 0, minZoom: MIN_ZOOM };\n if (!imageSize) return { width, height, minZoom: MIN_ZOOM };\n\n const scaleX = width / imageSize.width;\n const scaleY = height / imageSize.height;\n const cover = Math.max(scaleX, scaleY);\n\n const rawMinZoom = fill === 'width' ? scaleX / cover : fill === 'height' ? scaleY / cover : 0;\n\n return {\n width: imageSize.width * cover,\n height: imageSize.height * cover,\n minZoom: Math.max(MIN_ZOOM, rawMinZoom),\n };\n };\n\n const baseMetrics = getBaseMetrics();\n const minZoom = baseMetrics.minZoom;\n\n const currentTransform = transform ?? draftTransform;\n const clampedZoom = clamp(currentTransform.zoom, minZoom, MAX_ZOOM);\n const displayImage = imageSrc ?? image ?? null;\n const hasPresetImage = !children && !!image && !imageSrc && !sourceFile;\n const canTransform = !hasPresetImage;\n const content =\n children ??\n (displayImage ? (\n <img\n alt=''\n draggable={false}\n onLoad={(event) => {\n const img = event.currentTarget;\n if (img.naturalWidth && img.naturalHeight) {\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n }\n }}\n src={displayImage}\n />\n ) : null);\n const isEmpty = content == null;\n\n const clampOffset = (next: { x: number; y: number }, zoomToUse: number) => {\n const { maxX, maxY } = getClampBounds(zoomToUse);\n return {\n x: clamp(next.x, -maxX, maxX),\n y: clamp(next.y, -maxY, maxY),\n };\n };\n\n const getViewportVectorFromClient = (clientX: number, clientY: number) => {\n const node = viewportRef.current;\n if (!node) return null;\n const rect = node.getBoundingClientRect();\n const x = clientX - rect.left - rect.width / 2;\n const y = clientY - rect.top - rect.height / 2;\n return { x, y };\n };\n\n const computeAnchoredOffset = (\n currentOffset: { x: number; y: number },\n currentZoom: number,\n nextZoom: number,\n anchorVec: { x: number; y: number }\n ) => {\n const z0 = clamp(currentZoom, minZoom, MAX_ZOOM);\n const z1 = clamp(nextZoom, minZoom, MAX_ZOOM);\n if (z0 === 0) return currentOffset;\n const r = z1 / z0;\n return {\n x: (1 - r) * anchorVec.x + r * currentOffset.x,\n y: (1 - r) * anchorVec.y + r * currentOffset.y,\n };\n };\n\n const commitTransform = (\n nextZoom: number,\n nextOffset: { x: number; y: number },\n anchorVec?: { x: number; y: number } | null\n ) => {\n const z0 = transformRef.current.zoom;\n const z1 = clamp(nextZoom, minZoom, MAX_ZOOM);\n const currentOffset = transformRef.current.offset;\n const anchoredOffset = anchorVec\n ? computeAnchoredOffset(currentOffset, z0, z1, anchorVec)\n : nextOffset;\n const clampedOffset = clampOffset(anchoredOffset, z1);\n transformRef.current = { zoom: z1, offset: clampedOffset };\n\n if (!transform) {\n setDraftTransform({ zoom: z1, offset: clampedOffset });\n }\n onTransformChange?.({ zoom: z1, offset: clampedOffset });\n };\n\n const scheduleTransform = (\n nextZoom: number,\n nextOffset: { x: number; y: number },\n anchorVec?: { x: number; y: number } | null\n ) => {\n pendingRef.current = {\n zoom: nextZoom,\n offset: nextOffset,\n anchor: anchorVec ?? null,\n };\n\n if (animationFrameRef.current != null) return;\n\n animationFrameRef.current = window.requestAnimationFrame(() => {\n animationFrameRef.current = null;\n\n const pending = pendingRef.current;\n pendingRef.current = null;\n\n const z = pending?.zoom ?? transformRef.current.zoom;\n const o = pending?.offset ?? transformRef.current.offset;\n const a = pending?.anchor ?? null;\n\n commitTransform(z, o, a);\n });\n };\n\n const handleWheel: React.WheelEventHandler<HTMLDivElement> = (event) => {\n if (isEmpty || !canTransform) return;\n\n const sensitivity = event.ctrlKey ? 0.001 : 0.00025;\n const next = transformRef.current.zoom * Math.exp(-event.deltaY * sensitivity);\n\n const anchor = getViewportVectorFromClient(event.clientX, event.clientY);\n scheduleTransform(next, transformRef.current.offset, anchor);\n };\n\n const getClampBounds = (zoomToUse: number) => {\n const width = viewportSize.width;\n const height = viewportSize.height;\n if (!width || !height) return { maxX: 0, maxY: 0 };\n const z = clamp(zoomToUse, minZoom, MAX_ZOOM);\n const scaledWidth = baseMetrics.width * z;\n const scaledHeight = baseMetrics.height * z;\n const maxX = Math.max(0, (scaledWidth - width) / 2);\n const maxY = Math.max(0, (scaledHeight - height) / 2);\n return { maxX, maxY };\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n const input = event.target;\n const file = input.files?.[0] ?? null;\n\n if (objectUrlRef.current) {\n URL.revokeObjectURL(objectUrlRef.current);\n objectUrlRef.current = null;\n }\n\n if (!file) {\n setImageSrc(null);\n setSourceFile(null);\n onFileChange?.(null);\n input.value = '';\n return;\n }\n\n const url = URL.createObjectURL(file);\n objectUrlRef.current = url;\n setImageSrc(url);\n setImageSize(null);\n setSourceFile(file);\n scheduleTransform(DEFAULT_TRANSFORM.zoom, DEFAULT_TRANSFORM.offset);\n transformRef.current = DEFAULT_TRANSFORM;\n onFileChange?.(file);\n input.value = '';\n };\n\n const handlePointerDown: React.PointerEventHandler<HTMLDivElement> = (event) => {\n if (isEmpty || !canTransform || (event.pointerType === 'mouse' && event.button !== 0)) return;\n\n event.currentTarget.setPointerCapture(event.pointerId);\n\n if (event.pointerType === 'touch') {\n const points = pointers.current;\n points.set(event.pointerId, { x: event.clientX, y: event.clientY });\n if (points.size === 2) {\n dragStartRef.current = null;\n activePointerId.current = null;\n setIsDragging(false);\n const [first, second] = Array.from(points.values());\n pinchDistance.current = Math.hypot(first.x - second.x, first.y - second.y);\n return;\n }\n }\n\n activePointerId.current = event.pointerId;\n dragStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n originX: transformRef.current.offset.x,\n originY: transformRef.current.offset.y,\n };\n };\n\n const handlePointerMove: React.PointerEventHandler<HTMLDivElement> = (event) => {\n if (isEmpty || !canTransform) return;\n\n if (event.pointerType === 'touch') {\n const points = pointers.current;\n if (!points.has(event.pointerId)) return;\n points.set(event.pointerId, { x: event.clientX, y: event.clientY });\n if (points.size === 2) {\n const [first, second] = Array.from(points.values());\n const dx = first.x - second.x;\n const dy = first.y - second.y;\n const distance = Math.hypot(dx, dy);\n const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };\n if (pinchDistance.current) {\n const ratio = distance / pinchDistance.current;\n const nextZoom = transformRef.current.zoom * ratio;\n const anchor = getViewportVectorFromClient(center.x, center.y);\n scheduleTransform(nextZoom, transformRef.current.offset, anchor);\n }\n pinchDistance.current = distance;\n return;\n }\n }\n\n if (activePointerId.current !== event.pointerId || !dragStartRef.current || !canDrag) return;\n const dx = event.clientX - dragStartRef.current.x;\n const dy = event.clientY - dragStartRef.current.y;\n const distance = Math.abs(dx) + Math.abs(dy);\n if (!isDragging && distance > 2) setIsDragging(true);\n if (distance <= 1) return;\n scheduleTransform(transformRef.current.zoom, {\n x: dragStartRef.current.originX + dx,\n y: dragStartRef.current.originY + dy,\n });\n };\n\n const handlePointerUp: React.PointerEventHandler<HTMLDivElement> = (event) => {\n if (event.pointerType === 'touch') {\n pointers.current.delete(event.pointerId);\n if (pointers.current.size < 2) pinchDistance.current = null;\n }\n\n if (activePointerId.current === event.pointerId) {\n activePointerId.current = null;\n dragStartRef.current = null;\n setIsDragging(false);\n }\n };\n\n useEffect(() => {\n if (!transform) return;\n\n const z = clamp(transform.zoom, minZoom, MAX_ZOOM);\n transformRef.current = { zoom: z, offset: clampOffset(transform.offset, z) };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [transform, viewportSize.width, viewportSize.height, imageSize?.width, imageSize?.height]);\n\n useEffect(() => {\n return () => {\n if (objectUrlRef.current) URL.revokeObjectURL(objectUrlRef.current);\n };\n }, []);\n\n useEffect(() => {\n const node = viewportRef.current;\n if (!node) return;\n\n const update = () => {\n const rect = node.getBoundingClientRect();\n setViewportSize((prev) =>\n prev.width === rect.width && prev.height === rect.height\n ? prev\n : { width: rect.width, height: rect.height }\n );\n if (onCroppableChange) onCroppableChange(rect);\n };\n\n update();\n\n const handleScroll = () => update();\n window.addEventListener('scroll', handleScroll, true);\n\n if (typeof ResizeObserver === 'undefined') {\n const handleResize = () => update();\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }\n\n const observer = new ResizeObserver(() => update());\n observer.observe(node);\n return () => {\n observer.disconnect();\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [onCroppableChange]);\n\n useEffect(() => {\n if (transform) return;\n\n const current = transformRef.current.offset;\n const clamped = clampOffset(current, clampedZoom);\n\n if (current.x === clamped.x && current.y === clamped.y) return;\n\n transformRef.current = { zoom: transformRef.current.zoom, offset: clamped };\n setDraftTransform((prev) => ({ ...prev, offset: clamped }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clampedZoom, imageSize, viewportSize.width, viewportSize.height]);\n\n useEffect(() => {\n if (!displayImage) {\n setImageSize(null);\n }\n }, [displayImage]);\n\n useEffect(() => {\n onImageChangeRef.current = onImageChange;\n }, [onImageChange]);\n\n useEffect(() => {\n if (!onImageChange) return;\n\n if (!sourceFile || !viewportSize.width || !viewportSize.height || children) {\n onImageChangeRef.current?.(null);\n return;\n }\n\n let isActive = true;\n const timeout = window.setTimeout(() => {\n createCroppedFile({\n file: sourceFile,\n fill,\n transform: {\n zoom: clampedZoom,\n offset: currentTransform.offset,\n },\n viewport: viewportSize,\n })\n .then((nextFile) => {\n if (isActive) {\n onImageChangeRef.current?.(nextFile);\n }\n })\n .catch(() => {\n if (isActive) {\n onImageChangeRef.current?.(null);\n }\n });\n }, 75);\n\n return () => {\n isActive = false;\n window.clearTimeout(timeout);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [children, clampedZoom, currentTransform.offset, fill, sourceFile, viewportSize]);\n\n useEffect(() => {\n return () => {\n if (animationFrameRef.current != null) {\n window.cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n };\n }, []);\n\n const clampBounds = getClampBounds(clampedZoom);\n const canDrag = !isEmpty && canTransform && (clampBounds.maxX > 0 || clampBounds.maxY > 0);\n const openFilePicker = () => inputRef.current?.click();\n const handleSelectImageClick: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n event.stopPropagation();\n openFilePicker();\n };\n\n return (\n <div\n className={cx(styles.croppable, standalone && styles.standalone)}\n onClick={() => {\n if (isEmpty) openFilePicker();\n }}\n >\n <input\n accept='image/*'\n onChange={handleInputChange}\n ref={inputRef}\n type='file'\n />\n <div\n className={styles.viewport}\n ref={viewportRef}\n onDragStart={(event) => event.preventDefault()}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onWheel={handleWheel}\n style={\n {\n '--croppable-height': `${height ?? DEFAULT_HEIGHT}px`,\n '--croppable-zoom': clampedZoom,\n '--croppable-x': `${currentTransform.offset.x}px`,\n '--croppable-y': `${currentTransform.offset.y}px`,\n ...(imageSize\n ? {\n '--croppable-image-width': `${baseMetrics.width}px`,\n '--croppable-image-height': `${baseMetrics.height}px`,\n }\n : null),\n } as React.CSSProperties\n }\n >\n {isEmpty ? (\n <div className={styles.empty}>\n <Figure>\n <Icon\n name='Image'\n size='large'\n />\n </Figure>\n <Button onClick={handleSelectImageClick}>{label ?? EMPTY_STATE_LABEL}</Button>\n </div>\n ) : (\n <div\n className={cx(\n styles.media,\n canDrag && styles.draggable,\n canDrag && isDragging && styles.dragging\n )}\n >\n <div className={cx(styles.inner)}>{content}</div>\n {hasPresetImage && (\n <div className={styles.overlay}>\n <div className={styles.empty}>\n <Figure>\n <Icon\n name='Image'\n size='large'\n />\n </Figure>\n <Button onClick={handleSelectImageClick}>{label ?? EMPTY_STATE_LABEL}</Button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["MAX_ZOOM","MIN_ZOOM","IMAGE_EXPORT_QUALITY","clamp","value","min","max","Math","loadImage","file","Promise","resolve","reject","url","URL","createObjectURL","image","globalThis","Image","onload","revokeObjectURL","onerror","Error","src","createCroppedFile","fill","transform","viewport","widthRatio","width","naturalWidth","heightRatio","height","naturalHeight","coverRatio","baseWidth","baseHeight","minZoom","zoom","scale","renderedWidth","renderedHeight","left","offset","x","top","y","sourceX","sourceY","sourceWidth","sourceHeight","canvas","document","createElement","context","getContext","round","drawImage","outputType","type","startsWith","blob","toBlob","File","name","lastModified","Date","now","DEFAULT_HEIGHT","DEFAULT_TRANSFORM","EMPTY_STATE_LABEL","Croppable","children","label","onCroppableChange","onFileChange","onImageChange","onTransformChange","standalone","activePointerId","useRef","animationFrameRef","dragStartRef","inputRef","onImageChangeRef","objectUrlRef","pendingRef","pinchDistance","pointers","Map","transformRef","viewportRef","imageSize","setImageSize","useState","imageSrc","setImageSrc","isDragging","setIsDragging","draftTransform","setDraftTransform","sourceFile","setSourceFile","viewportSize","setViewportSize","baseMetrics","getBaseMetrics","scaleX","scaleY","cover","rawMinZoom","currentTransform","clampedZoom","displayImage","hasPresetImage","canTransform","content","jsx","event","img","currentTarget","isEmpty","clampOffset","next","zoomToUse","maxX","maxY","getClampBounds","getViewportVectorFromClient","clientX","clientY","node","current","rect","getBoundingClientRect","computeAnchoredOffset","currentOffset","currentZoom","nextZoom","anchorVec","z0","z1","r","commitTransform","nextOffset","anchoredOffset","clampedOffset","scheduleTransform","anchor","window","requestAnimationFrame","pending","z","o","a","handleWheel","sensitivity","ctrlKey","exp","deltaY","scaledWidth","scaledHeight","handleInputChange","input","target","files","handlePointerDown","pointerType","button","setPointerCapture","pointerId","points","set","size","first","second","Array","from","values","hypot","originX","originY","handlePointerMove","has","dx","dy","distance","center","ratio","canDrag","abs","handlePointerUp","delete","useEffect","update","prev","handleScroll","addEventListener","ResizeObserver","handleResize","removeEventListener","observer","observe","disconnect","clamped","isActive","timeout","setTimeout","then","nextFile","catch","clearTimeout","cancelAnimationFrame","clampBounds","openFilePicker","click","handleSelectImageClick","preventDefault","stopPropagation","jsxs","cx","styles","croppable","empty","Figure","Icon","Button","media","draggable","dragging","inner","overlay"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index36.css');const e=require("react/jsx-runtime"),P=require("../../classix-5H4IWnMA.cjs"),a=require("react"),j=require("../button/index.cjs"),T=require("../icon/index.cjs"),E="_dialog_10cs4_3",F="_close_10cs4_24",M="_fullscreen_10cs4_35",S="_structured_10cs4_56",X="_header_10cs4_62",Y="_content_10cs4_73",w="_controls_10cs4_81",r={dialog:E,close:F,fullscreen:M,structured:S,header:X,content:Y,controls:w},B=l=>a.Children.toArray(l).some(c=>a.isValidElement(c)?c.type===j.Button&&c.props.variant==="danger"?!0:B(c.props.children):!1),A=({children:l,className:c,controls:o,fullscreen:f=!1,header:_,onCancel:i,onClick:u,onClose:d,open:n=!1,setOpen:s,...b})=>{const g=a.useRef(null),m=B(o),h=f||_!=null||o!=null;a.useEffect(()=>{const t=g.current;t&&(n&&!t.open?t.showModal():!n&&t.open&&t.close())},[n]);const q=t=>{i==null||i(t),!(t.defaultPrevented||!s)&&(t.preventDefault(),s(!1))},y=t=>{if(u==null||u(t),m||t.defaultPrevented||t.target!==t.currentTarget||!s)return;const{bottom:R,left:D,right:k,top:p}=t.currentTarget.getBoundingClientRect();(t.clientX<D||t.clientX>k||t.clientY<p||t.clientY>R)&&s(!1)},N=t=>{d==null||d(t),n&&(s==null||s(!1))},x=s&&!m?e.jsx(j.Button,{"aria-label":"Close dialog",className:r.close,onClick:()=>s(!1),variant:"simple",children:e.jsx(T.Icon,{name:"x"})}):null;return e.jsx("dialog",{className:P.t(r.dialog,h&&r.structured,f&&r.fullscreen,c),onCancel:q,onClick:y,onClose:N,ref:g,...b,"data-component":"dialog",children:h?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:r.header,children:[_,x]}),e.jsx("div",{className:r.content,children:l}),o!=null&&e.jsx("div",{className:r.controls,children:o})]}):e.jsxs(e.Fragment,{children:[x,l]})})};exports.Dialog=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index36.css');const e=require("react/jsx-runtime"),P=require("../../classix-5H4IWnMA.cjs"),a=require("react"),j=require("../button/index.cjs"),T=require("../icon/index.cjs"),X="_dialog_10cs4_3",E="_close_10cs4_24",F="_fullscreen_10cs4_35",M="_structured_10cs4_56",S="_header_10cs4_62",Y="_content_10cs4_73",w="_controls_10cs4_81",r={dialog:X,close:E,fullscreen:F,structured:M,header:S,content:Y,controls:w},B=l=>a.Children.toArray(l).some(c=>a.isValidElement(c)?c.type===j.Button&&c.props.variant==="danger"?!0:B(c.props.children):!1),A=({children:l,className:c,controls:o,fullscreen:f=!1,header:_,onCancel:i,onClick:u,onClose:d,open:n=!1,setOpen:s,...b})=>{const g=a.useRef(null),m=B(o),h=f||_!=null||o!=null;a.useEffect(()=>{const t=g.current;t&&(n&&!t.open?t.showModal():!n&&t.open&&t.close())},[n]);const q=t=>{i==null||i(t),!(t.defaultPrevented||!s)&&(t.preventDefault(),s(!1))},y=t=>{if(u==null||u(t),m||t.defaultPrevented||t.target!==t.currentTarget||!s)return;const{bottom:R,left:D,right:k,top:p}=t.currentTarget.getBoundingClientRect();(t.clientX<D||t.clientX>k||t.clientY<p||t.clientY>R)&&s(!1)},N=t=>{d==null||d(t),n&&(s==null||s(!1))},x=s&&!m?e.jsx(j.Button,{"aria-label":"Close dialog",className:r.close,onClick:()=>s(!1),variant:"simple",children:e.jsx(T.Icon,{name:"X"})}):null;return e.jsx("dialog",{className:P.t(r.dialog,h&&r.structured,f&&r.fullscreen,c),onCancel:q,onClick:y,onClose:N,ref:g,...b,"data-component":"dialog",children:h?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:r.header,children:[_,x]}),e.jsx("div",{className:r.content,children:l}),o!=null&&e.jsx("div",{className:r.controls,children:o})]}):e.jsxs(e.Fragment,{children:[x,l]})})};exports.Dialog=A;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/dialog/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport React, { useEffect, useRef } from 'react';\n\nimport { Button, type ButtonProps } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport styles from './styles.module.css';\n\ntype ControlElementProps = {\n children?: React.ReactNode;\n variant?: ButtonProps['variant'];\n};\n\nconst hasDangerControl = (node: React.ReactNode): boolean =>\n React.Children.toArray(node).some((child) => {\n if (!React.isValidElement<ControlElementProps>(child)) return false;\n if (child.type === Button && child.props.variant === 'danger') return true;\n\n return hasDangerControl(child.props.children);\n });\n\nexport type DialogProps = React.DialogHTMLAttributes<HTMLDialogElement> & {\n children: React.ReactNode;\n controls?: React.ReactNode;\n fullscreen?: boolean;\n header?: React.ReactNode;\n setOpen?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Dialog = ({\n children,\n className,\n controls,\n fullscreen = false,\n header,\n onCancel,\n onClick,\n onClose,\n open = false,\n setOpen,\n ...props\n}: DialogProps) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const destructive = hasDangerControl(controls);\n const structured = fullscreen || header != null || controls != null;\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open && !dialog.open) {\n dialog.showModal();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n const handleCancel = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onCancel?.(event);\n if (event.defaultPrevented || !setOpen) return;\n\n event.preventDefault();\n setOpen(false);\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDialogElement>) => {\n onClick?.(event);\n if (destructive || event.defaultPrevented || event.target !== event.currentTarget || !setOpen)\n return;\n\n const { bottom, left, right, top } = event.currentTarget.getBoundingClientRect();\n const clickedBackdrop =\n event.clientX < left ||\n event.clientX > right ||\n event.clientY < top ||\n event.clientY > bottom;\n\n if (clickedBackdrop) {\n setOpen(false);\n }\n };\n\n const handleClose = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onClose?.(event);\n if (open) setOpen?.(false);\n };\n\n const closeButton =\n setOpen && !destructive ? (\n <Button\n aria-label='Close dialog'\n className={styles.close}\n onClick={() => setOpen(false)}\n variant='simple'\n >\n <Icon name='x' />\n </Button>\n ) : null;\n\n return (\n <dialog\n className={cx(\n styles.dialog,\n structured && styles.structured,\n fullscreen && styles.fullscreen,\n className\n )}\n onCancel={handleCancel}\n onClick={handleClick}\n onClose={handleClose}\n ref={dialogRef}\n {...props}\n >\n {structured ? (\n <>\n <div className={styles.header}>\n {header}\n {closeButton}\n </div>\n <div className={styles.content}>{children}</div>\n {controls != null && <div className={styles.controls}>{controls}</div>}\n </>\n ) : (\n <>\n {closeButton}\n {children}\n </>\n )}\n </dialog>\n );\n};\n"],"names":["hasDangerControl","node","React","Children","toArray","some","child","isValidElement","type","Button","props","variant","children","Dialog","className","controls","fullscreen","header","onCancel","onClick","onClose","open","setOpen","dialogRef","useRef","destructive","structured","useEffect","dialog","current","showModal","close","handleCancel","event","defaultPrevented","preventDefault","handleClick","target","currentTarget","bottom","left","right","top","getBoundingClientRect","clientX","clientY","handleClose","closeButton","styles","Icon","jsx","cx","jsxs","Fragment","content"],"mappings":"ydAaMA,EAAoBC,GACxBC,EAAMC,SAASC,QAAQH,CAAI,EAAEI,KAAMC,GAC5BJ,EAAMK,eAAoCD,CAAK,EAChDA,EAAME,OAASC,UAAUH,EAAMI,MAAMC,UAAY,SAAiB,GAE/DX,EAAiBM,EAAMI,MAAME,QAAQ,EAHkB,EAI/D,EAUUC,EAASA,CAAC,CACrBD,SAAAA,EACAE,UAAAA,EACAC,SAAAA,EACAC,WAAAA,EAAa,GACbC,OAAAA,EACAC,SAAAA,EACAC,QAAAA,EACAC,QAAAA,EACAC,KAAAA,EAAO,GACPC,QAAAA,EACA,GAAGZ,CACQ,IAAM,CACjB,MAAMa,EAAYC,EAAAA,OAA0B,IAAI,EAC1CC,EAAczB,EAAiBe,CAAQ,EACvCW,EAAaV,GAAcC,GAAU,MAAQF,GAAY,KAE/DY,EAAAA,UAAU,IAAM,CACd,MAAMC,EAASL,EAAUM,QACpBD,IAEDP,GAAQ,CAACO,EAAOP,KAClBO,EAAOE,UAAAA,EACE,CAACT,GAAQO,EAAOP,MACzBO,EAAOG,MAAAA,EAEX,EAAG,CAACV,CAAI,CAAC,EAET,MAAMW,EAAgBC,GAAmD,CACvEf,GAAAA,MAAAA,EAAWe,GACPA,EAAAA,EAAMC,kBAAoB,CAACZ,KAE/BW,EAAME,eAAAA,EACNb,EAAQ,EAAK,EACf,EAEMc,EAAeH,GAA+C,CAElE,GADAd,GAAAA,MAAAA,EAAUc,GACNR,GAAeQ,EAAMC,kBAAoBD,EAAMI,SAAWJ,EAAMK,eAAiB,CAAChB,EACpF,OAEF,KAAM,CAAEiB,OAAAA,EAAQC,KAAAA,EAAMC,MAAAA,EAAOC,IAAAA,CAAAA,EAAQT,EAAMK,cAAcK,sBAAAA,GAEvDV,EAAMW,QAAUJ,GAChBP,EAAMW,QAAUH,GAChBR,EAAMY,QAAUH,GAChBT,EAAMY,QAAUN,IAGhBjB,EAAQ,EAAK,CAEjB,EAEMwB,EAAeb,GAAmD,CACtEb,GAAAA,MAAAA,EAAUa,GACNZ,eAAgB,IACtB,EAEM0B,EACJzB,GAAW,CAACG,QACThB,EAAAA,OAAA,CACC,aAAW,eACX,UAAWuC,EAAOjB,MAClB,QAAS,IAAMT,EAAQ,EAAK,EAC5B,QAAQ,SAER,eAAC2B,EAAAA,KAAA,CAAK,KAAK,IAAG,CAAA,CAChB,EACE,KAEN,OACEC,EAAAA,IAAC,SAAA,CACC,UAAWC,EAAAA,EACTH,EAAOpB,OACPF,GAAcsB,EAAOtB,WACrBV,GAAcgC,EAAOhC,WACrBF,CACF,EACA,SAAUkB,EACV,QAASI,EACT,QAASU,EACT,IAAKvB,EACL,GAAIb,EAAM,iBAAA,SAETgB,SAAAA,EACC0B,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAWJ,EAAO/B,OACpBA,SAAAA,CAAAA,EACA8B,CAAAA,EACH,EACAG,EAAAA,IAAC,MAAA,CAAI,UAAWF,EAAOM,QAAU1C,SAAAA,EAAS,EACzCG,GAAY,MAAQmC,EAAAA,IAAC,OAAI,UAAWF,EAAOjC,SAAWA,SAAAA,CAAAA,CAAS,CAAA,CAAA,CAClE,EAEAqC,EAAAA,KAAAC,EAAAA,SAAA,CACGN,SAAAA,CAAAA,EACAnC,CAAAA,CAAAA,CACH,CAAA,CAEJ,CAEJ"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/dialog/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport React, { useEffect, useRef } from 'react';\n\nimport { Button, type ButtonProps } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport styles from './styles.module.css';\n\ntype ControlElementProps = {\n children?: React.ReactNode;\n variant?: ButtonProps['variant'];\n};\n\nconst hasDangerControl = (node: React.ReactNode): boolean =>\n React.Children.toArray(node).some((child) => {\n if (!React.isValidElement<ControlElementProps>(child)) return false;\n if (child.type === Button && child.props.variant === 'danger') return true;\n\n return hasDangerControl(child.props.children);\n });\n\nexport type DialogProps = React.DialogHTMLAttributes<HTMLDialogElement> & {\n children: React.ReactNode;\n controls?: React.ReactNode;\n fullscreen?: boolean;\n header?: React.ReactNode;\n setOpen?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Dialog = ({\n children,\n className,\n controls,\n fullscreen = false,\n header,\n onCancel,\n onClick,\n onClose,\n open = false,\n setOpen,\n ...props\n}: DialogProps) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const destructive = hasDangerControl(controls);\n const structured = fullscreen || header != null || controls != null;\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open && !dialog.open) {\n dialog.showModal();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n const handleCancel = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onCancel?.(event);\n if (event.defaultPrevented || !setOpen) return;\n\n event.preventDefault();\n setOpen(false);\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDialogElement>) => {\n onClick?.(event);\n if (destructive || event.defaultPrevented || event.target !== event.currentTarget || !setOpen)\n return;\n\n const { bottom, left, right, top } = event.currentTarget.getBoundingClientRect();\n const clickedBackdrop =\n event.clientX < left ||\n event.clientX > right ||\n event.clientY < top ||\n event.clientY > bottom;\n\n if (clickedBackdrop) {\n setOpen(false);\n }\n };\n\n const handleClose = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onClose?.(event);\n if (open) setOpen?.(false);\n };\n\n const closeButton =\n setOpen && !destructive ? (\n <Button\n aria-label='Close dialog'\n className={styles.close}\n onClick={() => setOpen(false)}\n variant='simple'\n >\n <Icon name='X' />\n </Button>\n ) : null;\n\n return (\n <dialog\n className={cx(\n styles.dialog,\n structured && styles.structured,\n fullscreen && styles.fullscreen,\n className\n )}\n onCancel={handleCancel}\n onClick={handleClick}\n onClose={handleClose}\n ref={dialogRef}\n {...props}\n >\n {structured ? (\n <>\n <div className={styles.header}>\n {header}\n {closeButton}\n </div>\n <div className={styles.content}>{children}</div>\n {controls != null && <div className={styles.controls}>{controls}</div>}\n </>\n ) : (\n <>\n {closeButton}\n {children}\n </>\n )}\n </dialog>\n );\n};\n"],"names":["hasDangerControl","node","React","Children","toArray","some","child","isValidElement","type","Button","props","variant","children","Dialog","className","controls","fullscreen","header","onCancel","onClick","onClose","open","setOpen","dialogRef","useRef","destructive","structured","useEffect","dialog","current","showModal","close","handleCancel","event","defaultPrevented","preventDefault","handleClick","target","currentTarget","bottom","left","right","top","getBoundingClientRect","clientX","clientY","handleClose","closeButton","styles","Icon","jsx","cx","jsxs","Fragment","content"],"mappings":"ydAaMA,EAAoBC,GACxBC,EAAMC,SAASC,QAAQH,CAAI,EAAEI,KAAMC,GAC5BJ,EAAMK,eAAoCD,CAAK,EAChDA,EAAME,OAASC,UAAUH,EAAMI,MAAMC,UAAY,SAAiB,GAE/DX,EAAiBM,EAAMI,MAAME,QAAQ,EAHkB,EAI/D,EAUUC,EAASA,CAAC,CACrBD,SAAAA,EACAE,UAAAA,EACAC,SAAAA,EACAC,WAAAA,EAAa,GACbC,OAAAA,EACAC,SAAAA,EACAC,QAAAA,EACAC,QAAAA,EACAC,KAAAA,EAAO,GACPC,QAAAA,EACA,GAAGZ,CACQ,IAAM,CACjB,MAAMa,EAAYC,EAAAA,OAA0B,IAAI,EAC1CC,EAAczB,EAAiBe,CAAQ,EACvCW,EAAaV,GAAcC,GAAU,MAAQF,GAAY,KAE/DY,EAAAA,UAAU,IAAM,CACd,MAAMC,EAASL,EAAUM,QACpBD,IAEDP,GAAQ,CAACO,EAAOP,KAClBO,EAAOE,UAAAA,EACE,CAACT,GAAQO,EAAOP,MACzBO,EAAOG,MAAAA,EAEX,EAAG,CAACV,CAAI,CAAC,EAET,MAAMW,EAAgBC,GAAmD,CACvEf,GAAAA,MAAAA,EAAWe,GACPA,EAAAA,EAAMC,kBAAoB,CAACZ,KAE/BW,EAAME,eAAAA,EACNb,EAAQ,EAAK,EACf,EAEMc,EAAeH,GAA+C,CAElE,GADAd,GAAAA,MAAAA,EAAUc,GACNR,GAAeQ,EAAMC,kBAAoBD,EAAMI,SAAWJ,EAAMK,eAAiB,CAAChB,EACpF,OAEF,KAAM,CAAEiB,OAAAA,EAAQC,KAAAA,EAAMC,MAAAA,EAAOC,IAAAA,CAAAA,EAAQT,EAAMK,cAAcK,sBAAAA,GAEvDV,EAAMW,QAAUJ,GAChBP,EAAMW,QAAUH,GAChBR,EAAMY,QAAUH,GAChBT,EAAMY,QAAUN,IAGhBjB,EAAQ,EAAK,CAEjB,EAEMwB,EAAeb,GAAmD,CACtEb,GAAAA,MAAAA,EAAUa,GACNZ,eAAgB,IACtB,EAEM0B,EACJzB,GAAW,CAACG,QACThB,EAAAA,OAAA,CACC,aAAW,eACX,UAAWuC,EAAOjB,MAClB,QAAS,IAAMT,EAAQ,EAAK,EAC5B,QAAQ,SAER,eAAC2B,EAAAA,KAAA,CAAK,KAAK,IAAG,CAAA,CAChB,EACE,KAEN,OACEC,EAAAA,IAAC,SAAA,CACC,UAAWC,EAAAA,EACTH,EAAOpB,OACPF,GAAcsB,EAAOtB,WACrBV,GAAcgC,EAAOhC,WACrBF,CACF,EACA,SAAUkB,EACV,QAASI,EACT,QAASU,EACT,IAAKvB,EACL,GAAIb,EAAM,iBAAA,SAETgB,SAAAA,EACC0B,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAWJ,EAAO/B,OACpBA,SAAAA,CAAAA,EACA8B,CAAAA,EACH,EACAG,EAAAA,IAAC,MAAA,CAAI,UAAWF,EAAOM,QAAU1C,SAAAA,EAAS,EACzCG,GAAY,MAAQmC,EAAAA,IAAC,OAAI,UAAWF,EAAOjC,SAAWA,SAAAA,CAAAA,CAAS,CAAA,CAAA,CAClE,EAEAqC,EAAAA,KAAAC,EAAAA,SAAA,CACGN,SAAAA,CAAAA,EACAnC,CAAAA,CAAAA,CACH,CAAA,CAEJ,CAEJ"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as e, jsxs as u, Fragment as B } from "react/jsx-runtime";
2
- import { t as X } from "../../classix-DG18itHa.js";
2
+ import { t as T } from "../../classix-DG18itHa.js";
3
3
  import N, { useRef as Y, useEffect as w } from "react";
4
- import { Button as x } from "../button/index.js";
4
+ import { Button as R } from "../button/index.js";
5
5
  import { Icon as A } from "../icon/index.js";
6
6
  import '../../assets/index36.css';const F = "_dialog_10cs4_3", I = "_close_10cs4_24", M = "_fullscreen_10cs4_35", V = "_structured_10cs4_56", q = "_header_10cs4_62", z = "_content_10cs4_73", G = "_controls_10cs4_81", c = {
7
7
  dialog: F,
@@ -11,7 +11,7 @@ import '../../assets/index36.css';const F = "_dialog_10cs4_3", I = "_close_10cs4
11
11
  header: q,
12
12
  content: z,
13
13
  controls: G
14
- }, R = (s) => N.Children.toArray(s).some((l) => N.isValidElement(l) ? l.type === x && l.props.variant === "danger" ? !0 : R(l.props.children) : !1), U = ({
14
+ }, k = (s) => N.Children.toArray(s).some((l) => N.isValidElement(l) ? l.type === R && l.props.variant === "danger" ? !0 : k(l.props.children) : !1), U = ({
15
15
  children: s,
16
16
  className: l,
17
17
  controls: o,
@@ -22,9 +22,9 @@ import '../../assets/index36.css';const F = "_dialog_10cs4_3", I = "_close_10cs4
22
22
  onClose: d,
23
23
  open: a = !1,
24
24
  setOpen: t,
25
- ...k
25
+ ...x
26
26
  }) => {
27
- const m = Y(null), g = R(o), h = f || _ != null || o != null;
27
+ const m = Y(null), g = k(o), h = f || _ != null || o != null;
28
28
  w(() => {
29
29
  const r = m.current;
30
30
  r && (a && !r.open ? r.showModal() : !a && r.open && r.close());
@@ -34,16 +34,16 @@ import '../../assets/index36.css';const F = "_dialog_10cs4_3", I = "_close_10cs4
34
34
  }, D = (r) => {
35
35
  if (i == null || i(r), g || r.defaultPrevented || r.target !== r.currentTarget || !t) return;
36
36
  const {
37
- bottom: j,
38
- left: E,
39
- right: P,
40
- top: T
37
+ bottom: b,
38
+ left: j,
39
+ right: E,
40
+ top: P
41
41
  } = r.currentTarget.getBoundingClientRect();
42
- (r.clientX < E || r.clientX > P || r.clientY < T || r.clientY > j) && t(!1);
43
- }, b = (r) => {
42
+ (r.clientX < j || r.clientX > E || r.clientY < P || r.clientY > b) && t(!1);
43
+ }, X = (r) => {
44
44
  d == null || d(r), a && (t == null || t(!1));
45
- }, p = t && !g ? /* @__PURE__ */ e(x, { "aria-label": "Close dialog", className: c.close, onClick: () => t(!1), variant: "simple", children: /* @__PURE__ */ e(A, { name: "x" }) }) : null;
46
- return /* @__PURE__ */ e("dialog", { className: X(c.dialog, h && c.structured, f && c.fullscreen, l), onCancel: y, onClick: D, onClose: b, ref: m, ...k, "data-component": "dialog", children: h ? /* @__PURE__ */ u(B, { children: [
45
+ }, p = t && !g ? /* @__PURE__ */ e(R, { "aria-label": "Close dialog", className: c.close, onClick: () => t(!1), variant: "simple", children: /* @__PURE__ */ e(A, { name: "X" }) }) : null;
46
+ return /* @__PURE__ */ e("dialog", { className: T(c.dialog, h && c.structured, f && c.fullscreen, l), onCancel: y, onClick: D, onClose: X, ref: m, ...x, "data-component": "dialog", children: h ? /* @__PURE__ */ u(B, { children: [
47
47
  /* @__PURE__ */ u("div", { className: c.header, children: [
48
48
  _,
49
49
  p
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/dialog/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport React, { useEffect, useRef } from 'react';\n\nimport { Button, type ButtonProps } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport styles from './styles.module.css';\n\ntype ControlElementProps = {\n children?: React.ReactNode;\n variant?: ButtonProps['variant'];\n};\n\nconst hasDangerControl = (node: React.ReactNode): boolean =>\n React.Children.toArray(node).some((child) => {\n if (!React.isValidElement<ControlElementProps>(child)) return false;\n if (child.type === Button && child.props.variant === 'danger') return true;\n\n return hasDangerControl(child.props.children);\n });\n\nexport type DialogProps = React.DialogHTMLAttributes<HTMLDialogElement> & {\n children: React.ReactNode;\n controls?: React.ReactNode;\n fullscreen?: boolean;\n header?: React.ReactNode;\n setOpen?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Dialog = ({\n children,\n className,\n controls,\n fullscreen = false,\n header,\n onCancel,\n onClick,\n onClose,\n open = false,\n setOpen,\n ...props\n}: DialogProps) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const destructive = hasDangerControl(controls);\n const structured = fullscreen || header != null || controls != null;\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open && !dialog.open) {\n dialog.showModal();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n const handleCancel = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onCancel?.(event);\n if (event.defaultPrevented || !setOpen) return;\n\n event.preventDefault();\n setOpen(false);\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDialogElement>) => {\n onClick?.(event);\n if (destructive || event.defaultPrevented || event.target !== event.currentTarget || !setOpen)\n return;\n\n const { bottom, left, right, top } = event.currentTarget.getBoundingClientRect();\n const clickedBackdrop =\n event.clientX < left ||\n event.clientX > right ||\n event.clientY < top ||\n event.clientY > bottom;\n\n if (clickedBackdrop) {\n setOpen(false);\n }\n };\n\n const handleClose = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onClose?.(event);\n if (open) setOpen?.(false);\n };\n\n const closeButton =\n setOpen && !destructive ? (\n <Button\n aria-label='Close dialog'\n className={styles.close}\n onClick={() => setOpen(false)}\n variant='simple'\n >\n <Icon name='x' />\n </Button>\n ) : null;\n\n return (\n <dialog\n className={cx(\n styles.dialog,\n structured && styles.structured,\n fullscreen && styles.fullscreen,\n className\n )}\n onCancel={handleCancel}\n onClick={handleClick}\n onClose={handleClose}\n ref={dialogRef}\n {...props}\n >\n {structured ? (\n <>\n <div className={styles.header}>\n {header}\n {closeButton}\n </div>\n <div className={styles.content}>{children}</div>\n {controls != null && <div className={styles.controls}>{controls}</div>}\n </>\n ) : (\n <>\n {closeButton}\n {children}\n </>\n )}\n </dialog>\n );\n};\n"],"names":["hasDangerControl","node","React","Children","toArray","some","child","isValidElement","type","Button","props","variant","children","Dialog","className","controls","fullscreen","header","onCancel","onClick","onClose","open","setOpen","dialogRef","useRef","destructive","structured","useEffect","dialog","current","showModal","close","handleCancel","event","defaultPrevented","preventDefault","handleClick","target","currentTarget","bottom","left","right","top","getBoundingClientRect","clientX","clientY","handleClose","closeButton","styles","Icon","jsx","cx","jsxs","Fragment","content"],"mappings":";;;;;;;;;;;;;GAaMA,IAAmBA,CAACC,MACxBC,EAAMC,SAASC,QAAQH,CAAI,EAAEI,KAAMC,CAAAA,MAC5BJ,EAAMK,eAAoCD,CAAK,IAChDA,EAAME,SAASC,KAAUH,EAAMI,MAAMC,YAAY,WAAiB,KAE/DX,EAAiBM,EAAMI,MAAME,QAAQ,IAHkB,EAI/D,GAUUC,IAASA,CAAC;AAAA,EACrBD,UAAAA;AAAAA,EACAE,WAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,YAAAA,IAAa;AAAA,EACbC,QAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,MAAAA,IAAO;AAAA,EACPC,SAAAA;AAAAA,EACA,GAAGZ;AACQ,MAAM;AACjB,QAAMa,IAAYC,EAA0B,IAAI,GAC1CC,IAAczB,EAAiBe,CAAQ,GACvCW,IAAaV,KAAcC,KAAU,QAAQF,KAAY;AAE/DY,EAAAA,EAAU,MAAM;AACd,UAAMC,IAASL,EAAUM;AACzB,IAAKD,MAEDP,KAAQ,CAACO,EAAOP,OAClBO,EAAOE,UAAAA,IACE,CAACT,KAAQO,EAAOP,QACzBO,EAAOG,MAAAA;AAAAA,EAEX,GAAG,CAACV,CAAI,CAAC;AAET,QAAMW,IAAeA,CAACC,MAAmD;AAEvE,IADAf,KAAAA,QAAAA,EAAWe,IACPA,EAAAA,EAAMC,oBAAoB,CAACZ,OAE/BW,EAAME,eAAAA,GACNb,EAAQ,EAAK;AAAA,EACf,GAEMc,IAAcA,CAACH,MAA+C;AAElE,QADAd,KAAAA,QAAAA,EAAUc,IACNR,KAAeQ,EAAMC,oBAAoBD,EAAMI,WAAWJ,EAAMK,iBAAiB,CAAChB,EACpF;AAEF,UAAM;AAAA,MAAEiB,QAAAA;AAAAA,MAAQC,MAAAA;AAAAA,MAAMC,OAAAA;AAAAA,MAAOC,KAAAA;AAAAA,IAAAA,IAAQT,EAAMK,cAAcK,sBAAAA;AAOzD,KALEV,EAAMW,UAAUJ,KAChBP,EAAMW,UAAUH,KAChBR,EAAMY,UAAUH,KAChBT,EAAMY,UAAUN,MAGhBjB,EAAQ,EAAK;AAAA,EAEjB,GAEMwB,IAAcA,CAACb,MAAmD;AACtEb,IAAAA,KAAAA,QAAAA,EAAUa,IACNZ,qBAAgB;AAAA,EACtB,GAEM0B,IACJzB,KAAW,CAACG,sBACThB,GAAA,EACC,cAAW,gBACX,WAAWuC,EAAOjB,OAClB,SAAS,MAAMT,EAAQ,EAAK,GAC5B,SAAQ,UAER,4BAAC2B,GAAA,EAAK,MAAK,KAAG,EAAA,CAChB,IACE;AAEN,SACE,gBAAAC,EAAC,UAAA,EACC,WAAWC,EACTH,EAAOpB,QACPF,KAAcsB,EAAOtB,YACrBV,KAAcgC,EAAOhC,YACrBF,CACF,GACA,UAAUkB,GACV,SAASI,GACT,SAASU,GACT,KAAKvB,GACL,GAAIb,GAAM,kBAAA,UAETgB,UAAAA,IACC,gBAAA0B,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWJ,EAAO/B,QACpBA,UAAAA;AAAAA,MAAAA;AAAAA,MACA8B;AAAAA,IAAAA,GACH;AAAA,IACA,gBAAAG,EAAC,OAAA,EAAI,WAAWF,EAAOM,SAAU1C,UAAAA,GAAS;AAAA,IACzCG,KAAY,QAAQ,gBAAAmC,EAAC,SAAI,WAAWF,EAAOjC,UAAWA,UAAAA,EAAAA,CAAS;AAAA,EAAA,EAAA,CAClE,IAEA,gBAAAqC,EAAAC,GAAA,EACGN,UAAAA;AAAAA,IAAAA;AAAAA,IACAnC;AAAAA,EAAAA,EAAAA,CACH,EAAA,CAEJ;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/dialog/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport React, { useEffect, useRef } from 'react';\n\nimport { Button, type ButtonProps } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport styles from './styles.module.css';\n\ntype ControlElementProps = {\n children?: React.ReactNode;\n variant?: ButtonProps['variant'];\n};\n\nconst hasDangerControl = (node: React.ReactNode): boolean =>\n React.Children.toArray(node).some((child) => {\n if (!React.isValidElement<ControlElementProps>(child)) return false;\n if (child.type === Button && child.props.variant === 'danger') return true;\n\n return hasDangerControl(child.props.children);\n });\n\nexport type DialogProps = React.DialogHTMLAttributes<HTMLDialogElement> & {\n children: React.ReactNode;\n controls?: React.ReactNode;\n fullscreen?: boolean;\n header?: React.ReactNode;\n setOpen?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Dialog = ({\n children,\n className,\n controls,\n fullscreen = false,\n header,\n onCancel,\n onClick,\n onClose,\n open = false,\n setOpen,\n ...props\n}: DialogProps) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const destructive = hasDangerControl(controls);\n const structured = fullscreen || header != null || controls != null;\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open && !dialog.open) {\n dialog.showModal();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n const handleCancel = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onCancel?.(event);\n if (event.defaultPrevented || !setOpen) return;\n\n event.preventDefault();\n setOpen(false);\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDialogElement>) => {\n onClick?.(event);\n if (destructive || event.defaultPrevented || event.target !== event.currentTarget || !setOpen)\n return;\n\n const { bottom, left, right, top } = event.currentTarget.getBoundingClientRect();\n const clickedBackdrop =\n event.clientX < left ||\n event.clientX > right ||\n event.clientY < top ||\n event.clientY > bottom;\n\n if (clickedBackdrop) {\n setOpen(false);\n }\n };\n\n const handleClose = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n onClose?.(event);\n if (open) setOpen?.(false);\n };\n\n const closeButton =\n setOpen && !destructive ? (\n <Button\n aria-label='Close dialog'\n className={styles.close}\n onClick={() => setOpen(false)}\n variant='simple'\n >\n <Icon name='X' />\n </Button>\n ) : null;\n\n return (\n <dialog\n className={cx(\n styles.dialog,\n structured && styles.structured,\n fullscreen && styles.fullscreen,\n className\n )}\n onCancel={handleCancel}\n onClick={handleClick}\n onClose={handleClose}\n ref={dialogRef}\n {...props}\n >\n {structured ? (\n <>\n <div className={styles.header}>\n {header}\n {closeButton}\n </div>\n <div className={styles.content}>{children}</div>\n {controls != null && <div className={styles.controls}>{controls}</div>}\n </>\n ) : (\n <>\n {closeButton}\n {children}\n </>\n )}\n </dialog>\n );\n};\n"],"names":["hasDangerControl","node","React","Children","toArray","some","child","isValidElement","type","Button","props","variant","children","Dialog","className","controls","fullscreen","header","onCancel","onClick","onClose","open","setOpen","dialogRef","useRef","destructive","structured","useEffect","dialog","current","showModal","close","handleCancel","event","defaultPrevented","preventDefault","handleClick","target","currentTarget","bottom","left","right","top","getBoundingClientRect","clientX","clientY","handleClose","closeButton","styles","Icon","jsx","cx","jsxs","Fragment","content"],"mappings":";;;;;;;;;;;;;GAaMA,IAAmBA,CAACC,MACxBC,EAAMC,SAASC,QAAQH,CAAI,EAAEI,KAAMC,CAAAA,MAC5BJ,EAAMK,eAAoCD,CAAK,IAChDA,EAAME,SAASC,KAAUH,EAAMI,MAAMC,YAAY,WAAiB,KAE/DX,EAAiBM,EAAMI,MAAME,QAAQ,IAHkB,EAI/D,GAUUC,IAASA,CAAC;AAAA,EACrBD,UAAAA;AAAAA,EACAE,WAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,YAAAA,IAAa;AAAA,EACbC,QAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,MAAAA,IAAO;AAAA,EACPC,SAAAA;AAAAA,EACA,GAAGZ;AACQ,MAAM;AACjB,QAAMa,IAAYC,EAA0B,IAAI,GAC1CC,IAAczB,EAAiBe,CAAQ,GACvCW,IAAaV,KAAcC,KAAU,QAAQF,KAAY;AAE/DY,EAAAA,EAAU,MAAM;AACd,UAAMC,IAASL,EAAUM;AACzB,IAAKD,MAEDP,KAAQ,CAACO,EAAOP,OAClBO,EAAOE,UAAAA,IACE,CAACT,KAAQO,EAAOP,QACzBO,EAAOG,MAAAA;AAAAA,EAEX,GAAG,CAACV,CAAI,CAAC;AAET,QAAMW,IAAeA,CAACC,MAAmD;AAEvE,IADAf,KAAAA,QAAAA,EAAWe,IACPA,EAAAA,EAAMC,oBAAoB,CAACZ,OAE/BW,EAAME,eAAAA,GACNb,EAAQ,EAAK;AAAA,EACf,GAEMc,IAAcA,CAACH,MAA+C;AAElE,QADAd,KAAAA,QAAAA,EAAUc,IACNR,KAAeQ,EAAMC,oBAAoBD,EAAMI,WAAWJ,EAAMK,iBAAiB,CAAChB,EACpF;AAEF,UAAM;AAAA,MAAEiB,QAAAA;AAAAA,MAAQC,MAAAA;AAAAA,MAAMC,OAAAA;AAAAA,MAAOC,KAAAA;AAAAA,IAAAA,IAAQT,EAAMK,cAAcK,sBAAAA;AAOzD,KALEV,EAAMW,UAAUJ,KAChBP,EAAMW,UAAUH,KAChBR,EAAMY,UAAUH,KAChBT,EAAMY,UAAUN,MAGhBjB,EAAQ,EAAK;AAAA,EAEjB,GAEMwB,IAAcA,CAACb,MAAmD;AACtEb,IAAAA,KAAAA,QAAAA,EAAUa,IACNZ,qBAAgB;AAAA,EACtB,GAEM0B,IACJzB,KAAW,CAACG,sBACThB,GAAA,EACC,cAAW,gBACX,WAAWuC,EAAOjB,OAClB,SAAS,MAAMT,EAAQ,EAAK,GAC5B,SAAQ,UAER,4BAAC2B,GAAA,EAAK,MAAK,KAAG,EAAA,CAChB,IACE;AAEN,SACE,gBAAAC,EAAC,UAAA,EACC,WAAWC,EACTH,EAAOpB,QACPF,KAAcsB,EAAOtB,YACrBV,KAAcgC,EAAOhC,YACrBF,CACF,GACA,UAAUkB,GACV,SAASI,GACT,SAASU,GACT,KAAKvB,GACL,GAAIb,GAAM,kBAAA,UAETgB,UAAAA,IACC,gBAAA0B,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWJ,EAAO/B,QACpBA,UAAAA;AAAAA,MAAAA;AAAAA,MACA8B;AAAAA,IAAAA,GACH;AAAA,IACA,gBAAAG,EAAC,OAAA,EAAI,WAAWF,EAAOM,SAAU1C,UAAAA,GAAS;AAAA,IACzCG,KAAY,QAAQ,gBAAAmC,EAAC,SAAI,WAAWF,EAAOjC,UAAWA,UAAAA,EAAAA,CAAS;AAAA,EAAA,EAAA,CAClE,IAEA,gBAAAqC,EAAAC,GAAA,EACGN,UAAAA;AAAAA,IAAAA;AAAAA,IACAnC;AAAAA,EAAAA,EAAAA,CACH,EAAA,CAEJ;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index37.css');const l=require("react/jsx-runtime"),b=require("../../classix-5H4IWnMA.cjs"),a=require("react"),F=require("../button/index.cjs"),de=require("../../icons-Lq3pr85X.cjs"),X=require("../../index-BOiGSTKz.cjs"),pe=require("../list/index.cjs"),V=require("../../index-BlnG4Rbh.cjs");function L(t){return typeof t=="string"||typeof t=="number"?String(t):Array.isArray(t)?t.map(L).join(" "):a.isValidElement(t)?L(t.props.children):""}function fe(t){return a.isValidElement(t)&&t.type==="option"}function me(t){return a.isValidElement(t)&&t.type==="optgroup"}function ve(t){return a.isValidElement(t)&&t.type===a.Fragment}function ge(t){return a.isValidElement(t)&&t.type===V.Select}function W(t,i,r=!1){const s=[];return a.Children.forEach(t,n=>{if(ve(n))s.push(...W(n.props.children,i,r));else if(fe(n)){const c=L(n.props.children).trim(),f=n.props.value!=null?String(n.props.value):c;s.push({disabled:r||!!n.props.disabled,groupLabel:i,hidden:!!n.props.hidden,isPlaceholder:!!(n.props.hidden&&f===""),label:n.props.children,selected:!!n.props.selected,text:c,value:f})}else me(n)&&s.push(...W(n.props.children,n.props.label,r||!!n.props.disabled))}),s}function _e(t){const i=t.trim();if(!i)return null;const s=[.../[*?]/.test(i)?i:`*${i}*`].map(n=>n==="*"?".*":n==="?"?".":n.replace(/[|\\{}()[\]^$+.,]/g,"\\$&")).join("");return new RegExp(`^${s}$`,"i")}function he(t,i){const r=_e(i),s=t.filter(n=>!n.hidden&&!n.isPlaceholder);return r?s.filter(n=>r.test([n.groupLabel,n.text,n.value].filter(Boolean).join(" "))):s}function xe(t,i){return t.find(r=>r.value===i)??t.find(r=>r.isPlaceholder)??t[0]}function be(t,i,r){var s,n;return i!=null?String(i):r!=null?String(r):((s=t.find(c=>c.selected))==null?void 0:s.value)??((n=t[0])==null?void 0:n.value)??""}function ye(t){if(ge(t)){const{children:i,placeholder:r,...s}=t.props;return{children:l.jsxs(l.Fragment,{children:[r&&l.jsx("option",{hidden:!0,value:"",children:r}),i]}),props:s}}return{children:t.props.children,props:t.props}}const je="_combobox_vg3rv_3",we="_dropdown_vg3rv_27",Se="_empty_vg3rv_32",Ne="_group_vg3rv_33",Ce="_placeholder_vg3rv_34",Ee="_filter_vg3rv_42",Ve="_native_vg3rv_53",Le="_option_vg3rv_63",Re="_options_vg3rv_85",$e="_panel_vg3rv_109",Be="_selected_vg3rv_134",Ie="_text_vg3rv_138",qe="_trigger_vg3rv_146",Pe="_minimal_vg3rv_183",De="_inline_vg3rv_238",ke="_label_vg3rv_270",o={combobox:je,"combobox-input":"_combobox-input_vg3rv_12",dropdown:we,empty:Se,group:Ne,placeholder:Ce,filter:Ee,native:Ve,option:Le,options:Re,panel:$e,selected:Be,text:Ie,trigger:qe,minimal:Pe,inline:De,label:ke,"inline-field":"_inline-field_vg3rv_276"};function Y(t,i){return{"--icon-svg":de.iconSVG(t).replace("currentColor",i)}}const Fe=({children:t,className:i,combobox:r=!1,createOption:s,emptyLabel:n="No matches found",label:c,renderOption:f,searchPlaceholder:R="Filter",selectedItems:Z,variant:_="default",...ee})=>{const $=ye(t),{defaultValue:te,onChange:B,value:I,...ne}=$.props,y=V.sanitizeSelectProps(ne),{className:re,...se}=y,M=a.useRef(null),Q=a.useRef(null),j=a.useId(),z=a.useRef(null),m=a.useRef(null),h=W($.children),x=I!=null,q=be(h,I,te),[P,D]=a.useState(()=>q),[u,p]=a.useState(!1),[w,S]=a.useState(""),N=x?String(I):P,O={default:V.resolveColor("--colors-semantic-content-secondary"),white:V.resolveColor("--color-white","white")},T=_==="minimal"?O.white:O.default,C=xe(h,N),le=Y("chevron",T),oe=Y("search",T),A=he(h,w),v=w.trim(),E=!!(r&&s&&v&&s.isValid(v)),ie=c&&_==="inline"?X.formatInlineLabel(c):c,G=e=>e?(f==null?void 0:f({groupLabel:e.groupLabel,isSelected:e.value===N,label:e.label,text:e.text,value:e.value}))??e.label:"Select an option";a.useEffect(()=>{!x&&!h.some(e=>e.value===P)&&D(q)},[q,P,x,h]),a.useEffect(()=>{var e;if(!u){S("");return}(e=m.current)==null||e.focus()},[u]),a.useEffect(()=>{if(!u)return;const e=d=>{var g;(g=Q.current)!=null&&g.contains(d.target)||p(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[u]);const ae=e=>{x||D(e.target.value),B==null||B(e)},k=()=>{var e;p(!1),r||(e=M.current)==null||e.focus()},K=()=>{var e;S(""),p(!0),(e=m.current)==null||e.focus()},H=()=>{!s||!E||(s.onCreate(v),K())},ce=e=>{var U;x||D(e);const d=z.current;if(!d){k();return}const g=(U=Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype,"value"))==null?void 0:U.set;g==null||g.call(d,e),d.dispatchEvent(new Event("change",{bubbles:!0})),r?K():k()},ue=e=>{e.key==="Escape"&&k(),e.key==="Enter"&&e.target===m.current&&E&&(e.preventDefault(),H())},J=l.jsxs("div",{className:b.t(o.dropdown,_==="inline"&&o.inline,_==="minimal"&&o.minimal,i),onKeyDown:ue,ref:Q,...ee,children:[l.jsx("select",{...se,"aria-hidden":"true",className:b.t(o.native,re),onChange:ae,ref:z,tabIndex:-1,value:N,children:$.children}),r?l.jsxs("div",{className:o.combobox,onClick:()=>{var e;return(e=m.current)==null?void 0:e.focus()},children:[Z,l.jsx("input",{"aria-autocomplete":"list","aria-expanded":u,"aria-label":y["aria-label"]??c??R,className:o["combobox-input"],disabled:y.disabled,onChange:e=>{S(e.target.value),p(!0)},onClick:()=>p(!0),onFocus:()=>p(!0),placeholder:R||void 0,ref:m,role:"combobox",type:"text",value:w})]}):l.jsx(F.Button,{"aria-expanded":u,"aria-haspopup":"dialog","aria-labelledby":c?`${j} ${j}-value`:void 0,className:b.t(o.trigger,(C==null?void 0:C.isPlaceholder)&&o.placeholder),"data-open":u?"true":void 0,disabled:y.disabled,onClick:()=>p(e=>!e),ref:M,style:le,variant:"tertiary",children:l.jsx("span",{className:o.text,id:`${j}-value`,children:G(C)})}),u&&l.jsxs("div",{className:o.panel,children:[!r&&l.jsx(X.Input,{"aria-label":"Filter",className:o.filter,icon:"search",onChange:e=>S(e.target.value),placeholder:R,ref:m,style:oe,type:"search",value:w}),l.jsxs(pe.List,{"aria-label":"Dropdown",className:o.options,children:[A.map(e=>{const d=e.value===N;return l.jsx("li",{"data-component":"dropdown",children:l.jsxs(F.Button,{"aria-label":d?`${e.text}, selected`:e.text,className:b.t(o.option,d&&o.selected),disabled:e.disabled,onClick:()=>ce(e.value),variant:"tertiary",children:[l.jsx("span",{className:o.text,children:G(e)}),e.groupLabel&&l.jsx("small",{className:o.group,children:e.groupLabel})]})},`${e.groupLabel??"root"}-${e.value}`)}),E&&s&&l.jsx("li",{children:l.jsx(F.Button,{"aria-label":L(s.render(v))||v,className:o.option,onClick:H,variant:"tertiary",children:l.jsx("span",{className:o.text,children:s.render(v)})})}),A.length===0&&!E&&l.jsx("li",{className:o.empty,children:n})]})]})]});return c?l.jsxs("div",{className:b.t(o.label,_==="inline"&&o["inline-field"]),"data-component":"dropdown",children:[l.jsx("span",{id:j,children:ie}),J]}):J};exports.Dropdown=Fe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index37.css');const l=require("react/jsx-runtime"),b=require("../../classix-5H4IWnMA.cjs"),a=require("react"),F=require("../button/index.cjs"),de=require("../../icons-B_uIKmIp.cjs"),X=require("../../index-rXfEqyt5.cjs"),pe=require("../list/index.cjs"),V=require("../../index-Y3jsTJhs.cjs");function L(t){return typeof t=="string"||typeof t=="number"?String(t):Array.isArray(t)?t.map(L).join(" "):a.isValidElement(t)?L(t.props.children):""}function fe(t){return a.isValidElement(t)&&t.type==="option"}function me(t){return a.isValidElement(t)&&t.type==="optgroup"}function ve(t){return a.isValidElement(t)&&t.type===a.Fragment}function ge(t){return a.isValidElement(t)&&t.type===V.Select}function M(t,i,r=!1){const s=[];return a.Children.forEach(t,n=>{if(ve(n))s.push(...M(n.props.children,i,r));else if(fe(n)){const c=L(n.props.children).trim(),f=n.props.value!=null?String(n.props.value):c;s.push({disabled:r||!!n.props.disabled,groupLabel:i,hidden:!!n.props.hidden,isPlaceholder:!!(n.props.hidden&&f===""),label:n.props.children,selected:!!n.props.selected,text:c,value:f})}else me(n)&&s.push(...M(n.props.children,n.props.label,r||!!n.props.disabled))}),s}function _e(t){const i=t.trim();if(!i)return null;const s=[.../[*?]/.test(i)?i:`*${i}*`].map(n=>n==="*"?".*":n==="?"?".":n.replace(/[|\\{}()[\]^$+.,]/g,"\\$&")).join("");return new RegExp(`^${s}$`,"i")}function he(t,i){const r=_e(i),s=t.filter(n=>!n.hidden&&!n.isPlaceholder);return r?s.filter(n=>r.test([n.groupLabel,n.text,n.value].filter(Boolean).join(" "))):s}function xe(t,i){return t.find(r=>r.value===i)??t.find(r=>r.isPlaceholder)??t[0]}function be(t,i,r){var s,n;return i!=null?String(i):r!=null?String(r):((s=t.find(c=>c.selected))==null?void 0:s.value)??((n=t[0])==null?void 0:n.value)??""}function ye(t){if(ge(t)){const{children:i,placeholder:r,...s}=t.props;return{children:l.jsxs(l.Fragment,{children:[r&&l.jsx("option",{hidden:!0,value:"",children:r}),i]}),props:s}}return{children:t.props.children,props:t.props}}const je="_combobox_vg3rv_3",we="_dropdown_vg3rv_27",Se="_empty_vg3rv_32",Ne="_group_vg3rv_33",Ce="_placeholder_vg3rv_34",Ee="_filter_vg3rv_42",Ve="_native_vg3rv_53",Le="_option_vg3rv_63",Re="_options_vg3rv_85",$e="_panel_vg3rv_109",Be="_selected_vg3rv_134",Ie="_text_vg3rv_138",qe="_trigger_vg3rv_146",De="_minimal_vg3rv_183",Pe="_inline_vg3rv_238",ke="_label_vg3rv_270",o={combobox:je,"combobox-input":"_combobox-input_vg3rv_12",dropdown:we,empty:Se,group:Ne,placeholder:Ce,filter:Ee,native:Ve,option:Le,options:Re,panel:$e,selected:Be,text:Ie,trigger:qe,minimal:De,inline:Pe,label:ke,"inline-field":"_inline-field_vg3rv_276"};function Y(t,i){return{"--icon-svg":de.iconSVG(t,i)}}const Fe=({children:t,className:i,combobox:r=!1,createOption:s,emptyLabel:n="No matches found",label:c,renderOption:f,searchPlaceholder:R="Filter",selectedItems:Z,variant:_="default",...ee})=>{const $=ye(t),{defaultValue:te,onChange:B,value:I,...ne}=$.props,y=V.sanitizeSelectProps(ne),{className:re,...se}=y,W=a.useRef(null),G=a.useRef(null),j=a.useId(),Q=a.useRef(null),m=a.useRef(null),h=M($.children),x=I!=null,q=be(h,I,te),[D,P]=a.useState(()=>q),[u,p]=a.useState(!1),[w,S]=a.useState(""),N=x?String(I):D,z={default:V.resolveColor("--colors-semantic-content-secondary"),white:V.resolveColor("--color-white","white")},O=_==="minimal"?z.white:z.default,C=xe(h,N),le=Y("CaretDown",O),oe=Y("MagnifyingGlass",O),T=he(h,w),v=w.trim(),E=!!(r&&s&&v&&s.isValid(v)),ie=c&&_==="inline"?X.formatInlineLabel(c):c,A=e=>e?(f==null?void 0:f({groupLabel:e.groupLabel,isSelected:e.value===N,label:e.label,text:e.text,value:e.value}))??e.label:"Select an option";a.useEffect(()=>{!x&&!h.some(e=>e.value===D)&&P(q)},[q,D,x,h]),a.useEffect(()=>{var e;if(!u){S("");return}(e=m.current)==null||e.focus()},[u]),a.useEffect(()=>{if(!u)return;const e=d=>{var g;(g=G.current)!=null&&g.contains(d.target)||p(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[u]);const ae=e=>{x||P(e.target.value),B==null||B(e)},k=()=>{var e;p(!1),r||(e=W.current)==null||e.focus()},K=()=>{var e;S(""),p(!0),(e=m.current)==null||e.focus()},H=()=>{!s||!E||(s.onCreate(v),K())},ce=e=>{var U;x||P(e);const d=Q.current;if(!d){k();return}const g=(U=Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype,"value"))==null?void 0:U.set;g==null||g.call(d,e),d.dispatchEvent(new Event("change",{bubbles:!0})),r?K():k()},ue=e=>{e.key==="Escape"&&k(),e.key==="Enter"&&e.target===m.current&&E&&(e.preventDefault(),H())},J=l.jsxs("div",{className:b.t(o.dropdown,_==="inline"&&o.inline,_==="minimal"&&o.minimal,i),onKeyDown:ue,ref:G,...ee,children:[l.jsx("select",{...se,"aria-hidden":"true",className:b.t(o.native,re),onChange:ae,ref:Q,tabIndex:-1,value:N,children:$.children}),r?l.jsxs("div",{className:o.combobox,onClick:()=>{var e;return(e=m.current)==null?void 0:e.focus()},children:[Z,l.jsx("input",{"aria-autocomplete":"list","aria-expanded":u,"aria-label":y["aria-label"]??c??R,className:o["combobox-input"],disabled:y.disabled,onChange:e=>{S(e.target.value),p(!0)},onClick:()=>p(!0),onFocus:()=>p(!0),placeholder:R||void 0,ref:m,role:"combobox",type:"text",value:w})]}):l.jsx(F.Button,{"aria-expanded":u,"aria-haspopup":"dialog","aria-labelledby":c?`${j} ${j}-value`:void 0,className:b.t(o.trigger,(C==null?void 0:C.isPlaceholder)&&o.placeholder),"data-open":u?"true":void 0,disabled:y.disabled,onClick:()=>p(e=>!e),ref:W,style:le,variant:"tertiary",children:l.jsx("span",{className:o.text,id:`${j}-value`,children:A(C)})}),u&&l.jsxs("div",{className:o.panel,children:[!r&&l.jsx(X.Input,{"aria-label":"Filter",className:o.filter,icon:"MagnifyingGlass",onChange:e=>S(e.target.value),placeholder:R,ref:m,style:oe,type:"search",value:w}),l.jsxs(pe.List,{"aria-label":"Dropdown",className:o.options,children:[T.map(e=>{const d=e.value===N;return l.jsx("li",{"data-component":"dropdown",children:l.jsxs(F.Button,{"aria-label":d?`${e.text}, selected`:e.text,className:b.t(o.option,d&&o.selected),disabled:e.disabled,onClick:()=>ce(e.value),variant:"tertiary",children:[l.jsx("span",{className:o.text,children:A(e)}),e.groupLabel&&l.jsx("small",{className:o.group,children:e.groupLabel})]})},`${e.groupLabel??"root"}-${e.value}`)}),E&&s&&l.jsx("li",{children:l.jsx(F.Button,{"aria-label":L(s.render(v))||v,className:o.option,onClick:H,variant:"tertiary",children:l.jsx("span",{className:o.text,children:s.render(v)})})}),T.length===0&&!E&&l.jsx("li",{className:o.empty,children:n})]})]})]});return c?l.jsxs("div",{className:b.t(o.label,_==="inline"&&o["inline-field"]),"data-component":"dropdown",children:[l.jsx("span",{id:j,children:ie}),J]}):J};exports.Dropdown=Fe;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/dropdown/options.tsx","../../../src/components/dropdown/index.tsx"],"sourcesContent":["import React, { Children, isValidElement } from 'react';\n\nimport { Select, type SelectProps } from '@/components/select';\n\ntype NativeSelectProps = Omit<React.ComponentPropsWithoutRef<'select'>, 'children' | 'multiple'> & {\n children: React.ReactNode;\n multiple?: false;\n};\n\ntype NativeSelectElement = React.ReactElement<NativeSelectProps, 'select'>;\ntype WrappedSelectElement = React.ReactElement<SelectProps, typeof Select>;\n\nexport type DropdownSelectElement = NativeSelectElement | WrappedSelectElement;\n\nexport type DropdownOption = {\n disabled: boolean;\n groupLabel?: string;\n hidden: boolean;\n isPlaceholder: boolean;\n label: React.ReactNode;\n selected: boolean;\n text: string;\n value: string;\n};\n\nexport type DropdownRenderOption = Pick<\n DropdownOption,\n 'groupLabel' | 'label' | 'text' | 'value'\n> & {\n isSelected: boolean;\n};\n\nexport function getNodeText(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getNodeText).join(' ');\n if (isValidElement<{ children?: React.ReactNode }>(node)) return getNodeText(node.props.children);\n return '';\n}\n\nfunction isOptionElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'option'>, 'option'> {\n return isValidElement(node) && node.type === 'option';\n}\n\nfunction isOptGroupElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'optgroup'>, 'optgroup'> {\n return isValidElement(node) && node.type === 'optgroup';\n}\n\nfunction isFragmentElement(\n node: React.ReactNode\n): node is React.ReactElement<{ children?: React.ReactNode }, typeof React.Fragment> {\n return isValidElement(node) && node.type === React.Fragment;\n}\n\nfunction isWrappedSelectElement(node: React.ReactNode): node is WrappedSelectElement {\n return isValidElement(node) && node.type === Select;\n}\n\nexport function extractOptions(\n children: React.ReactNode,\n groupLabel?: string,\n groupDisabled = false\n): DropdownOption[] {\n const options: DropdownOption[] = [];\n\n Children.forEach(children, (child) => {\n if (isFragmentElement(child)) {\n options.push(...extractOptions(child.props.children, groupLabel, groupDisabled));\n } else if (isOptionElement(child)) {\n const text = getNodeText(child.props.children).trim();\n const value = child.props.value != null ? String(child.props.value) : text;\n options.push({\n disabled: groupDisabled || Boolean(child.props.disabled),\n groupLabel,\n hidden: Boolean(child.props.hidden),\n isPlaceholder: Boolean(child.props.hidden && value === ''),\n label: child.props.children,\n selected: Boolean(child.props.selected),\n text,\n value,\n });\n } else if (isOptGroupElement(child)) {\n options.push(\n ...extractOptions(\n child.props.children,\n child.props.label,\n groupDisabled || Boolean(child.props.disabled)\n )\n );\n }\n });\n\n return options;\n}\n\nfunction buildWildcardMatcher(query: string) {\n const trimmedQuery = query.trim();\n if (!trimmedQuery) return null;\n\n const wildcardQuery = /[*?]/.test(trimmedQuery) ? trimmedQuery : `*${trimmedQuery}*`;\n const expression = [...wildcardQuery]\n .map((character) => {\n if (character === '*') return '.*';\n if (character === '?') return '.';\n return character.replace(/[|\\\\{}()[\\]^$+.,]/g, '\\\\$&');\n })\n .join('');\n\n return new RegExp(`^${expression}$`, 'i');\n}\n\nexport function filterOptions(options: DropdownOption[], query: string) {\n const matcher = buildWildcardMatcher(query);\n const selectableOptions = options.filter((option) => !option.hidden && !option.isPlaceholder);\n return matcher\n ? selectableOptions.filter((option) =>\n matcher.test([option.groupLabel, option.text, option.value].filter(Boolean).join(' '))\n )\n : selectableOptions;\n}\n\nexport function getDisplayOption(options: DropdownOption[], selectedValue: string) {\n return (\n options.find((option) => option.value === selectedValue) ??\n options.find((option) => option.isPlaceholder) ??\n options[0]\n );\n}\n\nexport function getInitialValue(\n options: DropdownOption[],\n value?: NativeSelectProps['value'],\n defaultValue?: NativeSelectProps['defaultValue']\n) {\n if (value != null) return String(value);\n if (defaultValue != null) return String(defaultValue);\n return options.find((option) => option.selected)?.value ?? options[0]?.value ?? '';\n}\n\nexport function normalizeSelectElement(selectElement: DropdownSelectElement) {\n if (isWrappedSelectElement(selectElement)) {\n const { children, placeholder, ...props } = selectElement.props;\n return {\n children: (\n <>\n {placeholder && (\n <option\n hidden\n value=''\n >\n {placeholder}\n </option>\n )}\n {children}\n </>\n ),\n props,\n };\n }\n\n return { children: selectElement.props.children, props: selectElement.props };\n}\n","import cx from 'classix';\nimport React, { useEffect, useId, useRef, useState } from 'react';\n\nimport { Button } from '@/components/button';\nimport { type IconName, iconSVG } from '@/components/icon/icons';\nimport { Input } from '@/components/input';\nimport { List } from '@/components/list';\nimport { sanitizeSelectProps } from '@/components/select/sanitize-select-props';\nimport { resolveColor } from '@/utils/color';\nimport { formatInlineLabel } from '@/utils/text';\n\nimport {\n type DropdownOption,\n type DropdownRenderOption,\n type DropdownSelectElement,\n extractOptions,\n filterOptions,\n getDisplayOption,\n getInitialValue,\n getNodeText,\n normalizeSelectElement,\n} from './options';\nimport styles from './styles.module.css';\n\nexport type { DropdownRenderOption } from './options';\n\nexport type DropdownCreateOption = {\n isValid: (value: string) => boolean;\n onCreate: (value: string) => void;\n render: (value: string) => React.ReactNode;\n};\n\nexport type DropdownProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> & {\n children: DropdownSelectElement;\n combobox?: boolean;\n createOption?: DropdownCreateOption;\n emptyLabel?: string;\n label?: string;\n renderOption?: (option: DropdownRenderOption) => React.ReactNode;\n searchPlaceholder?: string;\n selectedItems?: React.ReactNode;\n variant?: 'default' | 'inline' | 'minimal';\n};\n\ntype withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n};\n\nfunction getIconWithVars(icon: IconName, color: string): withVars {\n return {\n '--icon-svg': iconSVG(icon).replace('currentColor', color),\n };\n}\n\nexport const Dropdown = ({\n children: selectElement,\n className,\n combobox = false,\n createOption,\n emptyLabel = 'No matches found',\n label,\n renderOption,\n searchPlaceholder = 'Filter',\n selectedItems,\n variant = 'default',\n ...props\n}: DropdownProps) => {\n const normalizedSelect = normalizeSelectElement(selectElement);\n const { defaultValue, onChange, value, ...restSelectProps } = normalizedSelect.props;\n const selectProps = sanitizeSelectProps(restSelectProps);\n const { className: selectClassName, ...nativeSelectProps } = selectProps;\n const buttonRef = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n const nativeSelectRef = useRef<HTMLSelectElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const options = extractOptions(normalizedSelect.children);\n const isControlled = value != null;\n const initialValue = getInitialValue(options, value, defaultValue);\n const [internalValue, setInternalValue] = useState(() => initialValue);\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const selectedValue = isControlled ? String(value) : internalValue;\n const iconColors = {\n default: resolveColor('--colors-semantic-content-secondary'),\n white: resolveColor('--color-white', 'white'),\n };\n const dropdownIconColor = variant === 'minimal' ? iconColors.white : iconColors.default;\n const displayOption = getDisplayOption(options, selectedValue);\n const triggerWithVars = getIconWithVars('chevron', dropdownIconColor);\n const filterWithVars = getIconWithVars('search', dropdownIconColor);\n const filteredOptions = filterOptions(options, query);\n const customValue = query.trim();\n const canCreateOption = Boolean(\n combobox && createOption && customValue && createOption.isValid(customValue)\n );\n const displayLabel = label && variant === 'inline' ? formatInlineLabel(label) : label;\n const renderDropdownOption = (option: DropdownOption | undefined) => {\n if (!option) return 'Select an option';\n\n return (\n renderOption?.({\n groupLabel: option.groupLabel,\n isSelected: option.value === selectedValue,\n label: option.label,\n text: option.text,\n value: option.value,\n }) ?? option.label\n );\n };\n\n useEffect(() => {\n if (!isControlled && !options.some((option) => option.value === internalValue)) {\n setInternalValue(initialValue);\n }\n }, [initialValue, internalValue, isControlled, options]);\n\n useEffect(() => {\n if (!isOpen) {\n setQuery('');\n return;\n }\n\n searchRef.current?.focus();\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n };\n }, [isOpen]);\n\n const handleNativeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n\n onChange?.(event);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n if (!combobox) {\n buttonRef.current?.focus();\n }\n };\n\n const continueComboboxSelection = () => {\n setQuery('');\n setIsOpen(true);\n searchRef.current?.focus();\n };\n\n const commitCustomValue = () => {\n if (!createOption || !canCreateOption) return;\n\n createOption.onCreate(customValue);\n continueComboboxSelection();\n };\n\n const commitValue = (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n\n const nativeSelect = nativeSelectRef.current;\n\n if (!nativeSelect) {\n closeMenu();\n return;\n }\n\n const valueSetter = Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype, 'value')?.set;\n\n valueSetter?.call(nativeSelect, nextValue);\n nativeSelect.dispatchEvent(new Event('change', { bubbles: true }));\n if (combobox) {\n continueComboboxSelection();\n } else {\n closeMenu();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n closeMenu();\n }\n\n if (event.key === 'Enter' && event.target === searchRef.current && canCreateOption) {\n event.preventDefault();\n commitCustomValue();\n }\n };\n\n const dropdown = (\n <div\n className={cx(\n styles.dropdown,\n variant === 'inline' && styles.inline,\n variant === 'minimal' && styles.minimal,\n className\n )}\n onKeyDown={handleKeyDown}\n ref={containerRef}\n {...props}\n >\n <select\n {...nativeSelectProps}\n aria-hidden='true'\n className={cx(styles.native, selectClassName)}\n onChange={handleNativeChange}\n ref={nativeSelectRef}\n tabIndex={-1}\n value={selectedValue}\n >\n {normalizedSelect.children}\n </select>\n {combobox ? (\n <div\n className={styles.combobox}\n onClick={() => searchRef.current?.focus()}\n >\n {selectedItems}\n <input\n aria-autocomplete='list'\n aria-expanded={isOpen}\n aria-label={selectProps['aria-label'] ?? label ?? searchPlaceholder}\n className={styles['combobox-input']}\n disabled={selectProps.disabled}\n onChange={(event) => {\n setQuery(event.target.value);\n setIsOpen(true);\n }}\n onClick={() => setIsOpen(true)}\n onFocus={() => setIsOpen(true)}\n placeholder={searchPlaceholder || undefined}\n ref={searchRef}\n role='combobox'\n type='text'\n value={query}\n />\n </div>\n ) : (\n <Button\n aria-expanded={isOpen}\n aria-haspopup='dialog'\n aria-labelledby={label ? `${labelId} ${labelId}-value` : undefined}\n className={cx(styles.trigger, displayOption?.isPlaceholder && styles.placeholder)}\n data-open={isOpen ? 'true' : undefined}\n disabled={selectProps.disabled}\n onClick={() => setIsOpen((currentValue) => !currentValue)}\n ref={buttonRef}\n style={triggerWithVars}\n variant='tertiary'\n >\n <span\n className={styles.text}\n id={`${labelId}-value`}\n >\n {renderDropdownOption(displayOption)}\n </span>\n </Button>\n )}\n {isOpen && (\n <div className={styles.panel}>\n {!combobox && (\n <Input\n aria-label='Filter'\n className={styles.filter}\n icon='search'\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n ref={searchRef}\n style={filterWithVars}\n type='search'\n value={query}\n />\n )}\n <List\n aria-label='Dropdown'\n className={styles.options}\n >\n {filteredOptions.map((option) => {\n const isSelected = option.value === selectedValue;\n\n return (\n <li key={`${option.groupLabel ?? 'root'}-${option.value}`}>\n <Button\n aria-label={isSelected ? `${option.text}, selected` : option.text}\n className={cx(styles.option, isSelected && styles.selected)}\n disabled={option.disabled}\n onClick={() => commitValue(option.value)}\n variant='tertiary'\n >\n <span className={styles.text}>{renderDropdownOption(option)}</span>\n {option.groupLabel && (\n <small className={styles.group}>{option.groupLabel}</small>\n )}\n </Button>\n </li>\n );\n })}\n {canCreateOption && createOption && (\n <li>\n <Button\n aria-label={getNodeText(createOption.render(customValue)) || customValue}\n className={styles.option}\n onClick={commitCustomValue}\n variant='tertiary'\n >\n <span className={styles.text}>{createOption.render(customValue)}</span>\n </Button>\n </li>\n )}\n {filteredOptions.length === 0 && !canCreateOption && (\n <li className={styles.empty}>{emptyLabel}</li>\n )}\n </List>\n </div>\n )}\n </div>\n );\n\n return label ? (\n <div className={cx(styles.label, variant === 'inline' && styles['inline-field'])}>\n <span id={labelId}>{displayLabel}</span>\n {dropdown}\n </div>\n ) : (\n dropdown\n );\n};\n"],"names":["getNodeText","node","String","Array","isArray","map","join","isValidElement","props","children","isOptionElement","type","isOptGroupElement","isFragmentElement","React","Fragment","isWrappedSelectElement","Select","extractOptions","groupLabel","groupDisabled","options","Children","forEach","child","push","text","trim","value","disabled","Boolean","hidden","isPlaceholder","label","selected","buildWildcardMatcher","query","trimmedQuery","expression","test","character","replace","RegExp","filterOptions","matcher","selectableOptions","filter","option","getDisplayOption","selectedValue","find","getInitialValue","defaultValue","normalizeSelectElement","selectElement","placeholder","jsxs","getIconWithVars","icon","color","iconSVG","Dropdown","className","combobox","createOption","emptyLabel","renderOption","searchPlaceholder","selectedItems","variant","normalizedSelect","onChange","restSelectProps","selectProps","sanitizeSelectProps","selectClassName","nativeSelectProps","buttonRef","useRef","containerRef","labelId","useId","nativeSelectRef","searchRef","isControlled","initialValue","internalValue","setInternalValue","useState","isOpen","setIsOpen","setQuery","iconColors","default","resolveColor","white","dropdownIconColor","displayOption","triggerWithVars","filterWithVars","filteredOptions","customValue","canCreateOption","isValid","displayLabel","formatInlineLabel","renderDropdownOption","isSelected","useEffect","some","current","focus","handlePointerDown","event","contains","target","document","addEventListener","removeEventListener","handleNativeChange","closeMenu","continueComboboxSelection","commitCustomValue","onCreate","commitValue","nextValue","nativeSelect","valueSetter","Object","getOwnPropertyDescriptor","HTMLSelectElement","prototype","set","call","dispatchEvent","Event","bubbles","handleKeyDown","key","preventDefault","dropdown","cx","styles","inline","minimal","jsx","native","undefined","Button","trigger","currentValue","panel","Input","List","group","render","length","empty"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/dropdown/options.tsx","../../../src/components/dropdown/index.tsx"],"sourcesContent":["import React, { Children, isValidElement } from 'react';\n\nimport { Select, type SelectProps } from '@/components/select';\n\ntype NativeSelectProps = Omit<React.ComponentPropsWithoutRef<'select'>, 'children' | 'multiple'> & {\n children: React.ReactNode;\n multiple?: false;\n};\n\ntype NativeSelectElement = React.ReactElement<NativeSelectProps, 'select'>;\ntype WrappedSelectElement = React.ReactElement<SelectProps, typeof Select>;\n\nexport type DropdownSelectElement = NativeSelectElement | WrappedSelectElement;\n\nexport type DropdownOption = {\n disabled: boolean;\n groupLabel?: string;\n hidden: boolean;\n isPlaceholder: boolean;\n label: React.ReactNode;\n selected: boolean;\n text: string;\n value: string;\n};\n\nexport type DropdownRenderOption = Pick<\n DropdownOption,\n 'groupLabel' | 'label' | 'text' | 'value'\n> & {\n isSelected: boolean;\n};\n\nexport function getNodeText(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getNodeText).join(' ');\n if (isValidElement<{ children?: React.ReactNode }>(node)) return getNodeText(node.props.children);\n return '';\n}\n\nfunction isOptionElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'option'>, 'option'> {\n return isValidElement(node) && node.type === 'option';\n}\n\nfunction isOptGroupElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'optgroup'>, 'optgroup'> {\n return isValidElement(node) && node.type === 'optgroup';\n}\n\nfunction isFragmentElement(\n node: React.ReactNode\n): node is React.ReactElement<{ children?: React.ReactNode }, typeof React.Fragment> {\n return isValidElement(node) && node.type === React.Fragment;\n}\n\nfunction isWrappedSelectElement(node: React.ReactNode): node is WrappedSelectElement {\n return isValidElement(node) && node.type === Select;\n}\n\nexport function extractOptions(\n children: React.ReactNode,\n groupLabel?: string,\n groupDisabled = false\n): DropdownOption[] {\n const options: DropdownOption[] = [];\n\n Children.forEach(children, (child) => {\n if (isFragmentElement(child)) {\n options.push(...extractOptions(child.props.children, groupLabel, groupDisabled));\n } else if (isOptionElement(child)) {\n const text = getNodeText(child.props.children).trim();\n const value = child.props.value != null ? String(child.props.value) : text;\n options.push({\n disabled: groupDisabled || Boolean(child.props.disabled),\n groupLabel,\n hidden: Boolean(child.props.hidden),\n isPlaceholder: Boolean(child.props.hidden && value === ''),\n label: child.props.children,\n selected: Boolean(child.props.selected),\n text,\n value,\n });\n } else if (isOptGroupElement(child)) {\n options.push(\n ...extractOptions(\n child.props.children,\n child.props.label,\n groupDisabled || Boolean(child.props.disabled)\n )\n );\n }\n });\n\n return options;\n}\n\nfunction buildWildcardMatcher(query: string) {\n const trimmedQuery = query.trim();\n if (!trimmedQuery) return null;\n\n const wildcardQuery = /[*?]/.test(trimmedQuery) ? trimmedQuery : `*${trimmedQuery}*`;\n const expression = [...wildcardQuery]\n .map((character) => {\n if (character === '*') return '.*';\n if (character === '?') return '.';\n return character.replace(/[|\\\\{}()[\\]^$+.,]/g, '\\\\$&');\n })\n .join('');\n\n return new RegExp(`^${expression}$`, 'i');\n}\n\nexport function filterOptions(options: DropdownOption[], query: string) {\n const matcher = buildWildcardMatcher(query);\n const selectableOptions = options.filter((option) => !option.hidden && !option.isPlaceholder);\n return matcher\n ? selectableOptions.filter((option) =>\n matcher.test([option.groupLabel, option.text, option.value].filter(Boolean).join(' '))\n )\n : selectableOptions;\n}\n\nexport function getDisplayOption(options: DropdownOption[], selectedValue: string) {\n return (\n options.find((option) => option.value === selectedValue) ??\n options.find((option) => option.isPlaceholder) ??\n options[0]\n );\n}\n\nexport function getInitialValue(\n options: DropdownOption[],\n value?: NativeSelectProps['value'],\n defaultValue?: NativeSelectProps['defaultValue']\n) {\n if (value != null) return String(value);\n if (defaultValue != null) return String(defaultValue);\n return options.find((option) => option.selected)?.value ?? options[0]?.value ?? '';\n}\n\nexport function normalizeSelectElement(selectElement: DropdownSelectElement) {\n if (isWrappedSelectElement(selectElement)) {\n const { children, placeholder, ...props } = selectElement.props;\n return {\n children: (\n <>\n {placeholder && (\n <option\n hidden\n value=''\n >\n {placeholder}\n </option>\n )}\n {children}\n </>\n ),\n props,\n };\n }\n\n return { children: selectElement.props.children, props: selectElement.props };\n}\n","import cx from 'classix';\nimport React, { useEffect, useId, useRef, useState } from 'react';\n\nimport { Button } from '@/components/button';\nimport { type IconName, iconSVG } from '@/components/icon/icons';\nimport { Input } from '@/components/input';\nimport { List } from '@/components/list';\nimport { sanitizeSelectProps } from '@/components/select/sanitize-select-props';\nimport { resolveColor } from '@/utils/color';\nimport { formatInlineLabel } from '@/utils/text';\n\nimport {\n type DropdownOption,\n type DropdownRenderOption,\n type DropdownSelectElement,\n extractOptions,\n filterOptions,\n getDisplayOption,\n getInitialValue,\n getNodeText,\n normalizeSelectElement,\n} from './options';\nimport styles from './styles.module.css';\n\nexport type { DropdownRenderOption } from './options';\n\nexport type DropdownCreateOption = {\n isValid: (value: string) => boolean;\n onCreate: (value: string) => void;\n render: (value: string) => React.ReactNode;\n};\n\nexport type DropdownProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> & {\n children: DropdownSelectElement;\n combobox?: boolean;\n createOption?: DropdownCreateOption;\n emptyLabel?: string;\n label?: string;\n renderOption?: (option: DropdownRenderOption) => React.ReactNode;\n searchPlaceholder?: string;\n selectedItems?: React.ReactNode;\n variant?: 'default' | 'inline' | 'minimal';\n};\n\ntype withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n};\n\nfunction getIconWithVars(icon: IconName, color: string): withVars {\n return {\n '--icon-svg': iconSVG(icon, color),\n };\n}\n\nexport const Dropdown = ({\n children: selectElement,\n className,\n combobox = false,\n createOption,\n emptyLabel = 'No matches found',\n label,\n renderOption,\n searchPlaceholder = 'Filter',\n selectedItems,\n variant = 'default',\n ...props\n}: DropdownProps) => {\n const normalizedSelect = normalizeSelectElement(selectElement);\n const { defaultValue, onChange, value, ...restSelectProps } = normalizedSelect.props;\n const selectProps = sanitizeSelectProps(restSelectProps);\n const { className: selectClassName, ...nativeSelectProps } = selectProps;\n const buttonRef = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n const nativeSelectRef = useRef<HTMLSelectElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const options = extractOptions(normalizedSelect.children);\n const isControlled = value != null;\n const initialValue = getInitialValue(options, value, defaultValue);\n const [internalValue, setInternalValue] = useState(() => initialValue);\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const selectedValue = isControlled ? String(value) : internalValue;\n const iconColors = {\n default: resolveColor('--colors-semantic-content-secondary'),\n white: resolveColor('--color-white', 'white'),\n };\n const dropdownIconColor = variant === 'minimal' ? iconColors.white : iconColors.default;\n const displayOption = getDisplayOption(options, selectedValue);\n const triggerWithVars = getIconWithVars('CaretDown', dropdownIconColor);\n const filterWithVars = getIconWithVars('MagnifyingGlass', dropdownIconColor);\n const filteredOptions = filterOptions(options, query);\n const customValue = query.trim();\n const canCreateOption = Boolean(\n combobox && createOption && customValue && createOption.isValid(customValue)\n );\n const displayLabel = label && variant === 'inline' ? formatInlineLabel(label) : label;\n const renderDropdownOption = (option: DropdownOption | undefined) => {\n if (!option) return 'Select an option';\n\n return (\n renderOption?.({\n groupLabel: option.groupLabel,\n isSelected: option.value === selectedValue,\n label: option.label,\n text: option.text,\n value: option.value,\n }) ?? option.label\n );\n };\n\n useEffect(() => {\n if (!isControlled && !options.some((option) => option.value === internalValue)) {\n setInternalValue(initialValue);\n }\n }, [initialValue, internalValue, isControlled, options]);\n\n useEffect(() => {\n if (!isOpen) {\n setQuery('');\n return;\n }\n\n searchRef.current?.focus();\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n };\n }, [isOpen]);\n\n const handleNativeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n\n onChange?.(event);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n if (!combobox) {\n buttonRef.current?.focus();\n }\n };\n\n const continueComboboxSelection = () => {\n setQuery('');\n setIsOpen(true);\n searchRef.current?.focus();\n };\n\n const commitCustomValue = () => {\n if (!createOption || !canCreateOption) return;\n\n createOption.onCreate(customValue);\n continueComboboxSelection();\n };\n\n const commitValue = (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n\n const nativeSelect = nativeSelectRef.current;\n\n if (!nativeSelect) {\n closeMenu();\n return;\n }\n\n const valueSetter = Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype, 'value')?.set;\n\n valueSetter?.call(nativeSelect, nextValue);\n nativeSelect.dispatchEvent(new Event('change', { bubbles: true }));\n if (combobox) {\n continueComboboxSelection();\n } else {\n closeMenu();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n closeMenu();\n }\n\n if (event.key === 'Enter' && event.target === searchRef.current && canCreateOption) {\n event.preventDefault();\n commitCustomValue();\n }\n };\n\n const dropdown = (\n <div\n className={cx(\n styles.dropdown,\n variant === 'inline' && styles.inline,\n variant === 'minimal' && styles.minimal,\n className\n )}\n onKeyDown={handleKeyDown}\n ref={containerRef}\n {...props}\n >\n <select\n {...nativeSelectProps}\n aria-hidden='true'\n className={cx(styles.native, selectClassName)}\n onChange={handleNativeChange}\n ref={nativeSelectRef}\n tabIndex={-1}\n value={selectedValue}\n >\n {normalizedSelect.children}\n </select>\n {combobox ? (\n <div\n className={styles.combobox}\n onClick={() => searchRef.current?.focus()}\n >\n {selectedItems}\n <input\n aria-autocomplete='list'\n aria-expanded={isOpen}\n aria-label={selectProps['aria-label'] ?? label ?? searchPlaceholder}\n className={styles['combobox-input']}\n disabled={selectProps.disabled}\n onChange={(event) => {\n setQuery(event.target.value);\n setIsOpen(true);\n }}\n onClick={() => setIsOpen(true)}\n onFocus={() => setIsOpen(true)}\n placeholder={searchPlaceholder || undefined}\n ref={searchRef}\n role='combobox'\n type='text'\n value={query}\n />\n </div>\n ) : (\n <Button\n aria-expanded={isOpen}\n aria-haspopup='dialog'\n aria-labelledby={label ? `${labelId} ${labelId}-value` : undefined}\n className={cx(styles.trigger, displayOption?.isPlaceholder && styles.placeholder)}\n data-open={isOpen ? 'true' : undefined}\n disabled={selectProps.disabled}\n onClick={() => setIsOpen((currentValue) => !currentValue)}\n ref={buttonRef}\n style={triggerWithVars}\n variant='tertiary'\n >\n <span\n className={styles.text}\n id={`${labelId}-value`}\n >\n {renderDropdownOption(displayOption)}\n </span>\n </Button>\n )}\n {isOpen && (\n <div className={styles.panel}>\n {!combobox && (\n <Input\n aria-label='Filter'\n className={styles.filter}\n icon='MagnifyingGlass'\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n ref={searchRef}\n style={filterWithVars}\n type='search'\n value={query}\n />\n )}\n <List\n aria-label='Dropdown'\n className={styles.options}\n >\n {filteredOptions.map((option) => {\n const isSelected = option.value === selectedValue;\n\n return (\n <li key={`${option.groupLabel ?? 'root'}-${option.value}`}>\n <Button\n aria-label={isSelected ? `${option.text}, selected` : option.text}\n className={cx(styles.option, isSelected && styles.selected)}\n disabled={option.disabled}\n onClick={() => commitValue(option.value)}\n variant='tertiary'\n >\n <span className={styles.text}>{renderDropdownOption(option)}</span>\n {option.groupLabel && (\n <small className={styles.group}>{option.groupLabel}</small>\n )}\n </Button>\n </li>\n );\n })}\n {canCreateOption && createOption && (\n <li>\n <Button\n aria-label={getNodeText(createOption.render(customValue)) || customValue}\n className={styles.option}\n onClick={commitCustomValue}\n variant='tertiary'\n >\n <span className={styles.text}>{createOption.render(customValue)}</span>\n </Button>\n </li>\n )}\n {filteredOptions.length === 0 && !canCreateOption && (\n <li className={styles.empty}>{emptyLabel}</li>\n )}\n </List>\n </div>\n )}\n </div>\n );\n\n return label ? (\n <div className={cx(styles.label, variant === 'inline' && styles['inline-field'])}>\n <span id={labelId}>{displayLabel}</span>\n {dropdown}\n </div>\n ) : (\n dropdown\n );\n};\n"],"names":["getNodeText","node","String","Array","isArray","map","join","isValidElement","props","children","isOptionElement","type","isOptGroupElement","isFragmentElement","React","Fragment","isWrappedSelectElement","Select","extractOptions","groupLabel","groupDisabled","options","Children","forEach","child","push","text","trim","value","disabled","Boolean","hidden","isPlaceholder","label","selected","buildWildcardMatcher","query","trimmedQuery","expression","test","character","replace","RegExp","filterOptions","matcher","selectableOptions","filter","option","getDisplayOption","selectedValue","find","getInitialValue","defaultValue","normalizeSelectElement","selectElement","placeholder","jsxs","getIconWithVars","icon","color","iconSVG","Dropdown","className","combobox","createOption","emptyLabel","renderOption","searchPlaceholder","selectedItems","variant","normalizedSelect","onChange","restSelectProps","selectProps","sanitizeSelectProps","selectClassName","nativeSelectProps","buttonRef","useRef","containerRef","labelId","useId","nativeSelectRef","searchRef","isControlled","initialValue","internalValue","setInternalValue","useState","isOpen","setIsOpen","setQuery","iconColors","default","resolveColor","white","dropdownIconColor","displayOption","triggerWithVars","filterWithVars","filteredOptions","customValue","canCreateOption","isValid","displayLabel","formatInlineLabel","renderDropdownOption","isSelected","useEffect","some","current","focus","handlePointerDown","event","contains","target","document","addEventListener","removeEventListener","handleNativeChange","closeMenu","continueComboboxSelection","commitCustomValue","onCreate","commitValue","nextValue","nativeSelect","valueSetter","Object","getOwnPropertyDescriptor","HTMLSelectElement","prototype","set","call","dispatchEvent","Event","bubbles","handleKeyDown","key","preventDefault","dropdown","cx","styles","inline","minimal","jsx","native","undefined","Button","trigger","currentValue","panel","Input","List","group","render","length","empty"],"mappings":"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"}