@ewjdev/anyclick-react 0.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/FeedbackProvider.tsx","../src/context.ts","../src/ContextMenu.tsx","../src/styles.ts","../src/highlight.ts","../src/ScreenshotPreview.tsx","../../../node_modules/shared/src/utils.ts","../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../node_modules/lucide-react/src/Icon.ts","../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../node_modules/lucide-react/src/icons/camera.ts","../../../node_modules/lucide-react/src/icons/check.ts","../../../node_modules/lucide-react/src/icons/chevron-left.ts","../../../node_modules/lucide-react/src/icons/chevron-right.ts","../../../node_modules/lucide-react/src/icons/expand.ts","../../../node_modules/lucide-react/src/icons/flag.ts","../../../node_modules/lucide-react/src/icons/image.ts","../../../node_modules/lucide-react/src/icons/loader-circle.ts","../../../node_modules/lucide-react/src/icons/plus.ts","../../../node_modules/lucide-react/src/icons/refresh-cw.ts","../../../node_modules/lucide-react/src/icons/shrink.ts","../../../node_modules/lucide-react/src/icons/thumbs-up.ts","../../../node_modules/lucide-react/src/icons/x.ts","../src/types.ts"],"sourcesContent":["// Components\n\"use client\";\n\nexport { FeedbackProvider } from \"./FeedbackProvider\";\nexport { ContextMenu } from \"./ContextMenu\";\nexport { ScreenshotPreview } from \"./ScreenshotPreview\";\n\n// Context and hooks\nexport { FeedbackContext, useFeedback } from \"./context\";\n\n// Types\nexport type {\n FeedbackMenuItem,\n FeedbackProviderProps,\n FeedbackContextValue,\n ContextMenuProps,\n HighlightColors,\n HighlightConfig,\n FeedbackUserContext,\n ScreenshotPreviewProps,\n} from \"./types\";\n\n// Utilities\nexport { filterMenuItemsByRole } from \"./types\";\n\n// Re-export core types for convenience\nexport type {\n FeedbackType,\n FeedbackPayload,\n FeedbackAdapter,\n ElementContext,\n PageContext,\n ScreenshotData,\n ScreenshotCapture,\n ScreenshotConfig,\n ScreenshotCaptureMode,\n} from \"@ewjdev/anyclick-core\";\n\n// Re-export screenshot utilities from core\nexport {\n captureAllScreenshots,\n captureScreenshot,\n isScreenshotSupported,\n formatBytes,\n estimateTotalSize,\n DEFAULT_SCREENSHOT_CONFIG,\n DEFAULT_SENSITIVE_SELECTORS,\n} from \"@ewjdev/anyclick-core\";\n\n// Styles (for customization)\nexport { menuStyles, darkMenuStyles } from \"./styles\";\n\n// Highlight utilities (for customization)\nexport {\n findContainerParent,\n highlightTarget,\n highlightContainer,\n clearHighlights,\n applyHighlights,\n defaultHighlightColors,\n defaultContainerSelectors,\n} from \"./highlight\";\n","\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createFeedbackClient } from \"@ewjdev/anyclick-core\";\nimport type {\n FeedbackClient,\n FeedbackType,\n ScreenshotData,\n} from \"@ewjdev/anyclick-core\";\nimport { FeedbackContext } from \"./context\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { findContainerParent } from \"./highlight\";\nimport type {\n FeedbackContextValue,\n FeedbackMenuItem,\n FeedbackProviderProps,\n} from \"./types\";\n\n/**\n * Default menu items\n */\nconst defaultMenuItems: FeedbackMenuItem[] = [\n { type: \"issue\", label: \"Report an issue\", showComment: true },\n { type: \"feature\", label: \"Request a feature\", showComment: true },\n { type: \"like\", label: \"I like this!\", showComment: false },\n];\n\n/**\n * FeedbackProvider component - wraps your app to enable feedback capture\n */\nexport function FeedbackProvider({\n adapter,\n children,\n targetFilter,\n menuItems = defaultMenuItems,\n maxInnerTextLength,\n maxOuterHTMLLength,\n maxAncestors,\n cooldownMs,\n stripAttributes,\n metadata,\n onSubmitSuccess,\n onSubmitError,\n menuStyle,\n menuClassName,\n disabled = false,\n highlightConfig,\n screenshotConfig,\n}: FeedbackProviderProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [menuVisible, setMenuVisible] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });\n const [targetElement, setTargetElement] = useState<Element | null>(null);\n const [containerElement, setContainerElement] = useState<Element | null>(\n null,\n );\n\n const clientRef = useRef<FeedbackClient | null>(null);\n\n // Create/update the feedback client\n useEffect(() => {\n const client = createFeedbackClient({\n adapter,\n targetFilter,\n maxInnerTextLength,\n maxOuterHTMLLength,\n maxAncestors,\n cooldownMs,\n stripAttributes,\n });\n\n // Set up callbacks\n client.onSubmitSuccess = onSubmitSuccess;\n client.onSubmitError = onSubmitError;\n\n // Set up context menu handler\n client.onContextMenu = (event, element) => {\n setTargetElement(element);\n // Find container element for screenshot capture\n const container = findContainerParent(element, highlightConfig);\n setContainerElement(container);\n setMenuPosition({ x: event.clientX, y: event.clientY });\n setMenuVisible(true);\n };\n\n clientRef.current = client;\n\n // Attach event listeners if not disabled\n if (!disabled) {\n client.attach();\n }\n\n return () => {\n client.detach();\n };\n }, [\n adapter,\n targetFilter,\n maxInnerTextLength,\n maxOuterHTMLLength,\n maxAncestors,\n cooldownMs,\n stripAttributes,\n onSubmitSuccess,\n onSubmitError,\n disabled,\n highlightConfig,\n ]);\n\n // Submit feedback with optional screenshots\n const submitFeedback = useCallback(\n async (\n element: Element,\n type: FeedbackType,\n comment?: string,\n screenshots?: ScreenshotData,\n ) => {\n const client = clientRef.current;\n if (!client) return;\n\n setIsSubmitting(true);\n try {\n await client.submitFeedback(element, type, {\n comment,\n metadata,\n screenshots,\n });\n } finally {\n setIsSubmitting(false);\n setMenuVisible(false);\n setTargetElement(null);\n setContainerElement(null);\n }\n },\n [metadata],\n );\n\n // Open menu programmatically\n const openMenu = useCallback(\n (element: Element, position: { x: number; y: number }) => {\n setTargetElement(element);\n const container = findContainerParent(element, highlightConfig);\n setContainerElement(container);\n setMenuPosition(position);\n setMenuVisible(true);\n },\n [highlightConfig],\n );\n\n // Close menu\n const closeMenu = useCallback(() => {\n setMenuVisible(false);\n setTargetElement(null);\n setContainerElement(null);\n }, []);\n\n // Handle menu selection\n const handleMenuSelect = useCallback(\n (type: FeedbackType, comment?: string, screenshots?: ScreenshotData) => {\n if (targetElement) {\n submitFeedback(targetElement, type, comment, screenshots);\n }\n },\n [targetElement, submitFeedback],\n );\n\n // Context value\n const contextValue: FeedbackContextValue = useMemo(\n () => ({\n isEnabled: !disabled,\n isSubmitting,\n submitFeedback,\n openMenu,\n closeMenu,\n }),\n [disabled, isSubmitting, submitFeedback, openMenu, closeMenu],\n );\n\n return (\n <FeedbackContext.Provider value={contextValue}>\n {children}\n <ContextMenu\n visible={menuVisible && !disabled}\n position={menuPosition}\n targetElement={targetElement}\n containerElement={containerElement}\n items={menuItems}\n onSelect={handleMenuSelect}\n onClose={closeMenu}\n isSubmitting={isSubmitting}\n style={menuStyle}\n className={menuClassName}\n highlightConfig={highlightConfig}\n screenshotConfig={screenshotConfig}\n />\n </FeedbackContext.Provider>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { FeedbackContextValue } from \"./types\";\n\n/**\n * React context for feedback functionality\n */\nexport const FeedbackContext = createContext<FeedbackContextValue | null>(null);\n\n/**\n * Hook to access feedback context\n * @throws Error if used outside of FeedbackProvider\n */\nexport function useFeedback(): FeedbackContextValue {\n const context = useContext(FeedbackContext);\n if (!context) {\n throw new Error(\"useFeedback must be used within a FeedbackProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport type { ContextMenuProps, FeedbackMenuItem } from \"./types\";\nimport type { FeedbackType, ScreenshotData } from \"@ewjdev/anyclick-core\";\nimport {\n captureAllScreenshots,\n isScreenshotSupported,\n DEFAULT_SCREENSHOT_CONFIG,\n} from \"@ewjdev/anyclick-core\";\nimport { menuStyles } from \"./styles\";\nimport { applyHighlights, clearHighlights } from \"./highlight\";\nimport { ScreenshotPreview } from \"./ScreenshotPreview\";\nimport {\n FlagIcon,\n PlusIcon,\n ThumbsUpIcon,\n ChevronRightIcon,\n ChevronLeftIcon,\n CameraIcon,\n} from \"lucide-react\";\n\n/**\n * Default icons for feedback types\n */\nconst defaultIcons: Record<string, React.ReactNode> = {\n issue: <FlagIcon className=\"w-4 h-4\" />,\n feature: <PlusIcon className=\"w-4 h-4\" />,\n like: <ThumbsUpIcon className=\"w-4 h-4\" />,\n};\n\n/**\n * Menu item component\n */\nfunction MenuItem({\n item,\n onClick,\n disabled,\n hasChildren,\n}: {\n item: FeedbackMenuItem;\n onClick: () => void;\n disabled: boolean;\n hasChildren?: boolean;\n}) {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n ...menuStyles.item,\n ...(isHovered ? menuStyles.itemHover : {}),\n ...(disabled ? { opacity: 0.5, cursor: \"not-allowed\" } : {}),\n }}\n >\n <span style={menuStyles.itemIcon}>\n {item.icon ?? defaultIcons[item.type]}\n </span>\n <span style={{ flex: 1 }}>{item.label}</span>\n {hasChildren && (\n <ChevronRightIcon\n className=\"w-4 h-4\"\n style={{ marginLeft: \"auto\", opacity: 0.5 }}\n />\n )}\n </button>\n );\n}\n\n/**\n * Back button for submenu navigation\n */\nfunction BackButton({ onClick }: { onClick: () => void }) {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n ...menuStyles.item,\n ...(isHovered ? menuStyles.itemHover : {}),\n borderBottom: \"1px solid #e5e5e5\",\n marginBottom: \"4px\",\n }}\n >\n <ChevronLeftIcon className=\"w-4 h-4\" style={{ opacity: 0.5 }} />\n <span style={{ opacity: 0.7 }}>Back</span>\n </button>\n );\n}\n\n/**\n * Comment form component\n */\nfunction CommentForm({\n onSubmit,\n onCancel,\n isSubmitting,\n}: {\n onSubmit: (comment: string) => void;\n onCancel: () => void;\n isSubmitting: boolean;\n}) {\n const [comment, setComment] = useState(\"\");\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleSubmit = () => {\n onSubmit(comment);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n handleSubmit();\n } else if (e.key === \"Escape\") {\n onCancel();\n }\n };\n\n return (\n <div style={menuStyles.commentSection}>\n <textarea\n ref={inputRef}\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add a comment (optional)...\"\n style={menuStyles.commentInput}\n disabled={isSubmitting}\n />\n <div style={menuStyles.buttonRow}>\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isSubmitting}\n style={{ ...menuStyles.button, ...menuStyles.cancelButton }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting}\n style={{\n ...menuStyles.button,\n ...menuStyles.submitButton,\n ...(isSubmitting ? menuStyles.submitButtonDisabled : {}),\n }}\n >\n {isSubmitting ? \"Sending...\" : \"Send\"}\n </button>\n </div>\n </div>\n );\n}\n\n/** View states for the context menu */\ntype MenuView = \"menu\" | \"comment\" | \"screenshot-preview\";\n\n/**\n * Context menu component for selecting feedback type\n */\nexport function ContextMenu({\n visible,\n position,\n targetElement,\n containerElement,\n items,\n onSelect,\n onClose,\n isSubmitting,\n style,\n className,\n highlightConfig,\n screenshotConfig,\n}: ContextMenuProps) {\n const [selectedType, setSelectedType] = useState<FeedbackType | null>(null);\n const [currentView, setCurrentView] = useState<MenuView>(\"menu\");\n const [pendingComment, setPendingComment] = useState<string | undefined>();\n const [submenuStack, setSubmenuStack] = useState<FeedbackMenuItem[][]>([]);\n const [screenshots, setScreenshots] = useState<ScreenshotData | null>(null);\n const [isCapturing, setIsCapturing] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Merge screenshot config with defaults\n const mergedScreenshotConfig = {\n ...DEFAULT_SCREENSHOT_CONFIG,\n ...screenshotConfig,\n };\n\n const showPreview =\n mergedScreenshotConfig.showPreview && isScreenshotSupported();\n\n // Current items to display (either root items or submenu items)\n const currentItems =\n submenuStack.length > 0 ? submenuStack[submenuStack.length - 1] : items;\n\n // Capture screenshots\n const captureScreenshots = useCallback(async () => {\n if (!targetElement || !showPreview) return;\n\n setIsCapturing(true);\n try {\n const captured = await captureAllScreenshots(\n targetElement,\n containerElement,\n mergedScreenshotConfig,\n );\n setScreenshots(captured);\n } catch (error) {\n console.error(\"Failed to capture screenshots:\", error);\n setScreenshots(null);\n } finally {\n setIsCapturing(false);\n }\n }, [targetElement, containerElement, mergedScreenshotConfig, showPreview]);\n\n // Reset state when menu closes\n useEffect(() => {\n if (!visible) {\n setSelectedType(null);\n setCurrentView(\"menu\");\n setPendingComment(undefined);\n setSubmenuStack([]);\n setScreenshots(null);\n setIsCapturing(false);\n }\n }, [visible]);\n\n // Apply highlights to target element and container when menu opens\n useEffect(() => {\n if (visible && targetElement) {\n // Clear any existing highlights first to ensure clean state\n clearHighlights();\n // Apply highlights to the new target element\n applyHighlights(targetElement, highlightConfig);\n } else {\n // Clear highlights when menu is not visible\n clearHighlights();\n }\n\n return () => {\n clearHighlights();\n };\n }, [visible, targetElement, highlightConfig]);\n\n // Close menu when clicking outside of it\n useEffect(() => {\n if (!visible) {\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!menuRef.current) return;\n\n const target = event.target as Node;\n if (!menuRef.current.contains(target)) {\n onClose();\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [visible, onClose]);\n\n // Adjust position to stay within viewport\n useEffect(() => {\n if (visible && menuRef.current) {\n const rect = menuRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let adjustedX = position.x;\n let adjustedY = position.y;\n\n if (position.x + rect.width > viewportWidth) {\n adjustedX = viewportWidth - rect.width - 10;\n }\n if (position.y + rect.height > viewportHeight) {\n adjustedY = viewportHeight - rect.height - 10;\n }\n\n if (adjustedX !== position.x || adjustedY !== position.y) {\n menuRef.current.style.left = `${adjustedX}px`;\n menuRef.current.style.top = `${adjustedY}px`;\n }\n }\n }, [visible, position]);\n\n // Handle escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (currentView === \"screenshot-preview\") {\n setCurrentView(\"comment\");\n } else if (currentView === \"comment\") {\n setCurrentView(\"menu\");\n setSelectedType(null);\n setPendingComment(undefined);\n } else if (submenuStack.length > 0) {\n // Go back one level in submenu\n setSubmenuStack((prev) => prev.slice(0, -1));\n } else {\n onClose();\n }\n }\n };\n\n if (visible) {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }\n }, [visible, currentView, submenuStack.length, onClose]);\n\n if (!visible || !targetElement) {\n return null;\n }\n\n const handleItemClick = (item: FeedbackMenuItem) => {\n // If item has children, navigate to submenu\n if (item.children && item.children.length > 0) {\n setSubmenuStack((prev) => [...prev, item.children!]);\n return;\n }\n\n // Otherwise, handle selection\n if (item.showComment) {\n setSelectedType(item.type);\n setCurrentView(\"comment\");\n } else {\n // If preview is enabled, capture and show preview\n if (showPreview) {\n setSelectedType(item.type);\n setCurrentView(\"screenshot-preview\");\n captureScreenshots();\n } else {\n onSelect(item.type);\n }\n }\n };\n\n const handleBack = () => {\n setSubmenuStack((prev) => prev.slice(0, -1));\n };\n\n const handleCommentSubmit = (comment: string) => {\n if (!selectedType) return;\n\n // If preview is enabled, capture and show preview\n if (showPreview) {\n setPendingComment(comment || undefined);\n setCurrentView(\"screenshot-preview\");\n captureScreenshots();\n } else {\n onSelect(selectedType, comment || undefined);\n }\n };\n\n const handleCommentCancel = () => {\n setCurrentView(\"menu\");\n setSelectedType(null);\n setPendingComment(undefined);\n };\n\n const handleScreenshotConfirm = (confirmedScreenshots: ScreenshotData) => {\n if (selectedType) {\n onSelect(selectedType, pendingComment, confirmedScreenshots);\n }\n };\n\n const handleScreenshotCancel = () => {\n // Go back to comment or menu\n if (pendingComment !== undefined) {\n setCurrentView(\"comment\");\n } else {\n setCurrentView(\"menu\");\n setSelectedType(null);\n }\n setScreenshots(null);\n };\n\n const handleRetakeScreenshots = () => {\n captureScreenshots();\n };\n\n // Determine container width based on view\n const containerWidth = currentView === \"screenshot-preview\" ? 360 : undefined;\n\n return (\n <div\n ref={menuRef}\n className={className}\n style={{\n ...menuStyles.container,\n left: position.x,\n top: position.y,\n ...(containerWidth\n ? { width: containerWidth, minWidth: containerWidth }\n : {}),\n ...style,\n }}\n role=\"menu\"\n aria-label=\"Feedback options\"\n >\n <div style={menuStyles.header}>\n {currentView === \"screenshot-preview\"\n ? \"Review Screenshots\"\n : \"Send Feedback\"}\n </div>\n\n {currentView === \"menu\" && (\n <div style={menuStyles.itemList}>\n {submenuStack.length > 0 && <BackButton onClick={handleBack} />}\n {currentItems.map((item) => (\n <MenuItem\n key={item.type}\n item={item}\n onClick={() => handleItemClick(item)}\n disabled={isSubmitting}\n hasChildren={item.children && item.children.length > 0}\n />\n ))}\n {showPreview && (\n <div style={screenshotIndicatorStyle}>\n <CameraIcon className=\"w-3 h-3\" />\n <span>Screenshots will be captured</span>\n </div>\n )}\n </div>\n )}\n\n {currentView === \"comment\" && (\n <CommentForm\n onSubmit={handleCommentSubmit}\n onCancel={handleCommentCancel}\n isSubmitting={isSubmitting}\n />\n )}\n\n {currentView === \"screenshot-preview\" && (\n <ScreenshotPreview\n screenshots={screenshots}\n isLoading={isCapturing}\n onConfirm={handleScreenshotConfirm}\n onCancel={handleScreenshotCancel}\n onRetake={handleRetakeScreenshots}\n isSubmitting={isSubmitting}\n />\n )}\n </div>\n );\n}\n\nconst screenshotIndicatorStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 12px\",\n fontSize: \"11px\",\n color: \"#9ca3af\",\n borderTop: \"1px solid #f3f4f6\",\n marginTop: \"4px\",\n};\n","import type { CSSProperties } from \"react\";\n\nexport const menuStyles: Record<string, CSSProperties> = {\n overlay: {\n position: \"fixed\",\n inset: 0,\n zIndex: 9998,\n },\n container: {\n position: \"fixed\",\n zIndex: 9999,\n minWidth: \"200px\",\n backgroundColor: \"#ffffff\",\n borderRadius: \"8px\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.05)\",\n overflow: \"hidden\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: \"14px\",\n },\n header: {\n padding: \"12px 16px\",\n borderBottom: \"1px solid #e5e5e5\",\n color: \"#666\",\n fontSize: \"12px\",\n fontWeight: 500,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.5px\",\n },\n itemList: {\n padding: \"4px 0\",\n },\n item: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n padding: \"10px 16px\",\n cursor: \"pointer\",\n transition: \"background-color 0.15s\",\n color: \"#333\",\n border: \"none\",\n background: \"none\",\n width: \"100%\",\n textAlign: \"left\" as const,\n fontSize: \"14px\",\n },\n itemHover: {\n backgroundColor: \"#f5f5f5\",\n },\n itemIcon: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"20px\",\n height: \"20px\",\n fontSize: \"16px\",\n },\n commentSection: {\n padding: \"12px 16px\",\n borderTop: \"1px solid #e5e5e5\",\n },\n commentInput: {\n width: \"100%\",\n minHeight: \"60px\",\n padding: \"8px 12px\",\n border: \"1px solid #ddd\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n resize: \"vertical\" as const,\n outline: \"none\",\n boxSizing: \"border-box\" as const,\n },\n buttonRow: {\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n marginTop: \"8px\",\n },\n button: {\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"background-color 0.15s, opacity 0.15s\",\n border: \"none\",\n },\n cancelButton: {\n backgroundColor: \"#f0f0f0\",\n color: \"#666\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"2px\",\n },\n submitButton: {\n backgroundColor: \"#0066cc\",\n color: \"#ffffff\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"2px\",\n },\n submitButtonDisabled: {\n opacity: 0.6,\n cursor: \"not-allowed\",\n },\n};\n\n// Dark mode styles\nexport const darkMenuStyles: Record<string, CSSProperties> = {\n container: {\n ...menuStyles.container,\n backgroundColor: \"#1a1a1a\",\n boxShadow:\n \"0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.1)\",\n },\n header: {\n ...menuStyles.header,\n borderBottom: \"1px solid #333\",\n color: \"#888\",\n },\n item: {\n ...menuStyles.item,\n color: \"#e0e0e0\",\n },\n itemHover: {\n backgroundColor: \"#2a2a2a\",\n },\n commentSection: {\n ...menuStyles.commentSection,\n borderTop: \"1px solid #333\",\n },\n commentInput: {\n ...menuStyles.commentInput,\n backgroundColor: \"#2a2a2a\",\n border: \"1px solid #444\",\n color: \"#e0e0e0\",\n },\n cancelButton: {\n ...menuStyles.cancelButton,\n backgroundColor: \"#333\",\n color: \"#ccc\",\n },\n};\n","/**\n * Highlight utilities for feedback target elements\n */\n\nimport type { HighlightConfig, HighlightColors } from \"./types\";\n\nconst HIGHLIGHT_TARGET_CLASS = \"uifeedback-highlight-target\";\nconst HIGHLIGHT_CONTAINER_CLASS = \"uifeedback-highlight-container\";\nconst STYLE_ID = \"uifeedback-highlight-styles\";\n\n/**\n * Default highlight colors\n */\nexport const defaultHighlightColors: Required<HighlightColors> = {\n targetColor: \"#3b82f6\",\n containerColor: \"#8b5cf6\",\n targetShadowOpacity: 0.25,\n containerShadowOpacity: 0.1,\n};\n\n/**\n * Default container selectors\n */\nexport const defaultContainerSelectors: string[] = [\n \".container\",\n \".card\",\n \".panel\",\n \".section\",\n \".wrapper\",\n \".box\",\n \".modal\",\n \".dialog\",\n \".drawer\",\n '[role=\"dialog\"]',\n '[role=\"region\"]',\n '[role=\"article\"]',\n '[role=\"main\"]',\n \"article\",\n \"section\",\n \"main\",\n \"aside\",\n \"nav\",\n \"header\",\n \"footer\",\n];\n\n/**\n * Generate CSS for highlight effects based on configuration\n */\nfunction generateHighlightCSS(colors: Required<HighlightColors>): string {\n const { targetColor, containerColor, targetShadowOpacity, containerShadowOpacity } = colors;\n \n // Convert hex to rgba for shadows\n const hexToRgba = (hex: string, alpha: number): string => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return `rgba(0, 0, 0, ${alpha})`;\n return `rgba(${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)}, ${alpha})`;\n };\n\n return `\n.${HIGHLIGHT_TARGET_CLASS} {\n outline: 2px solid ${targetColor} !important;\n outline-offset: 2px !important;\n box-shadow: 0 0 0 4px ${hexToRgba(targetColor, targetShadowOpacity)}, 0 4px 12px ${hexToRgba(targetColor, targetShadowOpacity * 0.6)} !important;\n border-radius: 4px !important;\n position: relative;\n z-index: 9997;\n}\n\n.${HIGHLIGHT_CONTAINER_CLASS} {\n outline: 2px dashed ${hexToRgba(containerColor, 0.6)} !important;\n outline-offset: 4px !important;\n box-shadow: 0 0 0 6px ${hexToRgba(containerColor, containerShadowOpacity)} !important;\n border-radius: 6px !important;\n position: relative;\n z-index: 9996;\n}\n`;\n}\n\n/**\n * Inject or update highlight styles in document head\n */\nfunction injectStyles(colors: Required<HighlightColors>): void {\n if (typeof document === \"undefined\") return;\n\n // Remove existing styles if present\n const existingStyle = document.getElementById(STYLE_ID);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = generateHighlightCSS(colors);\n document.head.appendChild(style);\n}\n\n/**\n * Find the closest container parent element\n */\nexport function findContainerParent(\n element: Element,\n config?: HighlightConfig,\n): Element | null {\n const containerSelectors = config?.containerSelectors ?? defaultContainerSelectors;\n const minChildren = config?.minChildrenForContainer ?? 2;\n\n let current = element.parentElement;\n let fallbackContainer: Element | null = null;\n\n while (current && current !== document.body) {\n // Check if element matches any container selector\n for (const selector of containerSelectors) {\n try {\n if (current.matches(selector)) {\n return current;\n }\n } catch {\n // Invalid selector, skip\n }\n }\n\n // Check if parent has multiple meaningful children (not just text nodes)\n const meaningfulChildren = Array.from(current.children).filter((child) => {\n const tag = child.tagName.toLowerCase();\n // Exclude script, style, and hidden elements\n if (tag === \"script\" || tag === \"style\" || tag === \"noscript\") {\n return false;\n }\n // Check if element is visible\n const style = window.getComputedStyle(child);\n if (style.display === \"none\" || style.visibility === \"hidden\") {\n return false;\n }\n return true;\n });\n\n // If this parent has enough children, it's likely a container\n if (meaningfulChildren.length >= minChildren && !fallbackContainer) {\n fallbackContainer = current;\n }\n\n // If parent has 3+ children, strongly consider it a container\n if (meaningfulChildren.length >= 3) {\n return current;\n }\n\n current = current.parentElement;\n }\n\n return fallbackContainer;\n}\n\n/**\n * Apply highlight to target element\n */\nexport function highlightTarget(element: Element, colors?: HighlightColors): void {\n const mergedColors = { ...defaultHighlightColors, ...colors };\n injectStyles(mergedColors);\n element.classList.add(HIGHLIGHT_TARGET_CLASS);\n}\n\n/**\n * Apply highlight to container element\n */\nexport function highlightContainer(element: Element, colors?: HighlightColors): void {\n const mergedColors = { ...defaultHighlightColors, ...colors };\n injectStyles(mergedColors);\n element.classList.add(HIGHLIGHT_CONTAINER_CLASS);\n}\n\n/**\n * Remove all highlights from the document\n */\nexport function clearHighlights(): void {\n if (typeof document === \"undefined\") return;\n\n document.querySelectorAll(`.${HIGHLIGHT_TARGET_CLASS}`).forEach((el) => {\n el.classList.remove(HIGHLIGHT_TARGET_CLASS);\n });\n\n document.querySelectorAll(`.${HIGHLIGHT_CONTAINER_CLASS}`).forEach((el) => {\n el.classList.remove(HIGHLIGHT_CONTAINER_CLASS);\n });\n}\n\n/**\n * Apply highlights to target element and its container parent\n */\nexport function applyHighlights(\n targetElement: Element,\n config?: HighlightConfig,\n): {\n target: Element;\n container: Element | null;\n} {\n // If highlights are disabled, don't apply anything\n if (config?.enabled === false) {\n return { target: targetElement, container: null };\n }\n\n clearHighlights();\n\n const colors = { ...defaultHighlightColors, ...config?.colors };\n \n highlightTarget(targetElement, colors);\n\n const container = findContainerParent(targetElement, config);\n if (container && container !== targetElement) {\n highlightContainer(container, colors);\n }\n\n return { target: targetElement, container };\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport type { ScreenshotData } from \"@ewjdev/anyclick-core\";\nimport { formatBytes, estimateTotalSize } from \"@ewjdev/anyclick-core\";\nimport type { ScreenshotPreviewProps } from \"./types\";\nimport { menuStyles } from \"./styles\";\nimport {\n ImageIcon,\n RefreshCwIcon,\n CheckIcon,\n XIcon,\n Loader2Icon,\n ExpandIcon,\n ShrinkIcon,\n} from \"lucide-react\";\n\ntype TabType = \"element\" | \"container\" | \"viewport\";\n\n/**\n * Screenshot preview component - shows captured screenshots before sending\n */\nexport function ScreenshotPreview({\n screenshots,\n isLoading,\n onConfirm,\n onCancel,\n onRetake,\n isSubmitting,\n}: ScreenshotPreviewProps) {\n const [activeTab, setActiveTab] = useState<TabType>(\"element\");\n const [isExpanded, setIsExpanded] = useState(false);\n\n if (isLoading) {\n return (\n <div style={styles.container}>\n <div style={styles.loadingContainer}>\n <Loader2Icon\n className=\"w-6 h-6 animate-spin\"\n style={{ color: \"#3b82f6\" }}\n />\n <span style={styles.loadingText}>Capturing screenshots...</span>\n </div>\n </div>\n );\n }\n\n if (!screenshots) {\n return (\n <div style={styles.container}>\n <div style={styles.emptyContainer}>\n <ImageIcon className=\"w-8 h-8\" style={{ color: \"#9ca3af\" }} />\n <span style={styles.emptyText}>No screenshots captured</span>\n <button\n type=\"button\"\n onClick={onRetake}\n style={styles.retakeButton}\n disabled={isSubmitting}\n >\n <RefreshCwIcon className=\"w-4 h-4\" />\n Capture Screenshots\n </button>\n </div>\n </div>\n );\n }\n\n const allTabs: {\n key: TabType;\n label: string;\n data: typeof screenshots.element;\n }[] = [\n { key: \"element\" as const, label: \"Element\", data: screenshots.element },\n {\n key: \"container\" as const,\n label: \"Container\",\n data: screenshots.container,\n },\n { key: \"viewport\" as const, label: \"Viewport\", data: screenshots.viewport },\n ];\n const tabs = allTabs.filter((tab) => tab.data);\n\n const activeScreenshot =\n activeTab === \"element\"\n ? screenshots.element\n : activeTab === \"container\"\n ? screenshots.container\n : screenshots.viewport;\n\n const totalSize = estimateTotalSize(screenshots);\n\n return (\n <div\n style={{\n ...styles.container,\n ...(isExpanded ? styles.containerExpanded : {}),\n }}\n >\n <div style={styles.header}>\n <span style={styles.headerTitle}>Screenshot Preview</span>\n <div style={styles.headerActions}>\n <span style={styles.sizeLabel}>{formatBytes(totalSize)}</span>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n style={styles.iconButton}\n title={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n {isExpanded ? (\n <ShrinkIcon className=\"w-4 h-4\" />\n ) : (\n <ExpandIcon className=\"w-4 h-4\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Tabs */}\n <div style={styles.tabContainer}>\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n style={{\n ...styles.tab,\n ...(activeTab === tab.key ? styles.tabActive : {}),\n }}\n >\n {tab.label}\n {tab.data && (\n <span style={styles.tabSize}>\n {formatBytes(tab.data.sizeBytes)}\n </span>\n )}\n </button>\n ))}\n </div>\n\n {/* Preview image */}\n <div\n style={{\n ...styles.previewContainer,\n ...(isExpanded ? styles.previewContainerExpanded : {}),\n }}\n >\n {activeScreenshot ? (\n <img\n src={activeScreenshot.dataUrl}\n alt={`${activeTab} screenshot`}\n style={styles.previewImage}\n />\n ) : (\n <div style={styles.noPreview}>\n <ImageIcon className=\"w-6 h-6\" style={{ color: \"#9ca3af\" }} />\n <span>No {activeTab} screenshot</span>\n </div>\n )}\n </div>\n\n {/* Dimensions info */}\n {activeScreenshot && (\n <div style={styles.dimensionsInfo}>\n {activeScreenshot.width} × {activeScreenshot.height}px\n </div>\n )}\n\n {/* Actions */}\n <div style={styles.actions}>\n <button\n type=\"button\"\n onClick={onRetake}\n disabled={isSubmitting}\n style={styles.retakeButtonSmall}\n >\n <RefreshCwIcon className=\"w-3 h-3\" />\n Retake\n </button>\n <div style={styles.actionsRight}>\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isSubmitting}\n className=\"flex items-center gap-1\"\n style={{ ...menuStyles.button, ...menuStyles.cancelButton }}\n >\n <XIcon className=\"w-3 h-3\" />\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => onConfirm(screenshots)}\n disabled={isSubmitting}\n style={{\n ...menuStyles.button,\n ...menuStyles.submitButton,\n ...(isSubmitting ? menuStyles.submitButtonDisabled : {}),\n }}\n >\n {isSubmitting ? (\n <>\n <Loader2Icon className=\"w-3 h-3 animate-spin\" />\n Sending...\n </>\n ) : (\n <>\n <CheckIcon className=\"w-3 h-3\" />\n Send\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n container: {\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n },\n containerExpanded: {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"90vw\",\n maxWidth: \"800px\",\n maxHeight: \"90vh\",\n backgroundColor: \"#fff\",\n borderRadius: \"12px\",\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\",\n padding: \"16px\",\n zIndex: 10000,\n },\n loadingContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"12px\",\n padding: \"24px\",\n },\n loadingText: {\n fontSize: \"13px\",\n color: \"#6b7280\",\n },\n emptyContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n padding: \"24px\",\n },\n emptyText: {\n fontSize: \"13px\",\n color: \"#9ca3af\",\n },\n header: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"0 4px\",\n },\n headerTitle: {\n fontSize: \"12px\",\n fontWeight: \"600\",\n color: \"#374151\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n },\n headerActions: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n sizeLabel: {\n fontSize: \"11px\",\n color: \"#9ca3af\",\n },\n iconButton: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"24px\",\n height: \"24px\",\n border: \"none\",\n background: \"transparent\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n color: \"#6b7280\",\n },\n tabContainer: {\n display: \"flex\",\n gap: \"4px\",\n borderBottom: \"1px solid #e5e7eb\",\n paddingBottom: \"8px\",\n },\n tab: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"6px 10px\",\n fontSize: \"12px\",\n color: \"#6b7280\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n },\n tabActive: {\n backgroundColor: \"#eff6ff\",\n color: \"#3b82f6\",\n fontWeight: \"500\",\n },\n tabSize: {\n fontSize: \"10px\",\n color: \"#9ca3af\",\n },\n previewContainer: {\n position: \"relative\",\n width: \"100%\",\n height: \"150px\",\n backgroundColor: \"#f9fafb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n previewContainerExpanded: {\n height: \"60vh\",\n maxHeight: \"500px\",\n },\n previewImage: {\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n objectFit: \"contain\",\n },\n noPreview: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"8px\",\n fontSize: \"12px\",\n color: \"#9ca3af\",\n },\n dimensionsInfo: {\n fontSize: \"11px\",\n color: \"#9ca3af\",\n textAlign: \"center\" as const,\n },\n actions: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n paddingTop: \"8px\",\n borderTop: \"1px solid #e5e7eb\",\n },\n actionsRight: {\n display: \"flex\",\n gap: \"8px\",\n },\n retakeButton: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 16px\",\n fontSize: \"13px\",\n color: \"#fff\",\n backgroundColor: \"#3b82f6\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n fontWeight: \"500\",\n },\n retakeButtonSmall: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"4px 8px\",\n fontSize: \"11px\",\n color: \"#6b7280\",\n backgroundColor: \"transparent\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n },\n};\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z',\n key: '18u6gg',\n },\n ],\n ['circle', { cx: '12', cy: '13', r: '3', key: '1vg3eu' }],\n];\n\n/**\n * @component @name Camera\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTMuOTk3IDRhMiAyIDAgMCAxIDEuNzYgMS4wNWwuNDg2LjlBMiAyIDAgMCAwIDE4LjAwMyA3SDIwYTIgMiAwIDAgMSAyIDJ2OWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY5YTIgMiAwIDAgMSAyLTJoMS45OTdhMiAyIDAgMCAwIDEuNzU5LTEuMDQ4bC40ODktLjkwNEEyIDIgMCAwIDEgMTAuMDA0IDR6IiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTMiIHI9IjMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/camera\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Camera = createLucideIcon('camera', __iconNode);\n\nexport default Camera;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]];\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('check', __iconNode);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }]];\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronLeft = createLucideIcon('chevron-left', __iconNode);\n\nexport default ChevronLeft;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }]];\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronRight = createLucideIcon('chevron-right', __iconNode);\n\nexport default ChevronRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm15 15 6 6', key: '1s409w' }],\n ['path', { d: 'm15 9 6-6', key: 'ko1vev' }],\n ['path', { d: 'M21 16v5h-5', key: '1ck2sf' }],\n ['path', { d: 'M21 8V3h-5', key: '1qoq8a' }],\n ['path', { d: 'M3 16v5h5', key: '1t08am' }],\n ['path', { d: 'm3 21 6-6', key: 'wwnumi' }],\n ['path', { d: 'M3 8V3h5', key: '1ln10m' }],\n ['path', { d: 'M9 9 3 3', key: 'v551iv' }],\n];\n\n/**\n * @component @name Expand\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTUgNiA2IiAvPgogIDxwYXRoIGQ9Im0xNSA5IDYtNiIgLz4KICA8cGF0aCBkPSJNMjEgMTZ2NWgtNSIgLz4KICA8cGF0aCBkPSJNMjEgOFYzaC01IiAvPgogIDxwYXRoIGQ9Ik0zIDE2djVoNSIgLz4KICA8cGF0aCBkPSJtMyAyMSA2LTYiIC8+CiAgPHBhdGggZD0iTTMgOFYzaDUiIC8+CiAgPHBhdGggZD0iTTkgOSAzIDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/expand\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Expand = createLucideIcon('expand', __iconNode);\n\nexport default Expand;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528',\n key: '1jaruq',\n },\n ],\n];\n\n/**\n * @component @name Flag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAyMlY0YTEgMSAwIDAgMSAuNC0uOEE2IDYgMCAwIDEgOCAyYzMgMCA1IDIgNy4zMzMgMnEyIDAgMy4wNjctLjhBMSAxIDAgMCAxIDIwIDR2MTBhMSAxIDAgMCAxLS40LjhBNiA2IDAgMCAxIDE2IDE2Yy0zIDAtNS0yLTgtMmE2IDYgMCAwIDAtNCAxLjUyOCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/flag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Flag = createLucideIcon('flag', __iconNode);\n\nexport default Flag;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M21 12a9 9 0 1 1-6.219-8.56', key: '13zald' }]];\n\n/**\n * @component @name LoaderCircle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTYuMjE5LTguNTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader-circle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LoaderCircle = createLucideIcon('loader-circle', __iconNode);\n\nexport default LoaderCircle;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n];\n\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Plus = createLucideIcon('plus', __iconNode);\n\nexport default Plus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm15 15 6 6m-6-6v4.8m0-4.8h4.8', key: '17vawe' }],\n ['path', { d: 'M9 19.8V15m0 0H4.2M9 15l-6 6', key: 'chjx8e' }],\n ['path', { d: 'M15 4.2V9m0 0h4.8M15 9l6-6', key: 'lav6yq' }],\n ['path', { d: 'M9 4.2V9m0 0H4.2M9 9 3 3', key: '1pxi2q' }],\n];\n\n/**\n * @component @name Shrink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTUgNiA2bS02LTZ2NC44bTAtNC44aDQuOCIgLz4KICA8cGF0aCBkPSJNOSAxOS44VjE1bTAgMEg0LjJNOSAxNWwtNiA2IiAvPgogIDxwYXRoIGQ9Ik0xNSA0LjJWOW0wIDBoNC44TTE1IDlsNi02IiAvPgogIDxwYXRoIGQ9Ik05IDQuMlY5bTAgMEg0LjJNOSA5IDMgMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/shrink\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Shrink = createLucideIcon('shrink', __iconNode);\n\nexport default Shrink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M7 10v12', key: '1qc93n' }],\n [\n 'path',\n {\n d: 'M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z',\n key: 'emmmcr',\n },\n ],\n];\n\n/**\n * @component @name ThumbsUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNyAxMHYxMiIgLz4KICA8cGF0aCBkPSJNMTUgNS44OCAxNCAxMGg1LjgzYTIgMiAwIDAgMSAxLjkyIDIuNTZsLTIuMzMgOEEyIDIgMCAwIDEgMTcuNSAyMkg0YTIgMiAwIDAgMS0yLTJ2LThhMiAyIDAgMCAxIDItMmgyLjc2YTIgMiAwIDAgMCAxLjc5LTEuMTFMMTIgMmEzLjEzIDMuMTMgMCAwIDEgMyAzLjg4WiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/thumbs-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ThumbsUp = createLucideIcon('thumbs-up', __iconNode);\n\nexport default ThumbsUp;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import type {\n FeedbackAdapter,\n FeedbackPayload,\n FeedbackType,\n ScreenshotConfig,\n ScreenshotData,\n} from \"@ewjdev/anyclick-core\";\nimport type { ReactNode, CSSProperties } from \"react\";\n\n/**\n * Configuration for highlight colors\n */\nexport interface HighlightColors {\n /** Color for the target element highlight (default: #3b82f6 - blue) */\n targetColor?: string;\n /** Color for the container element highlight (default: #8b5cf6 - purple) */\n containerColor?: string;\n /** Opacity for the target shadow (default: 0.25) */\n targetShadowOpacity?: number;\n /** Opacity for the container shadow (default: 0.1) */\n containerShadowOpacity?: number;\n}\n\n/**\n * Configuration for highlight behavior\n */\nexport interface HighlightConfig {\n /** Whether to show highlights (default: true) */\n enabled?: boolean;\n /** Custom colors for highlights */\n colors?: HighlightColors;\n /** CSS selectors to identify container elements */\n containerSelectors?: string[];\n /** Minimum number of children for an element to be considered a container (default: 2) */\n minChildrenForContainer?: number;\n}\n\n/**\n * Menu item displayed in the feedback context menu\n */\nexport interface FeedbackMenuItem {\n /** Feedback type for this option (use unique identifier for parent items with children) */\n type: FeedbackType;\n /** Display label */\n label: string;\n /** Optional icon */\n icon?: ReactNode;\n /** Whether to show a comment input for this type */\n showComment?: boolean;\n /** Optional role(s) required to see this menu item */\n requiredRoles?: string[];\n /** Child menu items (creates a submenu) */\n children?: FeedbackMenuItem[];\n}\n\n/**\n * User context for role-based menu filtering\n */\nexport interface FeedbackUserContext {\n /** User's role(s) */\n roles?: string[];\n /** User ID */\n id?: string;\n /** User email */\n email?: string;\n}\n\n/**\n * Filter menu items based on user context\n */\nexport function filterMenuItemsByRole(\n items: FeedbackMenuItem[],\n userContext?: FeedbackUserContext,\n): FeedbackMenuItem[] {\n if (!userContext) {\n // If no user context, only show items without required roles\n return items.filter(\n (item) => !item.requiredRoles || item.requiredRoles.length === 0,\n );\n }\n\n const userRoles = userContext.roles ?? [];\n\n return items.filter((item) => {\n // If no required roles, show to everyone\n if (!item.requiredRoles || item.requiredRoles.length === 0) {\n return true;\n }\n // Check if user has any of the required roles\n return item.requiredRoles.some((role) => userRoles.includes(role));\n });\n}\n\n/**\n * Props for the FeedbackProvider component\n */\nexport interface FeedbackProviderProps {\n /** The adapter to use for submitting feedback */\n adapter: FeedbackAdapter;\n /** Child components */\n children: ReactNode;\n /**\n * Filter function to determine if feedback should be captured for a target element\n * Return true to allow feedback, false to ignore\n */\n targetFilter?: (event: MouseEvent, target: Element) => boolean;\n /** Custom menu items (defaults to Issue, Feature, Like) */\n menuItems?: FeedbackMenuItem[];\n /** Maximum length for innerText capture */\n maxInnerTextLength?: number;\n /** Maximum length for outerHTML capture */\n maxOuterHTMLLength?: number;\n /** Maximum number of ancestors to capture */\n maxAncestors?: number;\n /** Cooldown in milliseconds between submissions (rate limiting) */\n cooldownMs?: number;\n /** Attributes to strip from outerHTML for privacy */\n stripAttributes?: string[];\n /** Additional metadata to include with every submission */\n metadata?: Record<string, unknown>;\n /** Callback after successful submission */\n onSubmitSuccess?: (payload: FeedbackPayload) => void;\n /** Callback after failed submission */\n onSubmitError?: (error: Error, payload: FeedbackPayload) => void;\n /** Custom styles for the context menu */\n menuStyle?: CSSProperties;\n /** Custom class name for the context menu */\n menuClassName?: string;\n /** Whether the provider is disabled */\n disabled?: boolean;\n /** Configuration for element highlighting */\n highlightConfig?: HighlightConfig;\n /** Configuration for screenshot capture */\n screenshotConfig?: ScreenshotConfig;\n}\n\n/**\n * Context value exposed by FeedbackProvider\n */\nexport interface FeedbackContextValue {\n /** Whether feedback is currently enabled */\n isEnabled: boolean;\n /** Whether a submission is in progress */\n isSubmitting: boolean;\n /** Submit feedback for a specific element */\n submitFeedback: (\n element: Element,\n type: FeedbackType,\n comment?: string,\n ) => Promise<void>;\n /** Open the feedback menu programmatically */\n openMenu: (element: Element, position: { x: number; y: number }) => void;\n /** Close the feedback menu */\n closeMenu: () => void;\n}\n\n/**\n * Props for the context menu component\n */\nexport interface ContextMenuProps {\n /** Whether the menu is visible */\n visible: boolean;\n /** Position of the menu */\n position: { x: number; y: number };\n /** Target element for feedback */\n targetElement: Element | null;\n /** Container element found by highlight logic */\n containerElement: Element | null;\n /** Menu items to display */\n items: FeedbackMenuItem[];\n /** Callback when an item is selected */\n onSelect: (\n type: FeedbackType,\n comment?: string,\n screenshots?: ScreenshotData,\n ) => void;\n /** Callback when menu is closed */\n onClose: () => void;\n /** Whether submission is in progress */\n isSubmitting: boolean;\n /** Custom styles */\n style?: CSSProperties;\n /** Custom class name */\n className?: string;\n /** Configuration for element highlighting */\n highlightConfig?: HighlightConfig;\n /** Configuration for screenshot capture */\n screenshotConfig?: ScreenshotConfig;\n}\n\n/**\n * Props for the screenshot preview component\n */\nexport interface ScreenshotPreviewProps {\n /** Captured screenshot data */\n screenshots: ScreenshotData | null;\n /** Whether screenshots are loading */\n isLoading: boolean;\n /** Callback when user confirms screenshots */\n onConfirm: (screenshots: ScreenshotData) => void;\n /** Callback when user cancels */\n onCancel: () => void;\n /** Callback when user wants to retake screenshots */\n onRetake: () => void;\n /** Whether submission is in progress */\n isSubmitting: boolean;\n}\n"],"mappings":"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","names":["import_react","import_anyclick_core","import_react","import_anyclick_core","import_react","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","import_jsx_runtime","import_jsx_runtime","import_anyclick_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/AnyclickProvider.tsx","../src/context.ts","../src/ContextMenu.tsx","../src/styles.ts","../src/highlight.ts","../src/ScreenshotPreview.tsx","../../../node_modules/shared/src/utils.ts","../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../node_modules/lucide-react/src/Icon.ts","../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../node_modules/lucide-react/src/icons/camera.ts","../../../node_modules/lucide-react/src/icons/check.ts","../../../node_modules/lucide-react/src/icons/chevron-left.ts","../../../node_modules/lucide-react/src/icons/chevron-right.ts","../../../node_modules/lucide-react/src/icons/circle-alert.ts","../../../node_modules/lucide-react/src/icons/expand.ts","../../../node_modules/lucide-react/src/icons/flag.ts","../../../node_modules/lucide-react/src/icons/grip-vertical.ts","../../../node_modules/lucide-react/src/icons/image.ts","../../../node_modules/lucide-react/src/icons/loader-circle.ts","../../../node_modules/lucide-react/src/icons/plus.ts","../../../node_modules/lucide-react/src/icons/refresh-cw.ts","../../../node_modules/lucide-react/src/icons/shrink.ts","../../../node_modules/lucide-react/src/icons/thumbs-up.ts","../../../node_modules/lucide-react/src/icons/x.ts","../src/store.ts","../src/types.ts"],"sourcesContent":["// Components\n\"use client\";\n\n// New exports\nexport { AnyclickProvider } from \"./AnyclickProvider\";\nexport { ContextMenu } from \"./ContextMenu\";\nexport { ScreenshotPreview } from \"./ScreenshotPreview\";\n\n// Deprecated exports (for backward compatibility)\nexport { FeedbackProvider } from \"./AnyclickProvider\";\n\n// Context and hooks (new)\nexport { AnyclickContext, useAnyclick } from \"./context\";\n\n// Context and hooks (deprecated, for backward compatibility)\nexport { FeedbackContext, useFeedback } from \"./context\";\n\n// Store exports (for advanced use cases)\nexport {\n useProviderStore,\n generateProviderId,\n dispatchContextMenuEvent,\n type ProviderInstance,\n} from \"./store\";\n\n// Types (new)\nexport type {\n AnyclickProviderProps,\n AnyclickContextValue,\n AnyclickTheme,\n FeedbackMenuItem,\n ContextMenuProps,\n HighlightColors,\n HighlightConfig,\n FeedbackUserContext,\n ScreenshotPreviewProps,\n MenuPositionMode,\n} from \"./types\";\n\n// Types (deprecated, for backward compatibility)\nexport type { FeedbackProviderProps, FeedbackContextValue } from \"./types\";\n\n// Utilities\nexport { filterMenuItemsByRole } from \"./types\";\n\n// Re-export core types for convenience\nexport type {\n FeedbackType,\n FeedbackPayload,\n FeedbackAdapter,\n ElementContext,\n PageContext,\n ScreenshotData,\n ScreenshotCapture,\n ScreenshotConfig,\n ScreenshotCaptureMode,\n} from \"@ewjdev/anyclick-core\";\n\n// Re-export screenshot utilities from core\nexport {\n captureAllScreenshots,\n captureScreenshot,\n isScreenshotSupported,\n formatBytes,\n estimateTotalSize,\n DEFAULT_SCREENSHOT_CONFIG,\n DEFAULT_SENSITIVE_SELECTORS,\n} from \"@ewjdev/anyclick-core\";\n\n// Styles (for customization)\nexport { menuStyles, darkMenuStyles, menuCSSVariables } from \"./styles\";\n\n// Highlight utilities (for customization)\nexport {\n findContainerParent,\n highlightTarget,\n highlightContainer,\n clearHighlights,\n applyHighlights,\n defaultHighlightColors,\n defaultContainerSelectors,\n} from \"./highlight\";\n","\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createFeedbackClient } from \"@ewjdev/anyclick-core\";\nimport type {\n FeedbackClient,\n FeedbackMenuEvent,\n FeedbackType,\n ScreenshotData,\n} from \"@ewjdev/anyclick-core\";\nimport { AnyclickContext, useAnyclick } from \"./context\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { findContainerParent } from \"./highlight\";\nimport {\n useProviderStore,\n generateProviderId,\n type ProviderInstance,\n} from \"./store\";\nimport type {\n AnyclickContextValue,\n AnyclickProviderProps,\n AnyclickTheme,\n FeedbackMenuItem,\n} from \"./types\";\n\n/**\n * Default menu items\n */\nconst defaultMenuItems: FeedbackMenuItem[] = [\n { type: \"issue\", label: \"Report an issue\", showComment: true },\n { type: \"feature\", label: \"Request a feature\", showComment: true },\n { type: \"like\", label: \"I like this!\", showComment: false },\n];\n\n/**\n * AnyclickProvider component - wraps your app to enable feedback capture\n * Supports scoped providers and nested theming\n */\nexport function AnyclickProvider({\n adapter,\n children,\n targetFilter,\n menuItems = defaultMenuItems,\n maxInnerTextLength,\n maxOuterHTMLLength,\n maxAncestors,\n cooldownMs,\n stripAttributes,\n metadata,\n onSubmitSuccess,\n onSubmitError,\n menuStyle,\n menuClassName,\n disabled = false,\n highlightConfig,\n screenshotConfig,\n scoped = false,\n theme,\n touchHoldDurationMs,\n touchMoveThreshold,\n}: AnyclickProviderProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [menuVisible, setMenuVisible] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });\n const [targetElement, setTargetElement] = useState<Element | null>(null);\n const [containerElement, setContainerElement] = useState<Element | null>(\n null,\n );\n\n // Generate a stable ID for this provider instance\n const providerIdRef = useRef<string>(generateProviderId());\n const providerId = providerIdRef.current;\n\n // Ref to the container element (for scoped providers)\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // Track when container is ready for scoped providers\n const [containerReady, setContainerReady] = useState(!scoped);\n\n // Client reference\n const clientRef = useRef<FeedbackClient | null>(null);\n\n // Callback ref to detect when container element is mounted\n const setContainerRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (process.env.NODE_ENV === \"development\") {\n console.log(`[AnyclickProvider:${providerId}] Container ref callback`, {\n scoped,\n nodeReceived: !!node,\n hadPreviousNode: !!containerRef.current,\n clientExists: !!clientRef.current,\n });\n }\n\n containerRef.current = node;\n if (scoped && node) {\n setContainerReady(true);\n // If client already exists, update its container\n if (clientRef.current) {\n clientRef.current.setContainer(node);\n }\n }\n },\n [scoped, providerId],\n );\n\n // Access parent context (if nested)\n let parentContext: AnyclickContextValue | null = null;\n try {\n // This will throw if there's no parent provider\n parentContext = useAnyclick();\n } catch {\n // No parent provider - this is a root provider\n parentContext = null;\n }\n\n // Store access\n const {\n registerProvider,\n unregisterProvider,\n updateProvider,\n getMergedTheme,\n isDisabledByAncestor,\n findParentProvider,\n isElementInDisabledScope,\n isElementInAnyScopedProvider,\n } = useProviderStore();\n\n // Determine parent ID\n const parentId = parentContext?.providerId ?? null;\n\n // Calculate depth\n const depth = parentContext ? (parentContext.scoped ? 1 : 0) : 0;\n const actualDepth = useMemo(() => {\n if (!parentContext) return 0;\n // Find actual depth by traversing store\n let d = 0;\n let currentId = parentId;\n const providers = useProviderStore.getState().providers;\n while (currentId) {\n d++;\n const parent = providers.get(currentId);\n currentId = parent?.parentId ?? null;\n }\n return d;\n }, [parentId]);\n\n // Determine if disabled by theme\n const isDisabledByTheme = theme === null || theme?.disabled === true;\n const effectiveDisabled = disabled || isDisabledByTheme;\n\n // Build the theme for this provider\n const localTheme: AnyclickTheme = useMemo(() => {\n // If theme is null, treat as disabled\n if (theme === null) {\n return { disabled: true };\n }\n\n // Merge explicit theme props with theme object\n const explicitThemeProps: AnyclickTheme = {};\n if (menuStyle) explicitThemeProps.menuStyle = menuStyle;\n if (menuClassName) explicitThemeProps.menuClassName = menuClassName;\n if (highlightConfig) explicitThemeProps.highlightConfig = highlightConfig;\n if (screenshotConfig)\n explicitThemeProps.screenshotConfig = screenshotConfig;\n\n return {\n ...explicitThemeProps,\n ...theme,\n };\n }, [theme, menuStyle, menuClassName, highlightConfig, screenshotConfig]);\n\n // Context menu handler\n // Returns false to allow native context menu (for disabled scopes)\n // Returns true (or void) to show custom menu\n const handleContextMenu = useCallback(\n (event: FeedbackMenuEvent, element: Element): boolean => {\n // For non-scoped (global) providers, check if the element is inside\n // a disabled scoped provider's container - if so, allow native menu\n if (!scoped && isElementInDisabledScope(element)) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[AnyclickProvider:${providerId}] Allowing native menu - element is in disabled scope`,\n {\n targetTag: element.tagName,\n },\n );\n }\n return false; // Allow native context menu\n }\n\n // For non-scoped (global) providers on TOUCH events, check if the element\n // is inside any scoped provider's container - if so, defer to the scoped\n // provider to handle the event with its own theme\n // NOTE: For contextmenu (right-click) events, this is handled by capture\n // phase and stopPropagation in the client. But touch events don't have\n // the same propagation model, so we need to check here.\n if (!scoped && event.isTouch && isElementInAnyScopedProvider(element)) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[AnyclickProvider:${providerId}] Deferring to scoped provider for touch event`,\n {\n targetTag: element.tagName,\n },\n );\n }\n return false; // Let the scoped provider handle it\n }\n\n const mergedTheme = getMergedTheme(providerId);\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[AnyclickProvider:${providerId}] handleContextMenu called`,\n {\n scoped,\n targetTag: element.tagName,\n mergedThemeColors: mergedTheme.highlightConfig?.colors,\n position: { x: event.clientX, y: event.clientY },\n isTouch: event.isTouch,\n },\n );\n }\n\n setTargetElement(element);\n // Get merged theme for highlight config\n const container = findContainerParent(\n element,\n mergedTheme.highlightConfig ?? highlightConfig,\n );\n setContainerElement(container);\n setMenuPosition({ x: event.clientX, y: event.clientY });\n setMenuVisible(true);\n\n return true; // Handled - prevent native menu\n },\n [\n providerId,\n getMergedTheme,\n highlightConfig,\n scoped,\n isElementInDisabledScope,\n isElementInAnyScopedProvider,\n ],\n );\n\n // Register this provider in the store\n useLayoutEffect(() => {\n const providerInstance: ProviderInstance = {\n id: providerId,\n containerRef: containerRef as React.RefObject<Element | null>,\n scoped,\n theme: localTheme,\n disabled: effectiveDisabled,\n parentId,\n depth: actualDepth,\n onContextMenu: handleContextMenu,\n };\n\n registerProvider(providerInstance);\n\n return () => {\n unregisterProvider(providerId);\n };\n }, [\n providerId,\n scoped,\n localTheme,\n effectiveDisabled,\n parentId,\n actualDepth,\n handleContextMenu,\n registerProvider,\n unregisterProvider,\n ]);\n\n // Update provider when config changes\n useEffect(() => {\n updateProvider(providerId, {\n theme: localTheme,\n disabled: effectiveDisabled,\n onContextMenu: handleContextMenu,\n });\n }, [\n providerId,\n localTheme,\n effectiveDisabled,\n handleContextMenu,\n updateProvider,\n ]);\n\n // Create/update the feedback client\n // Wait for container to be ready for scoped providers\n useEffect(() => {\n // Check if disabled by any ancestor\n if (isDisabledByAncestor(providerId)) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[AnyclickProvider:${providerId}] Skipping - disabled by ancestor`,\n );\n }\n return;\n }\n\n // For scoped providers, wait until container is ready\n if (scoped && !containerReady) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[AnyclickProvider:${providerId}] Waiting for container to be ready`,\n {\n scoped,\n containerReady,\n },\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(`[AnyclickProvider:${providerId}] Creating client`, {\n scoped,\n containerReady,\n hasContainer: !!containerRef.current,\n effectiveDisabled,\n localThemeColors: localTheme.highlightConfig?.colors,\n });\n }\n\n const client = createFeedbackClient({\n adapter,\n targetFilter,\n maxInnerTextLength,\n maxOuterHTMLLength,\n maxAncestors,\n cooldownMs,\n stripAttributes,\n // For scoped providers, pass the container\n container: scoped ? containerRef.current : null,\n touchHoldDurationMs,\n touchMoveThreshold,\n });\n\n // Set up callbacks\n client.onSubmitSuccess = onSubmitSuccess;\n client.onSubmitError = onSubmitError;\n\n // Set up context menu handler\n client.onContextMenu = handleContextMenu;\n\n clientRef.current = client;\n\n // Attach event listeners if not disabled\n if (!effectiveDisabled) {\n client.attach();\n }\n\n return () => {\n client.detach();\n };\n }, [\n adapter,\n targetFilter,\n maxInnerTextLength,\n maxOuterHTMLLength,\n maxAncestors,\n cooldownMs,\n stripAttributes,\n onSubmitSuccess,\n onSubmitError,\n effectiveDisabled,\n scoped,\n containerReady,\n providerId,\n isDisabledByAncestor,\n handleContextMenu,\n touchHoldDurationMs,\n touchMoveThreshold,\n ]);\n\n // Submit feedback with optional screenshots\n const submitFeedback = useCallback(\n async (\n element: Element,\n type: FeedbackType,\n comment?: string,\n screenshots?: ScreenshotData,\n ) => {\n const client = clientRef.current;\n if (!client) return;\n\n setIsSubmitting(true);\n try {\n await client.submitFeedback(element, type, {\n comment,\n metadata,\n screenshots,\n });\n } finally {\n setIsSubmitting(false);\n setMenuVisible(false);\n setTargetElement(null);\n setContainerElement(null);\n }\n },\n [metadata],\n );\n\n // Open menu programmatically\n const openMenu = useCallback(\n (element: Element, position: { x: number; y: number }) => {\n setTargetElement(element);\n const mergedTheme = getMergedTheme(providerId);\n const container = findContainerParent(\n element,\n mergedTheme.highlightConfig ?? highlightConfig,\n );\n setContainerElement(container);\n setMenuPosition(position);\n setMenuVisible(true);\n },\n [providerId, getMergedTheme, highlightConfig],\n );\n\n // Close menu\n const closeMenu = useCallback(() => {\n setMenuVisible(false);\n setTargetElement(null);\n setContainerElement(null);\n }, []);\n\n // Handle menu selection\n const handleMenuSelect = useCallback(\n (type: FeedbackType, comment?: string, screenshots?: ScreenshotData) => {\n if (targetElement) {\n submitFeedback(targetElement, type, comment, screenshots);\n }\n },\n [targetElement, submitFeedback],\n );\n\n // Get merged theme for this provider\n // We use the store's getMergedTheme for inherited values (like highlightConfig),\n // but for this provider's own theme values, we use localTheme directly to avoid\n // timing issues with useMemo running before the provider is registered.\n const inheritedTheme = getMergedTheme(providerId);\n\n // Merge: inherited theme first, then local theme overrides\n const mergedTheme: AnyclickTheme = useMemo(\n () => ({\n ...inheritedTheme,\n ...localTheme,\n // Deep merge for nested configs\n highlightConfig: {\n ...inheritedTheme.highlightConfig,\n ...localTheme.highlightConfig,\n colors: {\n ...inheritedTheme.highlightConfig?.colors,\n ...localTheme.highlightConfig?.colors,\n },\n },\n screenshotConfig: {\n ...inheritedTheme.screenshotConfig,\n ...localTheme.screenshotConfig,\n },\n }),\n [inheritedTheme, localTheme],\n );\n\n // Apply merged theme styles\n const effectiveMenuStyle = mergedTheme.menuStyle ?? menuStyle;\n const effectiveMenuClassName = mergedTheme.menuClassName ?? menuClassName;\n\n // Debug: Log theme flow\n if (process.env.NODE_ENV === \"development\") {\n console.log(`[AnyclickProvider:${providerId}] Theme Debug`, {\n scoped,\n localThemeHasMenuStyle: !!localTheme.menuStyle,\n localThemeMenuStyleKeys: localTheme.menuStyle\n ? Object.keys(localTheme.menuStyle)\n : [],\n mergedThemeHasMenuStyle: !!mergedTheme.menuStyle,\n mergedThemeMenuStyleKeys: mergedTheme.menuStyle\n ? Object.keys(mergedTheme.menuStyle)\n : [],\n effectiveMenuStyleExists: !!effectiveMenuStyle,\n effectiveMenuStyleKeys: effectiveMenuStyle\n ? Object.keys(effectiveMenuStyle)\n : [],\n menuStyleProp: !!menuStyle,\n });\n }\n const effectiveHighlightConfig =\n mergedTheme.highlightConfig ?? highlightConfig;\n const effectiveScreenshotConfig =\n mergedTheme.screenshotConfig ?? screenshotConfig;\n\n // Context value\n const contextValue: AnyclickContextValue = useMemo(\n () => ({\n isEnabled: !effectiveDisabled && !isDisabledByAncestor(providerId),\n isSubmitting,\n submitFeedback,\n openMenu,\n closeMenu,\n theme: mergedTheme,\n scoped,\n providerId,\n }),\n [\n effectiveDisabled,\n providerId,\n isDisabledByAncestor,\n isSubmitting,\n submitFeedback,\n openMenu,\n closeMenu,\n mergedTheme,\n scoped,\n ],\n );\n\n // For scoped providers, wrap children in a container div\n const content = scoped ? (\n <div ref={setContainerRef} style={{ display: \"contents\" }}>\n {children}\n </div>\n ) : (\n children\n );\n\n return (\n <AnyclickContext.Provider value={contextValue}>\n {content}\n <ContextMenu\n visible={menuVisible && !effectiveDisabled}\n position={menuPosition}\n targetElement={targetElement}\n containerElement={containerElement}\n items={menuItems}\n onSelect={handleMenuSelect}\n onClose={closeMenu}\n isSubmitting={isSubmitting}\n style={effectiveMenuStyle}\n className={effectiveMenuClassName}\n highlightConfig={effectiveHighlightConfig}\n screenshotConfig={effectiveScreenshotConfig}\n />\n </AnyclickContext.Provider>\n );\n}\n\n/**\n * @deprecated Use AnyclickProvider instead\n */\nexport const FeedbackProvider = AnyclickProvider;\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { AnyclickContextValue } from \"./types\";\n\n/**\n * React context for anyclick functionality\n */\nexport const AnyclickContext = createContext<AnyclickContextValue | null>(null);\n\n/**\n * @deprecated Use AnyclickContext instead\n */\nexport const FeedbackContext = AnyclickContext;\n\n/**\n * Hook to access anyclick context\n * @throws Error if used outside of AnyclickProvider\n */\nexport function useAnyclick(): AnyclickContextValue {\n const context = useContext(AnyclickContext);\n if (!context) {\n throw new Error(\"useAnyclick must be used within an AnyclickProvider\");\n }\n return context;\n}\n\n/**\n * @deprecated Use useAnyclick instead\n */\nexport function useFeedback(): AnyclickContextValue {\n const context = useContext(AnyclickContext);\n if (!context) {\n throw new Error(\"useFeedback must be used within a FeedbackProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport type {\n ContextMenuProps,\n FeedbackMenuItem,\n MenuPositionMode,\n} from \"./types\";\nimport type { FeedbackType, ScreenshotData } from \"@ewjdev/anyclick-core\";\nimport {\n captureAllScreenshots,\n isScreenshotSupported,\n DEFAULT_SCREENSHOT_CONFIG,\n} from \"@ewjdev/anyclick-core\";\nimport { menuStyles } from \"./styles\";\nimport { applyHighlights, clearHighlights } from \"./highlight\";\nimport { ScreenshotPreview } from \"./ScreenshotPreview\";\nimport {\n FlagIcon,\n PlusIcon,\n ThumbsUpIcon,\n ChevronRightIcon,\n ChevronLeftIcon,\n CameraIcon,\n GripVertical,\n} from \"lucide-react\";\n\n/** Padding from viewport edges in pixels */\nconst VIEWPORT_PADDING = 10;\n\nconst screenshotIndicatorStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 12px\",\n fontSize: \"11px\",\n color: \"var(--anyclick-menu-text-muted, #9ca3af)\",\n borderTop: \"1px solid var(--anyclick-menu-border, #f3f4f6)\",\n marginTop: \"4px\",\n};\n\n/**\n * Default icons for feedback types\n */\nconst defaultIcons: Record<string, React.ReactNode> = {\n issue: <FlagIcon className=\"w-4 h-4\" />,\n feature: <PlusIcon className=\"w-4 h-4\" />,\n like: <ThumbsUpIcon className=\"w-4 h-4\" />,\n};\n\n/**\n * Menu item component with touch-friendly sizing\n */\nfunction MenuItem({\n item,\n onClick,\n disabled,\n hasChildren,\n}: {\n item: FeedbackMenuItem;\n onClick: () => void;\n disabled: boolean;\n hasChildren?: boolean;\n}) {\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onTouchStart={() => setIsPressed(true)}\n onTouchEnd={() => setIsPressed(false)}\n onTouchCancel={() => setIsPressed(false)}\n style={{\n ...menuStyles.item,\n // Apply hover/pressed state for both mouse and touch\n ...(isHovered || isPressed ? menuStyles.itemHover : {}),\n ...(disabled ? { opacity: 0.5, cursor: \"not-allowed\" } : {}),\n // Ensure minimum touch target size (44px is recommended)\n minHeight: \"44px\",\n // Prevent text selection on touch\n WebkitUserSelect: \"none\",\n userSelect: \"none\",\n // Prevent touch callout on iOS\n WebkitTouchCallout: \"none\",\n }}\n >\n <span style={menuStyles.itemIcon}>\n {item.icon ?? defaultIcons[item.type]}\n </span>\n <span style={{ flex: 1 }}>{item.label}</span>\n {hasChildren && (\n <ChevronRightIcon\n className=\"w-4 h-4\"\n style={{ marginLeft: \"auto\", opacity: 0.5 }}\n />\n )}\n </button>\n );\n}\n\n/**\n * Back button for submenu navigation with touch-friendly sizing\n */\nfunction BackButton({ onClick }: { onClick: () => void }) {\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onTouchStart={() => setIsPressed(true)}\n onTouchEnd={() => setIsPressed(false)}\n onTouchCancel={() => setIsPressed(false)}\n style={{\n ...menuStyles.item,\n ...(isHovered || isPressed ? menuStyles.itemHover : {}),\n borderBottom: \"1px solid #e5e5e5\",\n marginBottom: \"4px\",\n // Ensure minimum touch target size\n minHeight: \"44px\",\n // Prevent text selection on touch\n WebkitUserSelect: \"none\",\n userSelect: \"none\",\n WebkitTouchCallout: \"none\",\n }}\n >\n <ChevronLeftIcon className=\"w-4 h-4\" style={{ opacity: 0.5 }} />\n <span style={{ opacity: 0.7 }}>Back</span>\n </button>\n );\n}\n\n/**\n * Comment form component\n */\nfunction CommentForm({\n onSubmit,\n onCancel,\n isSubmitting,\n}: {\n onSubmit: (comment: string) => void;\n onCancel: () => void;\n isSubmitting: boolean;\n}) {\n const [comment, setComment] = useState(\"\");\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleSubmit = () => {\n onSubmit(comment);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n handleSubmit();\n } else if (e.key === \"Escape\") {\n onCancel();\n }\n };\n\n return (\n <div style={menuStyles.commentSection}>\n <textarea\n ref={inputRef}\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add a comment (optional)...\"\n style={menuStyles.commentInput}\n disabled={isSubmitting}\n />\n <div style={menuStyles.buttonRow}>\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isSubmitting}\n style={{ ...menuStyles.button, ...menuStyles.cancelButton }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting}\n style={{\n ...menuStyles.button,\n ...menuStyles.submitButton,\n ...(isSubmitting ? menuStyles.submitButtonDisabled : {}),\n }}\n >\n {isSubmitting ? \"Sending...\" : \"Send\"}\n </button>\n </div>\n </div>\n );\n}\n\n/** View states for the context menu */\ntype MenuView = \"menu\" | \"comment\" | \"screenshot-preview\";\n\n/**\n * Calculate adjusted position to keep menu in viewport\n */\nfunction calculateInViewPosition(\n requestedX: number,\n requestedY: number,\n menuWidth: number,\n menuHeight: number,\n): { x: number; y: number } {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let x = requestedX;\n let y = requestedY;\n\n // Adjust X if menu would go off the right edge\n if (x + menuWidth > viewportWidth - VIEWPORT_PADDING) {\n x = viewportWidth - menuWidth - VIEWPORT_PADDING;\n }\n // Ensure X doesn't go off the left edge\n if (x < VIEWPORT_PADDING) {\n x = VIEWPORT_PADDING;\n }\n\n // Adjust Y if menu would go off the bottom edge\n if (y + menuHeight > viewportHeight - VIEWPORT_PADDING) {\n y = viewportHeight - menuHeight - VIEWPORT_PADDING;\n }\n // Ensure Y doesn't go off the top edge\n if (y < VIEWPORT_PADDING) {\n y = VIEWPORT_PADDING;\n }\n\n return { x, y };\n}\n\n/**\n * Context menu component for selecting feedback type\n */\nexport function ContextMenu({\n visible,\n position,\n targetElement,\n containerElement,\n items,\n onSelect,\n onClose,\n isSubmitting,\n style,\n className,\n highlightConfig,\n screenshotConfig,\n positionMode = \"inView\",\n}: ContextMenuProps) {\n const [selectedType, setSelectedType] = useState<FeedbackType | null>(null);\n const [currentView, setCurrentView] = useState<MenuView>(\"menu\");\n const [pendingComment, setPendingComment] = useState<string | undefined>();\n const [submenuStack, setSubmenuStack] = useState<FeedbackMenuItem[][]>([]);\n const [screenshots, setScreenshots] = useState<ScreenshotData | null>(null);\n const [isCapturing, setIsCapturing] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Position state for different modes\n const [adjustedPosition, setAdjustedPosition] = useState<{\n x: number;\n y: number;\n }>(position);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState<{ x: number; y: number }>({\n x: 0,\n y: 0,\n });\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n\n // Merge screenshot config with defaults\n const mergedScreenshotConfig = {\n ...DEFAULT_SCREENSHOT_CONFIG,\n ...screenshotConfig,\n };\n\n const showPreview =\n mergedScreenshotConfig.showPreview && isScreenshotSupported();\n\n // Current items to display (either root items or submenu items)\n const currentItems =\n submenuStack.length > 0 ? submenuStack[submenuStack.length - 1] : items;\n\n // Capture screenshots\n const captureScreenshots = useCallback(async () => {\n if (!targetElement || !showPreview) return;\n\n setIsCapturing(true);\n try {\n const captured = await captureAllScreenshots(\n targetElement,\n containerElement,\n mergedScreenshotConfig,\n );\n setScreenshots(captured);\n } catch (error) {\n console.error(\"Failed to capture screenshots:\", error);\n setScreenshots(null);\n } finally {\n setIsCapturing(false);\n }\n }, [targetElement, containerElement, mergedScreenshotConfig, showPreview]);\n\n // Reset state when menu closes\n useEffect(() => {\n if (!visible) {\n setSelectedType(null);\n setCurrentView(\"menu\");\n setPendingComment(undefined);\n setSubmenuStack([]);\n setScreenshots(null);\n setIsCapturing(false);\n setIsDragging(false);\n setDragOffset({ x: 0, y: 0 });\n dragStartRef.current = null;\n }\n }, [visible]);\n\n // Apply highlights to target element and container when menu opens\n useEffect(() => {\n if (visible && targetElement) {\n // Clear any existing highlights first to ensure clean state\n clearHighlights();\n // Apply highlights to the new target element\n applyHighlights(targetElement, highlightConfig);\n } else {\n // Clear highlights when menu is not visible\n clearHighlights();\n }\n\n return () => {\n clearHighlights();\n };\n }, [visible, targetElement, highlightConfig]);\n\n // Close menu when clicking outside of it\n useEffect(() => {\n if (!visible) {\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!menuRef.current) return;\n\n const target = event.target as Node;\n // Don't close if clicking on the drag handle\n if ((target as HTMLElement).closest?.(\"[data-drag-handle]\")) {\n return;\n }\n if (!menuRef.current.contains(target)) {\n onClose();\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [visible, onClose]);\n\n // Reset adjusted position when menu opens at new position\n useEffect(() => {\n if (visible) {\n setAdjustedPosition(position);\n setDragOffset({ x: 0, y: 0 });\n }\n }, [visible, position.x, position.y]);\n\n // Calculate and apply position based on mode\n useEffect(() => {\n if (!visible || !menuRef.current) return;\n\n const updatePosition = () => {\n const menuElement = menuRef.current;\n if (!menuElement) return;\n\n const rect = menuElement.getBoundingClientRect();\n const baseX = position.x + dragOffset.x;\n const baseY = position.y + dragOffset.y;\n\n if (positionMode === \"static\") {\n // Static mode: use position directly (may go off-screen)\n setAdjustedPosition({ x: baseX, y: baseY });\n } else if (positionMode === \"inView\" || positionMode === \"dynamic\") {\n // inView and dynamic: keep menu in viewport\n const adjusted = calculateInViewPosition(\n baseX,\n baseY,\n rect.width,\n rect.height,\n );\n setAdjustedPosition(adjusted);\n }\n };\n\n // Initial calculation after render\n requestAnimationFrame(updatePosition);\n\n // Recalculate on resize\n window.addEventListener(\"resize\", updatePosition);\n return () => window.removeEventListener(\"resize\", updatePosition);\n }, [visible, position, positionMode, dragOffset, currentView]);\n\n // Dragging logic for dynamic mode\n useEffect(() => {\n if (!visible || positionMode !== \"dynamic\") return;\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!isDragging || !dragStartRef.current) return;\n\n const deltaX = event.clientX - dragStartRef.current.x;\n const deltaY = event.clientY - dragStartRef.current.y;\n\n setDragOffset((prev) => ({\n x: prev.x + deltaX,\n y: prev.y + deltaY,\n }));\n\n dragStartRef.current = { x: event.clientX, y: event.clientY };\n };\n\n const handlePointerUp = () => {\n setIsDragging(false);\n dragStartRef.current = null;\n };\n\n if (isDragging) {\n document.addEventListener(\"pointermove\", handlePointerMove);\n document.addEventListener(\"pointerup\", handlePointerUp);\n document.addEventListener(\"pointercancel\", handlePointerUp);\n\n return () => {\n document.removeEventListener(\"pointermove\", handlePointerMove);\n document.removeEventListener(\"pointerup\", handlePointerUp);\n document.removeEventListener(\"pointercancel\", handlePointerUp);\n };\n }\n }, [visible, positionMode, isDragging]);\n\n // Handle drag start\n const handleDragStart = useCallback(\n (event: React.PointerEvent) => {\n if (positionMode !== \"dynamic\") return;\n event.preventDefault();\n setIsDragging(true);\n dragStartRef.current = { x: event.clientX, y: event.clientY };\n },\n [positionMode],\n );\n\n // Handle escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (currentView === \"screenshot-preview\") {\n setCurrentView(\"comment\");\n } else if (currentView === \"comment\") {\n setCurrentView(\"menu\");\n setSelectedType(null);\n setPendingComment(undefined);\n } else if (submenuStack.length > 0) {\n // Go back one level in submenu\n setSubmenuStack((prev) => prev.slice(0, -1));\n } else {\n onClose();\n }\n }\n };\n\n if (visible) {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }\n }, [visible, currentView, submenuStack.length, onClose]);\n\n // Prevent touch default behaviors on menu container\n useEffect(() => {\n const menuElement = menuRef.current;\n if (!visible || !menuElement) return;\n\n // Prevent touch scrolling and other default behaviors within the menu\n const preventTouchDefault = (e: TouchEvent) => {\n // Allow touches within interactive elements (inputs, textareas)\n const target = e.target as HTMLElement;\n if (\n target.tagName === \"TEXTAREA\" ||\n target.tagName === \"INPUT\" ||\n target.isContentEditable\n ) {\n return;\n }\n // Prevent default to stop scroll/zoom behaviors\n e.preventDefault();\n };\n\n menuElement.addEventListener(\"touchmove\", preventTouchDefault, {\n passive: false,\n });\n\n return () => {\n menuElement.removeEventListener(\"touchmove\", preventTouchDefault);\n };\n }, [visible]);\n\n if (!visible || !targetElement) {\n return null;\n }\n\n const handleItemClick = (item: FeedbackMenuItem) => {\n // If item has children, navigate to submenu\n if (item.children && item.children.length > 0) {\n setSubmenuStack((prev) => [...prev, item.children!]);\n return;\n }\n\n // Otherwise, handle selection\n if (item.showComment) {\n setSelectedType(item.type);\n setCurrentView(\"comment\");\n } else {\n // If preview is enabled, capture and show preview\n if (showPreview) {\n setSelectedType(item.type);\n setCurrentView(\"screenshot-preview\");\n captureScreenshots();\n } else {\n onSelect(item.type);\n }\n }\n };\n\n const handleBack = () => {\n setSubmenuStack((prev) => prev.slice(0, -1));\n };\n\n const handleCommentSubmit = (comment: string) => {\n if (!selectedType) return;\n\n // If preview is enabled, capture and show preview\n if (showPreview) {\n setPendingComment(comment || undefined);\n setCurrentView(\"screenshot-preview\");\n captureScreenshots();\n } else {\n onSelect(selectedType, comment || undefined);\n }\n };\n\n const handleCommentCancel = () => {\n setCurrentView(\"menu\");\n setSelectedType(null);\n setPendingComment(undefined);\n };\n\n const handleScreenshotConfirm = (confirmedScreenshots: ScreenshotData) => {\n if (selectedType) {\n onSelect(selectedType, pendingComment, confirmedScreenshots);\n }\n };\n\n const handleScreenshotCancel = () => {\n // Go back to comment or menu\n if (pendingComment !== undefined) {\n setCurrentView(\"comment\");\n } else {\n setCurrentView(\"menu\");\n setSelectedType(null);\n }\n setScreenshots(null);\n };\n\n const handleRetakeScreenshots = () => {\n captureScreenshots();\n };\n\n // Determine container width based on view\n const containerWidth = currentView === \"screenshot-preview\" ? 360 : undefined;\n\n // Debug: Log received style\n if (process.env.NODE_ENV === \"development\" && visible) {\n console.log(\"[ContextMenu] Style Debug\", {\n styleExists: !!style,\n styleKeys: style ? Object.keys(style) : [],\n styleValues: style,\n className,\n });\n }\n\n return (\n <div\n ref={menuRef}\n className={className}\n style={{\n ...menuStyles.container,\n left: adjustedPosition.x,\n top: adjustedPosition.y,\n ...(containerWidth\n ? { width: containerWidth, minWidth: containerWidth }\n : {}),\n // Touch-specific styles\n WebkitUserSelect: \"none\",\n userSelect: \"none\",\n WebkitTouchCallout: \"none\",\n touchAction: \"none\", // Prevent default touch behaviors\n // Cursor style for dragging\n ...(isDragging ? { cursor: \"grabbing\" } : {}),\n ...style,\n }}\n role=\"menu\"\n aria-label=\"Feedback options\"\n >\n {/* Header with optional drag handle */}\n {currentView !== \"screenshot-preview\" && (\n <div\n style={{\n ...menuStyles.header,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <span>Send Feedback</span>\n {positionMode === \"dynamic\" && (\n <div\n data-drag-handle\n onPointerDown={handleDragStart}\n style={{\n cursor: isDragging ? \"grabbing\" : \"grab\",\n padding: \"4px\",\n marginRight: \"-4px\",\n borderRadius: \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n opacity: 0.5,\n transition: \"opacity 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.opacity = \"0.5\";\n }}\n title=\"Drag to move\"\n >\n <GripVertical className=\"w-4 h-4\" />\n </div>\n )}\n </div>\n )}\n\n {currentView === \"menu\" && (\n <div style={menuStyles.itemList}>\n {submenuStack.length > 0 && <BackButton onClick={handleBack} />}\n {currentItems.map((item) => (\n <MenuItem\n key={item.type}\n item={item}\n onClick={() => handleItemClick(item)}\n disabled={isSubmitting}\n hasChildren={item.children && item.children.length > 0}\n />\n ))}\n {showPreview && (\n <div style={screenshotIndicatorStyle}>\n <CameraIcon className=\"w-3 h-3\" />\n <span>Screenshots will be captured</span>\n </div>\n )}\n </div>\n )}\n\n {currentView === \"comment\" && (\n <CommentForm\n onSubmit={handleCommentSubmit}\n onCancel={handleCommentCancel}\n isSubmitting={isSubmitting}\n />\n )}\n\n {currentView === \"screenshot-preview\" && (\n <ScreenshotPreview\n screenshots={screenshots}\n isLoading={isCapturing}\n onConfirm={handleScreenshotConfirm}\n onCancel={handleScreenshotCancel}\n onRetake={handleRetakeScreenshots}\n isSubmitting={isSubmitting}\n />\n )}\n </div>\n );\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * CSS custom properties for menu theming.\n * These can be overridden via the `style` prop on AnyclickProvider.\n *\n * Example:\n * ```tsx\n * <AnyclickProvider\n * theme={{\n * menuStyle: {\n * '--anyclick-menu-bg': 'rgba(0, 0, 0, 0.9)',\n * '--anyclick-menu-text': '#ffffff',\n * '--anyclick-menu-border': 'rgba(255, 255, 255, 0.1)',\n * '--anyclick-menu-hover': 'rgba(255, 255, 255, 0.1)',\n * '--anyclick-menu-accent': '#f59e0b',\n * }\n * }}\n * />\n * ```\n */\nexport const menuCSSVariables = {\n // Background colors\n \"--anyclick-menu-bg\": \"#ffffff\",\n \"--anyclick-menu-hover\": \"#f5f5f5\",\n // Text colors\n \"--anyclick-menu-text\": \"#333333\",\n \"--anyclick-menu-text-muted\": \"#666666\",\n // Border colors\n \"--anyclick-menu-border\": \"#e5e5e5\",\n // Accent/action colors\n \"--anyclick-menu-accent\": \"#0066cc\",\n \"--anyclick-menu-accent-text\": \"#ffffff\",\n // Input colors\n \"--anyclick-menu-input-bg\": \"#ffffff\",\n \"--anyclick-menu-input-border\": \"#dddddd\",\n // Cancel button\n \"--anyclick-menu-cancel-bg\": \"#f0f0f0\",\n \"--anyclick-menu-cancel-text\": \"#666666\",\n} as const;\n\nexport const menuStyles: Record<string, CSSProperties> = {\n overlay: {\n position: \"fixed\",\n inset: 0,\n zIndex: 9998,\n },\n container: {\n position: \"fixed\",\n zIndex: 9999,\n minWidth: \"200px\",\n backgroundColor: \"var(--anyclick-menu-bg, #ffffff)\",\n borderRadius: \"8px\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.05)\",\n overflow: \"hidden\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: \"14px\",\n // Set default CSS variables\n ...menuCSSVariables,\n },\n header: {\n padding: \"12px 16px\",\n borderBottom: \"1px solid var(--anyclick-menu-border, #e5e5e5)\",\n color: \"var(--anyclick-menu-text-muted, #666)\",\n fontSize: \"12px\",\n fontWeight: 500,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.5px\",\n },\n itemList: {\n padding: \"4px 0\",\n },\n item: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n padding: \"10px 16px\",\n cursor: \"pointer\",\n transition: \"background-color 0.15s\",\n color: \"var(--anyclick-menu-text, #333)\",\n border: \"none\",\n backgroundColor: \"transparent\",\n width: \"100%\",\n textAlign: \"left\" as const,\n fontSize: \"14px\",\n },\n itemHover: {\n backgroundColor: \"var(--anyclick-menu-hover, #f5f5f5)\",\n },\n itemIcon: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"20px\",\n height: \"20px\",\n fontSize: \"16px\",\n },\n commentSection: {\n padding: \"12px 16px\",\n borderTop: \"1px solid var(--anyclick-menu-border, #e5e5e5)\",\n },\n commentInput: {\n width: \"100%\",\n minHeight: \"60px\",\n padding: \"8px 12px\",\n border: \"1px solid var(--anyclick-menu-input-border, #ddd)\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n resize: \"vertical\" as const,\n outline: \"none\",\n boxSizing: \"border-box\" as const,\n backgroundColor: \"var(--anyclick-menu-input-bg, #ffffff)\",\n color: \"var(--anyclick-menu-text, #333)\",\n },\n buttonRow: {\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n marginTop: \"8px\",\n },\n button: {\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"background-color 0.15s, opacity 0.15s\",\n border: \"none\",\n },\n cancelButton: {\n backgroundColor: \"var(--anyclick-menu-cancel-bg, #f0f0f0)\",\n color: \"var(--anyclick-menu-cancel-text, #666)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"2px\",\n },\n submitButton: {\n backgroundColor: \"var(--anyclick-menu-accent, #0066cc)\",\n color: \"var(--anyclick-menu-accent-text, #ffffff)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"2px\",\n },\n submitButtonDisabled: {\n opacity: 0.6,\n cursor: \"not-allowed\",\n },\n};\n\n// Dark mode styles\nexport const darkMenuStyles: Record<string, CSSProperties> = {\n container: {\n ...menuStyles.container,\n backgroundColor: \"#1a1a1a\",\n boxShadow:\n \"0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.1)\",\n },\n header: {\n ...menuStyles.header,\n borderBottom: \"1px solid #333\",\n color: \"#888\",\n },\n item: {\n ...menuStyles.item,\n color: \"#e0e0e0\",\n },\n itemHover: {\n backgroundColor: \"#2a2a2a\",\n },\n commentSection: {\n ...menuStyles.commentSection,\n borderTop: \"1px solid #333\",\n },\n commentInput: {\n ...menuStyles.commentInput,\n backgroundColor: \"#2a2a2a\",\n border: \"1px solid #444\",\n color: \"#e0e0e0\",\n },\n cancelButton: {\n ...menuStyles.cancelButton,\n backgroundColor: \"#333\",\n color: \"#ccc\",\n },\n};\n\nexport const screenshotPreviewStyles: Record<string, React.CSSProperties> = {\n container: {\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n },\n containerExpanded: {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"90vw\",\n maxWidth: \"800px\",\n maxHeight: \"90vh\",\n backgroundColor: \"#fff\",\n borderRadius: \"12px\",\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\",\n padding: \"16px\",\n zIndex: 10000,\n },\n loadingContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"12px\",\n padding: \"24px\",\n },\n loadingText: {\n fontSize: \"13px\",\n color: \"#6b7280\",\n },\n emptyContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n padding: \"24px\",\n },\n emptyText: {\n fontSize: \"13px\",\n color: \"#6b7280\",\n fontWeight: \"500\",\n },\n emptySubtext: {\n fontSize: \"11px\",\n color: \"#9ca3af\",\n textAlign: \"center\" as const,\n },\n emptyActions: {\n display: \"flex\",\n gap: \"8px\",\n marginTop: \"8px\",\n },\n retakeButtonOutline: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 12px\",\n fontSize: \"12px\",\n color: \"#6b7280\",\n backgroundColor: \"transparent\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n },\n continueButton: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 12px\",\n fontSize: \"12px\",\n color: \"#fff\",\n backgroundColor: \"#3b82f6\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n fontWeight: \"500\",\n },\n header: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"0 4px\",\n },\n headerTitle: {\n fontSize: \"12px\",\n fontWeight: \"600\",\n color: \"#374151\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n },\n headerActions: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n sizeLabel: {\n fontSize: \"11px\",\n color: \"#9ca3af\",\n },\n iconButton: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"24px\",\n height: \"24px\",\n border: \"none\",\n backgroundColor: \"transparent\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n color: \"#6b7280\",\n },\n tabContainer: {\n display: \"flex\",\n gap: \"4px\",\n borderBottom: \"1px solid #e5e7eb\",\n paddingBottom: \"8px\",\n },\n tab: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"2px 5px\",\n fontSize: \"12px\",\n color: \"#6b7280\",\n backgroundColor: \"transparent\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n },\n tabActive: {\n backgroundColor: \"#eff6ff\",\n color: \"#3b82f6\",\n fontWeight: \"500\",\n },\n tabError: {\n color: \"#ef4444\",\n },\n tabSize: {\n fontSize: \"10px\",\n color: \"#9ca3af\",\n },\n previewContainer: {\n position: \"relative\",\n width: \"100%\",\n height: \"150px\",\n backgroundColor: \"#f9fafb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n previewContainerExpanded: {\n height: \"60vh\",\n maxHeight: \"500px\",\n },\n previewImage: {\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n objectFit: \"contain\",\n },\n noPreview: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"8px\",\n fontSize: \"12px\",\n color: \"#9ca3af\",\n },\n errorPreview: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n padding: \"16px\",\n textAlign: \"center\" as const,\n },\n errorTitle: {\n fontSize: \"14px\",\n fontWeight: \"600\",\n color: \"#ef4444\",\n },\n errorMessage: {\n fontSize: \"12px\",\n color: \"#6b7280\",\n maxWidth: \"250px\",\n lineHeight: \"1.4\",\n },\n dimensionsInfo: {\n fontSize: \"11px\",\n color: \"#9ca3af\",\n textAlign: \"center\" as const,\n },\n actions: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n paddingTop: \"8px\",\n borderTop: \"1px solid #e5e7eb\",\n },\n actionsRight: {\n display: \"flex\",\n gap: \"8px\",\n },\n retakeButton: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 16px\",\n fontSize: \"13px\",\n color: \"#fff\",\n backgroundColor: \"#3b82f6\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n fontWeight: \"500\",\n },\n retakeButtonSmall: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"4px 8px\",\n fontSize: \"11px\",\n color: \"#6b7280\",\n backgroundColor: \"transparent\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n },\n};\n","/**\n * Highlight utilities for feedback target elements\n */\n\nimport type { HighlightConfig, HighlightColors } from \"./types\";\n\nconst HIGHLIGHT_TARGET_CLASS = \"uifeedback-highlight-target\";\nconst HIGHLIGHT_CONTAINER_CLASS = \"uifeedback-highlight-container\";\nconst STYLE_ID = \"uifeedback-highlight-styles\";\n\n/**\n * Default highlight colors\n */\nexport const defaultHighlightColors: Required<HighlightColors> = {\n targetColor: \"#3b82f6\",\n containerColor: \"#8b5cf6\",\n targetShadowOpacity: 0.25,\n containerShadowOpacity: 0.1,\n};\n\n/**\n * Default container selectors\n */\nexport const defaultContainerSelectors: string[] = [\n \".container\",\n \".card\",\n \".panel\",\n \".section\",\n \".wrapper\",\n \".box\",\n \".modal\",\n \".dialog\",\n \".drawer\",\n '[role=\"dialog\"]',\n '[role=\"region\"]',\n '[role=\"article\"]',\n '[role=\"main\"]',\n \"article\",\n \"section\",\n \"main\",\n \"aside\",\n \"nav\",\n \"header\",\n \"footer\",\n];\n\n/**\n * Generate CSS for highlight effects based on configuration\n */\nfunction generateHighlightCSS(colors: Required<HighlightColors>): string {\n const {\n targetColor,\n containerColor,\n targetShadowOpacity,\n containerShadowOpacity,\n } = colors;\n\n // Convert hex to rgba for shadows\n const hexToRgba = (hex: string, alpha: number): string => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return `rgba(0, 0, 0, ${alpha})`;\n return `rgba(${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)}, ${alpha})`;\n };\n\n return `\n.${HIGHLIGHT_TARGET_CLASS} {\n outline: 2px dashed ${targetColor} !important;\n outline-offset: 2px !important;\n box-shadow: 0 0 0 4px ${hexToRgba(targetColor, targetShadowOpacity)}, 0 4px 12px ${hexToRgba(targetColor, targetShadowOpacity * 0.6)} !important;\n border-radius: 4px !important;\n position: relative;\n z-index: 9997;\n}\n\n.${HIGHLIGHT_CONTAINER_CLASS} {\n outline: 2px dashed ${hexToRgba(containerColor, 0.6)} !important;\n outline-offset: 4px !important;\n box-shadow: 0 0 0 6px ${hexToRgba(containerColor, containerShadowOpacity)} !important;\n border-radius: 6px !important;\n position: relative;\n z-index: 9996;\n}\n`;\n}\n\n/**\n * Inject or update highlight styles in document head\n */\nfunction injectStyles(colors: Required<HighlightColors>): void {\n if (typeof document === \"undefined\") return;\n\n // Remove existing styles if present\n const existingStyle = document.getElementById(STYLE_ID);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = generateHighlightCSS(colors);\n document.head.appendChild(style);\n}\n\n/**\n * Find the closest container parent element\n */\nexport function findContainerParent(\n element: Element,\n config?: HighlightConfig,\n): Element | null {\n const containerSelectors =\n config?.containerSelectors ?? defaultContainerSelectors;\n const minChildren = config?.minChildrenForContainer ?? 2;\n\n let current = element.parentElement;\n let fallbackContainer: Element | null = null;\n\n while (current && current !== document.body) {\n // Check if element matches any container selector\n for (const selector of containerSelectors) {\n try {\n if (current.matches(selector)) {\n return current;\n }\n } catch {\n // Invalid selector, skip\n }\n }\n\n // Check if parent has multiple meaningful children (not just text nodes)\n const meaningfulChildren = Array.from(current.children).filter((child) => {\n const tag = child.tagName.toLowerCase();\n // Exclude script, style, and hidden elements\n if (tag === \"script\" || tag === \"style\" || tag === \"noscript\") {\n return false;\n }\n // Check if element is visible\n const style = window.getComputedStyle(child);\n if (style.display === \"none\" || style.visibility === \"hidden\") {\n return false;\n }\n return true;\n });\n\n // If this parent has enough children, it's likely a container\n if (meaningfulChildren.length >= minChildren && !fallbackContainer) {\n fallbackContainer = current;\n }\n\n // If parent has 3+ children, strongly consider it a container\n if (meaningfulChildren.length >= 3) {\n return current;\n }\n\n current = current.parentElement;\n }\n\n return fallbackContainer;\n}\n\n/**\n * Apply highlight to target element\n */\nexport function highlightTarget(\n element: Element,\n colors?: HighlightColors,\n): void {\n const mergedColors = { ...defaultHighlightColors, ...colors };\n injectStyles(mergedColors);\n element.classList.add(HIGHLIGHT_TARGET_CLASS);\n}\n\n/**\n * Apply highlight to container element\n */\nexport function highlightContainer(\n element: Element,\n colors?: HighlightColors,\n): void {\n const mergedColors = { ...defaultHighlightColors, ...colors };\n injectStyles(mergedColors);\n element.classList.add(HIGHLIGHT_CONTAINER_CLASS);\n}\n\n/**\n * Remove all highlights from the document\n */\nexport function clearHighlights(): void {\n if (typeof document === \"undefined\") return;\n\n document.querySelectorAll(`.${HIGHLIGHT_TARGET_CLASS}`).forEach((el) => {\n el.classList.remove(HIGHLIGHT_TARGET_CLASS);\n });\n\n document.querySelectorAll(`.${HIGHLIGHT_CONTAINER_CLASS}`).forEach((el) => {\n el.classList.remove(HIGHLIGHT_CONTAINER_CLASS);\n });\n}\n\n/**\n * Apply highlights to target element and its container parent\n */\nexport function applyHighlights(\n targetElement: Element,\n config?: HighlightConfig,\n): {\n target: Element;\n container: Element | null;\n} {\n // If highlights are disabled, don't apply anything\n if (config?.enabled === false) {\n return { target: targetElement, container: null };\n }\n\n clearHighlights();\n\n const colors = { ...defaultHighlightColors, ...config?.colors };\n\n highlightTarget(targetElement, colors);\n\n const container = findContainerParent(targetElement, config);\n if (container && container !== targetElement) {\n highlightContainer(container, colors);\n }\n\n return { target: targetElement, container };\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport type { ScreenshotData, ScreenshotError } from \"@ewjdev/anyclick-core\";\nimport { formatBytes, estimateTotalSize } from \"@ewjdev/anyclick-core\";\nimport type { ScreenshotPreviewProps } from \"./types\";\nimport { menuStyles } from \"./styles\";\nimport { screenshotPreviewStyles as styles } from \"./styles\";\nimport {\n ImageIcon,\n RefreshCwIcon,\n CheckIcon,\n XIcon,\n Loader2Icon,\n ExpandIcon,\n ShrinkIcon,\n AlertCircleIcon,\n} from \"lucide-react\";\n\ntype TabType = \"element\" | \"container\" | \"viewport\";\n\n/**\n * Screenshot preview component - shows captured screenshots before sending\n */\nexport function ScreenshotPreview({\n screenshots,\n isLoading,\n onConfirm,\n onCancel,\n onRetake,\n isSubmitting,\n}: ScreenshotPreviewProps) {\n const [activeTab, setActiveTab] = useState<TabType>(\"element\");\n const [isExpanded, setIsExpanded] = useState(false);\n\n if (isLoading) {\n return (\n <div style={styles.container}>\n <div style={styles.loadingContainer}>\n <Loader2Icon\n className=\"w-6 h-6 animate-spin\"\n style={{ color: \"#3b82f6\" }}\n />\n <span style={styles.loadingText}>Capturing screenshots...</span>\n </div>\n </div>\n );\n }\n\n if (!screenshots) {\n return (\n <div style={styles.container}>\n <div style={styles.emptyContainer}>\n <ImageIcon className=\"w-8 h-8\" style={{ color: \"#9ca3af\" }} />\n <span style={styles.emptyText}>Screenshots unavailable</span>\n <span style={styles.emptySubtext}>\n Some elements can&apos;t be captured (e.g., gradient text)\n </span>\n <div style={styles.emptyActions}>\n <button\n type=\"button\"\n onClick={onRetake}\n style={styles.retakeButtonOutline}\n disabled={isSubmitting}\n >\n <RefreshCwIcon className=\"w-4 h-4\" />\n Try Again\n </button>\n <button\n type=\"button\"\n onClick={() =>\n onConfirm({ capturedAt: new Date().toISOString() })\n }\n style={styles.continueButton}\n disabled={isSubmitting}\n >\n <CheckIcon className=\"w-4 h-4\" />\n Continue Without\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Get error for a specific tab\n const getError = (key: TabType): ScreenshotError | undefined => {\n return screenshots.errors?.[key];\n };\n\n const allTabs: {\n key: TabType;\n label: string;\n data: typeof screenshots.element;\n error?: ScreenshotError;\n }[] = [\n {\n key: \"element\" as const,\n label: \"Element\",\n data: screenshots.element,\n error: getError(\"element\"),\n },\n {\n key: \"container\" as const,\n label: \"Container\",\n data: screenshots.container,\n error: getError(\"container\"),\n },\n {\n key: \"viewport\" as const,\n label: \"Viewport\",\n data: screenshots.viewport,\n error: getError(\"viewport\"),\n },\n ];\n // Show tabs that have either data or errors\n const tabs = allTabs.filter((tab) => tab.data || tab.error);\n\n const activeScreenshot =\n activeTab === \"element\"\n ? screenshots.element\n : activeTab === \"container\"\n ? screenshots.container\n : screenshots.viewport;\n\n const activeError = getError(activeTab);\n\n const totalSize = estimateTotalSize(screenshots);\n\n console.log({ styles });\n\n return (\n <div\n style={{\n ...styles.container,\n ...(isExpanded ? styles.containerExpanded : {}),\n padding: \"8px\",\n }}\n >\n <div style={styles.header}>\n <span style={styles.headerTitle}>Review Screenshots</span>\n <div style={styles.headerActions}>\n <span style={styles.sizeLabel}>{formatBytes(totalSize)}</span>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n style={styles.iconButton}\n title={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n {isExpanded ? (\n <ShrinkIcon className=\"w-4 h-4\" />\n ) : (\n <ExpandIcon className=\"w-4 h-4\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Tabs */}\n <div style={styles.tabContainer}>\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n style={{\n ...styles.tab,\n ...(activeTab === tab.key ? styles.tabActive : {}),\n ...(tab.error && !tab.data ? styles.tabError : {}),\n }}\n >\n {tab.error && !tab.data && (\n <AlertCircleIcon\n className=\"w-3 h-3\"\n style={{ color: \"#ef4444\" }}\n />\n )}\n {tab.label}\n {tab.data && (\n <span style={styles.tabSize}>\n {formatBytes(tab.data.sizeBytes)}\n </span>\n )}\n </button>\n ))}\n </div>\n\n {/* Preview image */}\n <div\n style={{\n ...styles.previewContainer,\n ...(isExpanded ? styles.previewContainerExpanded : {}),\n }}\n >\n {activeScreenshot ? (\n <img\n src={activeScreenshot.dataUrl}\n alt={`${activeTab} screenshot`}\n style={styles.previewImage}\n />\n ) : activeError ? (\n <div style={styles.errorPreview}>\n <AlertCircleIcon className=\"w-8 h-8\" style={{ color: \"#ef4444\" }} />\n <span style={styles.errorTitle}>Capture Failed</span>\n <span style={styles.errorMessage}>{activeError.message}</span>\n </div>\n ) : (\n <div style={styles.noPreview}>\n <ImageIcon className=\"w-6 h-6\" style={{ color: \"#9ca3af\" }} />\n <span>No {activeTab} screenshot</span>\n </div>\n )}\n </div>\n\n {/* Dimensions info */}\n {activeScreenshot && (\n <div style={styles.dimensionsInfo}>\n {activeScreenshot.width} × {activeScreenshot.height}px\n </div>\n )}\n\n {/* Actions */}\n <div style={styles.actions}>\n <button\n type=\"button\"\n onClick={onRetake}\n disabled={isSubmitting}\n style={styles.retakeButtonSmall}\n >\n <RefreshCwIcon className=\"w-3 h-3\" />\n Retake\n </button>\n <div style={styles.actionsRight}>\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isSubmitting}\n className=\"flex items-center gap-1\"\n style={{ ...menuStyles.button, ...menuStyles.cancelButton }}\n >\n <XIcon className=\"w-3 h-3\" />\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => onConfirm(screenshots)}\n disabled={isSubmitting}\n style={{\n ...menuStyles.button,\n ...menuStyles.submitButton,\n ...(isSubmitting ? menuStyles.submitButtonDisabled : {}),\n }}\n >\n {isSubmitting ? (\n <>\n <Loader2Icon className=\"w-3 h-3 animate-spin\" />\n Sending...\n </>\n ) : (\n <>\n <CheckIcon className=\"w-3 h-3\" />\n Send\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z',\n key: '18u6gg',\n },\n ],\n ['circle', { cx: '12', cy: '13', r: '3', key: '1vg3eu' }],\n];\n\n/**\n * @component @name Camera\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTMuOTk3IDRhMiAyIDAgMCAxIDEuNzYgMS4wNWwuNDg2LjlBMiAyIDAgMCAwIDE4LjAwMyA3SDIwYTIgMiAwIDAgMSAyIDJ2OWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY5YTIgMiAwIDAgMSAyLTJoMS45OTdhMiAyIDAgMCAwIDEuNzU5LTEuMDQ4bC40ODktLjkwNEEyIDIgMCAwIDEgMTAuMDA0IDR6IiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTMiIHI9IjMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/camera\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Camera = createLucideIcon('camera', __iconNode);\n\nexport default Camera;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]];\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('check', __iconNode);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }]];\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronLeft = createLucideIcon('chevron-left', __iconNode);\n\nexport default ChevronLeft;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }]];\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronRight = createLucideIcon('chevron-right', __iconNode);\n\nexport default ChevronRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n];\n\n/**\n * @component @name CircleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjgiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMi4wMSIgeTE9IjE2IiB5Mj0iMTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleAlert = createLucideIcon('circle-alert', __iconNode);\n\nexport default CircleAlert;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm15 15 6 6', key: '1s409w' }],\n ['path', { d: 'm15 9 6-6', key: 'ko1vev' }],\n ['path', { d: 'M21 16v5h-5', key: '1ck2sf' }],\n ['path', { d: 'M21 8V3h-5', key: '1qoq8a' }],\n ['path', { d: 'M3 16v5h5', key: '1t08am' }],\n ['path', { d: 'm3 21 6-6', key: 'wwnumi' }],\n ['path', { d: 'M3 8V3h5', key: '1ln10m' }],\n ['path', { d: 'M9 9 3 3', key: 'v551iv' }],\n];\n\n/**\n * @component @name Expand\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTUgNiA2IiAvPgogIDxwYXRoIGQ9Im0xNSA5IDYtNiIgLz4KICA8cGF0aCBkPSJNMjEgMTZ2NWgtNSIgLz4KICA8cGF0aCBkPSJNMjEgOFYzaC01IiAvPgogIDxwYXRoIGQ9Ik0zIDE2djVoNSIgLz4KICA8cGF0aCBkPSJtMyAyMSA2LTYiIC8+CiAgPHBhdGggZD0iTTMgOFYzaDUiIC8+CiAgPHBhdGggZD0iTTkgOSAzIDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/expand\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Expand = createLucideIcon('expand', __iconNode);\n\nexport default Expand;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528',\n key: '1jaruq',\n },\n ],\n];\n\n/**\n * @component @name Flag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAyMlY0YTEgMSAwIDAgMSAuNC0uOEE2IDYgMCAwIDEgOCAyYzMgMCA1IDIgNy4zMzMgMnEyIDAgMy4wNjctLjhBMSAxIDAgMCAxIDIwIDR2MTBhMSAxIDAgMCAxLS40LjhBNiA2IDAgMCAxIDE2IDE2Yy0zIDAtNS0yLTgtMmE2IDYgMCAwIDAtNCAxLjUyOCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/flag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Flag = createLucideIcon('flag', __iconNode);\n\nexport default Flag;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '9', cy: '12', r: '1', key: '1vctgf' }],\n ['circle', { cx: '9', cy: '5', r: '1', key: 'hp0tcf' }],\n ['circle', { cx: '9', cy: '19', r: '1', key: 'fkjjf6' }],\n ['circle', { cx: '15', cy: '12', r: '1', key: '1tmaij' }],\n ['circle', { cx: '15', cy: '5', r: '1', key: '19l28e' }],\n ['circle', { cx: '15', cy: '19', r: '1', key: 'f4zoj3' }],\n];\n\n/**\n * @component @name GripVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjUiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iMTUiIGN5PSI1IiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE1IiBjeT0iMTkiIHI9IjEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/grip-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst GripVertical = createLucideIcon('grip-vertical', __iconNode);\n\nexport default GripVertical;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M21 12a9 9 0 1 1-6.219-8.56', key: '13zald' }]];\n\n/**\n * @component @name LoaderCircle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTYuMjE5LTguNTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader-circle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LoaderCircle = createLucideIcon('loader-circle', __iconNode);\n\nexport default LoaderCircle;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n];\n\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Plus = createLucideIcon('plus', __iconNode);\n\nexport default Plus;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n];\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('refresh-cw', __iconNode);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm15 15 6 6m-6-6v4.8m0-4.8h4.8', key: '17vawe' }],\n ['path', { d: 'M9 19.8V15m0 0H4.2M9 15l-6 6', key: 'chjx8e' }],\n ['path', { d: 'M15 4.2V9m0 0h4.8M15 9l6-6', key: 'lav6yq' }],\n ['path', { d: 'M9 4.2V9m0 0H4.2M9 9 3 3', key: '1pxi2q' }],\n];\n\n/**\n * @component @name Shrink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTUgNiA2bS02LTZ2NC44bTAtNC44aDQuOCIgLz4KICA8cGF0aCBkPSJNOSAxOS44VjE1bTAgMEg0LjJNOSAxNWwtNiA2IiAvPgogIDxwYXRoIGQ9Ik0xNSA0LjJWOW0wIDBoNC44TTE1IDlsNi02IiAvPgogIDxwYXRoIGQ9Ik05IDQuMlY5bTAgMEg0LjJNOSA5IDMgMyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/shrink\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Shrink = createLucideIcon('shrink', __iconNode);\n\nexport default Shrink;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M7 10v12', key: '1qc93n' }],\n [\n 'path',\n {\n d: 'M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z',\n key: 'emmmcr',\n },\n ],\n];\n\n/**\n * @component @name ThumbsUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNyAxMHYxMiIgLz4KICA8cGF0aCBkPSJNMTUgNS44OCAxNCAxMGg1LjgzYTIgMiAwIDAgMSAxLjkyIDIuNTZsLTIuMzMgOEEyIDIgMCAwIDEgMTcuNSAyMkg0YTIgMiAwIDAgMS0yLTJ2LThhMiAyIDAgMCAxIDItMmgyLjc2YTIgMiAwIDAgMCAxLjc5LTEuMTFMMTIgMmEzLjEzIDMuMTMgMCAwIDEgMyAzLjg4WiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/thumbs-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ThumbsUp = createLucideIcon('thumbs-up', __iconNode);\n\nexport default ThumbsUp;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","\"use client\";\n\nimport { create } from \"zustand\";\nimport type { FeedbackMenuEvent } from \"@ewjdev/anyclick-core\";\nimport type { AnyclickTheme } from \"./types\";\n\n/**\n * Registered provider instance\n */\nexport interface ProviderInstance {\n /** Unique identifier for this provider instance */\n id: string;\n /** Reference to the provider's container element (null if not scoped) */\n containerRef: React.RefObject<Element | null>;\n /** Whether this provider is scoped to its container */\n scoped: boolean;\n /** The provider's theme configuration */\n theme: AnyclickTheme | null;\n /** Whether this provider is disabled */\n disabled: boolean;\n /** Parent provider ID (if nested) */\n parentId: string | null;\n /** Depth in the provider hierarchy (0 = root) */\n depth: number;\n /** Handler to call when an event occurs in this provider's scope */\n onContextMenu?: (\n event: FeedbackMenuEvent,\n element: Element,\n ) => boolean | void;\n}\n\n/**\n * Provider registry store state\n */\ninterface ProviderStore {\n /** Map of provider ID to provider instance */\n providers: Map<string, ProviderInstance>;\n\n /**\n * Register a new provider\n */\n registerProvider: (provider: ProviderInstance) => void;\n\n /**\n * Unregister a provider\n */\n unregisterProvider: (id: string) => void;\n\n /**\n * Update a provider's configuration\n */\n updateProvider: (id: string, updates: Partial<ProviderInstance>) => void;\n\n /**\n * Find all providers that contain a given element, sorted by depth (nearest first)\n */\n findProvidersForElement: (element: Element) => ProviderInstance[];\n\n /**\n * Find the nearest parent provider for a given container\n */\n findParentProvider: (\n container: Element | null,\n excludeId?: string,\n ) => ProviderInstance | null;\n\n /**\n * Get merged theme for a provider (includes inherited parent themes)\n */\n getMergedTheme: (providerId: string) => AnyclickTheme;\n\n /**\n * Check if any ancestor provider has disabled anyclick\n */\n isDisabledByAncestor: (providerId: string) => boolean;\n\n /**\n * Check if an element is inside a disabled scoped provider's container\n * This is used to prevent the global provider from handling events\n * in areas where a disabled scoped provider should block them\n */\n isElementInDisabledScope: (element: Element) => boolean;\n\n /**\n * Check if an element is inside any scoped provider's container (enabled or not)\n * This is used to prevent the global provider from handling touch events\n * that should be handled by a scoped provider instead\n */\n isElementInAnyScopedProvider: (element: Element) => boolean;\n}\n\n/**\n * Generate a unique ID for a provider instance\n */\nlet providerIdCounter = 0;\nexport function generateProviderId(): string {\n return `anyclick-provider-${++providerIdCounter}`;\n}\n\n/**\n * Zustand store for managing provider instances\n */\nexport const useProviderStore = create<ProviderStore>((set, get) => ({\n providers: new Map(),\n\n registerProvider: (provider) => {\n set((state) => {\n const newProviders = new Map(state.providers);\n newProviders.set(provider.id, provider);\n return { providers: newProviders };\n });\n },\n\n unregisterProvider: (id) => {\n set((state) => {\n const newProviders = new Map(state.providers);\n newProviders.delete(id);\n return { providers: newProviders };\n });\n },\n\n updateProvider: (id, updates) => {\n set((state) => {\n const newProviders = new Map(state.providers);\n const existing = newProviders.get(id);\n if (existing) {\n newProviders.set(id, { ...existing, ...updates });\n }\n return { providers: newProviders };\n });\n },\n\n findProvidersForElement: (element) => {\n const { providers } = get();\n const matching: ProviderInstance[] = [];\n\n for (const provider of providers.values()) {\n // Skip disabled providers\n if (provider.disabled) continue;\n\n const container = provider.containerRef.current;\n\n // For scoped providers, check if element is within container\n if (provider.scoped && container) {\n if (container.contains(element)) {\n matching.push(provider);\n }\n } else if (!provider.scoped) {\n // Non-scoped providers match all elements\n matching.push(provider);\n }\n }\n\n // Sort by depth (nearest/deepest first)\n return matching.sort((a, b) => b.depth - a.depth);\n },\n\n findParentProvider: (container, excludeId) => {\n const { providers } = get();\n\n if (!container) return null;\n\n let nearestParent: ProviderInstance | null = null;\n let nearestDepth = -1;\n\n for (const provider of providers.values()) {\n if (provider.id === excludeId) continue;\n\n const providerContainer = provider.containerRef.current;\n if (!providerContainer) continue;\n\n // Check if this provider's container contains our container\n if (providerContainer.contains(container)) {\n // This is a potential parent - check if it's the nearest one\n if (provider.depth > nearestDepth) {\n nearestParent = provider;\n nearestDepth = provider.depth;\n }\n }\n }\n\n return nearestParent;\n },\n\n getMergedTheme: (providerId) => {\n const { providers } = get();\n const provider = providers.get(providerId);\n\n if (!provider) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(`[Store:getMergedTheme] Provider not found: ${providerId}`);\n }\n return {};\n }\n\n // Build ancestor chain\n const ancestors: ProviderInstance[] = [];\n let current: ProviderInstance | undefined = provider;\n\n while (current) {\n ancestors.unshift(current);\n current = current.parentId ? providers.get(current.parentId) : undefined;\n }\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(`[Store:getMergedTheme] Provider: ${providerId}`, {\n ancestorCount: ancestors.length,\n ancestorIds: ancestors.map((a) => a.id),\n providerHasTheme: !!provider.theme,\n providerThemeMenuStyle: provider.theme?.menuStyle\n ? Object.keys(provider.theme.menuStyle)\n : [],\n });\n }\n\n // Merge themes from root to current (later themes override earlier)\n const mergedTheme: AnyclickTheme = {};\n\n for (const ancestor of ancestors) {\n if (ancestor.theme) {\n // Deep merge for nested objects\n Object.assign(mergedTheme, ancestor.theme);\n\n // Special handling for highlightConfig and screenshotConfig\n if (ancestor.theme.highlightConfig) {\n mergedTheme.highlightConfig = {\n ...mergedTheme.highlightConfig,\n ...ancestor.theme.highlightConfig,\n colors: {\n ...mergedTheme.highlightConfig?.colors,\n ...ancestor.theme.highlightConfig.colors,\n },\n };\n }\n\n if (ancestor.theme.screenshotConfig) {\n mergedTheme.screenshotConfig = {\n ...mergedTheme.screenshotConfig,\n ...ancestor.theme.screenshotConfig,\n };\n }\n }\n }\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(`[Store:getMergedTheme] Result for ${providerId}`, {\n hasMenuStyle: !!mergedTheme.menuStyle,\n menuStyleKeys: mergedTheme.menuStyle\n ? Object.keys(mergedTheme.menuStyle)\n : [],\n });\n }\n\n return mergedTheme;\n },\n\n isDisabledByAncestor: (providerId) => {\n const { providers } = get();\n const provider = providers.get(providerId);\n\n if (!provider) return false;\n\n // Check this provider and all ancestors\n let current: ProviderInstance | undefined = provider;\n\n while (current) {\n if (current.disabled || current.theme?.disabled) {\n return true;\n }\n current = current.parentId ? providers.get(current.parentId) : undefined;\n }\n\n return false;\n },\n\n isElementInDisabledScope: (element) => {\n const { providers } = get();\n\n // Check all scoped providers (including disabled ones)\n for (const provider of providers.values()) {\n // Only check scoped providers that are disabled\n if (!provider.scoped) continue;\n if (!provider.disabled && !provider.theme?.disabled) continue;\n\n const container = provider.containerRef.current;\n if (!container) continue;\n\n // If element is inside this disabled scoped provider's container\n if (container.contains(element)) {\n return true;\n }\n }\n\n return false;\n },\n\n isElementInAnyScopedProvider: (element) => {\n const { providers } = get();\n\n // Check all scoped providers (enabled or disabled)\n for (const provider of providers.values()) {\n // Only check scoped providers\n if (!provider.scoped) continue;\n\n const container = provider.containerRef.current;\n if (!container) continue;\n\n // If element is inside this scoped provider's container\n if (container.contains(element)) {\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n `[Store:isElementInAnyScopedProvider] Element is in scoped provider: ${provider.id}`,\n {\n elementTag: element.tagName,\n providerId: provider.id,\n providerDisabled: provider.disabled,\n },\n );\n }\n return true;\n }\n }\n\n return false;\n },\n}));\n\n/**\n * Dispatch a context menu event to all matching providers (bubble up)\n */\nexport function dispatchContextMenuEvent(\n event: MouseEvent,\n element: Element,\n): void {\n const store = useProviderStore.getState();\n const providers = store.findProvidersForElement(element);\n\n // Convert MouseEvent to FeedbackMenuEvent\n const menuEvent: FeedbackMenuEvent = {\n clientX: event.clientX,\n clientY: event.clientY,\n originalEvent: event,\n isTouch: false,\n };\n\n // Call handlers from nearest to outermost\n for (const provider of providers) {\n // Check if disabled by theme or prop\n if (store.isDisabledByAncestor(provider.id)) {\n continue;\n }\n\n if (provider.onContextMenu) {\n provider.onContextMenu(menuEvent, element);\n // After the first handler processes, we don't need to call others\n // unless we want to implement explicit bubbling control\n break;\n }\n }\n}\n","import type {\n FeedbackAdapter,\n FeedbackPayload,\n FeedbackTriggerEvent,\n FeedbackType,\n ScreenshotConfig,\n ScreenshotData,\n} from \"@ewjdev/anyclick-core\";\nimport type { ReactNode, CSSProperties } from \"react\";\n\n/**\n * Theme configuration for AnyclickProvider\n * Supports nested theming with inheritance\n */\nexport interface AnyclickTheme {\n /** Custom styles for the context menu */\n menuStyle?: CSSProperties;\n /** Custom class name for the context menu */\n menuClassName?: string;\n /** Configuration for element highlighting */\n highlightConfig?: HighlightConfig;\n /** Configuration for screenshot capture */\n screenshotConfig?: ScreenshotConfig;\n /** Whether anyclick functionality is disabled in this theme */\n disabled?: boolean;\n}\n\n/**\n * Menu positioning modes\n * - static: Menu stays at exact click position (may go off-screen)\n * - inView: Menu adjusts position to stay fully visible in viewport\n * - dynamic: User can drag the menu to reposition it\n */\nexport type MenuPositionMode = \"static\" | \"inView\" | \"dynamic\";\n\n/**\n * Configuration for highlight colors\n */\nexport interface HighlightColors {\n /** Color for the target element highlight (default: #3b82f6 - blue) */\n targetColor?: string;\n /** Color for the container element highlight (default: #8b5cf6 - purple) */\n containerColor?: string;\n /** Opacity for the target shadow (default: 0.25) */\n targetShadowOpacity?: number;\n /** Opacity for the container shadow (default: 0.1) */\n containerShadowOpacity?: number;\n}\n\n/**\n * Configuration for highlight behavior\n */\nexport interface HighlightConfig {\n /** Whether to show highlights (default: true) */\n enabled?: boolean;\n /** Custom colors for highlights */\n colors?: HighlightColors;\n /** CSS selectors to identify container elements */\n containerSelectors?: string[];\n /** Minimum number of children for an element to be considered a container (default: 2) */\n minChildrenForContainer?: number;\n}\n\n/**\n * Menu item displayed in the feedback context menu\n */\nexport interface FeedbackMenuItem {\n /** Feedback type for this option (use unique identifier for parent items with children) */\n type: FeedbackType;\n /** Display label */\n label: string;\n /** Optional icon */\n icon?: ReactNode;\n /** Whether to show a comment input for this type */\n showComment?: boolean;\n /** Optional role(s) required to see this menu item */\n requiredRoles?: string[];\n /** Child menu items (creates a submenu) */\n children?: FeedbackMenuItem[];\n}\n\n/**\n * User context for role-based menu filtering\n */\nexport interface FeedbackUserContext {\n /** User's role(s) */\n roles?: string[];\n /** User ID */\n id?: string;\n /** User email */\n email?: string;\n}\n\n/**\n * Filter menu items based on user context\n */\nexport function filterMenuItemsByRole(\n items: FeedbackMenuItem[],\n userContext?: FeedbackUserContext,\n): FeedbackMenuItem[] {\n if (!userContext) {\n // If no user context, only show items without required roles\n return items.filter(\n (item) => !item.requiredRoles || item.requiredRoles.length === 0,\n );\n }\n\n const userRoles = userContext.roles ?? [];\n\n return items.filter((item) => {\n // If no required roles, show to everyone\n if (!item.requiredRoles || item.requiredRoles.length === 0) {\n return true;\n }\n // Check if user has any of the required roles\n return item.requiredRoles.some((role) => userRoles.includes(role));\n });\n}\n\n/**\n * Props for the AnyclickProvider component\n */\nexport interface AnyclickProviderProps {\n /** The adapter to use for submitting feedback */\n adapter: FeedbackAdapter;\n /** Child components */\n children: ReactNode;\n /**\n * Filter function to determine if feedback should be captured for a target element\n * Return true to allow feedback, false to ignore\n * Accepts both MouseEvent (right-click) and TouchEvent (press-and-hold)\n */\n targetFilter?: (event: FeedbackTriggerEvent, target: Element) => boolean;\n /** Custom menu items (defaults to Issue, Feature, Like) */\n menuItems?: FeedbackMenuItem[];\n /** Maximum length for innerText capture */\n maxInnerTextLength?: number;\n /** Maximum length for outerHTML capture */\n maxOuterHTMLLength?: number;\n /** Maximum number of ancestors to capture */\n maxAncestors?: number;\n /** Cooldown in milliseconds between submissions (rate limiting) */\n cooldownMs?: number;\n /** Attributes to strip from outerHTML for privacy */\n stripAttributes?: string[];\n /** Additional metadata to include with every submission */\n metadata?: Record<string, unknown>;\n /** Callback after successful submission */\n onSubmitSuccess?: (payload: FeedbackPayload) => void;\n /** Callback after failed submission */\n onSubmitError?: (error: Error, payload: FeedbackPayload) => void;\n /** Custom styles for the context menu */\n menuStyle?: CSSProperties;\n /** Custom class name for the context menu */\n menuClassName?: string;\n /** Whether the provider is disabled */\n disabled?: boolean;\n /** Configuration for element highlighting */\n highlightConfig?: HighlightConfig;\n /** Configuration for screenshot capture */\n screenshotConfig?: ScreenshotConfig;\n /**\n * Whether to scope this provider to its children only.\n * When true, events will only be captured for elements within this provider's subtree.\n * When false (default), events are captured for the entire document.\n */\n scoped?: boolean;\n /**\n * Theme configuration for this provider.\n * Themes are inherited from parent providers and merged (child overrides parent).\n * Set to null or { disabled: true } to disable anyclick in this subtree.\n */\n theme?: AnyclickTheme | null;\n /** Duration in ms to hold touch before triggering context menu (default: 500) */\n touchHoldDurationMs?: number;\n /** Maximum movement in px before touch hold is cancelled (default: 10) */\n touchMoveThreshold?: number;\n /** Menu positioning mode (default: 'inView') */\n menuPositionMode?: MenuPositionMode;\n}\n\n/**\n * @deprecated Use AnyclickProviderProps instead\n */\nexport type FeedbackProviderProps = AnyclickProviderProps;\n\n/**\n * Context value exposed by AnyclickProvider\n */\nexport interface AnyclickContextValue {\n /** Whether feedback is currently enabled */\n isEnabled: boolean;\n /** Whether a submission is in progress */\n isSubmitting: boolean;\n /** Submit feedback for a specific element */\n submitFeedback: (\n element: Element,\n type: FeedbackType,\n comment?: string,\n ) => Promise<void>;\n /** Open the feedback menu programmatically */\n openMenu: (element: Element, position: { x: number; y: number }) => void;\n /** Close the feedback menu */\n closeMenu: () => void;\n /** The current merged theme (inherited from ancestors) */\n theme: AnyclickTheme;\n /** Whether this provider is scoped */\n scoped: boolean;\n /** The provider's unique ID */\n providerId: string;\n}\n\n/**\n * @deprecated Use AnyclickContextValue instead\n */\nexport type FeedbackContextValue = AnyclickContextValue;\n\n/**\n * Props for the context menu component\n */\nexport interface ContextMenuProps {\n /** Whether the menu is visible */\n visible: boolean;\n /** Position of the menu */\n position: { x: number; y: number };\n /** Target element for feedback */\n targetElement: Element | null;\n /** Container element found by highlight logic */\n containerElement: Element | null;\n /** Menu items to display */\n items: FeedbackMenuItem[];\n /** Callback when an item is selected */\n onSelect: (\n type: FeedbackType,\n comment?: string,\n screenshots?: ScreenshotData,\n ) => void;\n /** Callback when menu is closed */\n onClose: () => void;\n /** Whether submission is in progress */\n isSubmitting: boolean;\n /** Custom styles */\n style?: CSSProperties;\n /** Custom class name */\n className?: string;\n /** Configuration for element highlighting */\n highlightConfig?: HighlightConfig;\n /** Configuration for screenshot capture */\n screenshotConfig?: ScreenshotConfig;\n /** Menu positioning mode (default: 'inView') */\n positionMode?: MenuPositionMode;\n}\n\n/**\n * Props for the screenshot preview component\n */\nexport interface ScreenshotPreviewProps {\n /** Captured screenshot data */\n screenshots: ScreenshotData | null;\n /** Whether screenshots are loading */\n isLoading: boolean;\n /** Callback when user confirms screenshots */\n onConfirm: (screenshots: ScreenshotData) => void;\n /** Callback when user cancels */\n onCancel: () => void;\n /** Callback when user wants to retake screenshots */\n onRetake: () => void;\n /** Whether submission is in progress */\n isSubmitting: boolean;\n}\n"],"mappings":"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","names":["import_react","import_anyclick_core","import_react","import_anyclick_core","import_react","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","import_jsx_runtime","import_jsx_runtime","mergedTheme","import_anyclick_core"]}