{"version":3,"file":"index.cjs","sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../node_modules/.pnpm/tailwind-merge@2.6.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs","../src/utils/cn.ts","../src/utils/grid.ts","../src/components/ResizeHandle.tsx","../src/components/GridItem.tsx","../src/utils/touch.ts","../src/hooks/useResize.ts","../src/hooks/useDrag.ts","../src/components/GridContainer.tsx","../src/components/ResponsiveGridContainer.tsx","../src/utils/touch-debug.ts","../src/components/DroppableGridContainer.tsx","../src/utils/throttle.ts","../src/components/WidthProvider.tsx","../src/utils/layouts.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","const CLASS_PART_SEPARATOR = '-';\nconst createClassGroupUtils = config => {\n  const classMap = createClassMap(config);\n  const {\n    conflictingClassGroups,\n    conflictingClassGroupModifiers\n  } = config;\n  const getClassGroupId = className => {\n    const classParts = className.split(CLASS_PART_SEPARATOR);\n    // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n    if (classParts[0] === '' && classParts.length !== 1) {\n      classParts.shift();\n    }\n    return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);\n  };\n  const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n    const conflicts = conflictingClassGroups[classGroupId] || [];\n    if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n      return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];\n    }\n    return conflicts;\n  };\n  return {\n    getClassGroupId,\n    getConflictingClassGroupIds\n  };\n};\nconst getGroupRecursive = (classParts, classPartObject) => {\n  if (classParts.length === 0) {\n    return classPartObject.classGroupId;\n  }\n  const currentClassPart = classParts[0];\n  const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n  const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;\n  if (classGroupFromNextClassPart) {\n    return classGroupFromNextClassPart;\n  }\n  if (classPartObject.validators.length === 0) {\n    return undefined;\n  }\n  const classRest = classParts.join(CLASS_PART_SEPARATOR);\n  return classPartObject.validators.find(({\n    validator\n  }) => validator(classRest))?.classGroupId;\n};\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/;\nconst getGroupIdForArbitraryProperty = className => {\n  if (arbitraryPropertyRegex.test(className)) {\n    const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];\n    const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));\n    if (property) {\n      // I use two dots here because one dot is used as prefix for class groups in plugins\n      return 'arbitrary..' + property;\n    }\n  }\n};\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n  const {\n    theme,\n    prefix\n  } = config;\n  const classMap = {\n    nextPart: new Map(),\n    validators: []\n  };\n  const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);\n  prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n    processClassesRecursively(classGroup, classMap, classGroupId, theme);\n  });\n  return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n  classGroup.forEach(classDefinition => {\n    if (typeof classDefinition === 'string') {\n      const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n      classPartObjectToEdit.classGroupId = classGroupId;\n      return;\n    }\n    if (typeof classDefinition === 'function') {\n      if (isThemeGetter(classDefinition)) {\n        processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n        return;\n      }\n      classPartObject.validators.push({\n        validator: classDefinition,\n        classGroupId\n      });\n      return;\n    }\n    Object.entries(classDefinition).forEach(([key, classGroup]) => {\n      processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);\n    });\n  });\n};\nconst getPart = (classPartObject, path) => {\n  let currentClassPartObject = classPartObject;\n  path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {\n    if (!currentClassPartObject.nextPart.has(pathPart)) {\n      currentClassPartObject.nextPart.set(pathPart, {\n        nextPart: new Map(),\n        validators: []\n      });\n    }\n    currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);\n  });\n  return currentClassPartObject;\n};\nconst isThemeGetter = func => func.isThemeGetter;\nconst getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {\n  if (!prefix) {\n    return classGroupEntries;\n  }\n  return classGroupEntries.map(([classGroupId, classGroup]) => {\n    const prefixedClassGroup = classGroup.map(classDefinition => {\n      if (typeof classDefinition === 'string') {\n        return prefix + classDefinition;\n      }\n      if (typeof classDefinition === 'object') {\n        return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));\n      }\n      return classDefinition;\n    });\n    return [classGroupId, prefixedClassGroup];\n  });\n};\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nconst createLruCache = maxCacheSize => {\n  if (maxCacheSize < 1) {\n    return {\n      get: () => undefined,\n      set: () => {}\n    };\n  }\n  let cacheSize = 0;\n  let cache = new Map();\n  let previousCache = new Map();\n  const update = (key, value) => {\n    cache.set(key, value);\n    cacheSize++;\n    if (cacheSize > maxCacheSize) {\n      cacheSize = 0;\n      previousCache = cache;\n      cache = new Map();\n    }\n  };\n  return {\n    get(key) {\n      let value = cache.get(key);\n      if (value !== undefined) {\n        return value;\n      }\n      if ((value = previousCache.get(key)) !== undefined) {\n        update(key, value);\n        return value;\n      }\n    },\n    set(key, value) {\n      if (cache.has(key)) {\n        cache.set(key, value);\n      } else {\n        update(key, value);\n      }\n    }\n  };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst createParseClassName = config => {\n  const {\n    separator,\n    experimentalParseClassName\n  } = config;\n  const isSeparatorSingleCharacter = separator.length === 1;\n  const firstSeparatorCharacter = separator[0];\n  const separatorLength = separator.length;\n  // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n  const parseClassName = className => {\n    const modifiers = [];\n    let bracketDepth = 0;\n    let modifierStart = 0;\n    let postfixModifierPosition;\n    for (let index = 0; index < className.length; index++) {\n      let currentCharacter = className[index];\n      if (bracketDepth === 0) {\n        if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {\n          modifiers.push(className.slice(modifierStart, index));\n          modifierStart = index + separatorLength;\n          continue;\n        }\n        if (currentCharacter === '/') {\n          postfixModifierPosition = index;\n          continue;\n        }\n      }\n      if (currentCharacter === '[') {\n        bracketDepth++;\n      } else if (currentCharacter === ']') {\n        bracketDepth--;\n      }\n    }\n    const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);\n    const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);\n    const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;\n    const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n    return {\n      modifiers,\n      hasImportantModifier,\n      baseClassName,\n      maybePostfixModifierPosition\n    };\n  };\n  if (experimentalParseClassName) {\n    return className => experimentalParseClassName({\n      className,\n      parseClassName\n    });\n  }\n  return parseClassName;\n};\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst sortModifiers = modifiers => {\n  if (modifiers.length <= 1) {\n    return modifiers;\n  }\n  const sortedModifiers = [];\n  let unsortedModifiers = [];\n  modifiers.forEach(modifier => {\n    const isArbitraryVariant = modifier[0] === '[';\n    if (isArbitraryVariant) {\n      sortedModifiers.push(...unsortedModifiers.sort(), modifier);\n      unsortedModifiers = [];\n    } else {\n      unsortedModifiers.push(modifier);\n    }\n  });\n  sortedModifiers.push(...unsortedModifiers.sort());\n  return sortedModifiers;\n};\nconst createConfigUtils = config => ({\n  cache: createLruCache(config.cacheSize),\n  parseClassName: createParseClassName(config),\n  ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n  const {\n    parseClassName,\n    getClassGroupId,\n    getConflictingClassGroupIds\n  } = configUtils;\n  /**\n   * Set of classGroupIds in following format:\n   * `{importantModifier}{variantModifiers}{classGroupId}`\n   * @example 'float'\n   * @example 'hover:focus:bg-color'\n   * @example 'md:!pr'\n   */\n  const classGroupsInConflict = [];\n  const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n  let result = '';\n  for (let index = classNames.length - 1; index >= 0; index -= 1) {\n    const originalClassName = classNames[index];\n    const {\n      modifiers,\n      hasImportantModifier,\n      baseClassName,\n      maybePostfixModifierPosition\n    } = parseClassName(originalClassName);\n    let hasPostfixModifier = Boolean(maybePostfixModifierPosition);\n    let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n    if (!classGroupId) {\n      if (!hasPostfixModifier) {\n        // Not a Tailwind class\n        result = originalClassName + (result.length > 0 ? ' ' + result : result);\n        continue;\n      }\n      classGroupId = getClassGroupId(baseClassName);\n      if (!classGroupId) {\n        // Not a Tailwind class\n        result = originalClassName + (result.length > 0 ? ' ' + result : result);\n        continue;\n      }\n      hasPostfixModifier = false;\n    }\n    const variantModifier = sortModifiers(modifiers).join(':');\n    const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n    const classId = modifierId + classGroupId;\n    if (classGroupsInConflict.includes(classId)) {\n      // Tailwind class omitted due to conflict\n      continue;\n    }\n    classGroupsInConflict.push(classId);\n    const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n    for (let i = 0; i < conflictGroups.length; ++i) {\n      const group = conflictGroups[i];\n      classGroupsInConflict.push(modifierId + group);\n    }\n    // Tailwind class not in conflict\n    result = originalClassName + (result.length > 0 ? ' ' + result : result);\n  }\n  return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nfunction twJoin() {\n  let index = 0;\n  let argument;\n  let resolvedValue;\n  let string = '';\n  while (index < arguments.length) {\n    if (argument = arguments[index++]) {\n      if (resolvedValue = toValue(argument)) {\n        string && (string += ' ');\n        string += resolvedValue;\n      }\n    }\n  }\n  return string;\n}\nconst toValue = mix => {\n  if (typeof mix === 'string') {\n    return mix;\n  }\n  let resolvedValue;\n  let string = '';\n  for (let k = 0; k < mix.length; k++) {\n    if (mix[k]) {\n      if (resolvedValue = toValue(mix[k])) {\n        string && (string += ' ');\n        string += resolvedValue;\n      }\n    }\n  }\n  return string;\n};\nfunction createTailwindMerge(createConfigFirst, ...createConfigRest) {\n  let configUtils;\n  let cacheGet;\n  let cacheSet;\n  let functionToCall = initTailwindMerge;\n  function initTailwindMerge(classList) {\n    const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n    configUtils = createConfigUtils(config);\n    cacheGet = configUtils.cache.get;\n    cacheSet = configUtils.cache.set;\n    functionToCall = tailwindMerge;\n    return tailwindMerge(classList);\n  }\n  function tailwindMerge(classList) {\n    const cachedResult = cacheGet(classList);\n    if (cachedResult) {\n      return cachedResult;\n    }\n    const result = mergeClassList(classList, configUtils);\n    cacheSet(classList, result);\n    return result;\n  }\n  return function callTailwindMerge() {\n    return functionToCall(twJoin.apply(null, arguments));\n  };\n}\nconst fromTheme = key => {\n  const themeGetter = theme => theme[key] || [];\n  themeGetter.isThemeGetter = true;\n  return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst stringLengths = /*#__PURE__*/new Set(['px', 'full', 'screen']);\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isLength = value => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, 'length', isLengthOnly);\nconst isNumber = value => Boolean(value) && !Number.isNaN(Number(value));\nconst isArbitraryNumber = value => getIsArbitraryValue(value, 'number', isNumber);\nconst isInteger = value => Boolean(value) && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst sizeLabels = /*#__PURE__*/new Set(['length', 'size', 'percentage']);\nconst isArbitrarySize = value => getIsArbitraryValue(value, sizeLabels, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, 'position', isNever);\nconst imageLabels = /*#__PURE__*/new Set(['image', 'url']);\nconst isArbitraryImage = value => getIsArbitraryValue(value, imageLabels, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, '', isShadow);\nconst isAny = () => true;\nconst getIsArbitraryValue = (value, label, testValue) => {\n  const result = arbitraryValueRegex.exec(value);\n  if (result) {\n    if (result[1]) {\n      return typeof label === 'string' ? result[1] === label : label.has(result[1]);\n    }\n    return testValue(result[2]);\n  }\n  return false;\n};\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst validators = /*#__PURE__*/Object.defineProperty({\n  __proto__: null,\n  isAny,\n  isArbitraryImage,\n  isArbitraryLength,\n  isArbitraryNumber,\n  isArbitraryPosition,\n  isArbitraryShadow,\n  isArbitrarySize,\n  isArbitraryValue,\n  isInteger,\n  isLength,\n  isNumber,\n  isPercent,\n  isTshirtSize\n}, Symbol.toStringTag, {\n  value: 'Module'\n});\nconst getDefaultConfig = () => {\n  const colors = fromTheme('colors');\n  const spacing = fromTheme('spacing');\n  const blur = fromTheme('blur');\n  const brightness = fromTheme('brightness');\n  const borderColor = fromTheme('borderColor');\n  const borderRadius = fromTheme('borderRadius');\n  const borderSpacing = fromTheme('borderSpacing');\n  const borderWidth = fromTheme('borderWidth');\n  const contrast = fromTheme('contrast');\n  const grayscale = fromTheme('grayscale');\n  const hueRotate = fromTheme('hueRotate');\n  const invert = fromTheme('invert');\n  const gap = fromTheme('gap');\n  const gradientColorStops = fromTheme('gradientColorStops');\n  const gradientColorStopPositions = fromTheme('gradientColorStopPositions');\n  const inset = fromTheme('inset');\n  const margin = fromTheme('margin');\n  const opacity = fromTheme('opacity');\n  const padding = fromTheme('padding');\n  const saturate = fromTheme('saturate');\n  const scale = fromTheme('scale');\n  const sepia = fromTheme('sepia');\n  const skew = fromTheme('skew');\n  const space = fromTheme('space');\n  const translate = fromTheme('translate');\n  const getOverscroll = () => ['auto', 'contain', 'none'];\n  const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n  const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing];\n  const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];\n  const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength];\n  const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue];\n  const getPositions = () => ['bottom', 'center', 'left', 'left-bottom', 'left-top', 'right', 'right-bottom', 'right-top', 'top'];\n  const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'];\n  const getBlendModes = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n  const getAlign = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'];\n  const getZeroAndEmpty = () => ['', '0', isArbitraryValue];\n  const getBreaks = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n  const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];\n  return {\n    cacheSize: 500,\n    separator: ':',\n    theme: {\n      colors: [isAny],\n      spacing: [isLength, isArbitraryLength],\n      blur: ['none', '', isTshirtSize, isArbitraryValue],\n      brightness: getNumberAndArbitrary(),\n      borderColor: [colors],\n      borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n      borderSpacing: getSpacingWithArbitrary(),\n      borderWidth: getLengthWithEmptyAndArbitrary(),\n      contrast: getNumberAndArbitrary(),\n      grayscale: getZeroAndEmpty(),\n      hueRotate: getNumberAndArbitrary(),\n      invert: getZeroAndEmpty(),\n      gap: getSpacingWithArbitrary(),\n      gradientColorStops: [colors],\n      gradientColorStopPositions: [isPercent, isArbitraryLength],\n      inset: getSpacingWithAutoAndArbitrary(),\n      margin: getSpacingWithAutoAndArbitrary(),\n      opacity: getNumberAndArbitrary(),\n      padding: getSpacingWithArbitrary(),\n      saturate: getNumberAndArbitrary(),\n      scale: getNumberAndArbitrary(),\n      sepia: getZeroAndEmpty(),\n      skew: getNumberAndArbitrary(),\n      space: getSpacingWithArbitrary(),\n      translate: getSpacingWithArbitrary()\n    },\n    classGroups: {\n      // Layout\n      /**\n       * Aspect Ratio\n       * @see https://tailwindcss.com/docs/aspect-ratio\n       */\n      aspect: [{\n        aspect: ['auto', 'square', 'video', isArbitraryValue]\n      }],\n      /**\n       * Container\n       * @see https://tailwindcss.com/docs/container\n       */\n      container: ['container'],\n      /**\n       * Columns\n       * @see https://tailwindcss.com/docs/columns\n       */\n      columns: [{\n        columns: [isTshirtSize]\n      }],\n      /**\n       * Break After\n       * @see https://tailwindcss.com/docs/break-after\n       */\n      'break-after': [{\n        'break-after': getBreaks()\n      }],\n      /**\n       * Break Before\n       * @see https://tailwindcss.com/docs/break-before\n       */\n      'break-before': [{\n        'break-before': getBreaks()\n      }],\n      /**\n       * Break Inside\n       * @see https://tailwindcss.com/docs/break-inside\n       */\n      'break-inside': [{\n        'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n      }],\n      /**\n       * Box Decoration Break\n       * @see https://tailwindcss.com/docs/box-decoration-break\n       */\n      'box-decoration': [{\n        'box-decoration': ['slice', 'clone']\n      }],\n      /**\n       * Box Sizing\n       * @see https://tailwindcss.com/docs/box-sizing\n       */\n      box: [{\n        box: ['border', 'content']\n      }],\n      /**\n       * Display\n       * @see https://tailwindcss.com/docs/display\n       */\n      display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n      /**\n       * Floats\n       * @see https://tailwindcss.com/docs/float\n       */\n      float: [{\n        float: ['right', 'left', 'none', 'start', 'end']\n      }],\n      /**\n       * Clear\n       * @see https://tailwindcss.com/docs/clear\n       */\n      clear: [{\n        clear: ['left', 'right', 'both', 'none', 'start', 'end']\n      }],\n      /**\n       * Isolation\n       * @see https://tailwindcss.com/docs/isolation\n       */\n      isolation: ['isolate', 'isolation-auto'],\n      /**\n       * Object Fit\n       * @see https://tailwindcss.com/docs/object-fit\n       */\n      'object-fit': [{\n        object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n      }],\n      /**\n       * Object Position\n       * @see https://tailwindcss.com/docs/object-position\n       */\n      'object-position': [{\n        object: [...getPositions(), isArbitraryValue]\n      }],\n      /**\n       * Overflow\n       * @see https://tailwindcss.com/docs/overflow\n       */\n      overflow: [{\n        overflow: getOverflow()\n      }],\n      /**\n       * Overflow X\n       * @see https://tailwindcss.com/docs/overflow\n       */\n      'overflow-x': [{\n        'overflow-x': getOverflow()\n      }],\n      /**\n       * Overflow Y\n       * @see https://tailwindcss.com/docs/overflow\n       */\n      'overflow-y': [{\n        'overflow-y': getOverflow()\n      }],\n      /**\n       * Overscroll Behavior\n       * @see https://tailwindcss.com/docs/overscroll-behavior\n       */\n      overscroll: [{\n        overscroll: getOverscroll()\n      }],\n      /**\n       * Overscroll Behavior X\n       * @see https://tailwindcss.com/docs/overscroll-behavior\n       */\n      'overscroll-x': [{\n        'overscroll-x': getOverscroll()\n      }],\n      /**\n       * Overscroll Behavior Y\n       * @see https://tailwindcss.com/docs/overscroll-behavior\n       */\n      'overscroll-y': [{\n        'overscroll-y': getOverscroll()\n      }],\n      /**\n       * Position\n       * @see https://tailwindcss.com/docs/position\n       */\n      position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n      /**\n       * Top / Right / Bottom / Left\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      inset: [{\n        inset: [inset]\n      }],\n      /**\n       * Right / Left\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      'inset-x': [{\n        'inset-x': [inset]\n      }],\n      /**\n       * Top / Bottom\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      'inset-y': [{\n        'inset-y': [inset]\n      }],\n      /**\n       * Start\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      start: [{\n        start: [inset]\n      }],\n      /**\n       * End\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      end: [{\n        end: [inset]\n      }],\n      /**\n       * Top\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      top: [{\n        top: [inset]\n      }],\n      /**\n       * Right\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      right: [{\n        right: [inset]\n      }],\n      /**\n       * Bottom\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      bottom: [{\n        bottom: [inset]\n      }],\n      /**\n       * Left\n       * @see https://tailwindcss.com/docs/top-right-bottom-left\n       */\n      left: [{\n        left: [inset]\n      }],\n      /**\n       * Visibility\n       * @see https://tailwindcss.com/docs/visibility\n       */\n      visibility: ['visible', 'invisible', 'collapse'],\n      /**\n       * Z-Index\n       * @see https://tailwindcss.com/docs/z-index\n       */\n      z: [{\n        z: ['auto', isInteger, isArbitraryValue]\n      }],\n      // Flexbox and Grid\n      /**\n       * Flex Basis\n       * @see https://tailwindcss.com/docs/flex-basis\n       */\n      basis: [{\n        basis: getSpacingWithAutoAndArbitrary()\n      }],\n      /**\n       * Flex Direction\n       * @see https://tailwindcss.com/docs/flex-direction\n       */\n      'flex-direction': [{\n        flex: ['row', 'row-reverse', 'col', 'col-reverse']\n      }],\n      /**\n       * Flex Wrap\n       * @see https://tailwindcss.com/docs/flex-wrap\n       */\n      'flex-wrap': [{\n        flex: ['wrap', 'wrap-reverse', 'nowrap']\n      }],\n      /**\n       * Flex\n       * @see https://tailwindcss.com/docs/flex\n       */\n      flex: [{\n        flex: ['1', 'auto', 'initial', 'none', isArbitraryValue]\n      }],\n      /**\n       * Flex Grow\n       * @see https://tailwindcss.com/docs/flex-grow\n       */\n      grow: [{\n        grow: getZeroAndEmpty()\n      }],\n      /**\n       * Flex Shrink\n       * @see https://tailwindcss.com/docs/flex-shrink\n       */\n      shrink: [{\n        shrink: getZeroAndEmpty()\n      }],\n      /**\n       * Order\n       * @see https://tailwindcss.com/docs/order\n       */\n      order: [{\n        order: ['first', 'last', 'none', isInteger, isArbitraryValue]\n      }],\n      /**\n       * Grid Template Columns\n       * @see https://tailwindcss.com/docs/grid-template-columns\n       */\n      'grid-cols': [{\n        'grid-cols': [isAny]\n      }],\n      /**\n       * Grid Column Start / End\n       * @see https://tailwindcss.com/docs/grid-column\n       */\n      'col-start-end': [{\n        col: ['auto', {\n          span: ['full', isInteger, isArbitraryValue]\n        }, isArbitraryValue]\n      }],\n      /**\n       * Grid Column Start\n       * @see https://tailwindcss.com/docs/grid-column\n       */\n      'col-start': [{\n        'col-start': getNumberWithAutoAndArbitrary()\n      }],\n      /**\n       * Grid Column End\n       * @see https://tailwindcss.com/docs/grid-column\n       */\n      'col-end': [{\n        'col-end': getNumberWithAutoAndArbitrary()\n      }],\n      /**\n       * Grid Template Rows\n       * @see https://tailwindcss.com/docs/grid-template-rows\n       */\n      'grid-rows': [{\n        'grid-rows': [isAny]\n      }],\n      /**\n       * Grid Row Start / End\n       * @see https://tailwindcss.com/docs/grid-row\n       */\n      'row-start-end': [{\n        row: ['auto', {\n          span: [isInteger, isArbitraryValue]\n        }, isArbitraryValue]\n      }],\n      /**\n       * Grid Row Start\n       * @see https://tailwindcss.com/docs/grid-row\n       */\n      'row-start': [{\n        'row-start': getNumberWithAutoAndArbitrary()\n      }],\n      /**\n       * Grid Row End\n       * @see https://tailwindcss.com/docs/grid-row\n       */\n      'row-end': [{\n        'row-end': getNumberWithAutoAndArbitrary()\n      }],\n      /**\n       * Grid Auto Flow\n       * @see https://tailwindcss.com/docs/grid-auto-flow\n       */\n      'grid-flow': [{\n        'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n      }],\n      /**\n       * Grid Auto Columns\n       * @see https://tailwindcss.com/docs/grid-auto-columns\n       */\n      'auto-cols': [{\n        'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n      }],\n      /**\n       * Grid Auto Rows\n       * @see https://tailwindcss.com/docs/grid-auto-rows\n       */\n      'auto-rows': [{\n        'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n      }],\n      /**\n       * Gap\n       * @see https://tailwindcss.com/docs/gap\n       */\n      gap: [{\n        gap: [gap]\n      }],\n      /**\n       * Gap X\n       * @see https://tailwindcss.com/docs/gap\n       */\n      'gap-x': [{\n        'gap-x': [gap]\n      }],\n      /**\n       * Gap Y\n       * @see https://tailwindcss.com/docs/gap\n       */\n      'gap-y': [{\n        'gap-y': [gap]\n      }],\n      /**\n       * Justify Content\n       * @see https://tailwindcss.com/docs/justify-content\n       */\n      'justify-content': [{\n        justify: ['normal', ...getAlign()]\n      }],\n      /**\n       * Justify Items\n       * @see https://tailwindcss.com/docs/justify-items\n       */\n      'justify-items': [{\n        'justify-items': ['start', 'end', 'center', 'stretch']\n      }],\n      /**\n       * Justify Self\n       * @see https://tailwindcss.com/docs/justify-self\n       */\n      'justify-self': [{\n        'justify-self': ['auto', 'start', 'end', 'center', 'stretch']\n      }],\n      /**\n       * Align Content\n       * @see https://tailwindcss.com/docs/align-content\n       */\n      'align-content': [{\n        content: ['normal', ...getAlign(), 'baseline']\n      }],\n      /**\n       * Align Items\n       * @see https://tailwindcss.com/docs/align-items\n       */\n      'align-items': [{\n        items: ['start', 'end', 'center', 'baseline', 'stretch']\n      }],\n      /**\n       * Align Self\n       * @see https://tailwindcss.com/docs/align-self\n       */\n      'align-self': [{\n        self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline']\n      }],\n      /**\n       * Place Content\n       * @see https://tailwindcss.com/docs/place-content\n       */\n      'place-content': [{\n        'place-content': [...getAlign(), 'baseline']\n      }],\n      /**\n       * Place Items\n       * @see https://tailwindcss.com/docs/place-items\n       */\n      'place-items': [{\n        'place-items': ['start', 'end', 'center', 'baseline', 'stretch']\n      }],\n      /**\n       * Place Self\n       * @see https://tailwindcss.com/docs/place-self\n       */\n      'place-self': [{\n        'place-self': ['auto', 'start', 'end', 'center', 'stretch']\n      }],\n      // Spacing\n      /**\n       * Padding\n       * @see https://tailwindcss.com/docs/padding\n       */\n      p: [{\n        p: [padding]\n      }],\n      /**\n       * Padding X\n       * @see https://tailwindcss.com/docs/padding\n       */\n      px: [{\n        px: [padding]\n      }],\n      /**\n       * Padding Y\n       * @see https://tailwindcss.com/docs/padding\n       */\n      py: [{\n        py: [padding]\n      }],\n      /**\n       * Padding Start\n       * @see https://tailwindcss.com/docs/padding\n       */\n      ps: [{\n        ps: [padding]\n      }],\n      /**\n       * Padding End\n       * @see https://tailwindcss.com/docs/padding\n       */\n      pe: [{\n        pe: [padding]\n      }],\n      /**\n       * Padding Top\n       * @see https://tailwindcss.com/docs/padding\n       */\n      pt: [{\n        pt: [padding]\n      }],\n      /**\n       * Padding Right\n       * @see https://tailwindcss.com/docs/padding\n       */\n      pr: [{\n        pr: [padding]\n      }],\n      /**\n       * Padding Bottom\n       * @see https://tailwindcss.com/docs/padding\n       */\n      pb: [{\n        pb: [padding]\n      }],\n      /**\n       * Padding Left\n       * @see https://tailwindcss.com/docs/padding\n       */\n      pl: [{\n        pl: [padding]\n      }],\n      /**\n       * Margin\n       * @see https://tailwindcss.com/docs/margin\n       */\n      m: [{\n        m: [margin]\n      }],\n      /**\n       * Margin X\n       * @see https://tailwindcss.com/docs/margin\n       */\n      mx: [{\n        mx: [margin]\n      }],\n      /**\n       * Margin Y\n       * @see https://tailwindcss.com/docs/margin\n       */\n      my: [{\n        my: [margin]\n      }],\n      /**\n       * Margin Start\n       * @see https://tailwindcss.com/docs/margin\n       */\n      ms: [{\n        ms: [margin]\n      }],\n      /**\n       * Margin End\n       * @see https://tailwindcss.com/docs/margin\n       */\n      me: [{\n        me: [margin]\n      }],\n      /**\n       * Margin Top\n       * @see https://tailwindcss.com/docs/margin\n       */\n      mt: [{\n        mt: [margin]\n      }],\n      /**\n       * Margin Right\n       * @see https://tailwindcss.com/docs/margin\n       */\n      mr: [{\n        mr: [margin]\n      }],\n      /**\n       * Margin Bottom\n       * @see https://tailwindcss.com/docs/margin\n       */\n      mb: [{\n        mb: [margin]\n      }],\n      /**\n       * Margin Left\n       * @see https://tailwindcss.com/docs/margin\n       */\n      ml: [{\n        ml: [margin]\n      }],\n      /**\n       * Space Between X\n       * @see https://tailwindcss.com/docs/space\n       */\n      'space-x': [{\n        'space-x': [space]\n      }],\n      /**\n       * Space Between X Reverse\n       * @see https://tailwindcss.com/docs/space\n       */\n      'space-x-reverse': ['space-x-reverse'],\n      /**\n       * Space Between Y\n       * @see https://tailwindcss.com/docs/space\n       */\n      'space-y': [{\n        'space-y': [space]\n      }],\n      /**\n       * Space Between Y Reverse\n       * @see https://tailwindcss.com/docs/space\n       */\n      'space-y-reverse': ['space-y-reverse'],\n      // Sizing\n      /**\n       * Width\n       * @see https://tailwindcss.com/docs/width\n       */\n      w: [{\n        w: ['auto', 'min', 'max', 'fit', 'svw', 'lvw', 'dvw', isArbitraryValue, spacing]\n      }],\n      /**\n       * Min-Width\n       * @see https://tailwindcss.com/docs/min-width\n       */\n      'min-w': [{\n        'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit']\n      }],\n      /**\n       * Max-Width\n       * @see https://tailwindcss.com/docs/max-width\n       */\n      'max-w': [{\n        'max-w': [isArbitraryValue, spacing, 'none', 'full', 'min', 'max', 'fit', 'prose', {\n          screen: [isTshirtSize]\n        }, isTshirtSize]\n      }],\n      /**\n       * Height\n       * @see https://tailwindcss.com/docs/height\n       */\n      h: [{\n        h: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n      }],\n      /**\n       * Min-Height\n       * @see https://tailwindcss.com/docs/min-height\n       */\n      'min-h': [{\n        'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n      }],\n      /**\n       * Max-Height\n       * @see https://tailwindcss.com/docs/max-height\n       */\n      'max-h': [{\n        'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n      }],\n      /**\n       * Size\n       * @see https://tailwindcss.com/docs/size\n       */\n      size: [{\n        size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit']\n      }],\n      // Typography\n      /**\n       * Font Size\n       * @see https://tailwindcss.com/docs/font-size\n       */\n      'font-size': [{\n        text: ['base', isTshirtSize, isArbitraryLength]\n      }],\n      /**\n       * Font Smoothing\n       * @see https://tailwindcss.com/docs/font-smoothing\n       */\n      'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n      /**\n       * Font Style\n       * @see https://tailwindcss.com/docs/font-style\n       */\n      'font-style': ['italic', 'not-italic'],\n      /**\n       * Font Weight\n       * @see https://tailwindcss.com/docs/font-weight\n       */\n      'font-weight': [{\n        font: ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black', isArbitraryNumber]\n      }],\n      /**\n       * Font Family\n       * @see https://tailwindcss.com/docs/font-family\n       */\n      'font-family': [{\n        font: [isAny]\n      }],\n      /**\n       * Font Variant Numeric\n       * @see https://tailwindcss.com/docs/font-variant-numeric\n       */\n      'fvn-normal': ['normal-nums'],\n      /**\n       * Font Variant Numeric\n       * @see https://tailwindcss.com/docs/font-variant-numeric\n       */\n      'fvn-ordinal': ['ordinal'],\n      /**\n       * Font Variant Numeric\n       * @see https://tailwindcss.com/docs/font-variant-numeric\n       */\n      'fvn-slashed-zero': ['slashed-zero'],\n      /**\n       * Font Variant Numeric\n       * @see https://tailwindcss.com/docs/font-variant-numeric\n       */\n      'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n      /**\n       * Font Variant Numeric\n       * @see https://tailwindcss.com/docs/font-variant-numeric\n       */\n      'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n      /**\n       * Font Variant Numeric\n       * @see https://tailwindcss.com/docs/font-variant-numeric\n       */\n      'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n      /**\n       * Letter Spacing\n       * @see https://tailwindcss.com/docs/letter-spacing\n       */\n      tracking: [{\n        tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest', isArbitraryValue]\n      }],\n      /**\n       * Line Clamp\n       * @see https://tailwindcss.com/docs/line-clamp\n       */\n      'line-clamp': [{\n        'line-clamp': ['none', isNumber, isArbitraryNumber]\n      }],\n      /**\n       * Line Height\n       * @see https://tailwindcss.com/docs/line-height\n       */\n      leading: [{\n        leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose', isLength, isArbitraryValue]\n      }],\n      /**\n       * List Style Image\n       * @see https://tailwindcss.com/docs/list-style-image\n       */\n      'list-image': [{\n        'list-image': ['none', isArbitraryValue]\n      }],\n      /**\n       * List Style Type\n       * @see https://tailwindcss.com/docs/list-style-type\n       */\n      'list-style-type': [{\n        list: ['none', 'disc', 'decimal', isArbitraryValue]\n      }],\n      /**\n       * List Style Position\n       * @see https://tailwindcss.com/docs/list-style-position\n       */\n      'list-style-position': [{\n        list: ['inside', 'outside']\n      }],\n      /**\n       * Placeholder Color\n       * @deprecated since Tailwind CSS v3.0.0\n       * @see https://tailwindcss.com/docs/placeholder-color\n       */\n      'placeholder-color': [{\n        placeholder: [colors]\n      }],\n      /**\n       * Placeholder Opacity\n       * @see https://tailwindcss.com/docs/placeholder-opacity\n       */\n      'placeholder-opacity': [{\n        'placeholder-opacity': [opacity]\n      }],\n      /**\n       * Text Alignment\n       * @see https://tailwindcss.com/docs/text-align\n       */\n      'text-alignment': [{\n        text: ['left', 'center', 'right', 'justify', 'start', 'end']\n      }],\n      /**\n       * Text Color\n       * @see https://tailwindcss.com/docs/text-color\n       */\n      'text-color': [{\n        text: [colors]\n      }],\n      /**\n       * Text Opacity\n       * @see https://tailwindcss.com/docs/text-opacity\n       */\n      'text-opacity': [{\n        'text-opacity': [opacity]\n      }],\n      /**\n       * Text Decoration\n       * @see https://tailwindcss.com/docs/text-decoration\n       */\n      'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n      /**\n       * Text Decoration Style\n       * @see https://tailwindcss.com/docs/text-decoration-style\n       */\n      'text-decoration-style': [{\n        decoration: [...getLineStyles(), 'wavy']\n      }],\n      /**\n       * Text Decoration Thickness\n       * @see https://tailwindcss.com/docs/text-decoration-thickness\n       */\n      'text-decoration-thickness': [{\n        decoration: ['auto', 'from-font', isLength, isArbitraryLength]\n      }],\n      /**\n       * Text Underline Offset\n       * @see https://tailwindcss.com/docs/text-underline-offset\n       */\n      'underline-offset': [{\n        'underline-offset': ['auto', isLength, isArbitraryValue]\n      }],\n      /**\n       * Text Decoration Color\n       * @see https://tailwindcss.com/docs/text-decoration-color\n       */\n      'text-decoration-color': [{\n        decoration: [colors]\n      }],\n      /**\n       * Text Transform\n       * @see https://tailwindcss.com/docs/text-transform\n       */\n      'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n      /**\n       * Text Overflow\n       * @see https://tailwindcss.com/docs/text-overflow\n       */\n      'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n      /**\n       * Text Wrap\n       * @see https://tailwindcss.com/docs/text-wrap\n       */\n      'text-wrap': [{\n        text: ['wrap', 'nowrap', 'balance', 'pretty']\n      }],\n      /**\n       * Text Indent\n       * @see https://tailwindcss.com/docs/text-indent\n       */\n      indent: [{\n        indent: getSpacingWithArbitrary()\n      }],\n      /**\n       * Vertical Alignment\n       * @see https://tailwindcss.com/docs/vertical-align\n       */\n      'vertical-align': [{\n        align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryValue]\n      }],\n      /**\n       * Whitespace\n       * @see https://tailwindcss.com/docs/whitespace\n       */\n      whitespace: [{\n        whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n      }],\n      /**\n       * Word Break\n       * @see https://tailwindcss.com/docs/word-break\n       */\n      break: [{\n        break: ['normal', 'words', 'all', 'keep']\n      }],\n      /**\n       * Hyphens\n       * @see https://tailwindcss.com/docs/hyphens\n       */\n      hyphens: [{\n        hyphens: ['none', 'manual', 'auto']\n      }],\n      /**\n       * Content\n       * @see https://tailwindcss.com/docs/content\n       */\n      content: [{\n        content: ['none', isArbitraryValue]\n      }],\n      // Backgrounds\n      /**\n       * Background Attachment\n       * @see https://tailwindcss.com/docs/background-attachment\n       */\n      'bg-attachment': [{\n        bg: ['fixed', 'local', 'scroll']\n      }],\n      /**\n       * Background Clip\n       * @see https://tailwindcss.com/docs/background-clip\n       */\n      'bg-clip': [{\n        'bg-clip': ['border', 'padding', 'content', 'text']\n      }],\n      /**\n       * Background Opacity\n       * @deprecated since Tailwind CSS v3.0.0\n       * @see https://tailwindcss.com/docs/background-opacity\n       */\n      'bg-opacity': [{\n        'bg-opacity': [opacity]\n      }],\n      /**\n       * Background Origin\n       * @see https://tailwindcss.com/docs/background-origin\n       */\n      'bg-origin': [{\n        'bg-origin': ['border', 'padding', 'content']\n      }],\n      /**\n       * Background Position\n       * @see https://tailwindcss.com/docs/background-position\n       */\n      'bg-position': [{\n        bg: [...getPositions(), isArbitraryPosition]\n      }],\n      /**\n       * Background Repeat\n       * @see https://tailwindcss.com/docs/background-repeat\n       */\n      'bg-repeat': [{\n        bg: ['no-repeat', {\n          repeat: ['', 'x', 'y', 'round', 'space']\n        }]\n      }],\n      /**\n       * Background Size\n       * @see https://tailwindcss.com/docs/background-size\n       */\n      'bg-size': [{\n        bg: ['auto', 'cover', 'contain', isArbitrarySize]\n      }],\n      /**\n       * Background Image\n       * @see https://tailwindcss.com/docs/background-image\n       */\n      'bg-image': [{\n        bg: ['none', {\n          'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n        }, isArbitraryImage]\n      }],\n      /**\n       * Background Color\n       * @see https://tailwindcss.com/docs/background-color\n       */\n      'bg-color': [{\n        bg: [colors]\n      }],\n      /**\n       * Gradient Color Stops From Position\n       * @see https://tailwindcss.com/docs/gradient-color-stops\n       */\n      'gradient-from-pos': [{\n        from: [gradientColorStopPositions]\n      }],\n      /**\n       * Gradient Color Stops Via Position\n       * @see https://tailwindcss.com/docs/gradient-color-stops\n       */\n      'gradient-via-pos': [{\n        via: [gradientColorStopPositions]\n      }],\n      /**\n       * Gradient Color Stops To Position\n       * @see https://tailwindcss.com/docs/gradient-color-stops\n       */\n      'gradient-to-pos': [{\n        to: [gradientColorStopPositions]\n      }],\n      /**\n       * Gradient Color Stops From\n       * @see https://tailwindcss.com/docs/gradient-color-stops\n       */\n      'gradient-from': [{\n        from: [gradientColorStops]\n      }],\n      /**\n       * Gradient Color Stops Via\n       * @see https://tailwindcss.com/docs/gradient-color-stops\n       */\n      'gradient-via': [{\n        via: [gradientColorStops]\n      }],\n      /**\n       * Gradient Color Stops To\n       * @see https://tailwindcss.com/docs/gradient-color-stops\n       */\n      'gradient-to': [{\n        to: [gradientColorStops]\n      }],\n      // Borders\n      /**\n       * Border Radius\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      rounded: [{\n        rounded: [borderRadius]\n      }],\n      /**\n       * Border Radius Start\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-s': [{\n        'rounded-s': [borderRadius]\n      }],\n      /**\n       * Border Radius End\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-e': [{\n        'rounded-e': [borderRadius]\n      }],\n      /**\n       * Border Radius Top\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-t': [{\n        'rounded-t': [borderRadius]\n      }],\n      /**\n       * Border Radius Right\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-r': [{\n        'rounded-r': [borderRadius]\n      }],\n      /**\n       * Border Radius Bottom\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-b': [{\n        'rounded-b': [borderRadius]\n      }],\n      /**\n       * Border Radius Left\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-l': [{\n        'rounded-l': [borderRadius]\n      }],\n      /**\n       * Border Radius Start Start\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-ss': [{\n        'rounded-ss': [borderRadius]\n      }],\n      /**\n       * Border Radius Start End\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-se': [{\n        'rounded-se': [borderRadius]\n      }],\n      /**\n       * Border Radius End End\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-ee': [{\n        'rounded-ee': [borderRadius]\n      }],\n      /**\n       * Border Radius End Start\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-es': [{\n        'rounded-es': [borderRadius]\n      }],\n      /**\n       * Border Radius Top Left\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-tl': [{\n        'rounded-tl': [borderRadius]\n      }],\n      /**\n       * Border Radius Top Right\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-tr': [{\n        'rounded-tr': [borderRadius]\n      }],\n      /**\n       * Border Radius Bottom Right\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-br': [{\n        'rounded-br': [borderRadius]\n      }],\n      /**\n       * Border Radius Bottom Left\n       * @see https://tailwindcss.com/docs/border-radius\n       */\n      'rounded-bl': [{\n        'rounded-bl': [borderRadius]\n      }],\n      /**\n       * Border Width\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w': [{\n        border: [borderWidth]\n      }],\n      /**\n       * Border Width X\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-x': [{\n        'border-x': [borderWidth]\n      }],\n      /**\n       * Border Width Y\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-y': [{\n        'border-y': [borderWidth]\n      }],\n      /**\n       * Border Width Start\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-s': [{\n        'border-s': [borderWidth]\n      }],\n      /**\n       * Border Width End\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-e': [{\n        'border-e': [borderWidth]\n      }],\n      /**\n       * Border Width Top\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-t': [{\n        'border-t': [borderWidth]\n      }],\n      /**\n       * Border Width Right\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-r': [{\n        'border-r': [borderWidth]\n      }],\n      /**\n       * Border Width Bottom\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-b': [{\n        'border-b': [borderWidth]\n      }],\n      /**\n       * Border Width Left\n       * @see https://tailwindcss.com/docs/border-width\n       */\n      'border-w-l': [{\n        'border-l': [borderWidth]\n      }],\n      /**\n       * Border Opacity\n       * @see https://tailwindcss.com/docs/border-opacity\n       */\n      'border-opacity': [{\n        'border-opacity': [opacity]\n      }],\n      /**\n       * Border Style\n       * @see https://tailwindcss.com/docs/border-style\n       */\n      'border-style': [{\n        border: [...getLineStyles(), 'hidden']\n      }],\n      /**\n       * Divide Width X\n       * @see https://tailwindcss.com/docs/divide-width\n       */\n      'divide-x': [{\n        'divide-x': [borderWidth]\n      }],\n      /**\n       * Divide Width X Reverse\n       * @see https://tailwindcss.com/docs/divide-width\n       */\n      'divide-x-reverse': ['divide-x-reverse'],\n      /**\n       * Divide Width Y\n       * @see https://tailwindcss.com/docs/divide-width\n       */\n      'divide-y': [{\n        'divide-y': [borderWidth]\n      }],\n      /**\n       * Divide Width Y Reverse\n       * @see https://tailwindcss.com/docs/divide-width\n       */\n      'divide-y-reverse': ['divide-y-reverse'],\n      /**\n       * Divide Opacity\n       * @see https://tailwindcss.com/docs/divide-opacity\n       */\n      'divide-opacity': [{\n        'divide-opacity': [opacity]\n      }],\n      /**\n       * Divide Style\n       * @see https://tailwindcss.com/docs/divide-style\n       */\n      'divide-style': [{\n        divide: getLineStyles()\n      }],\n      /**\n       * Border Color\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color': [{\n        border: [borderColor]\n      }],\n      /**\n       * Border Color X\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-x': [{\n        'border-x': [borderColor]\n      }],\n      /**\n       * Border Color Y\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-y': [{\n        'border-y': [borderColor]\n      }],\n      /**\n       * Border Color S\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-s': [{\n        'border-s': [borderColor]\n      }],\n      /**\n       * Border Color E\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-e': [{\n        'border-e': [borderColor]\n      }],\n      /**\n       * Border Color Top\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-t': [{\n        'border-t': [borderColor]\n      }],\n      /**\n       * Border Color Right\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-r': [{\n        'border-r': [borderColor]\n      }],\n      /**\n       * Border Color Bottom\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-b': [{\n        'border-b': [borderColor]\n      }],\n      /**\n       * Border Color Left\n       * @see https://tailwindcss.com/docs/border-color\n       */\n      'border-color-l': [{\n        'border-l': [borderColor]\n      }],\n      /**\n       * Divide Color\n       * @see https://tailwindcss.com/docs/divide-color\n       */\n      'divide-color': [{\n        divide: [borderColor]\n      }],\n      /**\n       * Outline Style\n       * @see https://tailwindcss.com/docs/outline-style\n       */\n      'outline-style': [{\n        outline: ['', ...getLineStyles()]\n      }],\n      /**\n       * Outline Offset\n       * @see https://tailwindcss.com/docs/outline-offset\n       */\n      'outline-offset': [{\n        'outline-offset': [isLength, isArbitraryValue]\n      }],\n      /**\n       * Outline Width\n       * @see https://tailwindcss.com/docs/outline-width\n       */\n      'outline-w': [{\n        outline: [isLength, isArbitraryLength]\n      }],\n      /**\n       * Outline Color\n       * @see https://tailwindcss.com/docs/outline-color\n       */\n      'outline-color': [{\n        outline: [colors]\n      }],\n      /**\n       * Ring Width\n       * @see https://tailwindcss.com/docs/ring-width\n       */\n      'ring-w': [{\n        ring: getLengthWithEmptyAndArbitrary()\n      }],\n      /**\n       * Ring Width Inset\n       * @see https://tailwindcss.com/docs/ring-width\n       */\n      'ring-w-inset': ['ring-inset'],\n      /**\n       * Ring Color\n       * @see https://tailwindcss.com/docs/ring-color\n       */\n      'ring-color': [{\n        ring: [colors]\n      }],\n      /**\n       * Ring Opacity\n       * @see https://tailwindcss.com/docs/ring-opacity\n       */\n      'ring-opacity': [{\n        'ring-opacity': [opacity]\n      }],\n      /**\n       * Ring Offset Width\n       * @see https://tailwindcss.com/docs/ring-offset-width\n       */\n      'ring-offset-w': [{\n        'ring-offset': [isLength, isArbitraryLength]\n      }],\n      /**\n       * Ring Offset Color\n       * @see https://tailwindcss.com/docs/ring-offset-color\n       */\n      'ring-offset-color': [{\n        'ring-offset': [colors]\n      }],\n      // Effects\n      /**\n       * Box Shadow\n       * @see https://tailwindcss.com/docs/box-shadow\n       */\n      shadow: [{\n        shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow]\n      }],\n      /**\n       * Box Shadow Color\n       * @see https://tailwindcss.com/docs/box-shadow-color\n       */\n      'shadow-color': [{\n        shadow: [isAny]\n      }],\n      /**\n       * Opacity\n       * @see https://tailwindcss.com/docs/opacity\n       */\n      opacity: [{\n        opacity: [opacity]\n      }],\n      /**\n       * Mix Blend Mode\n       * @see https://tailwindcss.com/docs/mix-blend-mode\n       */\n      'mix-blend': [{\n        'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker']\n      }],\n      /**\n       * Background Blend Mode\n       * @see https://tailwindcss.com/docs/background-blend-mode\n       */\n      'bg-blend': [{\n        'bg-blend': getBlendModes()\n      }],\n      // Filters\n      /**\n       * Filter\n       * @deprecated since Tailwind CSS v3.0.0\n       * @see https://tailwindcss.com/docs/filter\n       */\n      filter: [{\n        filter: ['', 'none']\n      }],\n      /**\n       * Blur\n       * @see https://tailwindcss.com/docs/blur\n       */\n      blur: [{\n        blur: [blur]\n      }],\n      /**\n       * Brightness\n       * @see https://tailwindcss.com/docs/brightness\n       */\n      brightness: [{\n        brightness: [brightness]\n      }],\n      /**\n       * Contrast\n       * @see https://tailwindcss.com/docs/contrast\n       */\n      contrast: [{\n        contrast: [contrast]\n      }],\n      /**\n       * Drop Shadow\n       * @see https://tailwindcss.com/docs/drop-shadow\n       */\n      'drop-shadow': [{\n        'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue]\n      }],\n      /**\n       * Grayscale\n       * @see https://tailwindcss.com/docs/grayscale\n       */\n      grayscale: [{\n        grayscale: [grayscale]\n      }],\n      /**\n       * Hue Rotate\n       * @see https://tailwindcss.com/docs/hue-rotate\n       */\n      'hue-rotate': [{\n        'hue-rotate': [hueRotate]\n      }],\n      /**\n       * Invert\n       * @see https://tailwindcss.com/docs/invert\n       */\n      invert: [{\n        invert: [invert]\n      }],\n      /**\n       * Saturate\n       * @see https://tailwindcss.com/docs/saturate\n       */\n      saturate: [{\n        saturate: [saturate]\n      }],\n      /**\n       * Sepia\n       * @see https://tailwindcss.com/docs/sepia\n       */\n      sepia: [{\n        sepia: [sepia]\n      }],\n      /**\n       * Backdrop Filter\n       * @deprecated since Tailwind CSS v3.0.0\n       * @see https://tailwindcss.com/docs/backdrop-filter\n       */\n      'backdrop-filter': [{\n        'backdrop-filter': ['', 'none']\n      }],\n      /**\n       * Backdrop Blur\n       * @see https://tailwindcss.com/docs/backdrop-blur\n       */\n      'backdrop-blur': [{\n        'backdrop-blur': [blur]\n      }],\n      /**\n       * Backdrop Brightness\n       * @see https://tailwindcss.com/docs/backdrop-brightness\n       */\n      'backdrop-brightness': [{\n        'backdrop-brightness': [brightness]\n      }],\n      /**\n       * Backdrop Contrast\n       * @see https://tailwindcss.com/docs/backdrop-contrast\n       */\n      'backdrop-contrast': [{\n        'backdrop-contrast': [contrast]\n      }],\n      /**\n       * Backdrop Grayscale\n       * @see https://tailwindcss.com/docs/backdrop-grayscale\n       */\n      'backdrop-grayscale': [{\n        'backdrop-grayscale': [grayscale]\n      }],\n      /**\n       * Backdrop Hue Rotate\n       * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n       */\n      'backdrop-hue-rotate': [{\n        'backdrop-hue-rotate': [hueRotate]\n      }],\n      /**\n       * Backdrop Invert\n       * @see https://tailwindcss.com/docs/backdrop-invert\n       */\n      'backdrop-invert': [{\n        'backdrop-invert': [invert]\n      }],\n      /**\n       * Backdrop Opacity\n       * @see https://tailwindcss.com/docs/backdrop-opacity\n       */\n      'backdrop-opacity': [{\n        'backdrop-opacity': [opacity]\n      }],\n      /**\n       * Backdrop Saturate\n       * @see https://tailwindcss.com/docs/backdrop-saturate\n       */\n      'backdrop-saturate': [{\n        'backdrop-saturate': [saturate]\n      }],\n      /**\n       * Backdrop Sepia\n       * @see https://tailwindcss.com/docs/backdrop-sepia\n       */\n      'backdrop-sepia': [{\n        'backdrop-sepia': [sepia]\n      }],\n      // Tables\n      /**\n       * Border Collapse\n       * @see https://tailwindcss.com/docs/border-collapse\n       */\n      'border-collapse': [{\n        border: ['collapse', 'separate']\n      }],\n      /**\n       * Border Spacing\n       * @see https://tailwindcss.com/docs/border-spacing\n       */\n      'border-spacing': [{\n        'border-spacing': [borderSpacing]\n      }],\n      /**\n       * Border Spacing X\n       * @see https://tailwindcss.com/docs/border-spacing\n       */\n      'border-spacing-x': [{\n        'border-spacing-x': [borderSpacing]\n      }],\n      /**\n       * Border Spacing Y\n       * @see https://tailwindcss.com/docs/border-spacing\n       */\n      'border-spacing-y': [{\n        'border-spacing-y': [borderSpacing]\n      }],\n      /**\n       * Table Layout\n       * @see https://tailwindcss.com/docs/table-layout\n       */\n      'table-layout': [{\n        table: ['auto', 'fixed']\n      }],\n      /**\n       * Caption Side\n       * @see https://tailwindcss.com/docs/caption-side\n       */\n      caption: [{\n        caption: ['top', 'bottom']\n      }],\n      // Transitions and Animation\n      /**\n       * Tranisition Property\n       * @see https://tailwindcss.com/docs/transition-property\n       */\n      transition: [{\n        transition: ['none', 'all', '', 'colors', 'opacity', 'shadow', 'transform', isArbitraryValue]\n      }],\n      /**\n       * Transition Duration\n       * @see https://tailwindcss.com/docs/transition-duration\n       */\n      duration: [{\n        duration: getNumberAndArbitrary()\n      }],\n      /**\n       * Transition Timing Function\n       * @see https://tailwindcss.com/docs/transition-timing-function\n       */\n      ease: [{\n        ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue]\n      }],\n      /**\n       * Transition Delay\n       * @see https://tailwindcss.com/docs/transition-delay\n       */\n      delay: [{\n        delay: getNumberAndArbitrary()\n      }],\n      /**\n       * Animation\n       * @see https://tailwindcss.com/docs/animation\n       */\n      animate: [{\n        animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue]\n      }],\n      // Transforms\n      /**\n       * Transform\n       * @see https://tailwindcss.com/docs/transform\n       */\n      transform: [{\n        transform: ['', 'gpu', 'none']\n      }],\n      /**\n       * Scale\n       * @see https://tailwindcss.com/docs/scale\n       */\n      scale: [{\n        scale: [scale]\n      }],\n      /**\n       * Scale X\n       * @see https://tailwindcss.com/docs/scale\n       */\n      'scale-x': [{\n        'scale-x': [scale]\n      }],\n      /**\n       * Scale Y\n       * @see https://tailwindcss.com/docs/scale\n       */\n      'scale-y': [{\n        'scale-y': [scale]\n      }],\n      /**\n       * Rotate\n       * @see https://tailwindcss.com/docs/rotate\n       */\n      rotate: [{\n        rotate: [isInteger, isArbitraryValue]\n      }],\n      /**\n       * Translate X\n       * @see https://tailwindcss.com/docs/translate\n       */\n      'translate-x': [{\n        'translate-x': [translate]\n      }],\n      /**\n       * Translate Y\n       * @see https://tailwindcss.com/docs/translate\n       */\n      'translate-y': [{\n        'translate-y': [translate]\n      }],\n      /**\n       * Skew X\n       * @see https://tailwindcss.com/docs/skew\n       */\n      'skew-x': [{\n        'skew-x': [skew]\n      }],\n      /**\n       * Skew Y\n       * @see https://tailwindcss.com/docs/skew\n       */\n      'skew-y': [{\n        'skew-y': [skew]\n      }],\n      /**\n       * Transform Origin\n       * @see https://tailwindcss.com/docs/transform-origin\n       */\n      'transform-origin': [{\n        origin: ['center', 'top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', isArbitraryValue]\n      }],\n      // Interactivity\n      /**\n       * Accent Color\n       * @see https://tailwindcss.com/docs/accent-color\n       */\n      accent: [{\n        accent: ['auto', colors]\n      }],\n      /**\n       * Appearance\n       * @see https://tailwindcss.com/docs/appearance\n       */\n      appearance: [{\n        appearance: ['none', 'auto']\n      }],\n      /**\n       * Cursor\n       * @see https://tailwindcss.com/docs/cursor\n       */\n      cursor: [{\n        cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryValue]\n      }],\n      /**\n       * Caret Color\n       * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n       */\n      'caret-color': [{\n        caret: [colors]\n      }],\n      /**\n       * Pointer Events\n       * @see https://tailwindcss.com/docs/pointer-events\n       */\n      'pointer-events': [{\n        'pointer-events': ['none', 'auto']\n      }],\n      /**\n       * Resize\n       * @see https://tailwindcss.com/docs/resize\n       */\n      resize: [{\n        resize: ['none', 'y', 'x', '']\n      }],\n      /**\n       * Scroll Behavior\n       * @see https://tailwindcss.com/docs/scroll-behavior\n       */\n      'scroll-behavior': [{\n        scroll: ['auto', 'smooth']\n      }],\n      /**\n       * Scroll Margin\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-m': [{\n        'scroll-m': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin X\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-mx': [{\n        'scroll-mx': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin Y\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-my': [{\n        'scroll-my': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin Start\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-ms': [{\n        'scroll-ms': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin End\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-me': [{\n        'scroll-me': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin Top\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-mt': [{\n        'scroll-mt': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin Right\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-mr': [{\n        'scroll-mr': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin Bottom\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-mb': [{\n        'scroll-mb': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Margin Left\n       * @see https://tailwindcss.com/docs/scroll-margin\n       */\n      'scroll-ml': [{\n        'scroll-ml': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-p': [{\n        'scroll-p': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding X\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-px': [{\n        'scroll-px': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding Y\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-py': [{\n        'scroll-py': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding Start\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-ps': [{\n        'scroll-ps': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding End\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-pe': [{\n        'scroll-pe': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding Top\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-pt': [{\n        'scroll-pt': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding Right\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-pr': [{\n        'scroll-pr': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding Bottom\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-pb': [{\n        'scroll-pb': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Padding Left\n       * @see https://tailwindcss.com/docs/scroll-padding\n       */\n      'scroll-pl': [{\n        'scroll-pl': getSpacingWithArbitrary()\n      }],\n      /**\n       * Scroll Snap Align\n       * @see https://tailwindcss.com/docs/scroll-snap-align\n       */\n      'snap-align': [{\n        snap: ['start', 'end', 'center', 'align-none']\n      }],\n      /**\n       * Scroll Snap Stop\n       * @see https://tailwindcss.com/docs/scroll-snap-stop\n       */\n      'snap-stop': [{\n        snap: ['normal', 'always']\n      }],\n      /**\n       * Scroll Snap Type\n       * @see https://tailwindcss.com/docs/scroll-snap-type\n       */\n      'snap-type': [{\n        snap: ['none', 'x', 'y', 'both']\n      }],\n      /**\n       * Scroll Snap Type Strictness\n       * @see https://tailwindcss.com/docs/scroll-snap-type\n       */\n      'snap-strictness': [{\n        snap: ['mandatory', 'proximity']\n      }],\n      /**\n       * Touch Action\n       * @see https://tailwindcss.com/docs/touch-action\n       */\n      touch: [{\n        touch: ['auto', 'none', 'manipulation']\n      }],\n      /**\n       * Touch Action X\n       * @see https://tailwindcss.com/docs/touch-action\n       */\n      'touch-x': [{\n        'touch-pan': ['x', 'left', 'right']\n      }],\n      /**\n       * Touch Action Y\n       * @see https://tailwindcss.com/docs/touch-action\n       */\n      'touch-y': [{\n        'touch-pan': ['y', 'up', 'down']\n      }],\n      /**\n       * Touch Action Pinch Zoom\n       * @see https://tailwindcss.com/docs/touch-action\n       */\n      'touch-pz': ['touch-pinch-zoom'],\n      /**\n       * User Select\n       * @see https://tailwindcss.com/docs/user-select\n       */\n      select: [{\n        select: ['none', 'text', 'all', 'auto']\n      }],\n      /**\n       * Will Change\n       * @see https://tailwindcss.com/docs/will-change\n       */\n      'will-change': [{\n        'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue]\n      }],\n      // SVG\n      /**\n       * Fill\n       * @see https://tailwindcss.com/docs/fill\n       */\n      fill: [{\n        fill: [colors, 'none']\n      }],\n      /**\n       * Stroke Width\n       * @see https://tailwindcss.com/docs/stroke-width\n       */\n      'stroke-w': [{\n        stroke: [isLength, isArbitraryLength, isArbitraryNumber]\n      }],\n      /**\n       * Stroke\n       * @see https://tailwindcss.com/docs/stroke\n       */\n      stroke: [{\n        stroke: [colors, 'none']\n      }],\n      // Accessibility\n      /**\n       * Screen Readers\n       * @see https://tailwindcss.com/docs/screen-readers\n       */\n      sr: ['sr-only', 'not-sr-only'],\n      /**\n       * Forced Color Adjust\n       * @see https://tailwindcss.com/docs/forced-color-adjust\n       */\n      'forced-color-adjust': [{\n        'forced-color-adjust': ['auto', 'none']\n      }]\n    },\n    conflictingClassGroups: {\n      overflow: ['overflow-x', 'overflow-y'],\n      overscroll: ['overscroll-x', 'overscroll-y'],\n      inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n      'inset-x': ['right', 'left'],\n      'inset-y': ['top', 'bottom'],\n      flex: ['basis', 'grow', 'shrink'],\n      gap: ['gap-x', 'gap-y'],\n      p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n      px: ['pr', 'pl'],\n      py: ['pt', 'pb'],\n      m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n      mx: ['mr', 'ml'],\n      my: ['mt', 'mb'],\n      size: ['w', 'h'],\n      'font-size': ['leading'],\n      'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n      'fvn-ordinal': ['fvn-normal'],\n      'fvn-slashed-zero': ['fvn-normal'],\n      'fvn-figure': ['fvn-normal'],\n      'fvn-spacing': ['fvn-normal'],\n      'fvn-fraction': ['fvn-normal'],\n      'line-clamp': ['display', 'overflow'],\n      rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n      'rounded-s': ['rounded-ss', 'rounded-es'],\n      'rounded-e': ['rounded-se', 'rounded-ee'],\n      'rounded-t': ['rounded-tl', 'rounded-tr'],\n      'rounded-r': ['rounded-tr', 'rounded-br'],\n      'rounded-b': ['rounded-br', 'rounded-bl'],\n      'rounded-l': ['rounded-tl', 'rounded-bl'],\n      'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n      'border-w': ['border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n      'border-w-x': ['border-w-r', 'border-w-l'],\n      'border-w-y': ['border-w-t', 'border-w-b'],\n      'border-color': ['border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n      'border-color-x': ['border-color-r', 'border-color-l'],\n      'border-color-y': ['border-color-t', 'border-color-b'],\n      'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n      'scroll-mx': ['scroll-mr', 'scroll-ml'],\n      'scroll-my': ['scroll-mt', 'scroll-mb'],\n      'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n      'scroll-px': ['scroll-pr', 'scroll-pl'],\n      'scroll-py': ['scroll-pt', 'scroll-pb'],\n      touch: ['touch-x', 'touch-y', 'touch-pz'],\n      'touch-x': ['touch'],\n      'touch-y': ['touch'],\n      'touch-pz': ['touch']\n    },\n    conflictingClassGroupModifiers: {\n      'font-size': ['leading']\n    }\n  };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n  cacheSize,\n  prefix,\n  separator,\n  experimentalParseClassName,\n  extend = {},\n  override = {}\n}) => {\n  overrideProperty(baseConfig, 'cacheSize', cacheSize);\n  overrideProperty(baseConfig, 'prefix', prefix);\n  overrideProperty(baseConfig, 'separator', separator);\n  overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n  for (const configKey in override) {\n    overrideConfigProperties(baseConfig[configKey], override[configKey]);\n  }\n  for (const key in extend) {\n    mergeConfigProperties(baseConfig[key], extend[key]);\n  }\n  return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n  if (overrideValue !== undefined) {\n    baseObject[overrideKey] = overrideValue;\n  }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n  if (overrideObject) {\n    for (const key in overrideObject) {\n      overrideProperty(baseObject, key, overrideObject[key]);\n    }\n  }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n  if (mergeObject) {\n    for (const key in mergeObject) {\n      const mergeValue = mergeObject[key];\n      if (mergeValue !== undefined) {\n        baseObject[key] = (baseObject[key] || []).concat(mergeValue);\n      }\n    }\n  }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}","import { GridItem, GridPosition } from '../types'\n\nexport function calculateGridPosition(\n  x: number,\n  y: number,\n  cols: number,\n  rowHeight: number,\n  gap: number,\n  containerWidth: number,\n  margin?: [number, number]\n): { col: number; row: number } {\n  const verticalMargin = margin ? margin[1] : gap\n  \n  // React Grid Layout과 동일한 방식으로 계산  \n  const unitWidth = containerWidth / cols\n  \n  // 사용 임계값으로 스무스한 그리드 스냅\n  const threshold = 0.3 // 30% 진입 시 스냅\n  \n  // 그리드 위치 계산 with threshold\n  const colFloat = x / unitWidth\n  const rowFloat = y / (rowHeight + verticalMargin)\n  \n  // 임계값을 적용한 스냅\n  const col = Math.floor(colFloat + threshold)\n  const row = Math.floor(rowFloat + threshold)\n  \n  return {\n    col: Math.max(0, col),\n    row: Math.max(0, row)\n  }\n}\n\nexport function getPixelPosition(\n  item: GridPosition,\n  cols: number,\n  rowHeight: number,\n  gap: number,\n  containerWidth: number,\n  margin?: [number, number],\n  containerPadding?: [number, number]\n): { left: number; top: number; width: number; height: number } {\n  const horizontalMargin = margin ? margin[0] : gap\n  const verticalMargin = margin ? margin[1] : gap\n  const leftPadding = containerPadding ? containerPadding[0] : 0\n  const topPadding = containerPadding ? containerPadding[1] : 0\n  \n  // React Grid Layout과 동일한 계산 방식\n  // 컨테이너 패딩을 제외한 실제 그리드 영역\n  const gridWidth = containerWidth - (leftPadding * 2)\n  const totalMarginWidth = (cols - 1) * horizontalMargin\n  const availableWidth = gridWidth - totalMarginWidth\n  const unitWidth = availableWidth / cols\n  \n  // 위치 계산 (컨테이너 패딩 포함)\n  const left = leftPadding + item.x * (unitWidth + horizontalMargin)\n  const width = item.w * unitWidth + (item.w - 1) * horizontalMargin\n  \n  return {\n    left: Math.round(left),\n    top: topPadding + item.y * (rowHeight + verticalMargin),\n    width: Math.round(width),\n    height: item.h * rowHeight + (item.h - 1) * verticalMargin\n  }\n}\n\nexport function checkCollision(\n  item1: GridPosition,\n  item2: GridPosition\n): boolean {\n  return !(\n    item1.x + item1.w <= item2.x ||\n    item2.x + item2.w <= item1.x ||\n    item1.y + item1.h <= item2.y ||\n    item2.y + item2.h <= item1.y\n  )\n}\n\nexport function findFreeSpace(\n  items: GridItem[],\n  itemToPlace: GridPosition,\n  cols: number,\n  excludeId?: string\n): GridPosition {\n  const itemsToCheck = excludeId \n    ? items.filter(item => item.id !== excludeId)\n    : items\n  \n  // First, try to place at the requested position\n  const hasCollisionAtOriginal = itemsToCheck.some(item => \n    checkCollision(itemToPlace, item)\n  )\n  \n  if (!hasCollisionAtOriginal) {\n    return itemToPlace\n  }\n  \n  // If there's collision, find the nearest free space\n  let y = itemToPlace.y\n  \n  while (true) {\n    for (let x = 0; x <= cols - itemToPlace.w; x++) {\n      const testPosition = { ...itemToPlace, x, y }\n      const hasCollision = itemsToCheck.some(item => \n        checkCollision(testPosition, item)\n      )\n      \n      if (!hasCollision) {\n        return testPosition\n      }\n    }\n    y++\n  }\n}\n\nexport function compactLayout(\n  items: GridItem[],\n  cols: number,\n  compactType: 'vertical' | 'horizontal' | null = 'vertical'\n): GridItem[] {\n  if (!compactType) return items\n  \n  // Separate static and non-static items\n  const staticItems = items.filter(item => item.static)\n  const nonStaticItems = items.filter(item => !item.static)\n  \n  // Sort non-static items based on compact type\n  const sorted = [...nonStaticItems].sort((a, b) => {\n    if (compactType === 'horizontal') {\n      // For horizontal compacting, sort by x then y\n      if (a.x === b.x) return a.y - b.y\n      return a.x - b.x\n    } else {\n      // For vertical compacting, sort by y then x\n      if (a.y === b.y) return a.x - b.x\n      return a.y - b.y\n    }\n  })\n  \n  const compacted: GridItem[] = [...staticItems]\n  \n  sorted.forEach(item => {\n    if (compactType === 'vertical') {\n      // Find the topmost position for this item\n      let minY = 0\n      let found = false\n      \n      // Try each row from top to bottom\n      for (let y = 0; !found; y++) {\n        const testItem = { ...item, y, x: item.x }\n        const hasCollision = compacted.some(placed => \n          checkCollision(testItem, placed)\n        )\n        \n        if (!hasCollision) {\n          minY = y\n          found = true\n        }\n      }\n      \n      compacted.push({ ...item, y: minY })\n    } else if (compactType === 'horizontal') {\n      // Find the leftmost position for this item\n      let minX = 0\n      let found = false\n      \n      // Try each column from left to right\n      for (let x = 0; x <= cols - item.w && !found; x++) {\n        const testItem = { ...item, x, y: item.y }\n        const hasCollision = compacted.some(placed => \n          checkCollision(testItem, placed)\n        )\n        \n        if (!hasCollision) {\n          minX = x\n          found = true\n        }\n      }\n      \n      compacted.push({ ...item, x: minX })\n    }\n  })\n  \n  return compacted\n}\n\nexport function shouldSwapItems(\n  draggingItem: GridPosition,\n  targetItem: GridPosition,\n  originalItem: GridPosition\n): boolean {\n  const draggingCenterX = draggingItem.x + draggingItem.w / 2\n  const draggingCenterY = draggingItem.y + draggingItem.h / 2\n  const targetCenterX = targetItem.x + targetItem.w / 2\n  const targetCenterY = targetItem.y + targetItem.h / 2\n  \n  const isMovingDown = draggingItem.y > originalItem.y\n  const isMovingUp = draggingItem.y < originalItem.y\n  const isMovingRight = draggingItem.x > originalItem.x\n  const isMovingLeft = draggingItem.x < originalItem.x\n  \n  if (isMovingDown && draggingCenterY > targetCenterY) return true\n  if (isMovingUp && draggingCenterY < targetCenterY) return true\n  if (isMovingRight && draggingCenterX > targetCenterX) return true\n  if (isMovingLeft && draggingCenterX < targetCenterX) return true\n  \n  return false\n}\n\nexport function moveItems(\n  layout: GridItem[],\n  item: GridItem,\n  _cols: number,\n  originalItem?: GridItem\n): GridItem[] {\n  if (!originalItem) return layout\n  \n  const movedLayout = [...layout]\n  const itemIndex = movedLayout.findIndex(l => l.id === item.id)\n  if (itemIndex !== -1) {\n    movedLayout[itemIndex] = { ...item }\n  }\n  \n  // 충돌하는 아이템들 찾기\n  const collisions = movedLayout.filter(l => {\n    if (l.id === item.id || l.static) return false\n    return checkCollision(item, l)\n  })\n  \n  // 충돌하는 아이템들을 밀어내기\n  const isMovingUp = item.y < originalItem.y\n  const isMovingDown = item.y > originalItem.y\n  \n  for (const collision of collisions) {\n    const collisionIndex = movedLayout.findIndex(l => l.id === collision.id)\n    if (collisionIndex !== -1) {\n      if (isMovingUp) {\n        // 위로 이동할 때는 충돌 아이템을 아래로 밀기\n        movedLayout[collisionIndex] = { \n          ...collision, \n          y: item.y + item.h \n        }\n      } else if (isMovingDown) {\n        // 아래로 이동할 때는 충돌 아이템을 위로 밀기\n        movedLayout[collisionIndex] = { \n          ...collision, \n          y: Math.max(0, item.y - collision.h) \n        }\n      } else {\n        // 좌우 이동시 원래 로직 사용\n        if (shouldSwapItems(item, collision, originalItem)) {\n          movedLayout[collisionIndex] = { \n            ...collision, \n            x: originalItem.x, \n            y: originalItem.y \n          }\n        }\n      }\n    }\n  }\n  \n  return movedLayout\n}\n\nexport function getAllCollisions(\n  layout: GridItem[],\n  item: GridItem\n): GridItem[] {\n  return layout.filter(l => l.id !== item.id && checkCollision(l, item))\n}","'use client'\n\nimport React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface ResizeHandleProps {\n  position: 'se' | 'sw' | 'ne' | 'nw' | 'n' | 's' | 'e' | 'w'\n  onMouseDown: (e: React.MouseEvent | React.TouchEvent | React.PointerEvent) => void\n  isActive?: boolean\n  isVisible?: boolean\n}\n\nexport const ResizeHandle: React.FC<ResizeHandleProps> = ({\n  position,\n  onMouseDown,\n  isActive = true,\n  isVisible = true,\n}) => {\n  // 이벤트 전파를 막아서 부모의 드래그 핸들러가 실행되지 않도록 함\n  const handleEvent = (e: React.MouseEvent | React.TouchEvent | React.PointerEvent) => {\n    e.stopPropagation()\n    onMouseDown(e)\n  }\n  // Corner handle positions and their styling - with slight offset like React Grid Layout\n  const cornerPositions = {\n    se: { className: 'bottom-0 right-0', cursor: 'cursor-se-resize', backgroundPosition: 'bottom right', transform: undefined },\n    sw: { className: 'bottom-0 left-0', cursor: 'cursor-sw-resize', backgroundPosition: 'bottom left', transform: 'scaleX(-1)' },\n    ne: { className: 'top-0 right-0', cursor: 'cursor-ne-resize', backgroundPosition: 'top right', transform: 'scaleY(-1)' },\n    nw: { className: 'top-0 left-0', cursor: 'cursor-nw-resize', backgroundPosition: 'top left', transform: 'scale(-1, -1)' }\n  }\n\n  // React Grid Layout style handles for corners\n  if (cornerPositions[position as keyof typeof cornerPositions] && isVisible) {\n    const corner = cornerPositions[position as keyof typeof cornerPositions]\n    return (\n      <span\n        data-testid={`resize-handle-${position}`}\n        className={cn(\n          'react-grid-layout__resize-handle',\n          'absolute w-5 h-5',\n          isActive ? corner.cursor : 'cursor-not-allowed opacity-50',\n          'z-50',\n          'touch-action-none'\n        )}\n        onMouseDown={isActive ? handleEvent : undefined}\n        onTouchStart={isActive ? handleEvent : undefined}\n        onDoubleClick={(e) => e.preventDefault()}\n        style={{\n          ...(position === 'se' && { bottom: '0px', right: '0px', cursor: 'se-resize' }),\n          ...(position === 'sw' && { bottom: '0px', left: '0px', cursor: 'sw-resize' }),\n          ...(position === 'ne' && { top: '0px', right: '0px', cursor: 'ne-resize' }),\n          ...(position === 'nw' && { top: '0px', left: '0px', cursor: 'nw-resize' }),\n          backgroundImage: `url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg08IS0tIEdlbmVyYXRvcjogQWRvYmUgRmlyZXdvcmtzIENTNiwgRXhwb3J0IFNWRyBFeHRlbnNpb24gYnkgQWFyb24gQmVhbGwgKGh0dHA6Ly9maXJld29ya3MuYWJlYWxsLmNvbSkgLiBWZXJzaW9uOiAwLjYuMSAgLS0+DTwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DTxzdmcgaWQ9IlVudGl0bGVkLVBhZ2UlMjAxIiB2aWV3Qm94PSIwIDAgNiA2IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmMDAiIHZlcnNpb249IjEuMSINCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiDQl4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiDT4NCTxnIG9wYWNpdHk9IjAuMzAyIj4NCQk8cGF0aCBkPSJNIDYgNiBMIDAgNiBMIDAgNC4yIEwgNCA0LjIgTCA0LjIgNC4yIEwgNC4yIDAgTCA2IDAgTCA2IDYgTCA2IDYgWiIgZmlsbD0iIzAwMDAwMCIvPg0JPC9nPg08L3N2Zz4=\")`,\n          backgroundPosition: 'bottom right',\n          backgroundRepeat: 'no-repeat',\n          backgroundOrigin: 'content-box',\n          boxSizing: 'border-box',\n          transform: corner.transform,\n          padding: '3px'\n        }}\n      />\n    )\n  }\n\n  // Edge handles (n, s, e, w) - invisible but functional with larger hit area\n  const edgeHandleClasses: Record<string, string> = {\n    n: 'top-0 left-1/2 -translate-x-1/2 w-16 h-4 cursor-n-resize',\n    s: 'bottom-0 left-1/2 -translate-x-1/2 w-16 h-4 cursor-s-resize',\n    e: 'right-0 top-1/2 -translate-y-1/2 w-4 h-16 cursor-e-resize',\n    w: 'left-0 top-1/2 -translate-y-1/2 w-4 h-16 cursor-w-resize'\n  }\n\n  // Cursor styles for edge handles\n  const edgeCursors: Record<string, string> = {\n    n: 'n-resize',\n    s: 's-resize',\n    e: 'e-resize',\n    w: 'w-resize'\n  }\n\n  // Render edge handles (n, s, e, w)\n  if (edgeHandleClasses[position]) {\n    return (\n      <div\n        data-testid={`resize-handle-${position}`}\n        className={cn(\n          'absolute',\n          edgeHandleClasses[position],\n          !isActive && 'pointer-events-none',\n          'z-20',\n          'touch-action-none'\n        )}\n        style={{ cursor: isActive ? edgeCursors[position] : 'not-allowed' }}\n        onMouseDown={isActive ? handleEvent : undefined}\n        onTouchStart={isActive ? handleEvent : undefined}\n        onDoubleClick={(e) => e.preventDefault()}\n      />\n    )\n  }\n\n  // Fallback for any unsupported positions\n  return null\n}","'use client'\n\nimport React from 'react'\nimport { cn } from '../utils/cn'\nimport { GridItem, ResizeState } from '../types'\nimport { ResizeHandle } from './ResizeHandle'\n\ninterface GridItemComponentProps {\n  item: GridItem\n  position: { left: number; top: number; width: number; height: number }\n  isDragging: boolean\n  isResizing: boolean\n  isColliding?: boolean\n  isDraggable: boolean\n  isResizable: boolean\n  resizeHandles?: Array<'s' | 'w' | 'e' | 'n' | 'sw' | 'nw' | 'se' | 'ne'>\n  draggableCancel?: string\n  onDragStart: (itemId: string, e: React.MouseEvent | React.TouchEvent | React.PointerEvent) => void\n  onResizeStart: (itemId: string, handle: ResizeState['resizeHandle'], e: React.MouseEvent | React.TouchEvent | React.PointerEvent) => void\n  children: React.ReactNode\n}\n\nexport const GridItemComponent: React.FC<GridItemComponentProps> = ({\n  item,\n  position,\n  isDragging,\n  isResizing,\n  isColliding = false,\n  isDraggable,\n  isResizable,\n  resizeHandles = ['se'],\n  draggableCancel,\n  onDragStart,\n  onResizeStart,\n  children\n}) => {\n  const handleMouseDown = (e: React.MouseEvent | React.TouchEvent | React.PointerEvent) => {\n    // Don't allow dragging static items\n    if (item.static) return\n\n    // Only initiate drag if clicking on the drag handle or if no specific handle is defined\n    const target = e.target as HTMLElement\n    const isDragHandle = target.closest('.grid-drag-handle')\n    const isActionButton = target.closest('.grid-actions, button, a')\n\n    // Check if clicking on resize handle - don't start drag\n    const isResizeHandle = target.closest('.react-grid-layout__resize-handle') || target.closest('[data-testid^=\"resize-handle-\"]')\n    if (isResizeHandle) {\n      return\n    }\n\n    // Check draggableCancel selector\n    const isCancelled = draggableCancel && target.closest(draggableCancel)\n\n\n    if (isDraggable && (isDragHandle || !target.closest('.grid-drag-handle')) && !isActionButton && !isCancelled) {\n\n      // For touch events, we need to call preventDefault to prevent scrolling\n      // But we should do it before calling onDragStart to ensure the event is not consumed\n      if ('touches' in e) {\n        e.preventDefault()\n      }\n\n      onDragStart(item.id, e)\n    }\n  }\n\n  return (\n    <div\n      data-grid-id={item.id}\n      className={cn(\n        'absolute isolate',\n        !isDragging && 'transition-all duration-200',\n        isDragging && 'opacity-80 z-50 cursor-grabbing shadow-2xl',\n        isResizing && 'z-40',\n        isColliding && 'ring-1 ring-gray-400 shadow-inner',\n        !isDragging && !isResizing && 'hover:z-30',\n        !isDragging && (item.static ? 'cursor-not-allowed' : (isDraggable ? 'cursor-grab' : 'cursor-default')),\n        item.className\n      )}\n      style={{\n        left: `${position.left}px`,\n        top: `${position.top}px`,\n        width: `${position.width}px`,\n        height: `${position.height}px`,\n        transform: isDragging ? 'scale(1.02)' : 'scale(1)'\n      }}\n      onMouseDown={handleMouseDown}\n      onTouchStart={(e) => {\n        // Call handleMouseDown with synthetic event\n        handleMouseDown(e)\n        // Stop propagation to prevent bubbling issues\n        e.stopPropagation()\n      }}\n      onDoubleClick={(e) => e.preventDefault()}\n    >\n      {/* Content wrapper with lower z-index to ensure resize handles are always on top */}\n      <div className=\"relative z-0 h-full w-full\">\n        {children}\n      </div>\n\n      {/* Resize handles */}\n      {isResizable && (\n        <>\n          {resizeHandles.map(handle => (\n            <ResizeHandle\n              key={handle}\n              position={handle}\n              onMouseDown={(e) => onResizeStart(item.id, handle, e)}\n              isActive={true}\n              isVisible={['se', 'sw', 'ne', 'nw'].includes(handle)}\n            />\n          ))}\n        </>\n      )}\n    </div>\n  )\n}","export interface Position {\n  x: number\n  y: number\n}\n\n/**\n * Get the position from a mouse or touch event\n */\nexport function getControlPosition(e: MouseEvent | TouchEvent | PointerEvent): Position | null {\n  // Handle PointerEvent (used by Chrome DevTools touch simulation)\n  if ('pointerId' in e) {\n    const pointerEvent = e as PointerEvent\n    return {\n      x: pointerEvent.clientX,\n      y: pointerEvent.clientY\n    }\n  }\n  \n  // Handle touch events\n  if ('touches' in e) {\n    const touchEvent = e as TouchEvent\n    const touch = touchEvent.touches[0] || touchEvent.changedTouches[0]\n    \n    if (!touch) {\n      return null\n    }\n    \n    return {\n      x: touch.clientX,\n      y: touch.clientY\n    }\n  }\n  \n  // Handle mouse events\n  return {\n    x: e.clientX,\n    y: e.clientY\n  }\n}\n\n/**\n * Get touch identifier for tracking specific touches\n */\nexport function getTouchIdentifier(e: TouchEvent): number | null {\n  if (e.targetTouches && e.targetTouches[0]) {\n    return e.targetTouches[0].identifier\n  }\n  if (e.changedTouches && e.changedTouches[0]) {\n    return e.changedTouches[0].identifier\n  }\n  return null\n}\n\n/**\n * Check if this is the primary touch (first touch in multi-touch scenario)\n */\nexport function isPrimaryTouch(e: TouchEvent): boolean {\n  return e.touches.length === 1 || \n         (e.touches.length > 1 && e.touches[0]?.identifier === getTouchIdentifier(e))\n}\n\n/**\n * Add event listener options for better mobile performance\n * passive: false - allows preventDefault to work\n * capture: true - use capturing phase for better touch handling\n */\nexport const touchEventOptions = { passive: false, capture: true }\n\n/**\n * Prevent default behavior for touch events\n */\nexport function preventDefaultTouchEvent(e: TouchEvent): void {\n  if (e.cancelable) {\n    e.preventDefault()\n  }\n}","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { GridItem, ResizeState } from '../types'\nimport { getControlPosition, preventDefaultTouchEvent, touchEventOptions } from '../utils/touch'\nimport { checkCollision } from '../utils/grid'\n\nexport interface UseResizeOptions {\n  cols: number\n  rowHeight: number\n  gap: number\n  margin?: [number, number]\n  containerPadding: [number, number]\n  containerWidth: number\n  layout: GridItem[]\n  setLayout: React.Dispatch<React.SetStateAction<GridItem[]>>\n  updateLayout: (layout: GridItem[]) => void\n  containerRef: React.RefObject<HTMLDivElement>\n  onResizeStart?: (layout: GridItem[], oldItem: GridItem, newItem: GridItem, placeholder: GridItem, e: MouseEvent | TouchEvent | PointerEvent, element: HTMLElement) => void\n  onResize?: (layout: GridItem[], oldItem: GridItem, newItem: GridItem, placeholder: GridItem, e: MouseEvent | TouchEvent | PointerEvent, element: HTMLElement) => void\n  onResizeStop?: (layout: GridItem[], oldItem: GridItem, newItem: GridItem, placeholder: GridItem, e: MouseEvent | TouchEvent | PointerEvent, element: HTMLElement) => void\n}\n\nexport interface UseResizeReturn {\n  resizeState: ResizeState\n  handleResizeStart: (\n    itemId: string,\n    handle: ResizeState['resizeHandle'],\n    e: React.MouseEvent | React.TouchEvent | React.PointerEvent\n  ) => void\n}\n\nconst initialResizeState: ResizeState = {\n  isResizing: false,\n  resizedItem: null,\n  resizeHandle: null,\n  startSize: { w: 0, h: 0 },\n  startPos: { x: 0, y: 0 },\n  currentPixelSize: { w: 0, h: 0 },\n  currentPixelPos: { x: 0, y: 0 }\n}\n\nexport function useResize({\n  cols,\n  rowHeight,\n  gap,\n  margin,\n  containerPadding,\n  containerWidth,\n  layout,\n  setLayout,\n  updateLayout,\n  containerRef,\n  onResizeStart,\n  onResize,\n  onResizeStop\n}: UseResizeOptions): UseResizeReturn {\n  const [resizeState, setResizeState] = useState<ResizeState>(initialResizeState)\n\n  // Use ref to always have latest layout in event handlers\n  const layoutRef = useRef(layout)\n  layoutRef.current = layout\n\n  // Calculate grid unit dimensions\n  const getGridUnits = useCallback(() => {\n    const horizontalMargin = margin ? margin[0] : gap\n    const verticalMargin = margin ? margin[1] : gap\n    const gridWidth = containerWidth - containerPadding[0] * 2\n    const colWidth = (gridWidth - horizontalMargin * (cols - 1)) / cols\n    const gridUnitW = colWidth + horizontalMargin\n    const gridUnitH = rowHeight + verticalMargin\n    return { horizontalMargin, verticalMargin, colWidth, gridUnitW, gridUnitH }\n  }, [cols, rowHeight, gap, margin, containerPadding, containerWidth])\n\n  // Handle resize start\n  const handleResizeStart = useCallback((\n    itemId: string,\n    handle: ResizeState['resizeHandle'],\n    e: React.MouseEvent | React.TouchEvent | React.PointerEvent\n  ) => {\n    const item = layoutRef.current.find(i => i.id === itemId)!\n    const pos = getControlPosition(e.nativeEvent)\n    if (!pos) return\n\n    const { horizontalMargin, verticalMargin, colWidth, gridUnitW, gridUnitH } = getGridUnits()\n\n    setResizeState({\n      isResizing: true,\n      resizedItem: itemId,\n      resizeHandle: handle,\n      startSize: { w: item.w, h: item.h },\n      startPos: { x: pos.x, y: pos.y },\n      originalPos: { x: item.x, y: item.y },\n      currentPixelSize: {\n        w: item.w * colWidth + (item.w - 1) * horizontalMargin,\n        h: item.h * rowHeight + (item.h - 1) * verticalMargin\n      },\n      currentPixelPos: {\n        x: item.x * gridUnitW,\n        y: item.y * gridUnitH\n      }\n    })\n\n    if (onResizeStart) {\n      const element = e.currentTarget as HTMLElement\n      onResizeStart(layoutRef.current, item, item, { ...item }, e.nativeEvent, element)\n    }\n\n    e.preventDefault()\n    e.stopPropagation()\n    if ('touches' in e.nativeEvent) {\n      preventDefaultTouchEvent(e.nativeEvent as TouchEvent)\n    }\n  }, [getGridUnits, onResizeStart, rowHeight])\n\n  // Handle resize move\n  const handleResizeMove = useCallback((e: MouseEvent | TouchEvent | PointerEvent) => {\n    const item = layoutRef.current.find(i => i.id === resizeState.resizedItem)\n    if (!item) return\n\n    const pos = getControlPosition(e)\n    if (!pos) return\n\n    const { horizontalMargin, verticalMargin, colWidth, gridUnitW, gridUnitH } = getGridUnits()\n\n    const pixelDeltaX = pos.x - resizeState.startPos.x\n    const pixelDeltaY = pos.y - resizeState.startPos.y\n\n    const gridDeltaX = pixelDeltaX / gridUnitW\n    const gridDeltaY = pixelDeltaY / gridUnitH\n\n    let newGridW = resizeState.startSize.w\n    let newGridH = resizeState.startSize.h\n    let newGridX = resizeState.originalPos?.x ?? item.x\n    let newGridY = resizeState.originalPos?.y ?? item.y\n\n    // Calculate new size/position based on handle\n    switch (resizeState.resizeHandle) {\n      case 'se': {\n        newGridW = Math.max(1, Math.round(resizeState.startSize.w + gridDeltaX))\n        newGridH = Math.max(1, Math.round(resizeState.startSize.h + gridDeltaY))\n        break\n      }\n      case 'sw': {\n        const deltaW = Math.round(gridDeltaX)\n        const maxDeltaW = resizeState.startSize.w - 1\n        const clampedDeltaW = Math.min(deltaW, maxDeltaW)\n        newGridX = Math.max(0, (resizeState.originalPos?.x ?? item.x) + clampedDeltaW)\n        newGridW = Math.max(1, resizeState.startSize.w - clampedDeltaW)\n        newGridH = Math.max(1, Math.round(resizeState.startSize.h + gridDeltaY))\n        break\n      }\n      case 'ne': {\n        const deltaH = Math.round(gridDeltaY)\n        const maxDeltaH = resizeState.startSize.h - 1\n        const clampedDeltaH = Math.min(deltaH, maxDeltaH)\n        newGridY = Math.max(0, (resizeState.originalPos?.y ?? item.y) + clampedDeltaH)\n        newGridW = Math.max(1, Math.round(resizeState.startSize.w + gridDeltaX))\n        newGridH = Math.max(1, resizeState.startSize.h - clampedDeltaH)\n        break\n      }\n      case 'nw': {\n        const deltaW = Math.round(gridDeltaX)\n        const deltaH = Math.round(gridDeltaY)\n        const maxDeltaW = resizeState.startSize.w - 1\n        const maxDeltaH = resizeState.startSize.h - 1\n        const clampedDeltaW = Math.min(deltaW, maxDeltaW)\n        const clampedDeltaH = Math.min(deltaH, maxDeltaH)\n        newGridX = Math.max(0, (resizeState.originalPos?.x ?? item.x) + clampedDeltaW)\n        newGridY = Math.max(0, (resizeState.originalPos?.y ?? item.y) + clampedDeltaH)\n        newGridW = Math.max(1, resizeState.startSize.w - clampedDeltaW)\n        newGridH = Math.max(1, resizeState.startSize.h - clampedDeltaH)\n        break\n      }\n      case 'e': {\n        newGridW = Math.max(1, Math.round(resizeState.startSize.w + gridDeltaX))\n        break\n      }\n      case 'w': {\n        const deltaW = Math.round(gridDeltaX)\n        const maxDeltaW = resizeState.startSize.w - 1\n        const clampedDeltaW = Math.min(deltaW, maxDeltaW)\n        newGridX = Math.max(0, (resizeState.originalPos?.x ?? item.x) + clampedDeltaW)\n        newGridW = Math.max(1, resizeState.startSize.w - clampedDeltaW)\n        break\n      }\n      case 's': {\n        newGridH = Math.max(1, Math.round(resizeState.startSize.h + gridDeltaY))\n        break\n      }\n      case 'n': {\n        const deltaH = Math.round(gridDeltaY)\n        const maxDeltaH = resizeState.startSize.h - 1\n        const clampedDeltaH = Math.min(deltaH, maxDeltaH)\n        newGridY = Math.max(0, (resizeState.originalPos?.y ?? item.y) + clampedDeltaH)\n        newGridH = Math.max(1, resizeState.startSize.h - clampedDeltaH)\n        break\n      }\n    }\n\n    // Apply boundary constraints\n    newGridX = Math.max(0, Math.min(cols - newGridW, newGridX))\n    newGridW = Math.min(newGridW, cols - newGridX)\n\n    // Apply minW/maxW constraints\n    const constrainedW = Math.min(Math.max(item.minW || 1, newGridW), item.maxW || Infinity)\n    const constrainedH = Math.max(item.minH || 1, Math.min(newGridH, item.maxH || Infinity))\n    const constrainedX = Math.max(0, Math.min(cols - constrainedW, newGridX))\n    const constrainedY = Math.max(0, newGridY)\n\n    // Static item collision detection\n    const staticItems = layoutRef.current.filter(i => i.static && i.id !== item.id)\n    let finalX = constrainedX\n    let finalY = constrainedY\n    let finalW = constrainedW\n    let finalH = constrainedH\n    let hasCollision = false\n\n    for (const staticItem of staticItems) {\n      const tempItem = { ...item, x: constrainedX, y: constrainedY, w: constrainedW, h: constrainedH }\n\n      if (checkCollision(tempItem, staticItem)) {\n        hasCollision = true\n\n        switch (resizeState.resizeHandle) {\n          case 'se':\n            if (tempItem.x < staticItem.x) {\n              finalW = Math.min(finalW, staticItem.x - tempItem.x)\n            }\n            if (tempItem.y < staticItem.y) {\n              finalH = Math.min(finalH, staticItem.y - tempItem.y)\n            }\n            break\n\n          case 'nw':\n            if (staticItem.x + staticItem.w <= resizeState.originalPos!.x + resizeState.startSize.w) {\n              const maxLeftMove = resizeState.originalPos!.x - (staticItem.x + staticItem.w)\n              const actualLeftMove = resizeState.originalPos!.x - constrainedX\n              if (actualLeftMove > maxLeftMove) {\n                finalX = staticItem.x + staticItem.w\n                finalW = resizeState.originalPos!.x + resizeState.startSize.w - finalX\n              }\n            }\n            if (staticItem.y + staticItem.h <= resizeState.originalPos!.y + resizeState.startSize.h) {\n              const maxUpMove = resizeState.originalPos!.y - (staticItem.y + staticItem.h)\n              const actualUpMove = resizeState.originalPos!.y - constrainedY\n              if (actualUpMove > maxUpMove) {\n                finalY = staticItem.y + staticItem.h\n                finalH = resizeState.originalPos!.y + resizeState.startSize.h - finalY\n              }\n            }\n            break\n\n          case 'sw':\n            if (staticItem.x + staticItem.w <= resizeState.originalPos!.x + resizeState.startSize.w) {\n              const maxLeftMove = resizeState.originalPos!.x - (staticItem.x + staticItem.w)\n              const actualLeftMove = resizeState.originalPos!.x - constrainedX\n              if (actualLeftMove > maxLeftMove) {\n                finalX = staticItem.x + staticItem.w\n                finalW = resizeState.originalPos!.x + resizeState.startSize.w - finalX\n              }\n            }\n            if (tempItem.y < staticItem.y) {\n              finalH = Math.min(finalH, staticItem.y - tempItem.y)\n            }\n            break\n\n          case 'ne':\n            if (tempItem.x < staticItem.x) {\n              finalW = Math.min(finalW, staticItem.x - tempItem.x)\n            }\n            if (staticItem.y + staticItem.h <= resizeState.originalPos!.y + resizeState.startSize.h) {\n              const maxUpMove = resizeState.originalPos!.y - (staticItem.y + staticItem.h)\n              const actualUpMove = resizeState.originalPos!.y - constrainedY\n              if (actualUpMove > maxUpMove) {\n                finalY = staticItem.y + staticItem.h\n                finalH = resizeState.originalPos!.y + resizeState.startSize.h - finalY\n              }\n            }\n            break\n\n          case 'w':\n            if (staticItem.x + staticItem.w <= resizeState.originalPos!.x + resizeState.startSize.w) {\n              const maxLeftMove = resizeState.originalPos!.x - (staticItem.x + staticItem.w)\n              const actualLeftMove = resizeState.originalPos!.x - constrainedX\n              if (actualLeftMove > maxLeftMove) {\n                finalX = staticItem.x + staticItem.w\n                finalW = resizeState.originalPos!.x + resizeState.startSize.w - finalX\n              }\n            }\n            break\n\n          case 'e':\n            if (tempItem.x < staticItem.x) {\n              finalW = Math.min(finalW, staticItem.x - tempItem.x)\n            }\n            break\n\n          case 'n':\n            if (staticItem.y + staticItem.h <= resizeState.originalPos!.y + resizeState.startSize.h) {\n              const maxUpMove = resizeState.originalPos!.y - (staticItem.y + staticItem.h)\n              const actualUpMove = resizeState.originalPos!.y - constrainedY\n              if (actualUpMove > maxUpMove) {\n                finalY = staticItem.y + staticItem.h\n                finalH = resizeState.originalPos!.y + resizeState.startSize.h - finalY\n              }\n            }\n            break\n\n          case 's':\n            if (tempItem.y < staticItem.y) {\n              finalH = Math.min(finalH, staticItem.y - tempItem.y)\n            }\n            break\n        }\n      }\n    }\n\n    // Update collision state\n    setResizeState(prev => ({\n      ...prev,\n      isColliding: hasCollision\n    }))\n\n    const newLayout = layoutRef.current.map(i =>\n      i.id === resizeState.resizedItem\n        ? { ...i, x: finalX, y: finalY, w: finalW, h: finalH }\n        : i\n    )\n\n    setLayout(newLayout)\n\n    // Calculate final pixel positions\n    const finalPixelX = finalX * gridUnitW\n    const finalPixelY = finalY * gridUnitH\n    const finalPixelW = finalW * colWidth + (finalW - 1) * horizontalMargin\n    const finalPixelH = finalH * rowHeight + (finalH - 1) * verticalMargin\n\n    setResizeState(prev => ({\n      ...prev,\n      currentPixelSize: { w: finalPixelW, h: finalPixelH },\n      currentPixelPos: { x: finalPixelX, y: finalPixelY }\n    }))\n\n    // Call onResize callback\n    if (onResize && resizeState.originalPos) {\n      const element = containerRef.current?.querySelector(`[data-grid-id=\"${resizeState.resizedItem}\"]`) as HTMLElement\n      if (element) {\n        const originalItem = { ...item, x: resizeState.originalPos.x, y: resizeState.originalPos.y, w: resizeState.startSize.w, h: resizeState.startSize.h }\n        const newItem = { ...item, x: finalX, y: finalY, w: finalW, h: finalH }\n        onResize(newLayout, originalItem, newItem, newItem, e, element)\n      }\n    }\n\n    if ('touches' in e) {\n      e.preventDefault()\n    }\n  }, [resizeState, cols, rowHeight, getGridUnits, setLayout, onResize, containerRef])\n\n  // Handle resize end\n  const handleResizeEnd = useCallback((e: MouseEvent | TouchEvent | PointerEvent) => {\n    const resizedItem = layoutRef.current.find(i => i.id === resizeState.resizedItem)\n    if (resizedItem && onResizeStop && resizeState.originalPos) {\n      const element = containerRef.current?.querySelector(`[data-grid-id=\"${resizeState.resizedItem}\"]`) as HTMLElement\n      if (element) {\n        const originalItem = { ...resizedItem, x: resizeState.originalPos.x, y: resizeState.originalPos.y, w: resizeState.startSize.w, h: resizeState.startSize.h }\n        onResizeStop(layoutRef.current, originalItem, resizedItem, resizedItem, e, element)\n      }\n    }\n\n    updateLayout(layoutRef.current)\n\n    setResizeState(initialResizeState)\n  }, [resizeState, updateLayout, onResizeStop, containerRef])\n\n  // Set up event listeners\n  useEffect(() => {\n    if (resizeState.isResizing) {\n      document.addEventListener('mousemove', handleResizeMove)\n      document.addEventListener('mouseup', handleResizeEnd)\n      document.addEventListener('touchmove', handleResizeMove, touchEventOptions)\n      document.addEventListener('touchend', handleResizeEnd, touchEventOptions)\n      document.addEventListener('touchcancel', handleResizeEnd, touchEventOptions)\n      document.addEventListener('pointermove', handleResizeMove)\n      document.addEventListener('pointerup', handleResizeEnd)\n      document.addEventListener('pointercancel', handleResizeEnd)\n\n      document.body.style.userSelect = 'none'\n\n      return () => {\n        document.removeEventListener('mousemove', handleResizeMove)\n        document.removeEventListener('mouseup', handleResizeEnd)\n        document.removeEventListener('touchmove', handleResizeMove, touchEventOptions)\n        document.removeEventListener('touchend', handleResizeEnd, touchEventOptions)\n        document.removeEventListener('touchcancel', handleResizeEnd, touchEventOptions)\n        document.removeEventListener('pointermove', handleResizeMove)\n        document.removeEventListener('pointerup', handleResizeEnd)\n        document.removeEventListener('pointercancel', handleResizeEnd)\n        document.body.style.userSelect = ''\n      }\n    }\n    return undefined\n  }, [resizeState.isResizing, handleResizeMove, handleResizeEnd])\n\n  return {\n    resizeState,\n    handleResizeStart\n  }\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { GridItem, DragState, CompactType } from '../types'\nimport { getControlPosition, touchEventOptions } from '../utils/touch'\nimport { calculateGridPosition, compactLayout, moveItems, getAllCollisions } from '../utils/grid'\n\nexport interface UseDragOptions {\n  cols: number\n  rowHeight: number\n  gap: number\n  margin?: [number, number]\n  containerPadding: [number, number]\n  containerWidth: number\n  maxRows?: number\n  preventCollision: boolean\n  allowOverlap: boolean\n  isBounded: boolean\n  compactType: CompactType\n  layout: GridItem[]\n  setLayout: React.Dispatch<React.SetStateAction<GridItem[]>>\n  updateLayout: (layout: GridItem[]) => void\n  containerRef: React.RefObject<HTMLDivElement>\n  onDragStart?: (layout: GridItem[], oldItem: GridItem, newItem: GridItem, placeholder: GridItem, e: MouseEvent | TouchEvent | PointerEvent, element: HTMLElement) => void\n  onDrag?: (layout: GridItem[], oldItem: GridItem, newItem: GridItem, placeholder: GridItem, e: MouseEvent | TouchEvent | PointerEvent, element: HTMLElement) => void\n  onDragStop?: (layout: GridItem[], oldItem: GridItem, newItem: GridItem, placeholder: GridItem, e: MouseEvent | TouchEvent | PointerEvent, element: HTMLElement) => void\n}\n\nexport interface UseDragReturn {\n  dragState: DragState\n  handleDragStart: (\n    itemId: string,\n    e: React.MouseEvent | React.TouchEvent | React.PointerEvent\n  ) => void\n}\n\nconst initialDragState: DragState = {\n  isDragging: false,\n  draggedItem: null,\n  dragOffset: { x: 0, y: 0 },\n  placeholder: null,\n  originalPosition: null,\n  currentMousePos: undefined\n}\n\nexport function useDrag({\n  cols,\n  rowHeight,\n  gap,\n  margin,\n  containerPadding,\n  containerWidth,\n  maxRows,\n  preventCollision,\n  allowOverlap,\n  isBounded,\n  compactType,\n  layout,\n  setLayout,\n  updateLayout,\n  containerRef,\n  onDragStart,\n  onDrag,\n  onDragStop\n}: UseDragOptions): UseDragReturn {\n  const [dragState, setDragState] = useState<DragState>(initialDragState)\n\n  // Use ref to always have latest layout in event handlers\n  const layoutRef = useRef(layout)\n  layoutRef.current = layout\n\n  // Handle drag start\n  const handleDragStart = useCallback((\n    itemId: string,\n    e: React.MouseEvent | React.TouchEvent | React.PointerEvent\n  ) => {\n    // GridItem already checks isDraggable before calling this function\n    const item = layoutRef.current.find(i => i.id === itemId)!\n    // GridItem already checks item.isDraggable before calling this function\n\n    const rect = e.currentTarget.getBoundingClientRect()\n    const pos = getControlPosition(e.nativeEvent as MouseEvent | TouchEvent | PointerEvent)\n\n    if (!pos) {\n      return\n    }\n\n    const newDragState = {\n      isDragging: true,\n      draggedItem: itemId,\n      dragOffset: {\n        x: pos.x - rect.left,\n        y: pos.y - rect.top\n      },\n      placeholder: { ...item },\n      originalPosition: { ...item },\n      currentMousePos: { x: pos.x, y: pos.y }\n    }\n\n    setDragState(newDragState)\n\n    // Call onDragStart callback\n    if (onDragStart) {\n      const element = e.currentTarget as HTMLElement\n      onDragStart(layoutRef.current, item, item, { ...item }, e.nativeEvent, element)\n    }\n\n    // Don't call preventDefault here as it's already handled in GridItem for touch events\n    // This allows mouse events to work normally\n    if (!('touches' in e.nativeEvent)) {\n      e.preventDefault()\n    }\n  }, [onDragStart])\n\n  // Handle drag move\n  const handleDragMove = useCallback((e: MouseEvent | TouchEvent | PointerEvent) => {\n    // This function is only called when dragging is active\n    if (!containerRef.current) return\n\n    const pos = getControlPosition(e)\n    if (!pos) return\n\n    const containerRect = containerRef.current.getBoundingClientRect()\n    const x = pos.x - containerRect.left - dragState.dragOffset.x - containerPadding[0]\n    const y = pos.y - containerRect.top - dragState.dragOffset.y - containerPadding[1]\n\n    const { col, row } = calculateGridPosition(x, y, cols, rowHeight, gap, containerWidth, margin)\n\n    const draggedItem = layoutRef.current.find(i => i.id === dragState.draggedItem)\n    if (!draggedItem || draggedItem.static) return\n\n    const newPosition = {\n      x: Math.max(0, Math.min(cols - draggedItem.w, col)),\n      y: Math.max(0, row),\n      w: draggedItem.w,\n      h: draggedItem.h\n    }\n\n    // Apply maxRows constraint\n    if (maxRows && newPosition.y + newPosition.h > maxRows) {\n      newPosition.y = Math.max(0, maxRows - newPosition.h)\n    }\n\n    // Apply bounded constraints\n    if (isBounded) {\n      newPosition.x = Math.max(0, Math.min(cols - newPosition.w, newPosition.x))\n      newPosition.y = Math.max(0, newPosition.y)\n    }\n\n    // Check for collisions\n    const tempLayout = layoutRef.current.map(item =>\n      item.id === dragState.draggedItem ? { ...item, ...newPosition } : item\n    )\n\n    // If prevent collision is enabled and allowOverlap is false, don't allow overlapping\n    if (preventCollision && !allowOverlap) {\n      const collisions = getAllCollisions(tempLayout, { ...draggedItem, ...newPosition })\n\n      if (collisions.length > 0) {\n        // Don't update state or call callbacks if colliding with any items\n        return\n      }\n    }\n\n    // Move other items if needed\n    let finalLayout = tempLayout\n    if (!preventCollision && !allowOverlap) {\n      const itemWithNewPosition = { ...draggedItem, ...newPosition }\n      // originalPosition is always set when drag starts\n      const originalPosition = dragState.originalPosition\n      const originalWithId = { ...draggedItem, ...originalPosition }\n      finalLayout = moveItems(tempLayout, itemWithNewPosition, cols, originalWithId)\n    }\n\n    // Compact the layout\n    const compactedLayout = compactLayout(finalLayout, cols, compactType)\n    setLayout(compactedLayout)\n\n    setDragState(prev => ({\n      ...prev,\n      placeholder: newPosition,\n      currentMousePos: pos\n    }))\n\n    // Call onDrag callback\n    if (onDrag && dragState.originalPosition) {\n      const element = containerRef.current?.querySelector(`[data-grid-id=\"${dragState.draggedItem}\"]`) as HTMLElement\n      if (element) {\n        onDrag(compactedLayout, { ...draggedItem, ...dragState.originalPosition }, { ...draggedItem, ...newPosition }, { ...draggedItem, ...newPosition }, e, element)\n      }\n    }\n\n    // Prevent default for touch events to stop scrolling during drag\n    if ('touches' in e) {\n      e.preventDefault()\n    }\n  }, [dragState, cols, rowHeight, gap, containerWidth, containerPadding, preventCollision, allowOverlap, isBounded, compactType, margin, maxRows, onDrag, setLayout, containerRef])\n\n  // Handle drag end\n  const handleDragEnd = useCallback((e: MouseEvent | TouchEvent | PointerEvent) => {\n    // This function is only called when dragging is active\n\n    const draggedItem = layoutRef.current.find(i => i.id === dragState.draggedItem)\n    if (draggedItem && onDragStop && dragState.originalPosition) {\n      const element = containerRef.current?.querySelector(`[data-grid-id=\"${dragState.draggedItem}\"]`) as HTMLElement\n      if (element) {\n        onDragStop(layoutRef.current, { ...draggedItem, ...dragState.originalPosition }, draggedItem, { ...draggedItem, ...dragState.placeholder }, e, element)\n      }\n    }\n\n    // Use the current layout state which was updated during dragging\n    updateLayout(layoutRef.current)\n\n    setDragState(initialDragState)\n  }, [dragState, updateLayout, onDragStop, containerRef])\n\n  // Set up event listeners\n  useEffect(() => {\n    if (dragState.isDragging) {\n      // Mouse events\n      document.addEventListener('mousemove', handleDragMove)\n      document.addEventListener('mouseup', handleDragEnd)\n\n      // Touch events\n      document.addEventListener('touchmove', handleDragMove, touchEventOptions)\n      document.addEventListener('touchend', handleDragEnd, touchEventOptions)\n      document.addEventListener('touchcancel', handleDragEnd, touchEventOptions)\n\n      // Pointer events (for better dev tools support)\n      document.addEventListener('pointermove', handleDragMove)\n      document.addEventListener('pointerup', handleDragEnd)\n      document.addEventListener('pointercancel', handleDragEnd)\n\n      document.body.style.cursor = 'grabbing'\n      document.body.style.userSelect = 'none'\n      document.body.classList.add('grid-dragging')\n\n      return () => {\n        document.removeEventListener('mousemove', handleDragMove)\n        document.removeEventListener('mouseup', handleDragEnd)\n        document.removeEventListener('touchmove', handleDragMove, touchEventOptions)\n        document.removeEventListener('touchend', handleDragEnd, touchEventOptions)\n        document.removeEventListener('touchcancel', handleDragEnd, touchEventOptions)\n        document.removeEventListener('pointermove', handleDragMove)\n        document.removeEventListener('pointerup', handleDragEnd)\n        document.removeEventListener('pointercancel', handleDragEnd)\n        document.body.style.cursor = ''\n        document.body.style.userSelect = ''\n        document.body.classList.remove('grid-dragging')\n      }\n    }\n    // Return undefined when not dragging\n    return undefined\n  }, [dragState.isDragging, dragState.draggedItem, dragState.dragOffset, handleDragMove, handleDragEnd])\n\n  return {\n    dragState,\n    handleDragStart\n  }\n}\n","'use client'\n\nimport React, { useRef, useState, useCallback, useEffect } from 'react'\nimport { cn } from '../utils/cn'\nimport { GridItem, GridContainerProps } from '../types'\nimport { getPixelPosition, compactLayout } from '../utils/grid'\nimport { GridItemComponent } from './GridItem'\nimport { useResize } from '../hooks/useResize'\nimport { useDrag } from '../hooks/useDrag'\n\nexport const GridContainer: React.FC<GridContainerProps> = ({\n  cols = 12,\n  rowHeight = 60,\n  gap = 16,\n  margin,\n  containerPadding = [16, 16],\n  maxRows,\n  isDraggable = true,\n  isResizable = true,\n  preventCollision = false,\n  allowOverlap = false,\n  isBounded = true,\n  compactType = 'vertical',\n  resizeHandles = ['se'],\n  draggableCancel,\n  autoSize = true,\n  preserveInitialHeight = false,\n  verticalCompact: _verticalCompact = true,\n  transformScale: _transformScale = 1,\n  droppingItem,\n  isExternalDragging = false,\n  onLayoutChange,\n  onDragStart,\n  onDrag,\n  onDragStop,\n  onResizeStart,\n  onResize,\n  onResizeStop,\n  onDrop: _onDrop,\n  items,\n  children,\n  className,\n  style\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [containerWidth, setContainerWidth] = useState(0)\n  const [layout, setLayout] = useState<GridItem[]>(items)\n\n  // Store initial height for preserveInitialHeight feature\n  // Uses same calculation as autoSize for consistency\n  const initialHeightRef = useRef<number | null>(null)\n  if (preserveInitialHeight && initialHeightRef.current === null) {\n    const vertMargin = margin ? margin[1] : gap\n    const heights = items.map(item => (item.y + item.h) * (rowHeight + vertMargin))\n    initialHeightRef.current = heights.length > 0 ? Math.max(...heights) : 0\n  }\n  \n  // Update layout when items prop changes\n  useEffect(() => {\n    setLayout(prevLayout => {\n      // If items are completely different (e.g., different IDs), replace entirely\n      const prevIds = new Set(prevLayout.map(item => item.id))\n      const newIds = new Set(items.map(item => item.id))\n      const hasNewItems = items.some(item => !prevIds.has(item.id))\n      const hasRemovedItems = prevLayout.some(item => !newIds.has(item.id))\n      \n      if (hasNewItems || hasRemovedItems) {\n        // Create a map of existing items with their current positions\n        const existingItemsMap = new Map(prevLayout.map(item => [item.id, item]))\n        \n        // Merge new items with existing positions\n        const mergedLayout = items.map(item => {\n          const existing = existingItemsMap.get(item.id)\n          if (existing) {\n            // Keep existing position/size for items that already exist\n            return {\n              ...item,\n              x: existing.x,\n              y: existing.y,\n              w: existing.w,\n              h: existing.h\n            }\n          }\n          // New items keep their original position - THIS IS LINE 123 EQUIVALENT\n          return item\n        })\n        \n        return compactLayout(mergedLayout, cols, compactType)\n      }\n      \n      return items\n    })\n  }, [items, cols, compactType])\n  \n  // Update container width on mount and resize\n  useEffect(() => {\n    const updateContainerWidth = () => {\n      if (containerRef.current) {\n        setContainerWidth(containerRef.current.offsetWidth)\n      }\n    }\n\n    updateContainerWidth()\n    \n    // Use ResizeObserver if available\n    if (typeof ResizeObserver !== 'undefined' && containerRef.current) {\n      const resizeObserver = new ResizeObserver(updateContainerWidth)\n      resizeObserver.observe(containerRef.current)\n      return () => resizeObserver.disconnect()\n    } else {\n      // Fallback to window resize\n      window.addEventListener('resize', updateContainerWidth)\n      return () => window.removeEventListener('resize', updateContainerWidth)\n    }\n  }, [containerPadding])\n\n  // Compact layout after changes\n  const updateLayout = useCallback((newLayout: GridItem[]) => {\n    const compacted = compactLayout(newLayout, cols, compactType)\n    setLayout(compacted)\n    onLayoutChange?.(compacted)\n  }, [cols, compactType, onLayoutChange])\n\n  // Use the resize hook\n  const { resizeState, handleResizeStart } = useResize({\n    cols,\n    rowHeight,\n    gap,\n    margin,\n    containerPadding,\n    containerWidth,\n    layout,\n    setLayout,\n    updateLayout,\n    containerRef: containerRef as React.RefObject<HTMLDivElement>,\n    onResizeStart,\n    onResize,\n    onResizeStop\n  })\n\n  // Use the drag hook\n  const { dragState, handleDragStart } = useDrag({\n    cols,\n    rowHeight,\n    gap,\n    margin,\n    containerPadding,\n    containerWidth,\n    maxRows,\n    preventCollision,\n    allowOverlap,\n    isBounded,\n    compactType,\n    layout,\n    setLayout,\n    updateLayout,\n    containerRef: containerRef as React.RefObject<HTMLDivElement>,\n    onDragStart,\n    onDrag,\n    onDragStop\n  })\n\n  // Calculate grid height\n  const verticalMargin = margin ? margin[1] : gap\n  const heights = layout.map(item => (item.y + item.h) * (rowHeight + verticalMargin))\n  const calculatedHeight = heights.length > 0 ? Math.max(...heights) : 0\n  \n  // Apply autoSize or preserveInitialHeight\n  const autoSizeHeight = autoSize ? calculatedHeight + containerPadding[1] * 2 : undefined\n  const preservedMinHeight = preserveInitialHeight && initialHeightRef.current !== null\n    ? initialHeightRef.current + containerPadding[1] * 2\n    : undefined\n\n  // Determine container height style based on options\n  // - preserveInitialHeight + autoSize=false: use fixed height for scroll behavior\n  // - preserveInitialHeight + autoSize=true: use minHeight (container grows but doesn't shrink)\n  // - autoSize only: use minHeight to expand with content\n  const containerHeightStyle = (() => {\n    if (preserveInitialHeight && !autoSize && preservedMinHeight !== undefined) {\n      // Fixed height enables scroll when content exceeds container\n      return { height: preservedMinHeight }\n    }\n    if (autoSizeHeight !== undefined && preservedMinHeight !== undefined) {\n      return { minHeight: Math.max(autoSizeHeight, preservedMinHeight) }\n    }\n    if (autoSizeHeight !== undefined) {\n      return { minHeight: autoSizeHeight }\n    }\n    if (preservedMinHeight !== undefined) {\n      return { minHeight: preservedMinHeight }\n    }\n    return {}\n  })()\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\n        'tailwind-grid-layout relative w-full overflow-auto',\n        dragState.isDragging && 'dragging select-none',\n        resizeState.isResizing && 'resizing',\n        className\n      )}\n      style={{\n        ...containerHeightStyle,\n        padding: `${containerPadding[1]}px ${containerPadding[0]}px`,\n        ...style\n      }}\n    >\n      {/* Grid items */}\n      {layout.map(item => {\n        const isDragging = dragState.draggedItem === item.id\n        const isResizing = resizeState.resizedItem === item.id\n        let position = getPixelPosition(item, cols, rowHeight, gap, containerWidth, margin, containerPadding)\n        \n        // If this item is being dragged, position it at the mouse cursor\n        if (isDragging && dragState.currentMousePos && containerRef.current) {\n          const containerRect = containerRef.current.getBoundingClientRect()\n          position = {\n            ...position,\n            left: dragState.currentMousePos.x - containerRect.left - dragState.dragOffset.x - containerPadding[0],\n            top: dragState.currentMousePos.y - containerRect.top - dragState.dragOffset.y - containerPadding[1]\n          }\n        }\n        \n        // If this item is being resized, use pixel position for smooth resizing\n        if (isResizing && resizeState.currentPixelSize && resizeState.currentPixelPos) {\n          position = {\n            left: resizeState.currentPixelPos.x,\n            top: resizeState.currentPixelPos.y,\n            width: resizeState.currentPixelSize.w,\n            height: resizeState.currentPixelSize.h\n          }\n        }\n        \n        return (\n          <GridItemComponent\n            key={item.id}\n            item={item}\n            position={position}\n            isDragging={isDragging}\n            isResizing={isResizing}\n            isColliding={isResizing && resizeState.isColliding}\n            isDraggable={isDraggable && item.isDraggable !== false && !item.static}\n            isResizable={isResizable && item.isResizable !== false && !item.static}\n            resizeHandles={resizeHandles}\n            draggableCancel={draggableCancel}\n            onDragStart={handleDragStart}\n            onResizeStart={handleResizeStart}\n          >\n            {children(item)}\n          </GridItemComponent>\n        )\n      })}\n      \n      {/* Placeholder during drag - React Grid Layout style */}\n      {dragState.isDragging && dragState.placeholder && (\n        <div\n          className=\"absolute rounded-lg transition-all duration-300 pointer-events-none\"\n          style={{\n            ...getPixelPosition(dragState.placeholder, cols, rowHeight, gap, containerWidth, margin, containerPadding),\n            zIndex: 9,\n            background: 'rgba(59, 130, 246, 0.15)',\n            border: '2px dashed rgb(59, 130, 246)',\n            boxSizing: 'border-box'\n          }}\n        />\n      )}\n      \n      {/* Placeholder during resize - React Grid Layout style */}\n      {resizeState.isResizing && resizeState.resizedItem && (() => {\n        const resizedItem = layout.find(i => i.id === resizeState.resizedItem)\n        if (!resizedItem) return null\n        \n        return (\n          <div\n            className=\"absolute rounded-lg transition-all duration-200 pointer-events-none\"\n            style={{\n              ...getPixelPosition(resizedItem, cols, rowHeight, gap, containerWidth, margin, containerPadding),\n              zIndex: 8,\n              background: 'rgba(59, 130, 246, 0.1)',\n              border: '2px dashed rgb(59, 130, 246)',\n              boxSizing: 'border-box'\n            }}\n          />\n        )\n      })()}\n      \n      {/* Dropping Item Preview */}\n      {droppingItem && isExternalDragging && !dragState.isDragging && (() => {\n        const previewX = droppingItem.previewX ?? 0\n        const previewY = droppingItem.previewY ?? 0\n        const previewW = droppingItem.w || 2\n        const previewH = droppingItem.h || 2\n        const isValidPosition = droppingItem.isValidPosition ?? true\n\n        // Calculate pixel position using the same logic as grid items\n        const previewItem = { x: previewX, y: previewY, w: previewW, h: previewH }\n        const position = containerWidth > 0\n          ? getPixelPosition(previewItem, cols, rowHeight, gap, containerWidth, margin, containerPadding)\n          : { left: containerPadding[0], top: containerPadding[1], width: 0, height: 0 }\n\n        return (\n          <div\n            className={cn(\n              \"absolute border-2 border-dashed rounded opacity-75 pointer-events-none flex items-center justify-center transition-all duration-150\",\n              isValidPosition\n                ? \"bg-green-200 border-green-400\"\n                : \"bg-red-200 border-red-400\"\n            )}\n            style={{\n              width: position.width,\n              height: position.height,\n              left: position.left,\n              top: position.top,\n              transform: 'translate3d(0, 0, 0)' // Hardware acceleration\n            }}\n          >\n            <span className={cn(\n              \"font-medium\",\n              isValidPosition ? \"text-green-600\" : \"text-red-600\"\n            )}>\n              {isValidPosition ? 'Drop here' : 'Invalid position'}\n            </span>\n          </div>\n        )\n      })()}\n    </div>\n  )\n}","import { useState, useEffect, useMemo, useRef } from 'react'\nimport { GridContainer } from './GridContainer'\nimport type { GridItem, GridContainerProps } from '../types'\n\nexport interface BreakpointLayouts {\n  [breakpoint: string]: GridItem[]\n}\n\nexport interface ResponsiveGridContainerProps extends Omit<GridContainerProps, 'items' | 'cols' | 'onLayoutChange'> {\n  layouts: BreakpointLayouts\n  breakpoints?: { [breakpoint: string]: number }\n  cols?: { [breakpoint: string]: number }\n  onLayoutChange?: (layout: GridItem[], layouts: BreakpointLayouts) => void\n  onBreakpointChange?: (newBreakpoint: string, cols: number) => void\n  width?: number // For WidthProvider support\n}\n\nconst defaultBreakpoints = {\n  lg: 1200,\n  md: 996,\n  sm: 768,\n  xs: 480,\n  xxs: 0,\n}\n\nconst defaultCols = {\n  lg: 12,\n  md: 10,\n  sm: 6,\n  xs: 4,\n  xxs: 2,\n}\n\nexport function ResponsiveGridContainer({\n  layouts,\n  breakpoints = defaultBreakpoints,\n  cols = defaultCols,\n  onLayoutChange,\n  onBreakpointChange,\n  width,\n  ...props\n}: ResponsiveGridContainerProps) {\n  // Initialize with actual breakpoint based on current width\n  const [currentBreakpoint, setCurrentBreakpoint] = useState<string>(() => {\n    const initialWidth = width ?? window.innerWidth\n    const sortedBps = Object.entries(breakpoints).sort((a, b) => b[1] - a[1])\n    for (const [bp, minWidth] of sortedBps) {\n      if (initialWidth >= minWidth) {\n        return bp\n      }\n    }\n    return sortedBps[sortedBps.length - 1]?.[0] || 'lg'\n  })\n  const [currentCols, setCurrentCols] = useState(() => {\n    const colsForBreakpoint = typeof cols === 'object' ? cols[currentBreakpoint] : undefined\n    return colsForBreakpoint || (defaultCols as Record<string, number>)[currentBreakpoint] || 12\n  })\n\n  // Get sorted breakpoints\n  const sortedBreakpoints = useMemo(() => {\n    return Object.entries(breakpoints).sort((a, b) => b[1] - a[1])\n  }, [breakpoints])\n\n  // Calculate current breakpoint based on window width\n  const getBreakpoint = useMemo(() => (width: number) => {\n    // Default to 'lg' if no breakpoints are sorted\n    if (sortedBreakpoints.length === 0) return 'lg'\n    \n    const lastEntry = sortedBreakpoints[sortedBreakpoints.length - 1]\n    // lastEntry cannot be undefined here since we checked length > 0\n    let breakpoint = lastEntry![0]\n    \n    for (const [bp, minWidth] of sortedBreakpoints) {\n      if (width >= minWidth) {\n        breakpoint = bp\n        break\n      }\n    }\n    \n    return breakpoint\n  }, [sortedBreakpoints])\n\n  // Handle window resize with debouncing\n  const resizeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n  \n  useEffect(() => {\n    const handleResize = () => {\n      const containerWidth = width ?? window.innerWidth\n      const newBreakpoint = getBreakpoint(containerWidth)\n      if (newBreakpoint !== currentBreakpoint) {\n        setCurrentBreakpoint(newBreakpoint)\n        const newCols = (typeof cols === 'object' && cols[newBreakpoint]) || \n                        (defaultCols as Record<string, number>)[newBreakpoint] || \n                        12\n        setCurrentCols(newCols)\n        onBreakpointChange?.(newBreakpoint, newCols)\n      }\n    }\n\n    // Debounced resize handler\n    const debouncedHandleResize = () => {\n      if (resizeTimeoutRef.current) {\n        clearTimeout(resizeTimeoutRef.current)\n      }\n      resizeTimeoutRef.current = setTimeout(handleResize, 150)\n    }\n\n    // Call initial handleResize for setting up correct state\n    handleResize()\n    \n    // Only listen to window resize if width is not provided\n    if (width === undefined) {\n      window.addEventListener('resize', debouncedHandleResize)\n      return () => {\n        window.removeEventListener('resize', debouncedHandleResize)\n        if (resizeTimeoutRef.current) {\n          clearTimeout(resizeTimeoutRef.current)\n        }\n      }\n    } else {\n      // When width is provided, we still need to check for breakpoint changes\n      handleResize()\n    }\n    return undefined\n  }, [currentBreakpoint, cols, sortedBreakpoints, onBreakpointChange, width, getBreakpoint])\n\n  // Call onBreakpointChange on mount if provided\n  useEffect(() => {\n    if (onBreakpointChange) {\n      onBreakpointChange(currentBreakpoint, currentCols)\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []) // Only on mount\n\n  // Get current layout\n  const currentLayout = layouts[currentBreakpoint] || []\n\n  // Handle layout change\n  const handleLayoutChange = (newLayout: GridItem[]) => {\n    const newLayouts = {\n      ...layouts,\n      [currentBreakpoint]: newLayout,\n    }\n    onLayoutChange?.(newLayout, newLayouts)\n  }\n\n  return (\n    <GridContainer\n      {...props}\n      items={currentLayout}\n      cols={currentCols}\n      onLayoutChange={handleLayoutChange}\n    />\n  )\n}","// Touch event debugging utilities\n\nexport function logTouchEvent(eventName: string, e: TouchEvent | MouseEvent) {\n  // Production build: logging disabled\n  if (process.env.NODE_ENV === 'development') {\n    if ('touches' in e) {\n      console.log(`🔥 TOUCH EVENT: ${eventName}`, {\n        type: e.type,\n        touches: e.touches.length,\n        targetTouches: e.targetTouches?.length || 0,\n        changedTouches: e.changedTouches?.length || 0,\n        target: (e.target as Element)?.tagName,\n        timestamp: Date.now()\n      })\n    } else {\n      console.log(`🖱️ MOUSE EVENT: ${eventName}`, {\n        type: e.type,\n        target: (e.target as Element)?.tagName,\n        timestamp: Date.now()\n      })\n    }\n  }\n}\n\nexport function enableTouchDebugging() {\n  // Add global event listeners to debug touch events\n  document.addEventListener('touchstart', (e) => logTouchEvent('touchstart', e), { passive: false })\n  document.addEventListener('touchmove', (e) => logTouchEvent('touchmove', e), { passive: false })\n  document.addEventListener('touchend', (e) => logTouchEvent('touchend', e), { passive: false })\n  \n  // Also log mouse events for comparison\n  document.addEventListener('mousedown', (e) => logTouchEvent('mousedown', e))\n  document.addEventListener('mousemove', (e) => logTouchEvent('mousemove', e))\n  document.addEventListener('mouseup', (e) => logTouchEvent('mouseup', e))\n  \n  if (process.env.NODE_ENV === 'development') {\n    console.log('🚀 Touch debugging enabled')\n  }\n}","import React, { useState, useRef, useCallback, useMemo } from 'react'\nimport { GridContainer } from './GridContainer'\nimport type { GridItem, GridContainerProps } from '../types'\nimport { cn } from '../utils/cn'\nimport { getAllCollisions } from '../utils/grid'\nimport { throttle } from '../utils/throttle'\n\nexport interface DroppableGridContainerProps extends Omit<GridContainerProps, 'onDrop'> {\n  onDrop?: (item: GridItem) => void\n  droppingItem?: Partial<GridItem>\n}\n\ninterface DroppingItemWithPosition extends Partial<GridItem> {\n  previewX?: number\n  previewY?: number\n}\n\nexport function DroppableGridContainer({\n  onDrop,\n  droppingItem = { w: 2, h: 2 },\n  className,\n  ...props\n}: DroppableGridContainerProps) {\n  const [isDraggingOver, setIsDraggingOver] = useState(false)\n  const [previewPosition, setPreviewPosition] = useState<{ x: number; y: number } | null>(null)\n  const [isValidPosition, setIsValidPosition] = useState(true)\n  const containerRef = useRef<HTMLDivElement>(null)\n\n  const calculatePreviewPosition = useCallback((e: React.DragEvent) => {\n    e.preventDefault()\n    if (e.dataTransfer) {\n      e.dataTransfer.dropEffect = 'copy'\n    }\n    setIsDraggingOver(true)\n\n    const rect = containerRef.current?.getBoundingClientRect()\n    if (!rect) return\n\n    // Calculate mouse position relative to container\n    const containerPadding = props.containerPadding || [0, 0]\n    const relativeX = e.clientX - rect.left - containerPadding[0]\n    const relativeY = e.clientY - rect.top - containerPadding[1]\n\n    // Calculate grid position\n    const cols = props.cols || 12\n    const rowHeight = props.rowHeight || 60\n    const gap = props.gap || 16\n    const margin = props.margin || [gap, gap]\n    const containerWidth = rect.width\n    \n    // Use the same calculation as the drop handler\n    const gridWidth = containerWidth - containerPadding[0] * 2\n    const totalMarginWidth = (cols - 1) * margin[0]\n    const availableWidth = gridWidth - totalMarginWidth\n    const unitWidth = availableWidth / cols\n    const cellHeight = rowHeight + margin[1]\n    \n    const gridX = Math.floor(relativeX / (unitWidth + margin[0]))\n    const gridY = Math.floor(relativeY / cellHeight)\n    \n    // Clamp to valid grid positions\n    const clampedX = Math.max(0, Math.min(gridX, cols - (droppingItem.w || 2)))\n    const clampedY = Math.max(0, gridY)\n    \n    // Check for collisions\n    const previewItem: GridItem = {\n      id: 'preview',\n      x: clampedX,\n      y: clampedY,\n      w: droppingItem.w || 2,\n      h: droppingItem.h || 2\n    }\n    \n    const collisions = getAllCollisions(props.items, previewItem)\n    const hasStaticCollision = props.preventCollision && collisions.some(item => item.static)\n    \n    setIsValidPosition(!hasStaticCollision)\n    setPreviewPosition({ x: clampedX, y: clampedY })\n  }, [props.items, props.cols, props.rowHeight, props.gap, props.margin, props.containerPadding, props.preventCollision, droppingItem.w, droppingItem.h])\n  \n  // Throttle the position calculation for better performance (60fps)\n  const throttledCalculatePosition = useMemo(\n    () => throttle(calculatePreviewPosition, 16),\n    [calculatePreviewPosition]\n  )\n  \n  const handleDragOver = (e: React.DragEvent) => {\n    e.preventDefault()\n    if (e.dataTransfer) {\n      e.dataTransfer.dropEffect = 'copy'\n    }\n    setIsDraggingOver(true)\n    throttledCalculatePosition(e)\n  }\n\n  const handleDragLeave = (e: React.DragEvent) => {\n    // Only set to false if we're leaving the container entirely\n    const rect = containerRef.current?.getBoundingClientRect()\n    if (rect) {\n      const { clientX, clientY } = e\n      const isOutsideBounds = \n        clientX < rect.left ||\n        clientX > rect.right ||\n        clientY < rect.top ||\n        clientY > rect.bottom\n      \n      if (isOutsideBounds) {\n        setIsDraggingOver(false)\n        setPreviewPosition(null)\n        setIsValidPosition(true)\n      }\n    }\n  }\n\n  const handleDrop = (e: React.DragEvent) => {\n    e.preventDefault()\n    setIsDraggingOver(false)\n    setPreviewPosition(null)\n    setIsValidPosition(true)\n    \n    // Note: We allow drop even if position is invalid - the handler can decide what to do\n\n    const data = e.dataTransfer.getData('application/json')\n    if (!data) return\n\n    try {\n      const droppedData = JSON.parse(data)\n      const rect = containerRef.current?.getBoundingClientRect()\n      if (!rect) return\n\n      // Calculate grid position from drop coordinates\n      const relativeX = e.clientX - rect.left\n      const relativeY = e.clientY - rect.top\n\n      // Calculate grid units\n      const cols = props.cols || 12\n      const rowHeight = props.rowHeight || 60\n      const gap = props.gap || 16\n      const cellWidth = rect.width / cols\n      const cellHeight = rowHeight + gap\n      \n      const gridX = Math.floor(relativeX / cellWidth)\n      const gridY = Math.floor(relativeY / cellHeight)\n\n      const newItem: GridItem = {\n        id: droppedData.id || `dropped-${Date.now()}`,\n        x: Math.max(0, Math.min(gridX, cols - (droppingItem.w || 2))),\n        y: Math.max(0, gridY),\n        w: droppingItem.w || 2,\n        h: droppingItem.h || 2,\n        ...droppedData,\n      }\n\n      onDrop?.(newItem)\n    } catch (error) {\n      console.error('Failed to parse dropped data:', error)\n    }\n  }\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\n        'relative',\n        isDraggingOver && 'ring-2 ring-blue-500 ring-offset-2 rounded-lg',\n        className\n      )}\n      onDragOver={handleDragOver}\n      onDragLeave={handleDragLeave}\n      onDrop={handleDrop}\n    >\n      <GridContainer\n        {...props}\n        droppingItem={isDraggingOver && previewPosition ? {\n          ...droppingItem,\n          previewX: previewPosition.x,\n          previewY: previewPosition.y,\n          isValidPosition\n        } as DroppingItemWithPosition : undefined}\n        isExternalDragging={isDraggingOver}\n      />\n      {isDraggingOver && (\n        <div className=\"absolute inset-0 bg-blue-500/10 rounded-lg pointer-events-none\" />\n      )}\n    </div>\n  )\n}","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function throttle<T extends (...args: any[]) => void>(\n  func: T,\n  wait: number\n): (...args: Parameters<T>) => void {\n  let timeout: NodeJS.Timeout | null = null\n  let lastTime = 0\n\n  return (...args: Parameters<T>) => {\n    const now = Date.now()\n    const remaining = wait - (now - lastTime)\n\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout)\n        timeout = null\n      }\n      lastTime = now\n      func(...args)\n    } else if (!timeout) {\n      timeout = setTimeout(() => {\n        lastTime = Date.now()\n        timeout = null\n        func(...args)\n      }, remaining)\n    }\n  }\n}","import { useEffect, useState, useRef, ComponentType } from 'react'\n\nexport interface WidthProviderProps {\n  measureBeforeMount?: boolean\n}\n\nexport function WidthProvider<P extends { width?: number }>(\n  Component: ComponentType<P>\n): ComponentType<Omit<P, 'width'> & WidthProviderProps> {\n  return function WidthProviderComponent(\n    props: Omit<P, 'width'> & WidthProviderProps\n  ) {\n    const { measureBeforeMount = false, ...rest } = props\n    const [width, setWidth] = useState<number | undefined>(\n      measureBeforeMount ? undefined : 1280\n    )\n    const elementRef = useRef<HTMLDivElement>(null)\n    const mounted = useRef(false)\n\n    useEffect(() => {\n      mounted.current = true\n      \n      const handleResize = () => {\n        const element = elementRef.current\n        if (!element) return\n        const newWidth = element.offsetWidth\n        setWidth(newWidth)\n      }\n\n      // Initial measurement - only if not measureBeforeMount\n      if (!measureBeforeMount) {\n        handleResize()\n      }\n\n      // ResizeObserver for better performance\n      let resizeObserver: ResizeObserver | null = null\n      if (elementRef.current && 'ResizeObserver' in window) {\n        resizeObserver = new ResizeObserver(handleResize)\n        resizeObserver.observe(elementRef.current)\n      } else {\n        // Fallback to window resize\n        window.addEventListener('resize', handleResize)\n      }\n\n      return () => {\n        mounted.current = false\n        if (resizeObserver) {\n          resizeObserver.disconnect()\n        } else {\n          window.removeEventListener('resize', handleResize)\n        }\n      }\n    }, [measureBeforeMount])\n\n    // Don't render until we have a width (if measureBeforeMount is true)\n    if (measureBeforeMount && width === undefined) {\n      return <div ref={elementRef} style={{ width: '100%' }} />\n    }\n\n    return (\n      <div ref={elementRef} style={{ width: '100%' }}>\n        <Component {...(rest as P)} width={width} />\n      </div>\n    )\n  }\n}","import type { GridItem } from '../types'\nimport type { BreakpointLayouts } from '../components/ResponsiveGridContainer'\n\n/**\n * 모든 breakpoint에 동일한 레이아웃을 적용\n * react-grid-layout의 generateLayouts와 동일\n */\nexport function generateLayouts(\n  layout: GridItem[],\n  breakpoints: string[] = ['lg', 'md', 'sm', 'xs', 'xxs']\n): BreakpointLayouts {\n  return breakpoints.reduce((acc, bp) => {\n    acc[bp] = layout.map(item => ({ ...item }))\n    return acc\n  }, {} as BreakpointLayouts)\n}\n\n/**\n * 반응형 레이아웃 생성 (breakpoint별로 다른 컬럼 수에 맞춤)\n * react-grid-layout과 동일한 동작\n */\nexport function generateResponsiveLayouts(\n  items: GridItem[],\n  colsMap: { [breakpoint: string]: number } = {\n    lg: 12,\n    md: 10,\n    sm: 6,\n    xs: 4,\n    xxs: 2\n  }\n): BreakpointLayouts {\n  const layouts: BreakpointLayouts = {}\n\n  Object.entries(colsMap).forEach(([bp, cols]) => {\n    layouts[bp] = items.map(item => {\n      // 컬럼 수에 맞춰 너비 조정\n      const adjustedWidth = Math.min(item.w, cols)\n      const adjustedX = item.x + adjustedWidth > cols ? cols - adjustedWidth : item.x\n\n      return {\n        ...item,\n        w: adjustedWidth,\n        x: adjustedX\n      }\n    })\n  })\n\n  return layouts\n}\n\n"],"names":["r","e","t","f","n","Array","isArray","o","length","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","validators","classRest","join","_a","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","Map","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","isThemeGetter","push","key","getPart","path","currentClassPartObject","pathPart","has","set","func","classGroupEntries","map","fromEntries","value","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","postfixModifierPosition","bracketDepth","modifierStart","index","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","startsWith","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","sort","SPLIT_CLASSES_REGEX","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","configUtils","cacheGet","cacheSet","functionToCall","classList","reduce","previousConfig","createConfigCurrent","createConfigUtils","tailwindMerge","cachedResult","result","classGroupsInConflict","classNames","trim","originalClassName","Boolean","variantModifier","modifierId","classId","includes","conflictGroups","i","group","mergeClassList","apply","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","Set","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","Number","isNaN","isArbitraryNumber","isInteger","isPercent","endsWith","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","twMerge","colors","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getSpacingWithAutoAndArbitrary","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","getNumberWithAutoAndArbitrary","getZeroAndEmpty","getNumberAndArbitrary","aspect","container","columns","box","display","float","clear","isolation","object","overflow","overscroll","position","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","span","row","justify","content","items","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","size","text","font","tracking","leading","list","placeholder","decoration","indent","align","whitespace","break","hyphens","bg","repeat","from","via","to","rounded","border","divide","outline","ring","shadow","filter","table","caption","transition","duration","ease","delay","animate","transform","rotate","origin","accent","appearance","cursor","caret","resize","scroll","snap","touch","select","fill","stroke","sr","cn","inputs","clsx","calculateGridPosition","x","y","cols","rowHeight","containerWidth","colFloat","rowFloat","Math","floor","max","getPixelPosition","item","containerPadding","horizontalMargin","verticalMargin","leftPadding","topPadding","unitWidth","width","round","height","checkCollision","item1","item2","compactLayout","compactType","staticItems","static","sorted","a","b","compacted","minY","found","testItem","some","placed","minX","shouldSwapItems","draggingItem","targetItem","originalItem","draggingCenterX","draggingCenterY","targetCenterX","targetCenterY","isMovingDown","isMovingUp","isMovingRight","isMovingLeft","moveItems","layout","_cols","movedLayout","itemIndex","findIndex","l","id","collisions","collision","collisionIndex","getAllCollisions","ResizeHandle","onMouseDown","isActive","isVisible","handleEvent","stopPropagation","cornerPositions","se","backgroundPosition","sw","ne","nw","corner","jsxRuntime","jsx","onTouchStart","onDoubleClick","preventDefault","style","backgroundImage","backgroundRepeat","backgroundOrigin","boxSizing","edgeHandleClasses","s","edgeCursors","GridItemComponent","isDragging","isResizing","isColliding","isDraggable","isResizable","resizeHandles","draggableCancel","onDragStart","onResizeStart","children","handleMouseDown","target","isDragHandle","closest","isActionButton","isCancelled","jsxs","Fragment","handle","getControlPosition","pointerEvent","clientX","clientY","touchEvent","touches","changedTouches","getTouchIdentifier","targetTouches","identifier","touchEventOptions","passive","capture","preventDefaultTouchEvent","cancelable","initialResizeState","resizedItem","resizeHandle","startSize","startPos","currentPixelSize","currentPixelPos","initialDragState","draggedItem","dragOffset","originalPosition","currentMousePos","GridContainer","maxRows","preventCollision","allowOverlap","isBounded","autoSize","preserveInitialHeight","verticalCompact","_verticalCompact","transformScale","_transformScale","droppingItem","isExternalDragging","onLayoutChange","onDrag","onDragStop","onResize","onResizeStop","onDrop","_onDrop","containerRef","useRef","setContainerWidth","useState","setLayout","initialHeightRef","current","vertMargin","heights","useEffect","prevLayout","prevIds","newIds","hasNewItems","hasRemovedItems","existingItemsMap","existing","updateContainerWidth","offsetWidth","ResizeObserver","resizeObserver","observe","disconnect","window","addEventListener","removeEventListener","updateLayout","useCallback","newLayout","resizeState","handleResizeStart","setResizeState","layoutRef","getGridUnits","colWidth","gridUnitW","gridUnitH","itemId","pos","nativeEvent","originalPos","element","currentTarget","handleResizeMove","gridDeltaX","gridDeltaY","newGridW","newGridH","newGridX","newGridY","_b","deltaW","maxDeltaW","clampedDeltaW","min","_c","deltaH","maxDeltaH","clampedDeltaH","_d","_e","_f","_g","_h","constrainedW","minW","maxW","Infinity","constrainedH","minH","maxH","constrainedX","constrainedY","finalX","finalY","finalW","finalH","hasCollision","staticItem","tempItem","maxLeftMove","maxUpMove","prev","finalPixelX","finalPixelY","finalPixelW","finalPixelH","_i","querySelector","newItem","handleResizeEnd","document","body","userSelect","useResize","dragState","handleDragStart","setDragState","rect","getBoundingClientRect","newDragState","handleDragMove","containerRect","newPosition","tempLayout","finalLayout","itemWithNewPosition","compactedLayout","handleDragEnd","add","remove","useDrag","calculatedHeight","autoSizeHeight","preservedMinHeight","containerHeightStyle","minHeight","ref","zIndex","background","previewX","previewY","previewW","previewH","isValidPosition","defaultBreakpoints","lg","md","sm","xs","xxs","defaultCols","logTouchEvent","eventName","process","env","NODE_ENV","console","log","type","tagName","timestamp","Date","now","props","isDraggingOver","setIsDraggingOver","previewPosition","setPreviewPosition","setIsValidPosition","calculatePreviewPosition","dataTransfer","dropEffect","relativeX","relativeY","cellHeight","gridX","gridY","clampedX","clampedY","previewItem","hasStaticCollision","throttledCalculatePosition","useMemo","wait","timeout","lastTime","args","remaining","clearTimeout","setTimeout","throttle","onDragOver","onDragLeave","data","getData","droppedData","JSON","parse","cellWidth","error","layouts","breakpoints","onBreakpointChange","currentBreakpoint","setCurrentBreakpoint","initialWidth","innerWidth","sortedBps","bp","minWidth","currentCols","setCurrentCols","sortedBreakpoints","getBreakpoint","breakpoint","resizeTimeoutRef","handleResize","newBreakpoint","newCols","debouncedHandleResize","currentLayout","newLayouts","Component","measureBeforeMount","rest","setWidth","elementRef","mounted","newWidth","itemToPlace","excludeId","itemsToCheck","testPosition","acc","colsMap","adjustedWidth","adjustedX"],"mappings":"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","x_google_ignoreList":[0,1]}