{"version":3,"sources":["../src/hooks/useDeviceSupport.tsx","../src/hooks/useSound.tsx","../src/hooks/useGridClasses.tsx","../src/hooks/useShortcutFormatter.tsx","../src/hooks/getFormattedDate.ts"],"names":["useState","useEffect","useCallback","useMemo","UAParser","useRef"],"mappings":"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","file":"sdk.cjs","sourcesContent":["import { useEffect, useState } from \"react\";\n\n// Helper function to detect device type and orientation\nexport const useDeviceSupport = () => {\n  const [isSupported, setIsSupported] = useState(true);\n\n  useEffect(() => {\n    function checkSupport() {\n      // Get user agent and screen info\n      const ua =\n        typeof window !== \"undefined\" ? window.navigator.userAgent : \"\";\n      const width = typeof window !== \"undefined\" ? window.innerWidth : 1920;\n      const height = typeof window !== \"undefined\" ? window.innerHeight : 1080;\n      const isTouch =\n        typeof window !== \"undefined\" ? \"ontouchstart\" in window : false;\n\n      // Mobile detection (iOS/Android phones)\n      const isMobile = /Mobi|Android|iPhone|iPod/.test(ua) && width <= 767;\n\n      // Tablet detection (portrait/landscape)\n      const isTablet =\n        (/iPad|Tablet|Android/.test(ua) && !/Mobile/.test(ua)) ||\n        (isTouch && width >= 600 && width <= 1024);\n      // Tablet portrait: width < height, width <= 1024, height > width\n      const isTabletPortrait = isTablet && width < height;\n      // Tablet landscape: width > height, width <= 1366, width >= 1024\n      const isTabletLandscape =\n        isTablet && width > height && width >= 1024 && width <= 1366;\n\n      // Laptop: width >= 1024 (landscape), not touch or not tablet\n      const isLaptop =\n        width >= 1024 && !isMobile && (!isTablet || isTabletLandscape);\n\n      // Support logic:\n      // - Mobile: Not supported\n      // - Tablet portrait: Not supported\n      // - Tablet landscape: Supported\n      // - Laptop: Supported\n\n      if (isMobile) {\n        setIsSupported(false);\n      } else if (isTabletPortrait) {\n        setIsSupported(false);\n      } else if (isTabletLandscape) {\n        setIsSupported(true);\n      } else if (isLaptop) {\n        setIsSupported(true);\n      } else {\n        // Default: allow desktop\n        setIsSupported(true);\n      }\n    }\n\n    checkSupport();\n    window.addEventListener(\"resize\", checkSupport);\n    return () => window.removeEventListener(\"resize\", checkSupport);\n  }, []);\n\n  return isSupported;\n};\n","import { useCallback } from \"react\";\nimport clickTone from \"../assets/sounds/click-tone.wav\";\nimport errorTone from \"../assets/sounds/error-tone.wav\";\nimport notificationTone from \"../assets/sounds/notification-tone.wav\";\nimport successTone from \"../assets/sounds/success-tone.wav\";\nimport swipeTone from \"../assets/sounds/swipe-tone.wav\";\n\nexport type SoundType =\n  | \"click\"\n  | \"error\"\n  | \"success\"\n  | \"alert\"\n  | \"notification\"\n  | \"swipe\";\n\nconst soundMap: Record<SoundType, string> = {\n  click: clickTone,\n  error: errorTone,\n  success: successTone,\n  alert: errorTone,\n  notification: notificationTone,\n  swipe: swipeTone,\n};\n\nconst DEFAULT_SOUND_TYPE: SoundType = \"click\";\nconst audioBufferCache = new Map<string, Promise<AudioBuffer>>();\n\nlet sharedAudioContext: AudioContext | null = null;\n\nconst isSoundType = (type: string): type is SoundType => {\n  return type in soundMap;\n};\n\nexport const useSound = () => {\n  const getAudioContext = () => {\n    if (typeof window === \"undefined\") {\n      return null;\n    }\n\n    const AudioContextCtor = window.AudioContext ?? (window as Window & { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n\n    if (!AudioContextCtor) {\n      return null;\n    }\n\n    if (!sharedAudioContext || sharedAudioContext.state === \"closed\") {\n      sharedAudioContext = new AudioContextCtor();\n    }\n\n    return sharedAudioContext;\n  };\n\n  const loadAudioBuffer = async (source: string) => {\n    const cached = audioBufferCache.get(source);\n\n    if (cached) {\n      return cached;\n    }\n\n    const promise = (async () => {\n      if (typeof fetch !== \"function\") {\n        throw new Error(\"Fetch is not available\");\n      }\n\n      const response = await fetch(source);\n\n      if (!response.ok) {\n        throw new Error(`Failed to load sound source: ${response.status} ${response.statusText}`);\n      }\n\n      const context = getAudioContext();\n\n      if (!context) {\n        throw new Error(\"Web Audio API is not available\");\n      }\n\n      const arrayBuffer = await response.arrayBuffer();\n      return await context.decodeAudioData(arrayBuffer.slice(0));\n    })().catch((error) => {\n      audioBufferCache.delete(source);\n      throw error;\n    });\n\n    audioBufferCache.set(source, promise);\n    return promise;\n  };\n\n  const playWithAudioBuffer = async (buffer: AudioBuffer) => {\n    const context = getAudioContext();\n\n    if (!context) {\n      throw new Error(\"Web Audio API is not available\");\n    }\n\n    if (context.state === \"suspended\") {\n      await context.resume();\n    }\n\n    await new Promise<void>((resolve, reject) => {\n      const sourceNode = context.createBufferSource();\n      sourceNode.buffer = buffer;\n      sourceNode.connect(context.destination);\n      sourceNode.onended = () => resolve();\n\n      try {\n        sourceNode.start(0);\n      } catch (error) {\n        reject(error);\n      }\n    });\n  };\n\n  const playWithAudioElement = async (source: string) => {\n    const audio = new Audio(source);\n    audio.preload = \"auto\";\n    audio.currentTime = 0;\n    await audio.play();\n  };\n\n  const playSound = useCallback((type: SoundType | string) => {\n    if (typeof window === \"undefined\") {\n      return;\n    }\n\n    const requestedType = isSoundType(type)\n      ? type\n      : DEFAULT_SOUND_TYPE;\n\n    const src = soundMap[requestedType];\n\n    if (!src) {\n      console.error(`Sound playback failed: no source found for \"${requestedType}\"`);\n      return;\n    }\n\n    void (async () => {\n      let lastError: unknown;\n\n      if (getAudioContext()) {\n        try {\n          const buffer = await loadAudioBuffer(src);\n          await playWithAudioBuffer(buffer);\n          return;\n        } catch (error) {\n          lastError = error;\n        }\n      }\n\n      try {\n        await playWithAudioElement(src);\n        return;\n      } catch (error) {\n        lastError = error;\n      }\n\n      console.error(`Sound playback failed for \"${requestedType}\":`, lastError);\n    })();\n  }, []);\n\n  return {\n    playSound,\n  };\n};","import { useMemo } from \"react\";\n\nconst useGridClasses = (\n  windowSize: { width: number; height: number },\n  gridRules: Record<string, Record<string, Record<string, string>>>\n) => {\n  const deviceType: \"mobile\" | \"tablet\" | \"desktop\" = useMemo(() => {\n    if (windowSize.width <= 640) return \"mobile\"; // For mobile (width <= 640px)\n    if (windowSize.width <= 1024) return \"tablet\"; // For tablet (width <= 1024px)\n    return \"desktop\"; // For desktop (width > 1024px)\n  }, [windowSize]);\n\n  const gridClasses: Record<string, string> = useMemo(() => {\n    const classes: Record<string, string> = {};\n    for (const element in gridRules) {\n      const classRules = gridRules[element] ?? {};\n      const colSpan = classRules[\"col-span\"]?.[deviceType] ?? \"12\";\n      classes[element] = `col-span-${deviceType}-${colSpan}`;\n    }\n    return classes;\n  }, [deviceType, gridRules]);\n\n  return { gridClasses, deviceType };\n};\n\nexport default useGridClasses;\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { UAParser } from \"ua-parser-js\";\n\ntype OS = \"mac\" | \"windows\" | \"linux\";\n\ntype KeyMap = {\n  [key in OS]: {\n    [key: string]: string;\n  };\n};\n\nexport type Shortcut = {\n  command: string;\n  shortcut: string[];\n  usage: string;\n};\n\nconst keyMap: KeyMap = {\n  mac: {\n    ctrl: \"⌘\",\n    cmd: \"⌘\",\n    meta: \"⌘\",\n    alt: \"⌥\",\n    option: \"⌥\",\n    shift: \"⇧\",\n    enter: \"⏎\",\n    backspace: \"⌫\",\n    arrowup: \"↑\",\n    arrowdown: \"↓\",\n    arrowleft: \"←\",\n    arrowright: \"→\",\n  },\n  windows: {\n    ctrl: \"Ctrl\",\n    cmd: \"Ctrl\",\n    meta: \"Win\",\n    alt: \"Alt\",\n    option: \"Alt\",\n    shift: \"Shift\",\n    enter: \"Enter\",\n    backspace: \"Backspace\",\n    arrowup: \"↑\",\n    arrowdown: \"↓\",\n    arrowleft: \"←\",\n    arrowright: \"→\",\n  },\n  linux: {\n    ctrl: \"Ctrl\",\n    cmd: \"Ctrl\",\n    meta: \"Super\",\n    alt: \"Alt\",\n    option: \"Alt\",\n    shift: \"Shift\",\n    enter: \"Enter\",\n    backspace: \"Backspace\",\n    arrowup: \"↑\",\n    arrowdown: \"↓\",\n    arrowleft: \"←\",\n    arrowright: \"→\",\n  },\n};\n\nconst detectOS = (): OS => {\n  const parser = new UAParser();\n  const osName = parser.getOS().name?.toLowerCase() || \"\";\n\n  if (osName.includes(\"mac\")) return \"mac\";\n  if (osName.includes(\"windows\")) return \"windows\";\n  if (osName.includes(\"linux\")) return \"linux\";\n  return \"windows\";\n};\n\ntype UseShortcutFormatterOptions = {\n  globalKeyboardShortcuts?: Shortcut[];\n};\n\ntype UseShortcutFormatterReturn = {\n  formatKeys: (keys: string[]) => string;\n  getShortcutByCommand: (command: string) => string[];\n  addShortcutListener: (\n    command: string,\n    listener: (e: KeyboardEvent) => void\n  ) => void;\n  removeShortcutListener: (\n    command: string,\n    listener: (e: KeyboardEvent) => void\n  ) => void;\n};\n\nconst normalizeKey = (key: string) => key.toLowerCase();\n\nconst matchShortcut = (event: KeyboardEvent, shortcut: string[], os: OS) => {\n  const keySet = new Set(shortcut.map(normalizeKey));\n  const pressed: string[] = [];\n\n  if (os === \"mac\") {\n    if (event.metaKey) pressed.push(\"ctrl\");\n  } else {\n    if (event.ctrlKey) pressed.push(\"ctrl\");\n  }\n  \n  if (event.altKey) pressed.push(\"alt\");\n  if (event.shiftKey) pressed.push(\"shift\");\n\n  if (event.key && ![\"Control\", \"Meta\", \"Alt\", \"Shift\"].includes(event.key)) {\n    pressed.push(normalizeKey(event.key));\n  }\n\n  if (pressed.length !== shortcut.length) return false;\n  return pressed.every((k) => keySet.has(k));\n};\n\nconst useShortcutFormatter = ({\n  globalKeyboardShortcuts = [],\n}: UseShortcutFormatterOptions = {}): UseShortcutFormatterReturn => {\n  const [os, setOS] = useState<OS>(\"windows\");\n  const listenersRef = useRef<Map<string, Set<(e: KeyboardEvent) => void>>>(\n    new Map()\n  );\n\n  useEffect(() => {\n    setOS(detectOS());\n  }, []);\n\n  useEffect(() => {\n    if (!globalKeyboardShortcuts.length) return;\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      for (const shortcut of globalKeyboardShortcuts) {\n        if (matchShortcut(event, shortcut.shortcut, os)) {\n          const listeners = listenersRef.current.get(shortcut.command);\n          if (listeners && listeners.size > 0) {\n            event.preventDefault();\n            listeners.forEach((cb) => cb(event));\n          }\n        }\n      }\n    };\n\n    window.addEventListener(\"keydown\", handleKeyDown);\n    return () => {\n      window.removeEventListener(\"keydown\", handleKeyDown);\n    };\n  }, [os, globalKeyboardShortcuts]);\n\n  const formatKeys = useCallback(\n    (keys: string[] = []): string => {\n      const separator = os === \"mac\" ? \"\" : \" + \";\n      return keys\n        .map((key) => keyMap[os][key.toLowerCase()] || key.toUpperCase())\n        .join(separator);\n    },\n    [os]\n  );\n\n  const getShortcutByCommand = useCallback(\n    (command: string): string[] => {\n      const found = globalKeyboardShortcuts.find((s) => s.command === command);\n      return found ? found.shortcut : [];\n    },\n    [globalKeyboardShortcuts]\n  );\n\n  const addShortcutListener = useCallback(\n    (command: string, listener: (e: KeyboardEvent) => void) => {\n      if (!listenersRef.current.has(command)) {\n        listenersRef.current.set(command, new Set());\n      }\n      listenersRef.current.get(command)!.add(listener);\n    },\n    []\n  );\n\n  const removeShortcutListener = useCallback(\n    (command: string, listener: (e: KeyboardEvent) => void) => {\n      if (listenersRef.current.has(command)) {\n        listenersRef.current.get(command)!.delete(listener);\n      }\n    },\n    []\n  );\n\n  return {\n    formatKeys,\n    getShortcutByCommand,\n    addShortcutListener,\n    removeShortcutListener,\n  };\n};\n\nexport default useShortcutFormatter;","export const getFormattedDate = (dateInput: string): string => {\n  const timestamp = Number(dateInput);\n  if (isNaN(timestamp)) return \"Invalid date\";\n\n  const date = new Date(timestamp);\n  const formatter = new Intl.DateTimeFormat(\"en-GB\", {\n    day: \"2-digit\",\n    month: \"short\",\n    year: \"numeric\",\n  });\n\n  return formatter.format(date);\n};\n"]}