{"version":3,"sources":["../src/components/Button.tsx","../src/components/Modal.tsx","../src/components/Widget.tsx","../src/styles.ts","../src/utils/api.ts","../src/utils/metadata.ts","../src/index.ts"],"names":["MessageIcon","jsx","Button","onClick","label","position","primaryColor","hasError","isHovered","setIsHovered","useState","isPressed","setIsPressed","positionStyle","getTransform","jsxs","size","BugIcon","LightbulbIcon","ImageIcon","CloseIcon","CheckIcon","colors","Modal","config","metadata","onClose","onSubmit","onUpload","setLabel","text","setText","email","setEmail","imageUrl","setImageUrl","imagePreview","setImagePreview","isSubmitting","setIsSubmitting","isUploading","setIsUploading","error","setError","success","setSuccess","fileInputRef","useRef","i18n","formFields","theme","maxLength","currentPlaceholder","handleFileSelect","e","file","processedFile","processImage","reader","url","err","handleRemoveImage","handleSubmit","feedbackData","result","styles","primaryBgLight","active","disabled","successContainerStyle","successIconStyle","successTitleStyle","successTextStyle","headerLeftStyle","headerTitleStyle","closeButtonStyle","contentStyle","sectionStyle","labelStyle","typeButtonsStyle","typeIconStyle","descriptionRowStyle","descriptionColStyle","textareaWrapperStyle","textareaStyle","charCountStyle","uploadColStyle","imagePreviewContainerStyle","imagePreviewSquareStyle","removeImageButtonStyle","uploadingOverlayStyle","uploadButtonSquareStyle","inputStyle","errorStyle","spinnerContainerStyle","options","maxWidth","maxHeight","quality","resolve","reject","img","width","height","ratio","canvas","ctx","blob","timestamp","newFile","type","Widget","getMetadata","visible","defaultOpen","onOpenChange","isOpen","setIsOpen","useEffect","Fragment","injectStyles","style","API_BASE","CACHE_KEY","fetchWithTimeout","timeoutMs","controller","timeoutId","fetchProjectConfig","sdkKey","forceRefresh","cached","getFromCache","response","saveToCache","submitFeedback","data","errorData","uploadImage","formData","getCachedConfig","ignoreExpiry","raw","captureMetadata","DEFAULT_CONFIG","VoyageSDK","cachedConfig","fetchedConfig","freshConfig","newConfig","render","h","open","server","_client","pathname","include","exclude","pattern","prefix","Voyage","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import { h } from 'preact';\nimport { useState } from 'preact/hooks';\n\ninterface ButtonProps {\n  onClick: () => void;\n  label: string;\n  position: 'bottom-right' | 'bottom-left';\n  primaryColor: string;\n  hasError?: boolean;\n}\n\n// 말풍선 아이콘 SVG\nfunction MessageIcon() {\n  return (\n    <svg\n      width=\"20\"\n      height=\"20\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n    </svg>\n  );\n}\n\n// 에러 아이콘 (느낌표)\nfunction ErrorIcon() {\n  return (\n    <svg\n      width=\"14\"\n      height=\"14\"\n      viewBox=\"0 0 24 24\"\n      fill=\"#fff\"\n      stroke=\"none\"\n    >\n      <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#EF4444\" />\n      <text x=\"12\" y=\"17\" textAnchor=\"middle\" fill=\"#fff\" fontSize=\"14\" fontWeight=\"bold\">!</text>\n    </svg>\n  );\n}\n\nexport function Button({ onClick, label, position, primaryColor, hasError = false }: ButtonProps) {\n  const [isHovered, setIsHovered] = useState(false);\n  const [isPressed, setIsPressed] = useState(false);\n\n  const positionStyle = position === 'bottom-right'\n    ? { right: '24px' }\n    : { left: '24px' };\n\n  // Jelly 효과 transform\n  const getTransform = () => {\n    if (isPressed) return 'scale(0.95)';\n    if (isHovered) return 'scale(1.02) translateY(-2px)';\n    return 'scale(1)';\n  };\n\n  return (\n    <div style={{ position: 'fixed', bottom: '24px', ...positionStyle, zIndex: 9998 }}>\n      <button\n        onClick={onClick}\n        onMouseEnter={() => setIsHovered(true)}\n        onMouseLeave={() => { setIsHovered(false); setIsPressed(false); }}\n        onMouseDown={() => setIsPressed(true)}\n        onMouseUp={() => setIsPressed(false)}\n        style={{\n          position: 'relative',\n          display: 'flex',\n          alignItems: 'center',\n          gap: '10px',\n          padding: '14px 24px',\n          border: 'none',\n          borderRadius: '50px',\n          cursor: 'pointer',\n          fontFamily: \"'Quicksand', 'Nunito', system-ui, sans-serif\",\n          fontSize: '15px',\n          fontWeight: 600,\n          color: '#fff',\n          // primaryColor 적용\n          backgroundColor: primaryColor,\n          // 그림자 + glow 효과\n          boxShadow: isHovered\n            ? `0 8px 32px ${primaryColor}60, 0 0 20px ${primaryColor}40`\n            : `0 4px 20px ${primaryColor}50, 0 0 10px ${primaryColor}30`,\n          // Jelly 애니메이션\n          transform: getTransform(),\n          transition: 'all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1)',\n        }}\n      >\n        <MessageIcon />\n        <span>{label}</span>\n      </button>\n      {/* 에러 아이콘 - 우측 상단 */}\n      {hasError && (\n        <div\n          style={{\n            position: 'absolute',\n            top: '-4px',\n            right: '-4px',\n            width: '18px',\n            height: '18px',\n            borderRadius: '50%',\n            backgroundColor: '#EF4444',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            color: '#fff',\n            fontSize: '12px',\n            fontWeight: 'bold',\n            boxShadow: '0 2px 6px rgba(239, 68, 68, 0.5)',\n          }}\n        >\n          !\n        </div>\n      )}\n    </div>\n  );\n}\n","import { h } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport type { ProjectConfig, FeedbackData, FeedbackMetadata } from '../types';\n\ninterface ModalProps {\n  config: ProjectConfig;\n  metadata: FeedbackMetadata;\n  onClose: () => void;\n  onSubmit: (data: FeedbackData) => Promise<boolean>;\n  onUpload: (file: File) => Promise<string | null>;\n}\n\n// 아이콘들\nfunction MessageIcon({ size = 24 }: { size?: number }) {\n  return (\n    <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n    </svg>\n  );\n}\n\nfunction BugIcon() {\n  return (\n    <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M8 2l1.88 1.88M14.12 3.88L16 2M9 7.13v-1a3.003 3.003 0 116 0v1\" />\n      <path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 014-4h4a4 4 0 014 4v3c0 3.3-2.7 6-6 6\" />\n      <path d=\"M12 20v-9M6.53 9C4.6 8.8 3 7.1 3 5M6 13H2M6 17l-4 1M17.47 9c1.93-.2 3.53-1.9 3.53-4M18 13h4M18 17l4 1\" />\n    </svg>\n  );\n}\n\nfunction LightbulbIcon() {\n  return (\n    <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 006 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\" />\n      <path d=\"M9 18h6M10 22h4\" />\n    </svg>\n  );\n}\n\nfunction ImageIcon() {\n  return (\n    <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n      <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n      <polyline points=\"21 15 16 10 5 21\" />\n    </svg>\n  );\n}\n\nfunction CloseIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n      <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n    </svg>\n  );\n}\n\nfunction CheckIcon() {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <polyline points=\"20 6 9 17 4 12\" />\n    </svg>\n  );\n}\n\n// 라이트 테마 색상\nconst colors = {\n  bg: '#FFFFFF',\n  bgLight: '#F8FAFC',\n  bgCard: 'rgba(255, 255, 255, 0.98)',\n  border: 'rgba(0, 0, 0, 0.08)',\n  borderLight: 'rgba(0, 0, 0, 0.12)',\n  text: '#1F2937',\n  textMuted: '#6B7280',\n  error: '#EF4444',\n  success: '#22C55E',\n};\n\nexport function Modal({ config, metadata, onClose, onSubmit, onUpload }: ModalProps) {\n  const [label, setLabel] = useState<'bug' | 'feature' | null>(null);\n  const [text, setText] = useState('');\n  const [email, setEmail] = useState('');\n  const [imageUrl, setImageUrl] = useState<string | null>(null);\n  const [imagePreview, setImagePreview] = useState<string | null>(null);\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const [isUploading, setIsUploading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [success, setSuccess] = useState(false);\n  const fileInputRef = useRef<HTMLInputElement>(null);\n\n  const { i18n, formFields, theme } = config;\n  const primaryColor = theme.primaryColor || '#0ea5e9';\n  const maxLength = 400;\n\n  // 동적 placeholder\n  const currentPlaceholder = label === 'bug'\n    ? (i18n.bugPlaceholder || i18n.placeholder)\n    : (i18n.featurePlaceholder || i18n.placeholder);\n\n  const handleFileSelect = async (e: Event) => {\n    const target = e.target as HTMLInputElement;\n    const file = target.files?.[0];\n    if (!file) return;\n\n    if (!file.type.startsWith('image/')) {\n      setError('Only image files are allowed');\n      return;\n    }\n    if (file.size > 10 * 1024 * 1024) {\n      setError('Image must be under 10MB');\n      return;\n    }\n\n    setIsUploading(true);\n    setError(null);\n\n    try {\n      // 이미지를 WebP로 변환 및 resize\n      const processedFile = await processImage(file, {\n        maxWidth: 1920,\n        maxHeight: 1080,\n        quality: 0.8,\n      });\n\n      // 프리뷰 생성\n      const reader = new FileReader();\n      reader.onload = () => setImagePreview(reader.result as string);\n      reader.readAsDataURL(processedFile);\n\n      const url = await onUpload(processedFile);\n      setIsUploading(false);\n\n      if (url) {\n        setImageUrl(url);\n      } else {\n        setError('Failed to upload image');\n        setImagePreview(null);\n      }\n    } catch (err) {\n      console.error('[Voyage] Image processing error:', err);\n      setIsUploading(false);\n      setError('Failed to process image');\n    }\n  };\n\n  const handleRemoveImage = () => {\n    setImageUrl(null);\n    setImagePreview(null);\n    if (fileInputRef.current) {\n      fileInputRef.current.value = '';\n    }\n  };\n\n  const handleSubmit = async () => {\n    if (!label) {\n      setError('Please select a type');\n      return;\n    }\n    if (!text.trim()) {\n      setError('Please enter your feedback');\n      return;\n    }\n    if (formFields.email.required && !email.trim()) {\n      setError('Please enter your email');\n      return;\n    }\n\n    setIsSubmitting(true);\n    setError(null);\n\n    const feedbackData: FeedbackData = {\n      label,\n      text: text.trim(),\n      email: email.trim() || undefined,\n      imageUrl: imageUrl || undefined,\n      metadata,\n    };\n\n    const result = await onSubmit(feedbackData);\n    setIsSubmitting(false);\n\n    if (result) {\n      setSuccess(true);\n    } else {\n      setError('Failed to submit. Please try again.');\n    }\n  };\n\n  // 스타일 함수 (primaryColor 적용)\n  const getStyles = () => {\n    const primaryBgLight = `${primaryColor}15`;\n\n    return {\n      overlay: {\n        position: 'fixed',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        backgroundColor: 'rgba(0, 0, 0, 0.4)',\n        backdropFilter: 'blur(4px)',\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        zIndex: 9999,\n        padding: '20px',\n      } as h.JSX.CSSProperties,\n\n      modal: {\n        backgroundColor: colors.bgCard,\n        backdropFilter: 'blur(20px)',\n        borderRadius: '20px',\n        width: '100%',\n        maxWidth: '580px',\n        maxHeight: '90vh',\n        overflowY: 'auto',\n        position: 'relative',\n        fontFamily: \"'Quicksand', 'Nunito', system-ui, sans-serif\",\n        border: `1px solid ${colors.border}`,\n        boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.15)',\n      } as h.JSX.CSSProperties,\n\n      colorBar: {\n        height: '4px',\n        backgroundColor: primaryColor,\n      } as h.JSX.CSSProperties,\n\n      header: {\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        padding: '14px 20px',\n        borderBottom: `1px solid ${colors.border}`,\n        backgroundColor: colors.bgLight,\n      } as h.JSX.CSSProperties,\n\n      headerIcon: {\n        width: '32px',\n        height: '32px',\n        borderRadius: '10px',\n        backgroundColor: primaryColor,\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        color: '#fff',\n      } as h.JSX.CSSProperties,\n\n      typeButton: (active: boolean) => ({\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: '6px',\n        padding: '10px 12px',\n        border: active ? `2px solid ${primaryColor}` : `1px solid ${colors.border}`,\n        borderRadius: '10px',\n        backgroundColor: active ? primaryBgLight : colors.bgLight,\n        cursor: 'pointer',\n        fontWeight: 600,\n        fontSize: '13px',\n        color: active ? colors.text : colors.textMuted,\n        transition: 'all 0.2s',\n      } as h.JSX.CSSProperties),\n\n      submitButton: (disabled: boolean) => ({\n        width: '100%',\n        padding: '12px',\n        backgroundColor: disabled ? colors.bgLight : primaryColor,\n        color: disabled ? colors.textMuted : '#fff',\n        border: 'none',\n        borderRadius: '12px',\n        fontSize: '15px',\n        fontWeight: 700,\n        cursor: disabled ? 'not-allowed' : 'pointer',\n        fontFamily: 'inherit',\n        transition: 'all 0.2s',\n        boxShadow: disabled ? 'none' : `0 4px 15px ${primaryColor}40`,\n      } as h.JSX.CSSProperties),\n\n      primaryButton: {\n        width: '100%',\n        padding: '16px',\n        backgroundColor: primaryColor,\n        color: '#fff',\n        border: 'none',\n        borderRadius: '12px',\n        fontSize: '15px',\n        fontWeight: 700,\n        cursor: 'pointer',\n        fontFamily: 'inherit',\n        marginTop: '8px',\n      } as h.JSX.CSSProperties,\n    };\n  };\n\n  const styles = getStyles();\n\n  // 성공 화면\n  if (success) {\n    return (\n      <div style={styles.overlay}>\n        <div style={styles.modal}>\n          <div style={successContainerStyle}>\n            <div style={successIconStyle}>\n              <CheckIcon />\n            </div>\n            <h3 style={successTitleStyle}>{i18n.successMessage}</h3>\n            <p style={successTextStyle}>Your voice shapes what we build next.</p>\n            <button onClick={onClose} style={styles.primaryButton}>\n              Done\n            </button>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div style={styles.overlay} onClick={onClose}>\n      <div style={styles.modal} onClick={(e) => e.stopPropagation()}>\n        {/* 헤더 */}\n        <div style={styles.header}>\n          <div style={headerLeftStyle}>\n            <div style={styles.headerIcon}>\n              <MessageIcon size={20} />\n            </div>\n            <span style={headerTitleStyle}>Help Us Improve</span>\n          </div>\n          <button onClick={onClose} style={closeButtonStyle}>\n            <CloseIcon />\n          </button>\n        </div>\n\n        {/* 컬러 바 */}\n        <div style={styles.colorBar} />\n\n        {/* 컨텐츠 */}\n        <div style={contentStyle}>\n          {/* 이슈 타입 */}\n          <div style={sectionStyle}>\n            <label style={labelStyle}>Feedback Type</label>\n            <div style={typeButtonsStyle}>\n              <button\n                onClick={() => setLabel('bug')}\n                style={styles.typeButton(label === 'bug')}\n              >\n                <span style={typeIconStyle(label === 'bug', 'bug')}>\n                  <BugIcon />\n                </span>\n                <span>Bug</span>\n              </button>\n              <button\n                onClick={() => setLabel('feature')}\n                style={styles.typeButton(label === 'feature')}\n              >\n                <span style={typeIconStyle(label === 'feature', 'feature')}>\n                  <LightbulbIcon />\n                </span>\n                <span>Feature</span>\n              </button>\n            </div>\n          </div>\n\n          {/* 설명 + 이미지 (flex row) */}\n          <div style={descriptionRowStyle}>\n            {/* 텍스트 영역 */}\n            <div style={descriptionColStyle}>\n              <label style={labelStyle}>Description</label>\n              <div style={textareaWrapperStyle}>\n                <textarea\n                  placeholder={currentPlaceholder}\n                  value={text}\n                  maxLength={maxLength}\n                  onInput={(e) => setText((e.target as HTMLTextAreaElement).value)}\n                  style={textareaStyle}\n                />\n                <span style={charCountStyle}>{text.length}/{maxLength}</span>\n              </div>\n            </div>\n\n            {/* 이미지 업로드 (정사각형) */}\n            <div style={uploadColStyle}>\n              <label style={labelStyle}>Screenshot</label>\n              {imagePreview ? (\n                <div style={imagePreviewContainerStyle}>\n                  <img src={imagePreview} alt=\"Preview\" style={imagePreviewSquareStyle} />\n                  <button onClick={handleRemoveImage} style={removeImageButtonStyle}>\n                    <CloseIcon />\n                  </button>\n                  {isUploading && <div style={uploadingOverlayStyle}>...</div>}\n                </div>\n              ) : (\n                <button\n                  onClick={() => fileInputRef.current?.click()}\n                  style={uploadButtonSquareStyle}\n                >\n                  <ImageIcon />\n                  <span style={{ fontSize: '11px' }}>Upload</span>\n                </button>\n              )}\n              <input\n                ref={fileInputRef}\n                type=\"file\"\n                accept=\"image/*\"\n                onChange={handleFileSelect}\n                style={{ display: 'none' }}\n              />\n            </div>\n          </div>\n\n          {/* 이메일 */}\n          {formFields.email.enabled && (\n            <div style={sectionStyle}>\n              <label style={labelStyle}>\n                Email {formFields.email.required ? '' : '(optional)'}\n              </label>\n              <input\n                type=\"email\"\n                placeholder=\"your@email.com\"\n                value={email}\n                onInput={(e) => setEmail((e.target as HTMLInputElement).value)}\n                style={inputStyle}\n              />\n            </div>\n          )}\n\n          {/* 에러 */}\n          {error && <p style={errorStyle}>{error}</p>}\n\n          {/* 제출 버튼 */}\n          <button\n            onClick={handleSubmit}\n            disabled={isSubmitting || isUploading}\n            style={styles.submitButton(isSubmitting || isUploading)}\n          >\n            {isSubmitting ? (\n              <span style={spinnerContainerStyle}>\n                <span className=\"voyage-spinner\" />\n                Sending...\n              </span>\n            ) : (\n              i18n.submitLabel\n            )}\n          </button>\n        </div>\n      </div>\n    </div>\n  );\n}\n\n// 이미지 처리 유틸: resize + WebP 변환\ninterface ProcessImageOptions {\n  maxWidth: number;\n  maxHeight: number;\n  quality: number;\n}\n\nasync function processImage(file: File, options: ProcessImageOptions): Promise<File> {\n  const { maxWidth, maxHeight, quality } = options;\n\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.onload = () => {\n      // 비율 유지하면서 resize 계산\n      let { width, height } = img;\n\n      if (width > maxWidth || height > maxHeight) {\n        const ratio = Math.min(maxWidth / width, maxHeight / height);\n        width = Math.round(width * ratio);\n        height = Math.round(height * ratio);\n      }\n\n      // Canvas에 그리기\n      const canvas = document.createElement('canvas');\n      canvas.width = width;\n      canvas.height = height;\n\n      const ctx = canvas.getContext('2d');\n      if (!ctx) {\n        reject(new Error('Failed to get canvas context'));\n        return;\n      }\n\n      ctx.drawImage(img, 0, 0, width, height);\n\n      // WebP로 변환\n      canvas.toBlob(\n        (blob) => {\n          if (!blob) {\n            reject(new Error('Failed to convert image'));\n            return;\n          }\n\n          // Blob을 File로 변환\n          const timestamp = Date.now();\n          const newFile = new File([blob], `image_${timestamp}.webp`, {\n            type: 'image/webp',\n          });\n\n          resolve(newFile);\n        },\n        'image/webp',\n        quality\n      );\n    };\n\n    img.onerror = () => reject(new Error('Failed to load image'));\n    img.src = URL.createObjectURL(file);\n  });\n}\n\n// 정적 스타일 정의 (라이트 테마)\nconst headerLeftStyle: h.JSX.CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '12px',\n};\n\nconst headerTitleStyle: h.JSX.CSSProperties = {\n  fontSize: '16px',\n  fontWeight: 700,\n  color: colors.text,\n};\n\nconst closeButtonStyle: h.JSX.CSSProperties = {\n  background: 'transparent',\n  border: 'none',\n  color: colors.textMuted,\n  cursor: 'pointer',\n  padding: '8px',\n  borderRadius: '8px',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  transition: 'all 0.2s',\n};\n\nconst contentStyle: h.JSX.CSSProperties = {\n  padding: '16px 20px',\n};\n\nconst sectionStyle: h.JSX.CSSProperties = {\n  marginBottom: '14px',\n};\n\nconst labelStyle: h.JSX.CSSProperties = {\n  display: 'block',\n  fontSize: '13px',\n  fontWeight: 600,\n  color: colors.text,\n  marginBottom: '8px',\n};\n\nconst typeButtonsStyle: h.JSX.CSSProperties = {\n  display: 'grid',\n  gridTemplateColumns: '1fr 1fr',\n  gap: '12px',\n};\n\nconst descriptionRowStyle: h.JSX.CSSProperties = {\n  display: 'flex',\n  gap: '14px',\n  marginBottom: '14px',\n};\n\nconst descriptionColStyle: h.JSX.CSSProperties = {\n  flex: 1,\n  display: 'flex',\n  flexDirection: 'column',\n};\n\nconst uploadColStyle: h.JSX.CSSProperties = {\n  width: '120px',\n  flexShrink: 0,\n  display: 'flex',\n  flexDirection: 'column',\n};\n\nconst uploadButtonSquareStyle: h.JSX.CSSProperties = {\n  width: '100%',\n  aspectRatio: '1',\n  border: `2px dashed ${colors.border}`,\n  borderRadius: '10px',\n  backgroundColor: 'transparent',\n  cursor: 'pointer',\n  display: 'flex',\n  flexDirection: 'column',\n  alignItems: 'center',\n  justifyContent: 'center',\n  gap: '4px',\n  color: colors.textMuted,\n  fontSize: '12px',\n  transition: 'all 0.2s',\n};\n\nconst imagePreviewSquareStyle: h.JSX.CSSProperties = {\n  width: '100%',\n  aspectRatio: '1',\n  objectFit: 'cover',\n  borderRadius: '10px',\n};\n\nconst typeIconStyle = (active: boolean, type: 'bug' | 'feature'): h.JSX.CSSProperties => ({\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  color: active\n    ? (type === 'bug' ? colors.error : '#F59E0B')\n    : colors.textMuted,\n});\n\nconst textareaWrapperStyle: h.JSX.CSSProperties = {\n  position: 'relative',\n};\n\nconst textareaStyle: h.JSX.CSSProperties = {\n  width: '100%',\n  minHeight: '120px',\n  padding: '14px',\n  border: `1px solid ${colors.border}`,\n  borderRadius: '12px',\n  fontSize: '14px',\n  resize: 'vertical',\n  boxSizing: 'border-box',\n  backgroundColor: colors.bgLight,\n  color: colors.text,\n  fontFamily: 'inherit',\n  outline: 'none',\n};\n\nconst charCountStyle: h.JSX.CSSProperties = {\n  position: 'absolute',\n  bottom: '12px',\n  right: '14px',\n  fontSize: '12px',\n  color: colors.textMuted,\n};\n\nconst inputStyle: h.JSX.CSSProperties = {\n  width: '100%',\n  padding: '10px 12px',\n  border: `1px solid ${colors.border}`,\n  borderRadius: '10px',\n  fontSize: '13px',\n  boxSizing: 'border-box',\n  backgroundColor: colors.bgLight,\n  color: colors.text,\n  fontFamily: 'inherit',\n  outline: 'none',\n};\n\nconst imagePreviewContainerStyle: h.JSX.CSSProperties = {\n  position: 'relative',\n  display: 'inline-block',\n  borderRadius: '12px',\n  overflow: 'hidden',\n};\n\nconst removeImageButtonStyle: h.JSX.CSSProperties = {\n  position: 'absolute',\n  top: '8px',\n  right: '8px',\n  width: '28px',\n  height: '28px',\n  borderRadius: '50%',\n  backgroundColor: 'rgba(0, 0, 0, 0.7)',\n  color: '#fff',\n  border: 'none',\n  cursor: 'pointer',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n};\n\nconst uploadingOverlayStyle: h.JSX.CSSProperties = {\n  position: 'absolute',\n  inset: 0,\n  backgroundColor: 'rgba(0, 0, 0, 0.7)',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  color: '#fff',\n  fontSize: '14px',\n  borderRadius: '12px',\n};\n\nconst errorStyle: h.JSX.CSSProperties = {\n  color: colors.error,\n  fontSize: '14px',\n  marginBottom: '16px',\n  padding: '12px',\n  backgroundColor: 'rgba(239, 68, 68, 0.1)',\n  borderRadius: '8px',\n  border: `1px solid rgba(239, 68, 68, 0.3)`,\n};\n\nconst successContainerStyle: h.JSX.CSSProperties = {\n  padding: '48px 24px',\n  textAlign: 'center',\n};\n\nconst successIconStyle: h.JSX.CSSProperties = {\n  width: '64px',\n  height: '64px',\n  borderRadius: '50%',\n  backgroundColor: 'rgba(34, 197, 94, 0.15)',\n  color: colors.success,\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  margin: '0 auto 20px',\n};\n\nconst successTitleStyle: h.JSX.CSSProperties = {\n  fontSize: '20px',\n  fontWeight: 700,\n  color: colors.text,\n  marginBottom: '8px',\n};\n\nconst successTextStyle: h.JSX.CSSProperties = {\n  fontSize: '14px',\n  color: colors.textMuted,\n  marginBottom: '24px',\n};\n\nconst spinnerContainerStyle: h.JSX.CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  gap: '8px',\n};\n","import { h } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { Button } from './Button';\nimport { Modal } from './Modal';\nimport type { ProjectConfig, FeedbackData, FeedbackMetadata } from '../types';\n\ninterface WidgetProps {\n  config: ProjectConfig;\n  onSubmit: (data: FeedbackData) => Promise<boolean>;\n  onUpload: (file: File) => Promise<string | null>;\n  getMetadata: () => FeedbackMetadata;\n  visible: boolean;\n  defaultOpen?: boolean;\n  hasError?: boolean;\n  onOpenChange?: (open: boolean) => void;\n}\n\nexport function Widget({\n  config,\n  onSubmit,\n  onUpload,\n  getMetadata,\n  visible,\n  defaultOpen = false,\n  hasError = false,\n  onOpenChange,\n}: WidgetProps) {\n  const [isOpen, setIsOpen] = useState(defaultOpen);\n\n  // SDK에서 open()/close() 호출 시 동기화\n  useEffect(() => {\n    setIsOpen(defaultOpen);\n  }, [defaultOpen]);\n\n  useEffect(() => {\n    onOpenChange?.(isOpen);\n  }, [isOpen, onOpenChange]);\n\n  if (!visible) {\n    return null;\n  }\n\n  const { theme, i18n } = config;\n\n  return (\n    <>\n      {!isOpen && (\n        <Button\n          onClick={() => setIsOpen(true)}\n          label={i18n.buttonLabel}\n          position={theme.position}\n          primaryColor={theme.primaryColor}\n          hasError={hasError}\n        />\n      )}\n\n      {isOpen && (\n        <Modal\n          config={config}\n          metadata={getMetadata()}\n          onClose={() => setIsOpen(false)}\n          onSubmit={onSubmit}\n          onUpload={onUpload}\n        />\n      )}\n    </>\n  );\n}\n","// SDK 전용 CSS 스타일 (동적 주입)\nexport const injectStyles = () => {\n  if (typeof document === 'undefined') return;\n  if (document.getElementById('voyage-sdk-styles')) return;\n\n  const style = document.createElement('style');\n  style.id = 'voyage-sdk-styles';\n  style.textContent = `\n    /* Voyage SDK Styles */\n\n    /* Spinner Animation */\n    @keyframes voyage-spin {\n      from { transform: rotate(0deg); }\n      to { transform: rotate(360deg); }\n    }\n\n    #voyage-widget-container * {\n      box-sizing: border-box;\n    }\n\n    #voyage-widget-container button {\n      font-family: 'Quicksand', 'Nunito', system-ui, sans-serif;\n    }\n\n    #voyage-widget-container textarea:focus,\n    #voyage-widget-container input:focus {\n      border-color: rgba(124, 58, 237, 0.5);\n      box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);\n    }\n\n    #voyage-widget-container button:focus {\n      outline: none;\n    }\n\n    /* Spinner */\n    .voyage-spinner {\n      width: 16px;\n      height: 16px;\n      border: 2px solid rgba(255,255,255,0.3);\n      border-top-color: #fff;\n      border-radius: 50%;\n      animation: voyage-spin 0.8s linear infinite;\n    }\n\n    /* Load Quicksand font if not present */\n    @import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@400;500;600;700&display=swap');\n  `;\n\n  document.head.appendChild(style);\n};\n","import type { ProjectConfig, FeedbackData } from '../types';\n\n// Supabase Edge Functions URL\nconst API_BASE = 'https://rxflzurkkuqgopjkshjh.supabase.co/functions/v1';\n\nconst CACHE_KEY = 'voyage_config';\nconst CACHE_TTL = 60 * 60 * 1000; // 1시간\n\n// Timeout constants\nconst CONFIG_TIMEOUT = 5000; // 5초\nconst SUBMIT_TIMEOUT = 10000; // 10초\nconst UPLOAD_TIMEOUT = 30000; // 30초 (큰 파일 고려)\n\n// Request timeout utility\nfunction fetchWithTimeout(\n  url: string,\n  options: RequestInit,\n  timeoutMs: number\n): Promise<Response> {\n  const controller = new AbortController();\n  const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n  return fetch(url, { ...options, signal: controller.signal }).finally(() =>\n    clearTimeout(timeoutId)\n  );\n}\n\ninterface CachedConfig {\n  config: ProjectConfig;\n  timestamp: number;\n}\n\nexport async function fetchProjectConfig(\n  sdkKey: string,\n  options: { forceRefresh?: boolean } = {}\n): Promise<ProjectConfig | null> {\n  const { forceRefresh = false } = options;\n\n  // 캐시 확인 (forceRefresh가 아닐 때만)\n  if (!forceRefresh) {\n    const cached = getFromCache(sdkKey);\n    if (cached) {\n      return cached;\n    }\n  }\n\n  try {\n    const response = await fetchWithTimeout(\n      `${API_BASE}/get-widget-config`,\n      {\n        method: 'GET',\n        headers: {\n          'Content-Type': 'application/json',\n          'x-sdk-key': sdkKey,\n        },\n      },\n      CONFIG_TIMEOUT\n    );\n\n    if (!response.ok) {\n      console.error('[Voyage] Failed to fetch config:', response.status);\n      return getFromCache(sdkKey, true); // 실패 시 만료된 캐시라도 사용\n    }\n\n    const config = (await response.json()) as ProjectConfig;\n    saveToCache(sdkKey, config);\n    return config;\n  } catch (error) {\n    if (error instanceof Error && error.name === 'AbortError') {\n      console.warn('[Voyage] Config fetch timeout, using cached config');\n    } else {\n      console.error('[Voyage] Network error:', error);\n    }\n    // 네트워크 실패 시 캐시 사용 (만료되어도)\n    return getFromCache(sdkKey, true);\n  }\n}\n\nexport async function submitFeedback(sdkKey: string, data: FeedbackData): Promise<boolean> {\n  try {\n    const response = await fetchWithTimeout(\n      `${API_BASE}/submit-feedback`,\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'x-sdk-key': sdkKey,\n        },\n        body: JSON.stringify({\n          label: data.label,\n          content: data.text,\n          email: data.email,\n          imageUrl: data.imageUrl,\n          metadata: data.metadata,\n        }),\n      },\n      SUBMIT_TIMEOUT\n    );\n\n    if (!response.ok) {\n      const errorData = await response.json().catch(() => ({}));\n      console.error('[Voyage] Failed to submit feedback:', response.status, errorData);\n      return false;\n    }\n\n    return true;\n  } catch (error) {\n    if (error instanceof Error && error.name === 'AbortError') {\n      console.error('[Voyage] Feedback submission timeout');\n    } else {\n      console.error('[Voyage] Network error:', error);\n    }\n    return false;\n  }\n}\n\nexport async function uploadImage(sdkKey: string, file: File): Promise<string | null> {\n  // 검증\n  if (!file.type.startsWith('image/')) {\n    console.error('[Voyage] Only image files are allowed');\n    return null;\n  }\n\n  if (file.size > 5 * 1024 * 1024) {\n    console.error('[Voyage] Image must be under 5MB');\n    return null;\n  }\n\n  try {\n    const formData = new FormData();\n    formData.append('file', file);\n\n    const response = await fetchWithTimeout(\n      `${API_BASE}/upload-feedback-image`,\n      {\n        method: 'POST',\n        headers: {\n          'x-sdk-key': sdkKey,\n        },\n        body: formData,\n      },\n      UPLOAD_TIMEOUT\n    );\n\n    if (!response.ok) {\n      const errorData = await response.json().catch(() => ({}));\n      console.error('[Voyage] Failed to upload image:', response.status, errorData);\n      return null;\n    }\n\n    const result = await response.json();\n    return result.url;\n  } catch (error) {\n    if (error instanceof Error && error.name === 'AbortError') {\n      console.error('[Voyage] Image upload timeout');\n    } else {\n      console.error('[Voyage] Network error:', error);\n    }\n    return null;\n  }\n}\n\n// Export for optimistic loading\nexport function getCachedConfig(sdkKey: string): ProjectConfig | null {\n  return getFromCache(sdkKey, true); // 만료되어도 반환\n}\n\nfunction getFromCache(sdkKey: string, ignoreExpiry = false): ProjectConfig | null {\n  try {\n    const raw = localStorage.getItem(`${CACHE_KEY}_${sdkKey}`);\n    if (!raw) return null;\n\n    const cached: CachedConfig = JSON.parse(raw);\n    const isExpired = Date.now() - cached.timestamp > CACHE_TTL;\n\n    if (isExpired && !ignoreExpiry) {\n      return null;\n    }\n\n    return cached.config;\n  } catch {\n    return null;\n  }\n}\n\nfunction saveToCache(sdkKey: string, config: ProjectConfig): void {\n  try {\n    const cached: CachedConfig = {\n      config,\n      timestamp: Date.now(),\n    };\n    localStorage.setItem(`${CACHE_KEY}_${sdkKey}`, JSON.stringify(cached));\n  } catch {\n    // localStorage 사용 불가 시 무시\n  }\n}\n","import type { FeedbackMetadata } from '../types';\n\nexport function captureMetadata(): FeedbackMetadata {\n  return {\n    url: window.location.href,\n    pathname: window.location.pathname,\n    browser: navigator.userAgent,\n    viewport: `${window.innerWidth}x${window.innerHeight}`,\n    title: document.title,\n    timestamp: new Date().toISOString(),\n    locale: navigator.language,\n    referrer: document.referrer,\n  };\n}\n","// @voyage/sdk\n// Feedback Widget SDK for collecting user feedback\n\nimport { h, render } from 'preact';\n\nimport { Widget } from './components';\nimport { injectStyles } from './styles';\nimport {\n  fetchProjectConfig,\n  getCachedConfig,\n  submitFeedback,\n  uploadImage,\n} from './utils/api';\nimport { captureMetadata } from './utils/metadata';\n\nimport type { VoyageConfig, ProjectConfig, FeedbackData } from './types';\n\nexport type { VoyageConfig, ProjectConfig, FeedbackData, FeedbackMetadata } from './types';\n\nconst DEFAULT_CONFIG: ProjectConfig = {\n  projectId: '',\n  formFields: {\n    email: { enabled: true, required: false },\n    category: { enabled: true, options: ['bug', 'feature'] },\n  },\n  theme: {\n    primaryColor: '#0ea5e9',\n    position: 'bottom-right',\n  },\n  i18n: {\n    buttonLabel: 'To : the Maker',\n    placeholder: 'Describe your ideas to improve our product',\n    bugPlaceholder: 'Please describe the bug in detail (e.g., clicked a button and it didn\\'t work)',\n    featurePlaceholder: 'Describe your ideas to improve our product (e.g., I want to export TASK.md to Linear tickets)',\n    submitLabel: 'Send to the Maker',\n    successMessage: 'Thank you for your feedback!',\n  },\n};\n\nclass VoyageSDK {\n  private config: VoyageConfig | null = null;\n  private serverConfig: ProjectConfig | null = null;\n  private container: HTMLElement | null = null;\n  private isWidgetVisible = false;\n  private isModalOpen = false;\n  private hasInitError = false;\n\n  async init(config: VoyageConfig): Promise<void> {\n    this.config = config;\n    this.hasInitError = false;\n\n    if (!config.sdkKey) {\n      console.error('[Voyage] SDK Key is required. Get your key from the dashboard.');\n      this.hasInitError = true;\n      injectStyles();\n      this.isWidgetVisible = true;\n      this.serverConfig = { ...DEFAULT_CONFIG };\n      this.renderWidget();\n      return;\n    }\n\n    // Inject SDK styles\n    injectStyles();\n\n    // Check display control\n    if (!this.shouldDisplay()) {\n      console.log('[Voyage] Widget hidden by display rules');\n      return;\n    }\n\n    // Optimistic loading: 캐시가 있으면 먼저 표시\n    const cachedConfig = getCachedConfig(config.sdkKey);\n    if (cachedConfig) {\n      this.serverConfig = this.mergeConfig(cachedConfig, config);\n      this.isWidgetVisible = true;\n      this.renderWidget();\n      console.log('[Voyage] Initialized (cached)');\n\n      // 백그라운드에서 최신 config fetch\n      this.refreshConfigInBackground();\n      return;\n    }\n\n    // 캐시가 없으면 fetch 후 표시\n    const fetchedConfig = await fetchProjectConfig(config.sdkKey);\n\n    if (!fetchedConfig) {\n      console.error('[Voyage] Failed to fetch config. Check your SDK Key or network connection.');\n      this.hasInitError = true;\n      this.serverConfig = { ...DEFAULT_CONFIG };\n      this.isWidgetVisible = true;\n      this.renderWidget();\n      return;\n    }\n\n    this.serverConfig = this.mergeConfig(fetchedConfig, config);\n\n    // Render widget\n    this.isWidgetVisible = true;\n    this.renderWidget();\n    console.log('[Voyage] Initialized');\n  }\n\n  private async refreshConfigInBackground(): Promise<void> {\n    if (!this.config) return;\n\n    try {\n      // 캐시를 무시하고 서버에서 최신 설정 가져오기\n      const freshConfig = await fetchProjectConfig(this.config.sdkKey, { forceRefresh: true });\n      if (freshConfig && this.serverConfig) {\n        // 설정이 변경되었을 때만 re-render\n        const newConfig = this.mergeConfig(freshConfig, this.config);\n        if (JSON.stringify(newConfig) !== JSON.stringify(this.serverConfig)) {\n          this.serverConfig = newConfig;\n          this.renderWidget();\n          console.log('[Voyage] Config updated');\n        }\n      }\n    } catch {\n      // 백그라운드 갱신 실패는 무시 (이미 캐시로 동작 중)\n    }\n  }\n\n  show(): void {\n    if (!this.config) {\n      console.warn('[Voyage] SDK not initialized');\n      return;\n    }\n    this.isWidgetVisible = true;\n    this.renderWidget();\n  }\n\n  hide(): void {\n    this.isWidgetVisible = false;\n    this.renderWidget();\n  }\n\n  open(): void {\n    if (!this.config) {\n      console.warn('[Voyage] SDK not initialized');\n      return;\n    }\n    this.isModalOpen = true;\n    this.renderWidget();\n  }\n\n  close(): void {\n    this.isModalOpen = false;\n    this.renderWidget();\n  }\n\n  isOpen(): boolean {\n    return this.isModalOpen;\n  }\n\n  isVisible(): boolean {\n    return this.isWidgetVisible;\n  }\n\n  async refreshConfig(): Promise<void> {\n    if (!this.config) return;\n    // 캐시를 무시하고 서버에서 최신 설정 가져오기\n    const fetchedConfig = await fetchProjectConfig(this.config.sdkKey, { forceRefresh: true });\n    this.serverConfig = this.mergeConfig(fetchedConfig, this.config);\n    this.renderWidget();\n  }\n\n  destroy(): void {\n    if (this.container) {\n      render(null, this.container);\n      this.container.remove();\n      this.container = null;\n    }\n    this.config = null;\n    this.serverConfig = null;\n    this.isWidgetVisible = false;\n    this.isModalOpen = false;\n  }\n\n  private renderWidget(): void {\n    if (!this.serverConfig || !this.config) return;\n\n    // Create container if not exists\n    if (!this.container) {\n      this.container = document.createElement('div');\n      this.container.id = 'voyage-widget-container';\n      document.body.appendChild(this.container);\n    }\n\n    const sdkKey = this.config.sdkKey;\n\n    render(\n      h(Widget, {\n        config: this.serverConfig,\n        visible: this.isWidgetVisible,\n        defaultOpen: this.isModalOpen,\n        hasError: this.hasInitError,\n        onOpenChange: (open: boolean) => {\n          this.isModalOpen = open;\n        },\n        getMetadata: captureMetadata,\n        onSubmit: async (data: FeedbackData) => {\n          return submitFeedback(sdkKey, data);\n        },\n        onUpload: async (file: File) => {\n          return uploadImage(sdkKey, file);\n        },\n      }),\n      this.container\n    );\n  }\n\n  private mergeConfig(server: ProjectConfig | null, _client: VoyageConfig): ProjectConfig {\n    // Server config takes priority: use values set from dashboard\n    // Client-side theme override disabled (to prevent config conflicts)\n    return server || { ...DEFAULT_CONFIG };\n  }\n\n  private shouldDisplay(): boolean {\n    if (!this.config) return false;\n\n    const pathname = window.location.pathname;\n    const { include, exclude } = this.config;\n\n    // include takes priority over exclude\n    if (include && include.length > 0) {\n      return include.some((pattern) => this.matchPath(pathname, pattern));\n    }\n\n    if (exclude && exclude.length > 0) {\n      return !exclude.some((pattern) => this.matchPath(pathname, pattern));\n    }\n\n    return true;\n  }\n\n  private matchPath(pathname: string, pattern: string): boolean {\n    // Simple glob matching: /admin/* matches /admin/anything\n    if (pattern.endsWith('/*')) {\n      const prefix = pattern.slice(0, -2);\n      return pathname.startsWith(prefix);\n    }\n    return pathname === pattern;\n  }\n}\n\n// Singleton instance\nconst Voyage = new VoyageSDK();\n\nexport { Voyage };\nexport default Voyage;\n"]}