baseline-kit 3.0.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +99 -63
  2. package/dist/README.md +99 -63
  3. package/dist/baseline-kit.css +3 -21
  4. package/dist/core/src/config/defaults.d.ts +2 -0
  5. package/dist/core/src/config/index.d.ts +3 -0
  6. package/dist/core/src/config/merge.d.ts +21 -0
  7. package/dist/core/src/config/schema.d.ts +33 -0
  8. package/dist/core/src/descriptors/baseline.d.ts +26 -0
  9. package/dist/core/src/descriptors/box.d.ts +20 -0
  10. package/dist/core/src/descriptors/guide.d.ts +44 -0
  11. package/dist/core/src/descriptors/index.d.ts +5 -0
  12. package/dist/core/src/descriptors/padder.d.ts +19 -0
  13. package/dist/core/src/descriptors/spacer.d.ts +24 -0
  14. package/dist/core/src/index.d.ts +10 -0
  15. package/dist/core/src/types.d.ts +62 -0
  16. package/dist/core/src/utils/convert.d.ts +10 -0
  17. package/dist/core/src/utils/grid.d.ts +18 -0
  18. package/dist/{utils → core/src/utils}/index.d.ts +2 -9
  19. package/dist/core/src/utils/math.d.ts +9 -0
  20. package/dist/core/src/utils/merge.d.ts +28 -0
  21. package/dist/core/src/utils/normalize.d.ts +13 -0
  22. package/dist/core/src/utils/padding.d.ts +2 -0
  23. package/dist/core/src/utils/parse.d.ts +5 -0
  24. package/dist/core/src/utils/snapping.d.ts +2 -0
  25. package/dist/core/src/validation/guide.d.ts +3 -0
  26. package/dist/core/src/validation/index.d.ts +1 -0
  27. package/dist/core.cjs +1 -0
  28. package/dist/core.d.ts +344 -0
  29. package/dist/core.mjs +2 -0
  30. package/dist/dom/src/index.d.ts +11 -0
  31. package/dist/dom/src/measure.d.ts +18 -0
  32. package/dist/dom/src/observers.d.ts +5 -0
  33. package/dist/{utils → dom/src}/ssr.d.ts +0 -6
  34. package/dist/dom/src/timing.d.ts +2 -0
  35. package/dist/dom/src/viewport.d.ts +7 -0
  36. package/dist/dom/src/virtual.d.ts +23 -0
  37. package/dist/guide.cjs +2 -0
  38. package/dist/guide.cjs.map +1 -0
  39. package/dist/guide.css +2 -0
  40. package/dist/guide.d.ts +146 -0
  41. package/dist/guide.mjs +589 -0
  42. package/dist/guide.mjs.map +1 -0
  43. package/dist/index.cjs +2 -2
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.ts +197 -30
  46. package/dist/index.mjs +614 -1747
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/react/src/components/Baseline/Baseline.d.ts +13 -0
  49. package/dist/react/src/components/Baseline/index.d.ts +1 -0
  50. package/dist/react/src/components/Box/Box.d.ts +26 -0
  51. package/dist/react/src/components/Box/index.d.ts +1 -0
  52. package/dist/react/src/components/Config/Config.d.ts +20 -0
  53. package/dist/react/src/components/Config/index.d.ts +2 -0
  54. package/dist/react/src/components/Guide/Guide.d.ts +16 -0
  55. package/dist/react/src/components/Guide/index.d.ts +1 -0
  56. package/dist/react/src/components/Padder/Padder.d.ts +20 -0
  57. package/dist/react/src/components/Padder/index.d.ts +1 -0
  58. package/dist/react/src/components/Spacer/Spacer.d.ts +14 -0
  59. package/dist/react/src/components/Spacer/index.d.ts +1 -0
  60. package/dist/{components → react/src/components}/index.d.ts +1 -5
  61. package/dist/react/src/components/types.d.ts +29 -0
  62. package/dist/react/src/guide.d.ts +10 -0
  63. package/dist/{hooks → react/src/hooks}/index.d.ts +2 -3
  64. package/dist/react/src/hooks/useBaseline.d.ts +26 -0
  65. package/dist/react/src/hooks/useConfig.d.ts +9 -0
  66. package/dist/react/src/hooks/useDebug.d.ts +6 -0
  67. package/dist/react/src/hooks/useGuide.d.ts +7 -0
  68. package/dist/{hooks → react/src/hooks}/useIsClient.d.ts +0 -2
  69. package/dist/react/src/hooks/useMeasure.d.ts +10 -0
  70. package/dist/react/src/hooks/useVirtual.d.ts +14 -0
  71. package/dist/react/src/index.d.ts +21 -0
  72. package/dist/react/src/utils/index.d.ts +9 -0
  73. package/dist/react/src/utils/merge.d.ts +10 -0
  74. package/dist/react/src/utils/ssr.d.ts +1 -0
  75. package/dist/reset.css +43 -0
  76. package/dist/src-CMjyHjX5.cjs +2 -0
  77. package/dist/src-CMjyHjX5.cjs.map +1 -0
  78. package/dist/src-QHaSfgVe.js +619 -0
  79. package/dist/src-QHaSfgVe.js.map +1 -0
  80. package/dist/styles.css +1 -1
  81. package/dist/theme/dark.css +0 -8
  82. package/dist/theme/default.css +0 -9
  83. package/dist/theme/tokens.css +1 -10
  84. package/dist/theme.css +0 -18
  85. package/package.json +82 -42
  86. package/dist/components/Baseline/Baseline.d.ts +0 -48
  87. package/dist/components/Baseline/index.d.ts +0 -6
  88. package/dist/components/Box/Box.d.ts +0 -73
  89. package/dist/components/Box/index.d.ts +0 -6
  90. package/dist/components/Config/Config.d.ts +0 -179
  91. package/dist/components/Config/defaults.d.ts +0 -25
  92. package/dist/components/Config/index.d.ts +0 -11
  93. package/dist/components/Guide/Guide.d.ts +0 -70
  94. package/dist/components/Guide/index.d.ts +0 -6
  95. package/dist/components/Guide/types.d.ts +0 -144
  96. package/dist/components/Guide/validation.d.ts +0 -82
  97. package/dist/components/Layout/Layout.d.ts +0 -73
  98. package/dist/components/Layout/index.d.ts +0 -10
  99. package/dist/components/Padder/Padder.d.ts +0 -67
  100. package/dist/components/Padder/index.d.ts +0 -10
  101. package/dist/components/Spacer/Spacer.d.ts +0 -48
  102. package/dist/components/Spacer/index.d.ts +0 -10
  103. package/dist/components/Stack/Stack.d.ts +0 -84
  104. package/dist/components/Stack/index.d.ts +0 -10
  105. package/dist/components/styles/index.d.ts +0 -11
  106. package/dist/components/types.d.ts +0 -102
  107. package/dist/hooks/useBaseline.d.ts +0 -55
  108. package/dist/hooks/useConfig.d.ts +0 -41
  109. package/dist/hooks/useDebug.d.ts +0 -49
  110. package/dist/hooks/useGuide.d.ts +0 -61
  111. package/dist/hooks/useMeasure.d.ts +0 -35
  112. package/dist/hooks/useVirtual.d.ts +0 -60
  113. package/dist/styles.d.ts +0 -6
  114. package/dist/theme.d.ts +0 -6
  115. package/dist/utils/convert.d.ts +0 -24
  116. package/dist/utils/grid.d.ts +0 -22
  117. package/dist/utils/math.d.ts +0 -48
  118. package/dist/utils/merge.d.ts +0 -117
  119. package/dist/utils/normalize.d.ts +0 -30
  120. package/dist/utils/padding.d.ts +0 -11
  121. package/dist/utils/parse.d.ts +0 -18
  122. package/dist/utils/snapping.d.ts +0 -28
  123. package/dist/utils/timing.d.ts +0 -45
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/Config/defaults.ts","../src/components/Config/Config.tsx","../src/utils/parse.ts","../src/utils/convert.ts","../src/utils/math.ts","../src/utils/normalize.ts","../src/utils/padding.ts","../src/utils/snapping.ts","../src/utils/grid.ts","../src/utils/merge.ts","../src/utils/timing.ts","../src/hooks/useIsClient.ts","../src/utils/ssr.tsx","../src/hooks/useMeasure.ts","../src/hooks/useVirtual.ts","../src/hooks/useBaseline.ts","../src/components/Spacer/Spacer.tsx","../src/components/Padder/Padder.tsx","../src/components/Layout/Layout.tsx","../src/components/Box/Box.tsx","../src/components/Stack/Stack.tsx","../src/components/Guide/Guide.tsx","../src/components/Guide/validation.ts","../src/hooks/useGuide.ts","../src/hooks/useConfig.ts","../src/hooks/useDebug.ts","../src/components/Baseline/Baseline.tsx"],"sourcesContent":["/**\n * @file defaults.ts\n * @description Default theme and configuration values for baseline-kit\n * @module baseline-kit/components/Config\n */\n\nimport type { ConfigSchema } from './Config'\n\n/**\n * CSS variable-based color configuration for Guide component.\n * Maps each guide variant to its theme color.\n */\nconst GUIDE_COLORS = {\n /** Color for single-line guides */\n line: 'var(--bk-guide-color-line-theme)',\n /** Color for pattern-based guides */\n pattern: 'var(--bk-guide-color-pattern-theme)',\n /** Color for auto-calculated guides */\n auto: 'var(--bk-guide-color-auto-theme)',\n /** Color for fixed-column guides */\n fixed: 'var(--bk-guide-color-fixed-theme)',\n} as const\n\n/**\n * CSS variable-based color configuration for Baseline component.\n */\nconst BASELINE_COLORS = {\n /** Color for line variant */\n line: 'var(--bk-baseline-color-line-theme)',\n /** Color for flat/block variant */\n flat: 'var(--bk-baseline-color-flat-theme)',\n} as const\n\n/**\n * CSS variable-based color configuration for Spacer component.\n */\nconst SPACER_COLORS = {\n /** Color for line-style spacers */\n line: 'var(--bk-spacer-color-line-theme)',\n /** Color for flat/block spacers */\n flat: 'var(--bk-spacer-color-flat-theme)',\n /** Color for measurement indicators */\n text: 'var(--bk-spacer-color-text-theme)',\n} as const\n\n/**\n * CSS variable-based color configuration for Box component.\n */\nconst BOX_COLORS = {\n /** Border color for debug outline */\n line: 'var(--bk-box-color-line-theme)',\n /** Background color for debug mode */\n flat: 'var(--bk-box-color-flat-theme)',\n /** Color for measurement indicators */\n text: 'var(--bk-box-color-text-theme)',\n} as const\n\n/**\n * CSS variable-based color configuration for Stack/Flex component.\n */\nconst STACK_COLORS = {\n /** Border color for debug outline */\n line: 'var(--bk-stack-color-line-theme)',\n /** Background color for debug mode */\n flat: 'var(--bk-stack-color-flat-theme)',\n /** Color for measurement indicators */\n text: 'var(--bk-stack-color-text-theme)',\n} as const\n\n/**\n * CSS variable-based color configuration for Layout component.\n */\nconst LAYOUT_COLORS = {\n /** Border color for debug outline */\n line: 'var(--bk-layout-color-line-theme)',\n /** Background color for debug mode */\n flat: 'var(--bk-layout-color-flat-theme)',\n /** Color for measurement indicators */\n text: 'var(--bk-layout-color-text-theme)',\n} as const\n\n/** CSS variable for Padder component color */\nconst PADDER_COLOR = 'var(--bk-padder-color-theme)'\n\n/**\n * Default configuration for baseline-kit.\n *\n * @remarks\n * Provides the base configuration for all components including:\n * - Base unit for spacing calculations (8px default)\n * - Default component variants\n * - Initial debugging modes\n * - Theme color assignments\n *\n * Each component section includes:\n * - Visual variant selection (where applicable)\n * - Debugging mode setting\n * - Color theme assignments\n *\n * The configuration is marked as const to ensure type safety\n * and prevent accidental modifications.\n */\nexport const DEFAULT_CONFIG: ConfigSchema = {\n /** Base unit for spacing calculations (in pixels) */\n base: 8,\n\n /** Baseline grid configuration */\n baseline: {\n variant: 'line',\n debugging: 'hidden',\n colors: BASELINE_COLORS,\n },\n\n /** Guide overlay configuration */\n guide: {\n variant: 'line',\n debugging: 'hidden',\n colors: GUIDE_COLORS,\n },\n\n /** Spacer component configuration */\n spacer: {\n variant: 'line',\n debugging: 'hidden',\n colors: SPACER_COLORS,\n },\n\n /** Box component configuration */\n box: {\n debugging: 'hidden',\n colors: BOX_COLORS,\n },\n\n /** Stack/Flex component configuration */\n stack: {\n debugging: 'hidden',\n colors: STACK_COLORS,\n },\n\n /** Layout component configuration */\n layout: {\n debugging: 'hidden',\n colors: LAYOUT_COLORS,\n },\n\n /** Padder component configuration */\n padder: {\n debugging: 'hidden',\n color: PADDER_COLOR,\n },\n} as const\n","import * as React from 'react'\nimport { BaselineVariant } from '@/components'\nimport { DEFAULT_CONFIG } from './defaults'\nimport type { GuideVariant, Variant } from '../types'\n\n/**\n * Controls component debugging visibility and behavior.\n *\n * @remarks\n * - `none`: Debug features are fully disabled\n * - `hidden`: Debug elements exist in DOM but are not visible\n * - `visible`: Debug elements are fully rendered and visible\n */\nexport type DebuggingMode = 'none' | 'hidden' | 'visible'\n\n/** Color configuration for component themes. */\ntype Colors = {\n /** Color for line-based visuals */\n line: string\n /** Color for flat surface visuals */\n flat: string\n /** Color for measurement indicators */\n text: string\n}\n\n/** Complete configuration schema for baseline-kit. */\nexport type ConfigSchema = {\n /** Base unit for spacing calculations */\n base: number\n /** Guide component configuration */\n guide: {\n variant: GuideVariant\n debugging: DebuggingMode\n colors: Record<GuideVariant, string>\n }\n /** Baseline component configuration */\n baseline: {\n variant: BaselineVariant\n debugging: DebuggingMode\n colors: Record<BaselineVariant, string>\n }\n /** Stack component configuration */\n stack: {\n colors: Colors\n debugging: DebuggingMode\n }\n /** Layout component configuration */\n layout: {\n colors: Colors\n debugging: DebuggingMode\n }\n /** Spacer component configuration */\n spacer: {\n variant: Variant\n debugging: DebuggingMode\n colors: Colors\n }\n /** Box component configuration */\n box: {\n colors: Colors\n debugging: DebuggingMode\n }\n /** Padder component configuration */\n padder: {\n color: string\n debugging: DebuggingMode\n }\n}\n\n// Create the context\nconst ConfigContext = React.createContext<ConfigSchema>(DEFAULT_CONFIG)\nConfigContext.displayName = 'ConfigContext'\n\n// Update to use React 19's use hook instead of useContext\nexport const useDefaultConfig = () => React.use(ConfigContext)\n\ntype ConfigProps = {\n children: React.ReactNode\n /** Base unit for spacing calculations */\n base?: number\n /** Baseline component overrides */\n baseline?: Partial<ConfigSchema['baseline']>\n /** Flex component overrides */\n stack?: Partial<ConfigSchema['stack']>\n /** Layout component overrides */\n layout?: Partial<ConfigSchema['layout']>\n /** Guide component overrides */\n guide?: Partial<ConfigSchema['guide']>\n /** Spacer component overrides */\n spacer?: Partial<ConfigSchema['spacer']>\n /** Box component overrides */\n box?: Partial<ConfigSchema['box']>\n /** Padder component overrides */\n padder?: Partial<ConfigSchema['padder']>\n}\n\n// Utils -----------------------------------------------------------------------\n\n/** Parameters for creating CSS variables */\ntype CSSVariablesParams = {\n /** Base unit for spacing calculations */\n base: number\n /** Baseline component configuration */\n baseline: ConfigSchema['baseline']\n /** Guide component configuration */\n guide: ConfigSchema['guide']\n /** Stack component configuration */\n stack: ConfigSchema['stack']\n /** Spacer component configuration */\n spacer: ConfigSchema['spacer']\n /** Layout component configuration */\n layout: ConfigSchema['layout']\n /** Box component configuration */\n box: ConfigSchema['box']\n /** Padder component configuration */\n padder: ConfigSchema['padder']\n}\n\n/**\n * Creates CSS variables from the configuration object.\n * These variables are used throughout the component library.\n */\nexport const createCSSVariables = (\n params: CSSVariablesParams\n): Record<string, string> => {\n const { base, baseline, guide, stack, spacer, layout, box, padder } = params\n\n return {\n '--bkb': `${base}px`,\n\n // Baseline Colors\n '--bkbcl': baseline.colors.line,\n '--bkbcf': baseline.colors.flat,\n\n // Guide Colors\n '--bkgcl': guide.colors.line,\n '--bkgcp': guide.colors.pattern,\n '--bkgca': guide.colors.auto,\n '--bkgcf': guide.colors.fixed,\n\n // Spacer Colors\n '--bkscl': spacer.colors.line,\n '--bkscf': spacer.colors.flat,\n '--bksci': spacer.colors.text,\n\n // Box Colors\n '--bkxcl': box.colors.line,\n '--bkxcf': box.colors.flat,\n '--bkxci': box.colors.text,\n\n // Flex Colors\n '--bkkcl': stack.colors.line,\n '--bkkcf': stack.colors.flat,\n '--bkkci': stack.colors.text,\n\n // Layout Colors\n '--bklcl': layout.colors.line,\n '--bklcf': layout.colors.flat,\n '--bklci': layout.colors.text,\n\n // Padder Color\n '--bkpc': padder.color,\n }\n}\n\n/** Parameters for merging configuration */\ntype MergeConfigParams = {\n /** Parent configuration to extend */\n parentConfig: ConfigSchema\n /** Base unit override */\n base?: number\n /** Baseline component overrides */\n baseline?: Partial<ConfigSchema['baseline']>\n /** Guide component overrides */\n guide?: Partial<ConfigSchema['guide']>\n /** Spacer component overrides */\n spacer?: Partial<ConfigSchema['spacer']>\n /** Box component overrides */\n box?: Partial<ConfigSchema['box']>\n /** Stack component overrides */\n stack?: Partial<ConfigSchema['stack']>\n /** Layout component overrides */\n layout?: Partial<ConfigSchema['layout']>\n /** Padder component overrides */\n padder?: Partial<ConfigSchema['padder']>\n}\n\n/**\n * Merges parent config with overrides.\n * Creates a new config object without mutating the parent.\n */\nexport const mergeConfig = (params: MergeConfigParams): ConfigSchema => {\n const {\n parentConfig,\n base,\n baseline,\n guide,\n spacer,\n box,\n stack,\n layout,\n padder,\n } = params\n\n return {\n base: base ?? parentConfig.base,\n baseline: { ...parentConfig.baseline, ...baseline },\n guide: { ...parentConfig.guide, ...guide },\n spacer: { ...parentConfig.spacer, ...spacer },\n box: { ...parentConfig.box, ...box },\n stack: { ...parentConfig.stack, ...stack },\n layout: { ...parentConfig.layout, ...layout },\n padder: { ...parentConfig.padder, ...padder },\n }\n}\n\n/**\n * Configuration provider for baseline-kit components.\n *\n * @remarks\n * Config provides theme and debugging settings to all nested components.\n * It allows for:\n * - Global base unit configuration\n * - Component-specific color themes\n * - Debug mode control\n * - Visual style customization\n *\n * Configs can be nested to override settings for specific sections.\n *\n * @example\n * ```tsx\n * // Basic global configuration\n * <Config base={8}>\n * <App />\n * </Config>\n *\n * // Component-specific overrides\n * <Config\n * base={8}\n * guide={{\n * debugging: \"visible\",\n * colors: {\n * line: \"rgba(255,0,0,0.2)\",\n * pattern: \"rgba(0,0,255,0.2)\"\n * }\n * }}\n * >\n * <Layout>...</Layout>\n * </Config>\n *\n * // Nested configurations\n * <Config base={8}>\n * <div>Uses 8px base</div>\n * <Config base={4}>\n * <div>Uses 4px base</div>\n * </Config>\n * </Config>\n * ```\n */\nexport function Config({\n children,\n base,\n stack,\n baseline,\n guide,\n layout,\n spacer,\n box,\n padder,\n}: ConfigProps) {\n const parentConfig = useDefaultConfig()\n\n const value = React.useMemo(() => {\n return mergeConfig({\n parentConfig,\n base,\n baseline,\n guide,\n spacer,\n box,\n stack,\n layout,\n padder,\n })\n }, [parentConfig, base, baseline, guide, spacer, box, stack, layout, padder])\n\n return <ConfigContext value={value}>{children}</ConfigContext>\n}\n","/**\n * Parses a CSS unit string into its numeric value and unit.\n *\n * @param value - CSS value string to parse\n * @returns Object with value and unit, or null if parsing fails\n */\nexport function parseUnit(\n value: string\n): { value: number; unit: string } | null {\n const match = value.trim().match(/^([+-]?[\\d.]+)([a-zA-Z%]+)$/)\n if (!match) return null\n const num = parseFloat(match[1])\n const unit = match[2]\n return { value: num, unit }\n}\n\n/**\n * Formats a value as a valid CSS string.\n *\n * @param value - Value to format\n * @param defaultValue - Optional default if value is undefined\n * @returns Formatted CSS string\n */\nexport function formatValue(\n value: string | number | undefined,\n defaultValue?: number\n): string {\n if (value === undefined && defaultValue !== undefined)\n return `${defaultValue}px`\n if (\n value === 'auto' ||\n (typeof value === 'string' &&\n /^(auto|100%|0|.*(fr|vh|vw|vmin|vmax|rem))$/.test(value))\n ) {\n return String(value)\n }\n if (typeof value === 'number') return `${value}px`\n return value ?? ''\n}\n","import { parseUnit } from './parse'\n\nexport interface ConversionContext {\n /** Parent element dimension for relative units */\n parentSize?: number\n /** Viewport width for vw units */\n viewportWidth?: number\n /** Viewport height for vh units */\n viewportHeight?: number\n /** Root font size for rem units */\n rootFontSize?: number\n /** Parent font size for em units */\n parentFontSize?: number\n}\n\nconst DEFAULT_CONTEXT: Required<ConversionContext> = {\n parentSize: 0,\n viewportWidth: typeof window !== 'undefined' ? window.innerWidth : 1920,\n viewportHeight: typeof window !== 'undefined' ? window.innerHeight : 1080,\n rootFontSize: 16,\n parentFontSize: 16,\n}\n\n/** Conversion factors for absolute units to pixels */\nexport const ABSOLUTE_UNIT_CONVERSIONS: Record<string, number> = {\n px: 1,\n in: 96, // 1in = 96px\n cm: 37.8, // 1cm = 37.8px\n mm: 3.78, // 1mm = 3.78px\n pt: 1.33, // 1pt = 1.33px\n pc: 16, // 1pc = 16px\n}\n\n/** Supported relative CSS units */\nexport const RELATIVE_UNITS: string[] = [\n 'em',\n 'rem',\n 'vh',\n 'vw',\n 'vmin',\n 'vmax',\n '%',\n]\n\n/**\n * Converts CSS values to pixels.\n *\n * @param value - CSS value to convert\n * @param context - Optional context for relative unit conversion\n * @returns Value in pixels or null if conversion fails\n */\nexport function convertValue(\n value: number | string | undefined,\n context?: ConversionContext\n): number | null {\n if (typeof value === 'number') return value\n if (typeof value !== 'string') return null\n\n const parsed = parseUnit(value)\n if (!parsed) return null\n\n const { value: num, unit } = parsed\n\n // Handle absolute units\n if (unit in ABSOLUTE_UNIT_CONVERSIONS) {\n return num * ABSOLUTE_UNIT_CONVERSIONS[unit]\n }\n\n // Special case for auto\n if (unit === 'auto') return null\n\n // Handle relative units\n if (RELATIVE_UNITS.includes(unit)) {\n const ctx = { ...DEFAULT_CONTEXT, ...context }\n switch (unit) {\n case 'em':\n return num * ctx.parentFontSize\n case 'rem':\n return num * ctx.rootFontSize\n case 'vh':\n return (num / 100) * ctx.viewportHeight\n case 'vw':\n return (num / 100) * ctx.viewportWidth\n case 'vmin':\n return (num / 100) * Math.min(ctx.viewportWidth, ctx.viewportHeight)\n case 'vmax':\n return (num / 100) * Math.max(ctx.viewportWidth, ctx.viewportHeight)\n case '%':\n return (num / 100) * ctx.parentSize\n default:\n return null\n }\n }\n return null\n}\n","import { convertValue } from './convert'\n\n/**\n * Calculates the modulo (remainder) of a CSS value when divided by a base unit.\n *\n * @param value - Input value (number or CSS string)\n * @param base - Base unit to calculate remainder against\n * @param options - Optional calculation controls\n * @returns Remainder in pixel units (e.g., \"6px\")\n */\nexport function moduloize(\n value: number | string | undefined,\n base: number,\n options?: { round?: boolean }\n): string {\n const doRound = options?.round ?? true\n const num =\n value === undefined\n ? 0\n : typeof value === 'number'\n ? value\n : (convertValue(value) ?? 0)\n const normalized = doRound ? Math.round(num) : num\n const remainder = normalized % base\n return `${remainder}px`\n}\n\n/**\n * Constrains a number within a specified range.\n *\n * @param value - Number to clamp\n * @param min - Minimum allowed value\n * @param max - Maximum allowed value\n * @returns Clamped value\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\n/**\n * Rounds a number to specified precision.\n *\n * @param value - Number to round\n * @param precision - Decimal places (default: 0)\n * @returns Rounded number\n */\nexport function round(value: number, precision = 0): number {\n if (precision >= 0) {\n return Number(\n (Math.round(value * 10 ** precision) / 10 ** precision).toFixed(precision)\n )\n } else {\n const factor = 10 ** Math.abs(precision)\n return Math.round(value / factor) * factor\n }\n}\n\n/** Parameters for row count calculation */\ntype RowCountParams = {\n /** Available height for the container */\n height?: number\n /** Top padding/offset value */\n top: number\n /** Bottom padding/offset value */\n bottom: number\n /** Base unit for calculations */\n base: number\n}\n\n/**\n * Calculates the number of rows that fit in the available space.\n * Ensures at least one row is always returned.\n *\n * @param params - Parameters for calculation\n * @returns Number of rows that fit in the space\n */\nexport function calculateRowCount(params: RowCountParams): number {\n const { height, top, bottom, base } = params\n const totalHeight = (height ?? 0) - (top + bottom)\n return Math.max(1, Math.floor(totalHeight / base))\n}\n","import { convertValue } from './convert'\nimport { clamp } from './math'\n\nexport interface NormalizationOptions {\n /** Base unit for normalization */\n base?: number\n /** Whether to round to nearest base multiple */\n round?: boolean\n /** Optional value clamping */\n clamp?: { min?: number; max?: number }\n /** Suppress warning messages */\n suppressWarnings?: boolean\n}\n\n/**\n * Normalizes CSS values to a consistent format based on base unit.\n *\n * @param value - Value to normalize\n * @param options - Normalization configuration\n * @returns Normalized numeric value\n */\nexport function normalizeValue(\n value: string | number | undefined,\n options: NormalizationOptions = {}\n): number {\n const {\n base = 8,\n round: doRound = true,\n clamp: clampOptions,\n suppressWarnings = false,\n } = options\n\n // Handle special cases\n if (value === 'auto') return base\n\n // Convert to number\n let num: number | null = null\n if (typeof value === 'number') {\n num = value\n } else if (typeof value === 'string') {\n const conv = convertValue(value)\n if (conv === null) {\n if (!suppressWarnings) {\n console.error(\n `Failed to convert \"${value}\" to pixels. Falling back to base ${base}.`\n )\n }\n num = base\n } else {\n num = conv\n }\n }\n if (num === null) num = base\n\n // Apply normalization\n const normalized = doRound ? Math.round(num / base) * base : num\n\n // Apply clamping if needed\n const clamped =\n clampOptions !== undefined\n ? clamp(\n normalized,\n clampOptions.min ?? -Infinity,\n clampOptions.max ?? Infinity\n )\n : normalized\n\n // Warn about adjustments\n if (!suppressWarnings && clamped !== num) {\n console.warn(`Normalized ${num} to ${clamped} to match base ${base}px.`)\n }\n\n return clamped\n}\n\n/**\n * Normalizes a pair of CSS values.\n *\n * @param values - Tuple of values to normalize\n * @param defaults - Default values if input is undefined\n * @param options - Normalization options\n * @returns Tuple of normalized values\n */\nexport function normalizeValuePair(\n values:\n | [string | number | undefined, string | number | undefined]\n | undefined,\n defaults: [number, number],\n options?: NormalizationOptions\n): [number, number] {\n if (!values) return defaults\n\n if (values[0] === undefined && values[1] === undefined) {\n return defaults\n }\n\n const first =\n values[0] !== undefined ? normalizeValue(values[0], options) : defaults[0]\n const second =\n values[1] !== undefined ? normalizeValue(values[1], options) : defaults[1]\n return [first, second]\n}\n","import { Padding, PaddingValue, Spacing, SpacingProps } from '@components'\n\n/**\n * Extract numeric top, right, bottom, left (in px) from `padding` or `block/inline`.\n * @param spacing - The props which may include padding, block, inline\n * @returns { top, right, bottom, left } with 0 defaults\n *\n * Priority (if padding is defined, it overrides block/inline):\n * - If `padding` is present, parse it fully (4 edges).\n * - Otherwise, parse `block` for top/bottom and `inline` for left/right.\n */\nexport function parsePadding(spacing: SpacingProps): Padding {\n if ('padding' in spacing && spacing.padding != null) {\n return parsePaddingValue(spacing.padding)\n }\n\n // Otherwise, parse block/inline separately\n const blockEdges =\n 'block' in spacing && spacing.block != null\n ? parseBlock(spacing.block)\n : { top: 0, bottom: 0 }\n const inlineEdges =\n 'inline' in spacing && spacing.inline != null\n ? parseInline(spacing.inline)\n : { left: 0, right: 0 }\n\n // Merge partial edges\n return {\n top: blockEdges.top,\n right: inlineEdges.right,\n bottom: blockEdges.bottom,\n left: inlineEdges.left,\n }\n}\n\n/**\n * Parses `padding` of various shapes to { top, right, bottom, left } in px.\n *\n * @param padding - number | [block, inline] | [top, right, bottom, left] | { start?: number; end?: number; left?: number; right?: number }\n */\nfunction parsePaddingValue(padding: PaddingValue): Padding {\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding }\n }\n\n if (Array.isArray(padding)) {\n if (padding.length === 2) {\n const [block, inline] = padding\n return { top: block, right: inline, bottom: block, left: inline }\n }\n if (padding.length >= 4) {\n const [top, right, bottom, left] = padding\n return {\n top: top ?? 0,\n right: right ?? 0,\n bottom: bottom ?? 0,\n left: left ?? 0,\n }\n }\n }\n\n if (typeof padding === 'object' && !Array.isArray(padding)) {\n // possible keys: top, bottom, left, right, start, end\n // interpret start => top, end => bottom if you prefer\n const top = padding.top ?? 0\n const bottom = padding.bottom ?? 0\n const left = padding.left ?? 0\n const right = padding.right ?? 0\n return { top, right, bottom, left }\n }\n\n // fallback\n return { top: 0, right: 0, bottom: 0, left: 0 }\n}\n\n/**\n * Parses `block` of various shapes to { top, bottom } in px.\n * @param block - number | [top, bottom] | { start?: number; end?: number }\n */\nfunction parseBlock(block: Spacing): Pick<Padding, 'top' | 'bottom'> {\n if (typeof block === 'number') {\n return { top: block, bottom: block }\n }\n\n // [top, bottom]\n if (Array.isArray(block)) {\n const [top, bottom] = block\n return {\n top: top ?? 0,\n bottom: bottom ?? 0,\n }\n }\n\n // object { start, end }\n if (typeof block === 'object') {\n return {\n top: block.start ?? 0,\n bottom: block.end ?? 0,\n }\n }\n\n return { top: 0, bottom: 0 }\n}\n\n/**\n * Parses `inline` of various shapes to { left, right } in px.\n * @param inline - number | [left, right] | { start?: number; end?: number }\n */\nfunction parseInline(inline: Spacing): Pick<Padding, 'left' | 'right'> {\n if (typeof inline === 'number') {\n return { left: inline, right: inline }\n }\n\n if (Array.isArray(inline)) {\n const [left, right] = inline\n return {\n left: left ?? 0,\n right: right ?? 0,\n }\n }\n\n if (typeof inline === 'object') {\n return {\n left: inline.start ?? 0,\n right: inline.end ?? 0,\n }\n }\n\n return { left: 0, right: 0 }\n}\n","import { SnappingMode, Padding, PaddingValue } from '@components'\nimport { parsePadding } from '@/utils/padding'\n\n/**\n * Calculates spacing adjustments to maintain baseline grid alignment.\n *\n * @remarks\n * Provides different snapping behaviors:\n * - none: No adjustments\n * - height: Adjusts bottom padding only\n * - clamp: Adjusts both top and bottom padding\n *\n * @param height - Measured element height\n * @param base - Grid base unit\n * @param initial - Initial spacing values\n * @param snapping - Snapping mode to apply\n * @returns Adjusted spacing values\n *\n * @example\n * ```ts\n * // Height snapping mode\n * calculateSnappedSpacing(46, 8, { top: 10, bottom: 10 }, 'height')\n * // => { top: 10, right: 0, bottom: 12, left: 0 }\n *\n * // Clamp mode\n * calculateSnappedSpacing(45, 8, { top: 10, bottom: 6 }, 'clamp')\n * // => { top: 2, right: 0, bottom: 1, left: 0 }\n * ```\n */\nexport function calculateSnappedSpacing(\n height: number,\n base: number,\n initial: PaddingValue,\n snapping: SnappingMode\n): Padding {\n const pad: Padding = parsePadding({ padding: initial })\n\n if (snapping === 'none') {\n return pad\n }\n\n if (snapping === 'height') {\n const remainder = height % base\n if (remainder !== 0) {\n pad.bottom += base - remainder\n }\n }\n\n if (snapping === 'clamp') {\n pad.top = pad.top % base\n const remainder = height % base\n if (remainder !== 0) {\n pad.bottom += base - remainder\n }\n pad.bottom = pad.bottom % base\n }\n\n return pad\n}\n","/**\n * @file grid.ts\n * @description Grid layout utilities\n * @module utils\n */\n\nimport * as React from 'react'\n\n/**\n * Creates grid span styles based on span props.\n * Handles both combined span and individual col/row span values.\n *\n * @param span - Optional equal span for both rows and columns\n * @param colSpan - Optional column span value\n * @param rowSpan - Optional row span value\n * @returns CSS properties object with grid span values\n *\n * @example\n * ```ts\n * createGridSpanStyles(2) // => { gridColumn: \"span 2\", gridRow: \"span 2\" }\n * createGridSpanStyles(undefined, 3, 2) // => { gridColumn: \"span 3\", gridRow: \"span 2\" }\n * ```\n */\nexport const createGridSpanStyles = (\n span?: number,\n colSpan?: number,\n rowSpan?: number\n): React.CSSProperties => {\n const gridStyles: React.CSSProperties = {}\n\n if (span !== undefined) {\n gridStyles.gridColumn = `span ${span}`\n gridStyles.gridRow = `span ${span}`\n } else {\n if (colSpan !== undefined) {\n gridStyles.gridColumn = `span ${colSpan}`\n }\n if (rowSpan !== undefined) {\n gridStyles.gridRow = `span ${rowSpan}`\n }\n }\n\n return gridStyles\n}\n","import * as React from 'react'\n\n/**\n * Combines class names, filtering out falsy values.\n *\n * @remarks\n * - Filters out false, null, undefined\n * - Trims whitespace\n * - Preserves order of classes\n *\n * @param classes - Array of potential class names\n * @returns Combined class string\n *\n * @example\n * ```ts\n * mergeClasses('btn', isActive && 'active', undefined)\n * // => \"btn active\"\n * ```\n */\nexport const mergeClasses = (\n ...classes: Array<string | boolean | undefined | null>\n): string => classes.filter(Boolean).join(' ').trim()\n\n/**\n * Combines multiple style objects with type safety.\n *\n * @remarks\n * - Preserves type information\n * - Handles undefined values\n * - Merges deeply nested styles\n *\n * @param styles - Array of style objects\n * @returns Combined style object\n *\n * @example\n * ```ts\n * mergeStyles(\n * { color: 'red' },\n * isLarge && { fontSize: '2em' },\n * customStyles\n * )\n * ```\n */\nexport const mergeStyles = <T extends React.CSSProperties>(\n ...styles: Array<T | undefined>\n): T =>\n Object.assign(\n {},\n ...styles.filter((style): style is T => style !== undefined)\n )\n\n/**\n * Assigns a value to a React ref.\n */\nfunction assignRef<T>(\n ref: React.Ref<T> | null | undefined,\n node: T | null\n): void {\n if (!ref) return\n if (typeof ref === 'function') {\n ref(node)\n } else {\n try {\n Object.assign(ref, { current: node })\n } catch (error) {\n console.error('Error assigning ref:', error)\n }\n }\n}\n\n/**\n * Merges multiple React refs into a single callback ref.\n *\n * @remarks\n * Handles:\n * - Function refs\n * - Object refs\n * - Undefined/null refs\n *\n * @param refs - Array of refs to merge\n * @returns Combined ref callback\n *\n * @example\n * ```tsx\n * const Component = React.forwardRef((props, ref) => {\n * const localRef = useRef(null);\n * const combinedRef = mergeRefs(ref, localRef);\n *\n * return <div ref={combinedRef} />;\n * });\n * ```\n */\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | null | undefined>\n): React.RefCallback<T> {\n return (node: T | null) => {\n refs.forEach((ref) => {\n assignRef(ref, node)\n })\n }\n}\n\n/**\n * Parameters for creating a style override\n */\nexport type StyleOverrideParams = {\n /** CSS variable key to potentially override */\n key: string\n /** Value to use if override is needed */\n value: string\n /** Default styles to compare against */\n defaultStyles: Record<string, string>\n /** Special case dimensions that should be skipped for specific values */\n skipDimensions?: {\n /** Dimensions that should be skipped when they're set to \"fit-content\" */\n fitContent?: string[]\n /** Dimensions that should be skipped when they're set to \"auto\" */\n auto?: string[]\n /** Dimensions that should be skipped when they're set to % values (like \"100%\") */\n fullSize?: string[]\n }\n}\n\n/**\n * Creates style overrides for CSS variables, conditionally based on comparison to defaults.\n * Only applies overrides when the value differs from the default, optimizing style objects.\n *\n * @param params - Style override parameters or individual arguments\n * @param value\n * @param defaultStyles\n * @returns Style object with override (if needed)\n *\n * @example\n * ```ts\n * // Object parameter style:\n * createStyleOverride({\n * key: '--color',\n * value: 'red',\n * defaultStyles: { '--color': 'blue' }\n * })\n * // => { '--color': 'red' }\n *\n * // With dimension skipping:\n * createStyleOverride({\n * key: '--width',\n * value: 'fit-content',\n * defaultStyles: { '--width': 'auto' },\n * skipDimensions: { fitContent: ['--width', '--height'] }\n * })\n * // => {}\n *\n * // Legacy style with separate arguments:\n * createStyleOverride('--color', 'red', { '--color': 'blue' })\n * // => { '--color': 'red' }\n * ```\n */\nexport function createStyleOverride(\n params: StyleOverrideParams | string,\n value?: string,\n defaultStyles?: Record<string, string>\n): Record<string, string | number> {\n // Handle both object parameter and individual arguments for backward compatibility\n const key = typeof params === 'string' ? params : params.key\n const val = typeof params === 'string' ? value! : params.value\n const defaults =\n typeof params === 'string' ? defaultStyles! : params.defaultStyles\n const skipDimensions =\n typeof params === 'object' ? params.skipDimensions : undefined\n\n // Skip dimensions based on specific values\n if (skipDimensions) {\n // Skip 'fit-content' dimensions (Box, Spacer patterns)\n if (skipDimensions.fitContent?.includes(key) && val === 'fit-content') {\n return {}\n }\n\n // Skip 'auto' dimensions (Stack, Layout patterns)\n if (skipDimensions.auto?.includes(key) && val === 'auto') {\n return {}\n }\n\n // Skip '100%' or '100vh/vw' dimensions (Guide, some Spacer patterns)\n if (\n skipDimensions.fullSize?.includes(key) &&\n (val === '100%' || val === '100vh' || val === '100vw')\n ) {\n return {}\n }\n }\n\n // Only apply override if value differs from default\n return val !== defaults[key] ? { [key]: val } : {}\n}\n","/**\n * Creates a debounced version of a function.\n *\n * @remarks\n * Useful for:\n * - Handling rapid event sequences\n * - Limiting API calls\n * - Performance optimization\n *\n * @param fn - Function to debounce\n * @param delay - Delay in milliseconds\n * @returns Debounced function\n *\n * @example\n * ```ts\n * const handleResize = debounce(() => {\n * // Expensive calculation\n * }, 100);\n *\n * window.addEventListener('resize', handleResize);\n * ```\n */\nexport const debounce = <T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): [T, () => void] => {\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const cancel = () => {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n }\n\n const debounced = ((...args) => {\n cancel()\n timer = setTimeout(() => fn(...args), delay)\n }) as T\n\n return [debounced, cancel]\n}\n\n/**\n * Creates a requestAnimationFrame-based throttled function.\n *\n * @remarks\n * Optimizes performance by:\n * - Limiting execution to animation frames\n * - Preventing rapid-fire calls\n * - Maintaining visual smoothness\n *\n * @param fn - Function to throttle\n * @returns RAF-throttled function\n *\n * @example\n * ```ts\n * const updateScroll = rafThrottle(() => {\n * // Update scroll position\n * });\n *\n * document.addEventListener('scroll', updateScroll);\n * ```\n */\nexport const rafThrottle = <T extends (...args: never[]) => void>(fn: T): T => {\n let rafId: number | null = null\n let lastArgs: Parameters<T> | null = null\n\n const throttled = (...args: Parameters<T>) => {\n lastArgs = args\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n\n rafId = requestAnimationFrame(() => {\n fn(...lastArgs!)\n rafId = null\n lastArgs = null\n })\n }\n\n return throttled as T\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Hook to determine if the code is running on the client side.\n *\n * @returns Boolean indicating if the code is running in a browser environment\n */\nexport function useIsClient() {\n // Start with false for SSR\n const [isClient, setIsClient] = useState(false)\n\n // Only run once on mount\n useEffect(() => {\n setIsClient(true)\n }, [])\n\n return isClient\n}\n","/**\n * SSR (Server-Side Rendering) utility functions for baseline-kit.\n */\nimport * as React from 'react'\nimport { useIsClient } from '../hooks/useIsClient'\n\n/**\n * Detects if code is running in a server-side environment\n */\nexport const isSSR = typeof window === 'undefined'\n\n/**\n * Default dimensions to use during server-side rendering\n */\nexport const SSR_DIMENSIONS = {\n width: 1024,\n height: 768,\n}\n\n/**\n * Safe window-using function that works in both server and client\n * @param clientFn Function that uses window/browser APIs\n * @param fallback Fallback value to use in SSR environment\n * @returns Result of clientFn in browser, fallback in SSR\n */\nexport function safeClientValue<T>(clientFn: () => T, fallback: T): T {\n if (isSSR) {\n return fallback\n }\n\n try {\n return clientFn()\n } catch {\n return fallback\n }\n}\n\n/**\n * Returns a stable value during SSR and initial render, then switches to\n * the dynamic value after hydration\n * @param isHydrated Boolean indicating if component is hydrated\n * @param ssrValue Value to use during SSR/initial render\n * @param dynamicValue Value to use after hydration\n */\nexport function hydratedValue<T>(\n isHydrated: boolean,\n ssrValue: T,\n dynamicValue: T\n): T {\n return !isHydrated || isSSR ? ssrValue : dynamicValue\n}\n\n/**\n * ClientOnly component props\n * @internal\n */\ninterface ClientOnlyProps {\n /**\n * Content to render when on the client-side\n */\n children: React.ReactNode\n /**\n * Optional fallback to show during SSR\n */\n fallback?: React.ReactNode\n}\n\n/**\n * A utility component that only renders its children on the client side.\n * @internal Not part of the public API\n */\nexport function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\n const isClient = useIsClient()\n\n if (!isClient) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n","import * as React from 'react'\nimport { rafThrottle } from '@utils'\n\nexport interface MeasureResult {\n /** Measured width in pixels */\n width: number\n /** Measured height in pixels */\n height: number\n /** Function to force a remeasurement */\n refresh: () => void\n}\n\n/**\n * Hook for measuring and tracking DOM element dimensions.\n *\n * Provides responsive element measurements using ResizeObserver,\n * with performance optimization (via RAF throttling), error handling,\n * and a manual refresh method.\n *\n * @param ref - Reference to the DOM element to measure\n * @returns Current dimensions and refresh function\n *\n * @example\n * ```tsx\n * function ResponsiveBox() {\n * const ref = React.useRef<HTMLDivElement>(null);\n * const { width, height, refresh } = useMeasure(ref);\n *\n * return (\n * <div ref={ref} className=\"responsive-box\">\n * Width: {width}px, Height: {height}px\n * <button onClick={refresh}>Remeasure</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useMeasure(\n ref: React.RefObject<HTMLElement | null>\n): MeasureResult {\n const [dimensions, setDimensions] = React.useState({ width: 0, height: 0 })\n\n // measure() reads getBoundingClientRect() from ref.current\n const measure = React.useCallback(() => {\n if (!ref.current) return\n try {\n const rect = ref.current.getBoundingClientRect()\n const next = {\n width: rect ? Math.round(rect.width) : 0,\n height: rect ? Math.round(rect.height) : 0,\n }\n setDimensions((prev) =>\n prev.width === next.width && prev.height === next.height ? prev : next\n )\n } catch {\n setDimensions({ width: 0, height: 0 })\n }\n }, [ref])\n\n // Create a throttled version of measure using RAF.\n const refresh = React.useMemo(() => rafThrottle(measure), [measure])\n\n // On mount (or when ref changes) perform an immediate measurement.\n React.useLayoutEffect(() => {\n if (typeof window === 'undefined') return\n measure()\n }, [measure])\n\n // Set up a ResizeObserver on mount.\n React.useLayoutEffect(() => {\n if (typeof window === 'undefined' || !ref.current) return\n const observer = new ResizeObserver(() => {\n refresh()\n })\n observer.observe(ref.current)\n return () => {\n observer.disconnect()\n }\n }, [ref, refresh])\n\n return { ...dimensions, refresh }\n}\n","import {\n RefObject,\n useCallback,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react'\nimport { rafThrottle } from '@utils'\n\ntype VirtualResult = {\n /** Total number of items/lines to virtualize */\n totalLines: number\n /** Height of each item in pixels */\n lineHeight: number\n /** Reference to the scrollable container */\n containerRef: RefObject<HTMLDivElement | null>\n /** Additional items to render above/below viewport */\n buffer?: number | string\n}\n\n/**\n * Hook for optimizing large lists through virtual scrolling.\n *\n * @remarks\n * This hook helps manage virtual scrolling by:\n * - Calculating visible item ranges\n * - Handling scroll events efficiently\n * - Managing buffer zones for smooth scrolling\n * - Supporting dynamic container sizes\n *\n * Performance optimizations:\n * - RAF-based scroll handling\n * - Intersection Observer for visibility\n * - Buffer zones to prevent flicker\n * - Efficient range calculations\n *\n * @param options - Virtual scrolling configuration\n * @returns Object containing start and end indices of visible items\n *\n * @example\n * ```tsx\n * function VirtualList() {\n * const containerRef = useRef<HTMLDivElement>(null);\n * const { start, end } = useVirtual({\n * totalLines: 1000,\n * lineHeight: 30,\n * containerRef,\n * buffer: 5\n * });\n *\n * return (\n * <div ref={containerRef} className=\"scroll-container\">\n * <div style={{ height: 1000 * 30 }}>\n * {items.slice(start, end).map(item => (\n * <div key={item.id} style={{ height: 30 }}>\n * {item.content}\n * </div>\n * ))}\n * </div>\n * </div>\n * );\n * }\n * ```\n */\nexport function useVirtual({\n totalLines,\n lineHeight,\n containerRef,\n buffer = 0,\n}: VirtualResult) {\n // Convert buffer to numeric value\n const numericBuffer = useMemo(\n () => (typeof buffer === 'number' ? buffer : parseInt(buffer, 10) || 0),\n [buffer]\n )\n\n /**\n * Calculates the visible range of items based on scroll position\n * and viewport dimensions.\n */\n const calculateRange = useCallback(() => {\n const element = containerRef.current\n if (!element) return { start: 0, end: totalLines }\n\n // Show all lines if container is inside .content-block\n if (element.closest('.block')) {\n return { start: 0, end: totalLines }\n }\n\n // Calculate visible range\n const rect = element.getBoundingClientRect()\n const offsetTop = rect.top + window.scrollY\n const viewportTop = Math.max(0, window.scrollY - offsetTop - numericBuffer)\n const viewportBottom = viewportTop + window.innerHeight + numericBuffer * 2\n\n const start = Math.max(0, Math.floor(viewportTop / lineHeight))\n const end = Math.min(totalLines, Math.ceil(viewportBottom / lineHeight))\n\n return { start, end }\n }, [totalLines, lineHeight, containerRef, numericBuffer])\n\n const [visibleRange, setVisibleRange] = useState(calculateRange)\n\n // Subscribe to window events using our helper\n useWindowEvents(['scroll', 'resize'], () => {\n updateRangeThrottled()\n })\n\n // Throttle updates for performance\n const updateRange = useCallback(() => {\n setVisibleRange((prev) => {\n const next = calculateRange()\n return prev.start !== next.start || prev.end !== next.end ? next : prev\n })\n }, [calculateRange])\n\n const updateRangeThrottled = useMemo(\n () => rafThrottle(updateRange),\n [updateRange]\n )\n\n useLayoutEffect(() => {\n const element = containerRef.current\n if (!element) return\n\n // Use IntersectionObserver for visibility tracking\n const observer = new IntersectionObserver(updateRangeThrottled, {\n threshold: 0,\n })\n observer.observe(element)\n updateRangeThrottled()\n\n return () => {\n observer.disconnect()\n }\n }, [containerRef, calculateRange, updateRangeThrottled])\n\n return visibleRange\n}\n\n/** Helper hook to manage multiple window event listeners. */\nfunction useWindowEvents(events: string[], handler: () => void) {\n const stableHandler = useCallback(handler, [handler])\n\n useLayoutEffect(() => {\n const wrappedHandler = () => stableHandler()\n events.forEach((evt) => window.addEventListener(evt, wrappedHandler))\n return () =>\n events.forEach((evt) => window.removeEventListener(evt, wrappedHandler))\n }, [events, stableHandler])\n}\n","import * as React from 'react'\nimport { useMeasure } from './useMeasure'\nimport { calculateSnappedSpacing } from '@utils'\nimport type { SnappingMode, Padding } from '@components'\nimport { parsePadding } from '@utils'\n\nexport interface BaselineOptions {\n /* Base unit for alignment (default 8). */\n base?: number\n /** Snapping strategy: 'none' | 'height' | 'clamp'. */\n snapping?: SnappingMode\n /** Initial padding config. e.g. { top: 10, bottom: 20 } or just 8, etc. */\n spacing?: Partial<Padding> | number\n /** Whether to warn in the console if the measured height is not a multiple of base. */\n warnOnMisalignment?: boolean\n}\n\nexport interface BaselineResult {\n padding: Padding\n isAligned: boolean\n height: number\n}\n\n/**\n * Hook for managing baseline grid alignment in components.\n *\n * @remarks\n * This hook handles the complex calculations needed to maintain baseline grid\n * alignment, including:\n * ▪\tMeasuring element dimensions\n * ▪\tCalculating padding adjustments\n * ▪\tPotentially snapping values to ensure multiples of the base\n * ▪\tWarning about misalignments in development\n *\n * Different snapping modes affect how spacing is adjusted:\n * ▪\t'none': Uses raw spacing values without adjustment\n * ▪\t'height': Adjusts only the final (bottom) padding to align\n * ▪\t'clamp': Adjusts top and bottom to align\n *\n * @param ref Reference to the DOM element\n * @param options Configuration options for alignment behavior\n * @returns Object with adjusted padding, alignment status, and height\n *\n * @example\n * ```tsx\n * export function MyComponent() {\n * const ref = useRef<HTMLDivElement>(null)\n * const { padding } = useBaseline(ref, {\n * base: 8,\n * snapping: 'height',\n * spacing: {\n * top: 16,\n * bottom: 16\n * }\n * }}\n * >\n * Content\n * </div>\n * )\n * }\n */\nexport function useBaseline(\n ref: React.RefObject<HTMLElement | null>,\n {\n base = 8,\n snapping = 'none',\n spacing = {},\n warnOnMisalignment = false,\n }: BaselineOptions = {}\n): BaselineResult {\n if (base < 1) {\n throw new Error('Base must be >= 1 for baseline alignment.')\n }\n\n const { height } = useMeasure(ref)\n // Track whether we've already snapped once for this component.\n const didSnapRef = React.useRef<boolean>(false)\n const hasWarnedRef = React.useRef<boolean>(false)\n\n return React.useMemo(() => {\n // Convert the spacing prop into { top, right, bottom, left } numeric values.\n const initialPadding = parsePadding({ padding: spacing })\n const isAligned = height % base === 0\n\n // Log the warning only once\n if (\n !isAligned &&\n warnOnMisalignment &&\n process.env.NODE_ENV === 'development'\n ) {\n if (!hasWarnedRef.current) {\n console.warn(\n `[useBaseline] Element height (${height}px) is not aligned with base (${base}px).`\n )\n hasWarnedRef.current = true // Mark warning as logged\n }\n }\n\n // If snapping is disabled, just return the original padding.\n if (snapping === 'none') {\n return { padding: initialPadding, isAligned, height }\n }\n\n // If we've already snapped once, just reuse the original (or store the\n // snapped result in a ref if you prefer).\n if (didSnapRef.current) {\n return { padding: initialPadding, isAligned, height }\n }\n\n // Snap exactly once.\n const finalPadding = calculateSnappedSpacing(\n height,\n base,\n initialPadding,\n snapping\n )\n didSnapRef.current = true\n\n return { padding: finalPadding, isAligned, height }\n }, [base, snapping, spacing, warnOnMisalignment, height])\n}\n","import * as React from 'react'\nimport { useConfig, useDebug } from '@hooks'\nimport {\n mergeStyles,\n mergeClasses,\n formatValue,\n normalizeValuePair,\n createStyleOverride,\n hydratedValue,\n} from '@utils'\nimport { ComponentsProps, Variant } from '../types'\nimport styles from './styles.module.css'\n\n// Type Definitions ------------------------------------------------------------\n\nexport type IndicatorNode = (\n value: number,\n type: 'width' | 'height'\n) => React.ReactNode\n\nexport type SpacerProps = {\n /** Explicit width (takes precedence over block) */\n width?: React.CSSProperties['width']\n /** Explicit height (takes precedence over block) */\n height?: React.CSSProperties['height']\n /** Visual style in debug mode */\n variant?: Variant\n /** Color to use for debug visuals (overrides theme) */\n color?: string\n /** Base unit for measurements (defaults to theme value) */\n base?: number\n /** Custom content to render (for debugging info) */\n children?: React.ReactNode\n /** Custom indicator node rendering function */\n indicatorNode?: IndicatorNode\n /** Flag to enable SSR-compatible mode (simplified initial render) */\n ssrMode?: boolean\n} & ComponentsProps\n\n// Utils -----------------------------------------------------------------------\n\n/** Creates default spacer styles */\nconst createDefaultSpacerStyles = (\n base: number,\n textColor: string,\n flatColor: string,\n lineColor: string\n): Record<string, string> => ({\n '--bksw': '100%',\n '--bksh': '100%',\n '--bksb': `${base}px`,\n '--bksct': textColor,\n '--bkscf': flatColor,\n '--bkscl': lineColor,\n})\n\n/** Generates measurement indicators for debugging */\nconst generateMeasurements = (\n isShown: boolean,\n indicatorNode: SpacerProps['indicatorNode'],\n normWidth: number | string,\n normHeight: number | string\n): React.ReactNode | null => {\n if (!isShown || !indicatorNode) return null\n\n const width = typeof normWidth === 'number' ? normWidth : 0\n const height = typeof normHeight === 'number' ? normHeight : 0\n\n return (\n <>\n {height !== 0 && (\n <span key=\"height\">{indicatorNode(height, 'height')}</span>\n )}\n {width !== 0 && <span key=\"width\">{indicatorNode(width, 'width')}</span>}\n </>\n )\n}\n\n/**\n * Creates empty space for implementing margins, gaps, and spacing.\n *\n * @remarks\n * - Flexible sizing: Set width and height directly\n * - Normalized values: All inputs convert to base unit multiples\n * - Debug visuals: Shows spacing measurements with theming\n * - Automatic: Empty in production, visible in debug mode\n *\n * @example\n * ```tsx\n * // Fixed size spacer\n * <Spacer width={32} height={16} />\n *\n * // Percentage-based spacer with debug hints\n * <Spacer\n * width=\"50%\"\n * height={32}\n * debugging=\"visible\"\n * variant=\"line\"\n * />\n *\n * // Full-width spacer\n * <Spacer height={64} />\n * ```\n */\nexport const Spacer = React.memo(function Spacer({\n height: heightProp,\n width: widthProp,\n indicatorNode,\n debugging: debuggingProp,\n variant: variantProp,\n base: baseProp,\n color: colorProp,\n className,\n style,\n children,\n ssrMode = false,\n ...props\n}: SpacerProps) {\n const ref = React.useRef<HTMLDivElement>(null)\n const config = useConfig('spacer')\n\n const { isShown } = useDebug(debuggingProp, config.debugging)\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n\n // Add hydration state tracking\n const [isHydrated, setIsHydrated] = React.useState(false)\n\n React.useEffect(() => {\n setIsHydrated(true)\n }, [])\n\n const [normWidth, normHeight] = React.useMemo(() => {\n return normalizeValuePair([widthProp, heightProp], [0, 0], {\n base,\n suppressWarnings: true,\n })\n }, [widthProp, heightProp, base])\n\n // Ensure stable rendering for measurements during SSR\n const shouldShowMeasurements = hydratedValue(\n isHydrated && !ssrMode,\n false, // Don't show measurements during SSR\n isShown && indicatorNode !== undefined\n )\n\n // Only generate measurements after hydration\n const measurements = React.useMemo(() => {\n if (!shouldShowMeasurements) {\n return null\n }\n\n return generateMeasurements(isShown, indicatorNode, normWidth, normHeight)\n }, [shouldShowMeasurements, isShown, indicatorNode, normWidth, normHeight])\n\n const defaultStyles = React.useMemo(\n () =>\n createDefaultSpacerStyles(\n base,\n config.colors.text,\n config.colors.flat,\n config.colors.line\n ),\n [base, config.colors]\n )\n\n const baseStyles = React.useMemo(() => {\n const heightValue = formatValue(normHeight || '100%')\n const widthValue = formatValue(normWidth || '100%')\n const baseValue = `${base}px`\n\n // Define dimensions that should be skipped when set to 100%\n const dimensionVars = ['--bksw', '--bksh']\n\n const customStyles = {\n ...createStyleOverride({\n key: '--bksh',\n value: heightValue,\n defaultStyles,\n skipDimensions: { fullSize: dimensionVars },\n }),\n ...createStyleOverride({\n key: '--bksw',\n value: widthValue,\n defaultStyles,\n skipDimensions: { fullSize: dimensionVars },\n }),\n // Explicitly set --bksb to ensure it is always applied\n '--bksb': baseValue,\n ...createStyleOverride({\n key: '--bksct',\n value: colorProp ?? config.colors.text,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkscl',\n value: colorProp ?? config.colors.line,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkscf',\n value: colorProp ?? config.colors.flat,\n defaultStyles,\n }),\n } as React.CSSProperties\n\n return mergeStyles(customStyles, style)\n }, [\n normWidth,\n normHeight,\n colorProp,\n base,\n config.colors,\n defaultStyles,\n style,\n ])\n\n return (\n <div\n ref={ref}\n data-testid=\"spacer\"\n className={mergeClasses(\n styles.spr,\n isShown && styles[variant],\n className\n )}\n data-variant={variant}\n data-height={\n typeof normHeight === 'number' ? `${normHeight}px` : normHeight\n }\n style={baseStyles}\n {...props}\n >\n {measurements}\n {children}\n </div>\n )\n})\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline } from '@hooks'\nimport {\n mergeClasses,\n mergeStyles,\n parsePadding,\n mergeRefs,\n formatValue,\n hydratedValue,\n} from '@utils'\nimport { ComponentsProps, Variant } from '../types'\nimport { Spacer, IndicatorNode } from '../Spacer'\nimport { DebuggingMode } from '@/components'\nimport styles from './styles.module.css'\n\ntype RenderSpacerFn = (\n width: React.CSSProperties['width'],\n height: React.CSSProperties['height']\n) => React.ReactNode\n\ntype PaddingStyles = {\n paddingBlock?: string\n paddingInline?: string\n [key: string]: string | undefined\n}\n\nexport type PadderProps = {\n /** Render function for custom measurement indicators */\n indicatorNode?: IndicatorNode\n /** Flag to enable SSR-compatible mode (simplified initial render) */\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\n/** Creates default container styles for Padder */\nconst createPadderContainerStyles = (\n width: React.CSSProperties['width'],\n height: React.CSSProperties['height'],\n base: number,\n color: string\n): Record<string, string> => {\n const stylesObj: Record<string, string> = {}\n\n // Only inject width/height if they differ from defaults\n if (width !== 'fit-content') {\n stylesObj['--bkpw'] = formatValue(width || 'fit-content')\n }\n if (height !== 'fit-content') {\n stylesObj['--bkph'] = formatValue(height || 'fit-content')\n }\n\n // Always set base and color\n stylesObj['--bkpb'] = `${base}px`\n stylesObj['--bkpc'] = color\n\n return stylesObj\n}\n\n/** Creates direct padding styles when spacers are disabled */\nconst createDirectPaddingStyles = (\n enableSpacers: boolean,\n padding: {\n top: number\n right: number\n bottom: number\n left: number\n }\n): PaddingStyles => {\n const { top, right, bottom, left } = padding\n const stylesObj: PaddingStyles = {}\n\n // When spacers are disabled (i.e. debugging === \"none\"), add direct padding styles\n if (!enableSpacers) {\n if (top > 0 || bottom > 0) {\n stylesObj.paddingBlock = `${top}px ${bottom}px`\n }\n if (left > 0 || right > 0) {\n stylesObj.paddingInline = `${left}px ${right}px`\n }\n }\n\n return stylesObj\n}\n\n/** Creates a render function for spacers */\nconst createRenderSpacerFn = (\n variant: Variant | undefined,\n debugging: DebuggingMode | undefined,\n indicatorNode?: IndicatorNode\n): RenderSpacerFn => {\n // Default to 'line' if variant is undefined\n const safeVariant = variant || 'line'\n // Default to 'none' if debugging is undefined\n const safeDebugging = debugging || 'none'\n\n const SpacerElement = (\n widthVal: React.CSSProperties['width'],\n heightVal: React.CSSProperties['height']\n ) => (\n <Spacer\n variant={safeVariant}\n debugging={heightVal === 0 || widthVal === 0 ? 'none' : safeDebugging}\n indicatorNode={indicatorNode}\n height={heightVal !== '100%' ? heightVal : undefined}\n width={widthVal !== '100%' ? widthVal : undefined}\n />\n )\n\n // Add display name to satisfy linter\n SpacerElement.displayName = 'PadderSpacer'\n\n return SpacerElement\n}\n\n/**\n * A foundational component that manages consistent padding with visual debugging.\n *\n * @remarks\n * Padder is a low-level utility that:\n * - Applies consistent padding around content\n * - Supports visual debugging of spacing\n * - Maintains baseline grid alignment\n * - Uses Spacer components for visual padding representation\n *\n * When debugging is enabled (`\"visible\"` or `\"hidden\"`), padding is represented\n * using Spacer components. When debugging is `\"none\"`, direct CSS padding is\n * applied for better performance.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Padder block={16} inline={8}>\n * <div>Content with consistent padding</div>\n * </Padder>\n *\n * // With debug visuals and custom indicators\n * <Padder\n * block={[8, 16]}\n * inline={[16, 24]}\n * debugging=\"visible\"\n * indicatorNode={(value, dim) => (\n * <span className=\"text-sm\">{dim}: {value}px</span>\n * )}\n * >\n * <div>Content with visible padding guides</div>\n * </Padder>\n *\n * // Direct padding mode\n * <Padder\n * block={16}\n * inline={24}\n * debugging=\"none\"\n * >\n * <div>Content with direct CSS padding</div>\n * </Padder>\n * ```\n */\nexport const Padder = React.memo(\n React.forwardRef<HTMLDivElement, PadderProps>(function Padder(\n {\n children,\n className,\n debugging: debuggingProp,\n height,\n indicatorNode,\n style,\n width,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('padder')\n const { variant } = useConfig('spacer')\n const initialPadding = React.useMemo(\n () => parsePadding(spacingProps),\n [spacingProps]\n )\n const { isShown, isNone, debugging } = useDebug(\n debuggingProp,\n config.debugging\n )\n const enableSpacers = !isNone\n\n // Add hydration state tracking\n const [isHydrated, setIsHydrated] = React.useState(false)\n\n React.useEffect(() => {\n setIsHydrated(true)\n }, [])\n\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n\n // Get padding calculation from useBaseline\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping: 'height',\n spacing: initialPadding,\n warnOnMisalignment: !isNone,\n })\n\n // Create stable initial padding for SSR\n const stablePadding = {\n padding: {\n top: initialPadding.top || 0,\n right: initialPadding.right || 0,\n bottom: initialPadding.bottom || 0,\n left: initialPadding.left || 0,\n },\n }\n\n // Use stable padding during SSR and initial render, then switch to dynamic padding\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const setRefs = mergeRefs(ref, internalRef)\n\n const containerStyles = React.useMemo(() => {\n const baseStyles = createPadderContainerStyles(\n width,\n height,\n config.base,\n config.color\n )\n\n const paddingStyles = createDirectPaddingStyles(enableSpacers, {\n top: padding.top,\n right: padding.right,\n bottom: padding.bottom,\n left: padding.left,\n })\n\n return mergeStyles(\n { ...baseStyles, ...paddingStyles } as React.CSSProperties,\n style\n )\n }, [\n width,\n height,\n config.base,\n config.color,\n enableSpacers,\n padding.top,\n padding.right,\n padding.bottom,\n padding.left,\n style,\n ])\n\n const renderSpacer = React.useMemo(\n () => createRenderSpacerFn(variant, debugging, indicatorNode),\n [variant, debugging, indicatorNode]\n )\n\n // When debugging is \"none\", simply return a container with direct CSS padding\n // and no additional grid/Spacer elements.\n if (!enableSpacers) {\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={mergeClasses(styles.pad, className)}\n style={containerStyles}\n >\n {children}\n </div>\n )\n }\n\n // When debugging is enabled, use a grid structure with wrapping spacer elements.\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={mergeClasses(styles.pad, isShown && styles.v, className)}\n style={containerStyles}\n >\n <>\n {/* Top spacer - spans full width */}\n {padding.top >= 0 && (\n <div style={{ gridColumn: '1 / -1' }}>\n {renderSpacer('100%', padding.top)}\n </div>\n )}\n\n {/* Left spacer */}\n {padding.left >= 0 && (\n <div style={{ gridRow: '2 / 3' }}>\n {renderSpacer(padding.left, '100%')}\n </div>\n )}\n </>\n\n {/* Main content - centered in grid */}\n <div style={{ gridRow: '2 / 3', gridColumn: '2 / 3' }}>{children}</div>\n\n <>\n {/* Right spacer */}\n {padding.right >= 0 && (\n <div style={{ gridRow: '2 / 3' }}>\n {renderSpacer(padding.right, '100%')}\n </div>\n )}\n\n {/* Bottom spacer - spans full width */}\n {padding.bottom >= 0 && (\n <div style={{ gridColumn: '1 / -1' }}>\n {renderSpacer('100%', padding.bottom)}\n </div>\n )}\n </>\n </div>\n )\n })\n)\n","import * as React from 'react'\nimport type { Gaps } from '@components'\nimport { useConfig, useDebug, useBaseline } from '@hooks'\nimport {\n mergeStyles,\n mergeClasses,\n parsePadding,\n formatValue,\n createStyleOverride,\n hydratedValue,\n} from '@utils'\nimport { Config } from '../Config'\nimport { Padder } from '../Padder'\nimport { Spacer } from '../Spacer'\nimport { ComponentsProps, Variant } from '../types'\nimport styles from './styles.module.css'\n\n// Import the IndicatorNode type from Spacer props\ntype IndicatorNode = NonNullable<\n React.ComponentProps<typeof Spacer>['indicatorNode']\n>\n\nexport type LayoutProps = {\n /**\n * Grid column definition. Supports:\n * - Number: Equal columns (3 → repeat(3, 1fr))\n * - String: Raw template (\"1fr auto 200px\")\n * - Array: Mixed values ([100, '1fr'] → \"100px 1fr\")\n */\n columns?: number | string | Array<number | string>\n /** Grid row definition (same format as columns) */\n rows?: number | string | Array<number | string>\n /** Controls item alignment along column axis */\n justifyItems?: React.CSSProperties['justifyItems']\n /** Controls item alignment along row axis */\n alignItems?: React.CSSProperties['alignItems']\n /** Controls content distribution along row axis */\n justifyContent?: React.CSSProperties['justifyContent']\n /** Controls content distribution along column axis */\n alignContent?: React.CSSProperties['alignContent']\n /** Custom measurement indicator renderer */\n indicatorNode?: IndicatorNode\n /** Visual style in debug mode */\n variant?: Variant\n /** Flag to enable SSR-compatible mode (simplified initial render) */\n ssrMode?: boolean\n /** Container width (defaults to \"auto\") */\n width?: React.CSSProperties['width']\n /** Container height (defaults to \"auto\") */\n height?: React.CSSProperties['height']\n children?: React.ReactNode\n} & ComponentsProps &\n Gaps\n\n/** Creates default layout styles with theme colors */\nconst createDefaultLayoutStyles = (colors: {\n line: string\n flat: string\n text: string\n}): Record<string, string> => ({\n '--bklw': 'auto',\n '--bklh': 'auto',\n '--bklcl': colors.line,\n '--bklcf': colors.flat,\n '--bklci': colors.text,\n})\n\n/** Parses grid template definitions into CSS grid-template values. */\nconst getGridTemplate = (\n prop?: number | string | Array<number | string>\n): string => {\n if (typeof prop === 'number') return `repeat(${prop}, 1fr)`\n if (typeof prop === 'string') return prop\n if (Array.isArray(prop)) {\n return prop.map((p) => (typeof p === 'number' ? `${p}px` : p)).join(' ')\n }\n return 'repeat(auto-fill, minmax(100px, 1fr))'\n}\n\n/** Creates grid gap styles */\nconst createGridGapStyles = (\n gap?: React.CSSProperties['gap'] | number,\n rowGap?: React.CSSProperties['rowGap'] | number,\n columnGap?: React.CSSProperties['columnGap'] | number\n): Record<string, string> => {\n const styles: Record<string, string> = {}\n\n if (gap !== undefined) {\n styles.gap = formatValue(gap)\n }\n if (rowGap !== undefined) {\n styles.rowGap = formatValue(rowGap)\n }\n if (columnGap !== undefined) {\n styles.columnGap = formatValue(columnGap)\n }\n\n return styles\n}\n\n/**\n * A grid-based layout component with baseline alignment and responsive columns.\n *\n * @remarks\n * Layout provides a CSS Grid container that:\n * - Supports flexible column definitions\n * - Maintains baseline grid alignment\n * - Includes gap management\n * - Offers comprehensive alignment controls\n * - Provides debug overlays for visual verification\n *\n * When no explicit dimensions are provided, Layout defaults to \"auto\"\n * for both width and height.\n *\n * @example\n * ```tsx\n * // Basic equal columns\n * <Layout columns={3} gap={16}>\n * <div>Column 1</div>\n * <div>Column 2</div>\n * <div>Column 3</div>\n * </Layout>\n *\n * // Mixed column widths with alignment\n * <Layout\n * columns={['200px', '1fr', '2fr']}\n * gap={24}\n * alignItems=\"center\"\n * justifyContent=\"space-between\"\n * >\n * <div>Fixed</div>\n * <div>Flexible</div>\n * <div>Double width</div>\n * </Layout>\n * ```\n */\nexport const Layout = React.memo(function Layout({\n alignContent,\n alignItems,\n children,\n className,\n columns = 'repeat(auto-fill, minmax(100px, 1fr))',\n columnGap,\n debugging: debuggingProp,\n gap,\n height,\n indicatorNode,\n justifyContent,\n justifyItems,\n rowGap,\n rows,\n style,\n variant,\n width,\n ssrMode = false,\n ...spacingProps\n}: LayoutProps) {\n const config = useConfig('layout')\n const { isShown, debugging } = useDebug(debuggingProp, config.debugging)\n\n // Add hydration state tracking\n const [isHydrated, setIsHydrated] = React.useState(false)\n\n React.useEffect(() => {\n setIsHydrated(true)\n }, [])\n\n const layoutRef = React.useRef<HTMLDivElement>(null)\n\n const initialPadding = React.useMemo(\n () => parsePadding(spacingProps),\n [spacingProps]\n )\n\n // Get padding calculation from useBaseline\n const baselinePadding = useBaseline(layoutRef, {\n base: config.base,\n snapping: 'height',\n spacing: initialPadding,\n warnOnMisalignment: true,\n })\n\n // Create stable initial padding for SSR\n const stablePadding = {\n padding: {\n top: initialPadding.top || 0,\n right: initialPadding.right || 0,\n bottom: initialPadding.bottom || 0,\n left: initialPadding.left || 0,\n },\n }\n\n // Use stable padding during SSR and initial render, then switch to dynamic padding\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const gridTemplateColumns = React.useMemo(\n () => getGridTemplate(columns),\n [columns]\n )\n\n const gridTemplateRows = React.useMemo(\n () => (rows ? getGridTemplate(rows) : 'auto'),\n [rows]\n )\n\n const defaultLayoutStyles = React.useMemo(\n () => createDefaultLayoutStyles(config.colors),\n [config.colors]\n )\n\n const gridGapStyles = React.useMemo(\n () => createGridGapStyles(gap, rowGap, columnGap),\n [gap, rowGap, columnGap]\n )\n\n const containerStyles = React.useMemo(() => {\n const widthValue = formatValue(width || 'auto')\n const heightValue = formatValue(height || 'auto')\n\n // Define dimensions that should be skipped when set to auto\n const autoDimensions = ['--bklw', '--bklh']\n\n return mergeStyles(\n {\n // Theme overrides\n ...createStyleOverride({\n key: '--bklw',\n value: widthValue,\n defaultStyles: defaultLayoutStyles,\n skipDimensions: { auto: autoDimensions },\n }),\n ...createStyleOverride({\n key: '--bklh',\n value: heightValue,\n defaultStyles: defaultLayoutStyles,\n skipDimensions: { auto: autoDimensions },\n }),\n ...createStyleOverride({\n key: '--bklcl',\n value: config.colors.line,\n defaultStyles: defaultLayoutStyles,\n }),\n ...createStyleOverride({\n key: '--bklcf',\n value: config.colors.flat,\n defaultStyles: defaultLayoutStyles,\n }),\n ...createStyleOverride({\n key: '--bklci',\n value: config.colors.text,\n defaultStyles: defaultLayoutStyles,\n }),\n\n // Grid properties - only inject if different from defaults\n ...(gridTemplateColumns !== 'repeat(auto-fill, minmax(100px, 1fr))' && {\n '--bklgtc': gridTemplateColumns,\n }),\n ...(gridTemplateRows !== 'auto' && { '--bklgtr': gridTemplateRows }),\n ...(justifyItems && { '--bklji': justifyItems }),\n ...(alignItems && { '--bklai': alignItems }),\n ...(justifyContent && { '--bkljc': justifyContent }),\n ...(alignContent && { '--bklac': alignContent }),\n\n // Include gap styles\n ...gridGapStyles,\n } as React.CSSProperties,\n style\n )\n }, [\n gridTemplateColumns,\n gridTemplateRows,\n justifyItems,\n alignItems,\n justifyContent,\n alignContent,\n width,\n height,\n config.colors,\n defaultLayoutStyles,\n style,\n gridGapStyles,\n ])\n\n return (\n <Config spacer={{ variant: variant ?? 'line' }}>\n <Padder\n ref={layoutRef}\n className={isShown ? styles.v : ''}\n block={[padding.top, padding.bottom]}\n {...(indicatorNode ? { indicatorNode } : {})}\n inline={[padding.left, padding.right]}\n debugging={debugging}\n width={width}\n height={height}\n ssrMode={ssrMode}\n >\n <div\n data-testid=\"layout\"\n className={mergeClasses(className, styles.lay)}\n style={containerStyles}\n {...(spacingProps && Object.keys(spacingProps).length > 0\n ? Object.fromEntries(\n Object.entries(spacingProps).filter(\n ([key]) => key !== 'ssrMode'\n )\n )\n : {})}\n >\n {children}\n </div>\n </Padder>\n </Config>\n )\n})\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline } from '@hooks'\nimport {\n mergeClasses,\n mergeStyles,\n parsePadding,\n mergeRefs,\n formatValue,\n createGridSpanStyles,\n createStyleOverride,\n hydratedValue,\n} from '@utils'\nimport { Config } from '../Config/Config'\nimport { Padder } from '../Padder'\nimport { ComponentsProps } from '../types'\nimport styles from './styles.module.css'\n\n/**\n * Determines how the Box component aligns to the baseline grid.\n *\n * @remarks\n * - `none`: No snapping; uses raw spacing values as provided\n * - `height`: Only container height snaps to base unit multiples\n * - `clamp`: Both height and spacing values snap to base unit multiples\n */\nexport type SnappingMode = 'none' | 'height' | 'clamp'\n\nexport type BoxProps = {\n /** Number of columns to span in a grid layout */\n colSpan?: number\n /** Number of rows to span in a grid layout */\n rowSpan?: number\n /** Shorthand for equal column and row span. Takes precedence over individual spans */\n span?: number\n /** Controls baseline grid alignment behavior */\n snapping?: SnappingMode\n /** Flag to enable SSR-compatible mode (simplified initial render) */\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\n/**\n * Creates default box styles with theme values.\n * Sets CSS variables for width, height, base unit, and colors.\n */\nconst createDefaultBoxStyles = (\n base: number,\n lineColor: string\n): Record<string, string> => ({\n '--bkboxw': 'auto',\n '--bkboxh': 'auto',\n '--bkboxc': lineColor,\n '--bkboxb': `${base}px`,\n})\n\ntype BoxCustomStylesParams = {\n /** Width property for the box */\n width?: React.CSSProperties['width']\n /** Height property for the box */\n height?: React.CSSProperties['height']\n /** Base unit for measurements */\n base: number\n /** Line color from theme */\n lineColor: string\n /** Default styles for comparison */\n defaultStyles: Record<string, string>\n}\n\n/**\n * Creates custom styles for the Box component.\n * Handles dimension overrides and other custom properties.\n */\nconst createBoxCustomStyles = ({\n width,\n height,\n base,\n lineColor,\n defaultStyles,\n}: BoxCustomStylesParams): React.CSSProperties => {\n const widthValue = formatValue(width || 'fit-content')\n const heightValue = formatValue(height || 'fit-content')\n\n // Define box dimensions that should be skipped when set to fit-content\n const dimensionVars = ['--bkboxw', '--bkboxh']\n\n return {\n ...createStyleOverride({\n key: '--bkboxw',\n value: widthValue,\n defaultStyles,\n skipDimensions: { fitContent: dimensionVars },\n }),\n ...createStyleOverride({\n key: '--bkboxh',\n value: heightValue,\n defaultStyles,\n skipDimensions: { fitContent: dimensionVars },\n }),\n ...createStyleOverride({\n key: '--bkboxb',\n value: `${base}px`,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkboxc',\n value: lineColor,\n defaultStyles,\n }),\n } as React.CSSProperties\n}\n\n/**\n * A foundational container component that ensures consistent spacing and baseline alignment.\n *\n * @remarks\n * Box provides a layout container that:\n * - Ensures consistent spacing aligned to the baseline grid\n * - Supports grid layout integration through span props\n * - Offers configurable snapping modes for fine-grained alignment control\n * - Includes debug overlays for visual alignment verification\n *\n * By default, Box uses \"auto\" for both width and height unless explicitly specified.\n *\n * @example\n * ```tsx\n * // Basic usage with spacing\n * <Box block={16} inline={8}>\n * <p>Content aligned to baseline</p>\n * </Box>\n *\n * // With grid spanning and custom snapping\n * <Box\n * colSpan={2}\n * rowSpan={1}\n * snapping=\"height\"\n * debugging=\"visible\"\n * >\n * <p>Grid-integrated content</p>\n * </Box>\n * ```\n */\nexport const Box = React.memo(\n React.forwardRef<HTMLDivElement, BoxProps>(function Box(\n {\n children,\n snapping = 'clamp',\n debugging: debuggingProp,\n className,\n colSpan,\n rowSpan,\n span,\n width,\n height,\n style,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('box')\n const { isShown, debugging } = useDebug(debuggingProp, config.debugging)\n\n // Add hydration state tracking\n const [isHydrated, setIsHydrated] = React.useState(false)\n\n React.useEffect(() => {\n setIsHydrated(true)\n }, [])\n\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n const { top, bottom, left, right } = parsePadding(spacingProps)\n\n // Get padding calculation from useBaseline\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping,\n spacing: { top, bottom, left, right },\n warnOnMisalignment: debugging !== 'none',\n })\n\n // Create stable initial padding for SSR\n const stablePadding = {\n padding: {\n top: top || 0,\n right: right || 0,\n bottom: bottom || 0,\n left: left || 0,\n },\n }\n\n // Use stable padding during SSR and initial render, then switch to dynamic padding\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const gridSpanStyles = React.useMemo(\n () => createGridSpanStyles(span, colSpan, rowSpan),\n [colSpan, rowSpan, span]\n )\n\n const defaultBoxStyles = React.useMemo(\n () => createDefaultBoxStyles(config.base, config.colors.line),\n [config.base, config.colors.line]\n )\n\n const boxStyles = React.useMemo(() => {\n const customStyles = createBoxCustomStyles({\n width,\n height,\n base: config.base,\n lineColor: config.colors.line,\n defaultStyles: defaultBoxStyles,\n })\n return mergeStyles(customStyles, style)\n }, [\n config.base,\n config.colors.line,\n width,\n height,\n defaultBoxStyles,\n style,\n ])\n\n return (\n <div\n ref={mergeRefs(ref, internalRef)}\n data-testid=\"box\"\n className={mergeClasses(styles.box, isShown && styles.v, className)}\n style={mergeStyles(boxStyles, gridSpanStyles)}\n >\n <Config base={1} spacer={{ variant: 'flat' }}>\n <Padder\n block={[padding.top, padding.bottom]}\n inline={[padding.left, padding.right]}\n width=\"fit-content\"\n height={height}\n debugging={debugging}\n ssrMode={ssrMode}\n >\n {children}\n </Padder>\n </Config>\n </div>\n )\n })\n)\n","import * as React from 'react'\nimport type { Gaps } from '@components'\nimport { useConfig, useDebug, useBaseline } from '@hooks'\nimport {\n mergeClasses,\n mergeStyles,\n parsePadding,\n formatValue,\n createStyleOverride,\n hydratedValue,\n} from '@utils'\nimport { Padder } from '../Padder'\nimport { IndicatorNode } from '../Spacer'\nimport { Config } from '../Config'\nimport { ComponentsProps, Variant } from '../types'\nimport styles from './styles.module.css'\n\n// Maps shorthand directions to Flexbox directions\nconst DIRECTION_AXIS: Record<string, React.CSSProperties['flexDirection']> = {\n x: 'row',\n y: 'column',\n '-x': 'row-reverse',\n '-y': 'column-reverse',\n}\n\nexport type CSSPropertiesDirectionalAxis = keyof typeof DIRECTION_AXIS\n\nexport type StackProps = {\n /** Main axis orientation */\n direction?: React.CSSProperties['flexDirection'] &\n CSSPropertiesDirectionalAxis\n /** Distribution of space on main axis */\n justify?: React.CSSProperties['justifyContent']\n /** Alignment on cross axis */\n align?: React.CSSProperties['alignItems']\n /** Container width (defaults to \"auto\") */\n width?: React.CSSProperties['width']\n /** Container height (defaults to \"auto\") */\n height?: React.CSSProperties['height']\n /** Custom measurement indicator renderer */\n indicatorNode?: IndicatorNode\n /** Visual style in debug mode */\n variant?: Variant\n /** Gap between items in base units */\n gap?: Gaps\n /** Row gap when using different values for rows and columns */\n rowGap?: Gaps\n /** Column gap when using different values for rows and columns */\n columnGap?: Gaps\n /** Flag to enable SSR-compatible mode (simplified initial render) */\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\n// Utils -----------------------------------------------------------------------\n\n/** Creates default stack styles with theme colors */\nconst createDefaultStackStyles = (colors: Record<string, string>) => ({\n '--bkkw': 'auto',\n '--bkkh': 'auto',\n '--bkkcl': colors.line,\n '--bkkcf': colors.flat,\n '--bkkci': colors.text,\n})\n\n/** Creates gap styles for the stack */\nconst createStackGapStyles = (\n rowGap?: number,\n columnGap?: number,\n gap?: number\n): Record<string, number | undefined> => ({\n rowGap: gap !== undefined ? gap : rowGap,\n columnGap: gap !== undefined ? gap : columnGap,\n})\n\n/**\n * A flexible container component aligning children to the baseline grid.\n *\n * @remarks\n * Stack provides a flex container that:\n * - Maintains baseline grid alignment\n * - Supports both row and column layouts\n * - Handles consistent spacing between items\n * - Includes visual debug overlays\n *\n * Key features:\n * - Automatic dimension management (defaults to auto)\n * - Direct padding application in non-debug mode\n * - Comprehensive alignment controls\n * - Theme-aware debug visuals\n *\n * @example\n * ```tsx\n * // Basic horizontal stack\n * <Stack gap={16}>\n * <div>Item 1</div>\n * <div>Item 2</div>\n * </Stack>\n *\n * // Vertical stack with alignment\n * <Stack\n * direction=\"column\"\n * gap={24}\n * align=\"center\"\n * justify=\"space-between\"\n * debugging=\"visible\"\n * >\n * <div>Top</div>\n * <div>Middle</div>\n * <div>Bottom</div>\n * </Stack>\n *\n * // Complex layout with padding\n * <Stack\n * direction=\"row\"\n * gap={32}\n * align=\"stretch\"\n * block={[16, 24]}\n * inline={16}\n * debugging=\"visible\"\n * >\n * <div>Panel 1</div>\n * <div>Panel 2</div>\n * </Stack>\n * ```\n */\nexport const Stack = React.memo(function Stack({\n align = 'flex-start',\n children,\n className,\n columnGap,\n debugging: debuggingProp,\n direction = 'row',\n gap,\n height,\n indicatorNode,\n justify = 'flex-start',\n rowGap,\n style,\n variant,\n width,\n ssrMode = false,\n ...spacingProps\n}: StackProps) {\n // Read configuration from context or props\n const config = useConfig('stack')\n const { isShown, debugging } = useDebug(debuggingProp, config.debugging)\n\n // Add hydration state tracking\n const [isHydrated, setIsHydrated] = React.useState(false)\n\n React.useEffect(() => {\n setIsHydrated(true)\n }, [])\n\n const stackRef = React.useRef<HTMLDivElement | null>(null)\n\n // Process spacing props\n const { top, right, bottom, left } = parsePadding({\n ...spacingProps,\n })\n\n // Get padding calculation from useBaseline\n const baselinePadding = useBaseline(stackRef, {\n base: config.base,\n snapping: 'height',\n spacing: { top, right, bottom, left },\n warnOnMisalignment: debugging !== 'none',\n })\n\n // Create stable initial padding for SSR\n const stablePadding = {\n padding: {\n top: top || 0,\n right: right || 0,\n bottom: bottom || 0,\n left: left || 0,\n },\n }\n\n // Use stable padding during SSR and initial render, then switch to dynamic padding\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const stackGapStyles = React.useMemo(() => {\n const formattedRowGap = rowGap !== undefined ? Number(rowGap) : undefined\n const formattedColumnGap =\n columnGap !== undefined ? Number(columnGap) : undefined\n const formattedGap = gap !== undefined ? Number(gap) : undefined\n\n return createStackGapStyles(\n formattedRowGap,\n formattedColumnGap,\n formattedGap\n )\n }, [rowGap, columnGap, gap])\n\n const defaultStackStyles = React.useMemo(\n () => createDefaultStackStyles(config.colors),\n [config.colors]\n )\n\n const containerStyles = React.useMemo(() => {\n const widthValue = formatValue(width || 'auto')\n const heightValue = formatValue(height || 'auto')\n const flexDirection = DIRECTION_AXIS[direction] || direction\n\n // Define stack dimensions that should be skipped when set to auto\n const dimensionVars = ['--bkkw', '--bkkh']\n\n const customOverrides = {\n ...createStyleOverride({\n key: '--bkkw',\n value: widthValue,\n defaultStyles: defaultStackStyles,\n skipDimensions: { auto: dimensionVars },\n }),\n ...createStyleOverride({\n key: '--bkkh',\n value: heightValue,\n defaultStyles: defaultStackStyles,\n skipDimensions: { auto: dimensionVars },\n }),\n ...createStyleOverride({\n key: '--bkkcl',\n value: config.colors.line,\n defaultStyles: defaultStackStyles,\n }),\n ...createStyleOverride({\n key: '--bkkcf',\n value: config.colors.flat,\n defaultStyles: defaultStackStyles,\n }),\n ...createStyleOverride({\n key: '--bkkci',\n value: config.colors.text,\n defaultStyles: defaultStackStyles,\n }),\n } as React.CSSProperties\n\n const baseStyles = {\n flexDirection,\n justifyContent: justify,\n alignItems: align,\n width,\n height,\n } as React.CSSProperties\n\n return mergeStyles(baseStyles, stackGapStyles, customOverrides, style)\n }, [\n direction,\n justify,\n align,\n width,\n height,\n config.colors.line,\n config.colors.flat,\n config.colors.text,\n defaultStackStyles,\n stackGapStyles,\n style,\n ])\n\n const mergedContainerStyles =\n debugging === 'none'\n ? {\n ...containerStyles,\n paddingBlock: `${padding.top}px ${padding.bottom}px`,\n paddingInline: `${padding.left}px ${padding.right}px`,\n }\n : containerStyles\n\n return (\n <Config spacer={{ variant: variant ?? 'line' }}>\n <Padder\n ref={stackRef}\n block={[padding.top, padding.bottom]}\n inline={[padding.left, padding.right]}\n debugging={debugging}\n indicatorNode={indicatorNode}\n width={width}\n height={height}\n ssrMode={ssrMode}\n >\n <div\n data-testid=\"stack\"\n className={mergeClasses(className, styles.stk, isShown && styles.v)}\n style={mergedContainerStyles}\n {...spacingProps}\n >\n {children}\n </div>\n </Padder>\n </Config>\n )\n})\n","import * as React from 'react'\nimport { ComponentsProps } from '@components'\nimport { useConfig, useDebug, useGuide, useMeasure } from '@hooks'\nimport {\n formatValue,\n mergeClasses,\n mergeStyles,\n createStyleOverride,\n ClientOnly,\n} from '@utils'\nimport { AutoConfig, FixedConfig, LineConfig, PatternConfig } from './types'\nimport type { GuideVariant } from '../types'\nimport styles from './styles.module.css'\n\n/** Merged configuration types that support various grid layout strategies */\nexport type GuideConfig = PatternConfig | AutoConfig | FixedConfig | LineConfig\n\nexport type GuideProps = {\n /** Controls horizontal alignment of columns within the container */\n align?: React.CSSProperties['justifyContent']\n /** Visual style of the guide */\n variant?: GuideVariant\n /** Number of columns (for fixed/auto variants) */\n columns?: number | readonly (string | number | undefined | 'auto')[]\n /** Column width (for fixed variant) */\n columnWidth?: React.CSSProperties['width']\n /** Maximum width of the guide */\n maxWidth?: React.CSSProperties['maxWidth']\n /** Color override for guide lines */\n color?: React.CSSProperties['color']\n /** Content to render inside the guide */\n children?: React.ReactNode\n /** Gap between columns */\n gap?: number\n /** Flag to enable SSR-compatible mode (simplified initial render) */\n ssrMode?: boolean\n} & ComponentsProps &\n Omit<GuideConfig, 'columns' | 'columnWidth' | 'gap'>\n\n/** Parameters for creating a grid configuration */\ntype GridConfigParams = {\n variant: GuideVariant\n base: number\n gap: number\n columns?: number | readonly (string | number | undefined | 'auto')[]\n columnWidth?: React.CSSProperties['width']\n}\n\n/**\n * Creates a grid configuration based on the specified variant and parameters\n * Internal helper function for Guide component\n */\nconst createGridConfig = (\n params: GridConfigParams\n): PatternConfig | AutoConfig | FixedConfig | LineConfig => {\n const { variant, base, gap, columns, columnWidth } = params\n\n switch (variant) {\n case 'line':\n return {\n variant: 'line',\n gap,\n base,\n } as LineConfig\n\n case 'pattern':\n if (columns && Array.isArray(columns)) {\n return {\n variant: 'pattern',\n columns: columns as readonly (string | number)[],\n gap,\n base,\n } as PatternConfig\n }\n break\n\n case 'fixed':\n if (columns !== undefined) {\n const parsedColumns =\n typeof columns === 'number' ? columns : parseInt(String(columns), 10)\n return {\n variant: 'fixed',\n columns: !isNaN(parsedColumns) ? parsedColumns : 12,\n columnWidth: columnWidth || '60px',\n gap,\n base,\n } as FixedConfig\n }\n break\n }\n\n // Default to auto columns if no valid configuration was created\n return {\n variant: 'auto',\n columnWidth: columnWidth || '1fr',\n gap,\n base,\n } as AutoConfig\n}\n\n/** Creates default guide styles */\nconst createDefaultGuideStyles = (\n base: number,\n lineColor: string\n): Record<string, string> => ({\n '--bkgw': 'auto',\n '--bkgh': 'auto',\n '--bkgmw': 'none',\n '--bkgcw': '60px',\n '--bkggw': '24px',\n '--bkgc': '12',\n '--bkgb': `${base}px`,\n '--bkgcl': lineColor,\n '--bkgg': '0',\n})\n\n/**\n * A developer tool component that provides visual grid overlays for alignment.\n *\n * @remarks\n * Guide renders a configurable grid overlay that helps visualize:\n * - Column layouts and spacing\n * - Content alignment\n * - Layout patterns\n *\n * The component supports multiple variants:\n * - \"line\": Simple evenly-spaced vertical lines\n * - \"pattern\": Custom repeating column width patterns\n * - \"fixed\": Fixed number of equal or custom-width columns\n * - \"auto\": Dynamically calculated columns based on container width\n *\n * @example\n * ```tsx\n * // Basic column guide\n * <Guide\n * variant=\"line\"\n * gap={8}\n * debugging=\"visible\"\n * />\n *\n * // Custom column pattern\n * <Guide\n * variant=\"pattern\"\n * columns={['100px', '1fr', '2fr']}\n * gap={16}\n * align=\"center\"\n * debugging=\"visible\"\n * />\n *\n * // Fixed columns with custom width\n * <Guide\n * variant=\"fixed\"\n * columns={12}\n * columnWidth=\"60px\"\n * gap={8}\n * debugging=\"visible\"\n * />\n * ```\n */\nexport const Guide = React.memo(function Guide({\n className,\n debugging,\n style,\n variant: variantProp,\n align = 'center',\n gap: gapProp,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ssrMode = false,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const variant = variantProp ?? config.variant\n const gap = typeof gapProp === 'number' ? gapProp : 0\n const { isShown } = useDebug(debugging, config.debugging)\n\n // If debugging isn't enabled, render a hidden element\n // This ensures tests can find the element even when hidden\n if (!isShown) {\n return (\n <div\n className={mergeClasses(styles.g, styles.h, className)}\n style={style}\n data-testid=\"guide\"\n data-variant={variant}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n // Create a simple SSR fallback with the expected dimensions\n const ssrFallback = (\n <div\n className={mergeClasses(styles.g, styles.h, styles.ssr, className)}\n style={{\n width: width || '100%',\n height: height || '100%',\n maxWidth: maxWidth || 'none',\n ...style,\n }}\n data-testid=\"guide\"\n data-variant={variant}\n >\n {children}\n </div>\n )\n\n // Wrap the actual implementation in ClientOnly\n return (\n <ClientOnly fallback={ssrFallback}>\n <GuideImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n align={align}\n gap={gap}\n height={height}\n width={width}\n columns={columns}\n columnWidth={columnWidth}\n maxWidth={maxWidth}\n color={color}\n ssrMode={ssrMode}\n {...props}\n >\n {children}\n </GuideImpl>\n </ClientOnly>\n )\n})\n\n// Implementation component that only renders on the client side\nconst GuideImpl = React.memo(function GuideImpl({\n className,\n debugging,\n style,\n variant,\n align = 'center',\n gap,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ssrMode: _ssrMode = false,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const { isShown } = useDebug(debugging, config.debugging)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n\n // Measure the container dimensions\n const {\n width: containerWidth,\n height: containerHeight,\n refresh, // Keep the refresh function available for dynamic updates\n } = useMeasure(containerRef)\n\n // Effect for handling window resize events\n React.useEffect(() => {\n const handleResize = () => {\n // Trigger a remeasurement when window size changes\n refresh()\n }\n\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }, [refresh])\n\n // Create guide configuration based on variant\n const gridConfig = React.useMemo(() => {\n // Ensure we have valid values for the grid configuration\n const safeVariant = variant as GuideVariant\n const safeGap = typeof gap === 'number' ? gap : 0\n\n return createGridConfig({\n variant: safeVariant,\n base: config.base,\n gap: safeGap,\n columns,\n columnWidth,\n })\n }, [variant, config.base, gap, columns, columnWidth])\n\n const { template, columnsCount, calculatedGap } = useGuide(\n containerRef,\n gridConfig\n )\n\n const defaultStyles = React.useMemo(\n () => createDefaultGuideStyles(config.base, config.colors.line),\n [config.base, config.colors.line]\n )\n\n const containerStyles = React.useMemo(() => {\n // Process dimension values\n const widthValue = formatValue(width || containerWidth || 'auto')\n const heightValue = formatValue(height || containerHeight || 'auto')\n const maxWidthValue = formatValue(maxWidth || 'none')\n const columnWidthValue = formatValue(columnWidth || '60px')\n\n // Define dimensions that should be skipped when set to auto\n const autoDimensions = ['--bkgw', '--bkgh']\n\n // Create custom styles with conditional overrides\n const customStyles = {\n ...createStyleOverride({\n key: '--bkgw',\n value: widthValue,\n defaultStyles,\n skipDimensions: { auto: autoDimensions },\n }),\n ...createStyleOverride({\n key: '--bkgh',\n value: heightValue,\n defaultStyles,\n skipDimensions: { auto: autoDimensions },\n }),\n ...createStyleOverride({\n key: '--bkgmw',\n value: maxWidthValue,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgcw',\n value: columnWidthValue,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgc',\n value: `${columnsCount}`,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgb',\n value: `0`,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgcl',\n value: color ?? config.colors.line,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgg',\n value: `${calculatedGap}px`,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgj',\n value: align || 'center',\n defaultStyles,\n }),\n ...(template && template !== 'none' ? { '--bkgt': template } : {}),\n // Add grid template if available\n ...(template && template !== 'none'\n ? { gridTemplateColumns: template }\n : {}),\n } as React.CSSProperties\n\n return mergeStyles(customStyles, style)\n }, [\n width,\n height,\n maxWidth,\n columnWidth,\n columnsCount,\n color,\n template,\n calculatedGap,\n containerWidth,\n containerHeight,\n config.colors.line,\n defaultStyles,\n style,\n align,\n ])\n\n // In the component where gap is used:\n const handleGapCalculations = () => {\n // Ensure gap is a number\n const safeGap = typeof gap === 'number' ? gap : 0\n\n // When gap is 0, we need width + 1 columns to fill the space\n // When gap > 0, we need to account for the -1px reduction in each gap\n const finalGap = safeGap === 0 ? 0 : safeGap - 1\n const actualGapWithLine = finalGap + 1\n\n // Rest of the gap calculations...\n return { finalGap, actualGapWithLine }\n }\n\n // Use the gap calculations where needed\n const { finalGap, actualGapWithLine } = handleGapCalculations()\n\n // Ensure width is a number\n const containerWidthValue =\n typeof width === 'number' ? width : containerWidth || 1024\n\n // For line variants, account for the -1px reduction in each gap\n // If we have N columns, we have (N-1) gaps, each reduced by 1px\n // So the total width lost is (N-1) pixels\n let columnCount: number\n\n if (finalGap === 0) {\n // When gap is 0, we need a column per pixel + 1\n columnCount = Math.floor(containerWidthValue) + 1\n } else if (variant === 'line') {\n // For line variant with gap > 0:\n // We need to solve for N in: N * actualGapWithLine - (N-1) = containerWidthValue\n // Which simplifies to: N = (containerWidthValue + 1) / (actualGapWithLine - 1 + 1)\n columnCount = Math.max(\n 1,\n Math.floor((containerWidthValue + 1) / actualGapWithLine) + 1\n )\n } else {\n // For other variants, use the standard formula\n columnCount = Math.max(\n 1,\n Math.floor(containerWidthValue / actualGapWithLine) + 1\n )\n }\n\n return (\n <div\n ref={containerRef}\n data-testid=\"guide\"\n className={mergeClasses(\n styles.gde,\n className,\n isShown ? styles.v : styles.h,\n variant === 'line' && styles.line\n )}\n data-variant={variant}\n style={containerStyles}\n {...props}\n >\n {isShown && (\n <div className={styles.cols} data-variant={variant}>\n {Array.from({ length: columnCount }, (_, i) => {\n const colColor =\n config.colors[variant as keyof typeof config.colors] ??\n config.colors.line\n return (\n <div\n key={i}\n className={styles.col}\n data-column-index={i}\n data-variant={variant}\n style={{ backgroundColor: colColor }}\n />\n )\n })}\n </div>\n )}\n {children}\n </div>\n )\n})\n","/**\n * @file validation.ts\n * @description Validation utilities for Guide component configurations\n * @module baseline-kit/components/Guide/validation\n */\n\nimport {\n GRID_ALIGNMENTS,\n GridAlignment,\n GuideColumnsPattern,\n GuideColumnValue,\n GuideConfig,\n} from '@components'\nimport { ABSOLUTE_UNIT_CONVERSIONS, RELATIVE_UNITS } from '@utils'\n\n/**\n * Regular expression for valid CSS unit values.\n * Matches numeric values with supported CSS units.\n */\nconst UNIT_PATTERN =\n /^\\d*\\.?\\d+(?:fr|px|%|em|rem|vh|vw|vmin|vmax|pt|pc|in|cm|mm)$/\n\n/**\n * Validates individual grid column values.\n *\n * @example\n * ```ts\n * isValidGuideColumnValue(100) // true\n * isValidGuideColumnValue('100px') // true\n * isValidGuideColumnValue('auto') // true\n * isValidGuideColumnValue('foo') // false\n * ```\n */\nexport const isValidGuideColumnValue = (\n value: unknown\n): value is GuideColumnValue => {\n if (typeof value === 'number') return Number.isFinite(value) && value >= 0\n if (typeof value !== 'string') return false\n return value === 'auto' || value === '100%' || UNIT_PATTERN.test(value)\n}\n\n/**\n * Validates an array of column values as a grid pattern.\n *\n * @example\n * ```ts\n * isValidGuidePattern(['100px', '1fr']) // true\n * isValidGuidePattern([100, 200]) // true\n * isValidGuidePattern(['invalid']) // false\n * isValidGuidePattern([]) // false\n * ```\n */\nexport const isValidGuidePattern = (\n pattern: unknown\n): pattern is GuideColumnsPattern =>\n Array.isArray(pattern) &&\n pattern.length > 0 &&\n pattern.every(isValidGuideColumnValue)\n\n/**\n * Validates CSS grid values against supported units.\n *\n * @example\n * ```ts\n * isGuideValue('100px') // true\n * isGuideValue('2rem') // true\n * isGuideValue('foo') // false\n * ```\n */\nexport const isGuideValue = (value: unknown) => {\n const CSS_UNITS = [\n ...Object.keys(ABSOLUTE_UNIT_CONVERSIONS),\n ...RELATIVE_UNITS,\n ]\n return (\n typeof value === 'number' ||\n (typeof value === 'string' &&\n CSS_UNITS.some((unit) => value.endsWith(unit)))\n )\n}\n\n/**\n * Validates grid alignment values.\n *\n * @example\n * ```ts\n * isGuideAlignment('start') // true\n * isGuideAlignment('center') // true\n * isGuideAlignment('foo') // false\n * ```\n */\nexport const isGuideAlignment = (value: unknown): value is GridAlignment =>\n typeof value === 'string' && GRID_ALIGNMENTS.includes(value as GridAlignment)\n\n/**\n * Type guard for object values.\n */\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null\n\n/**\n * Validates line-based guide configurations.\n *\n * @example\n * ```ts\n * isGuideLineConfig({ variant: 'line' }) // true\n * isGuideLineConfig({ variant: 'pattern' }) // false\n * ```\n */\nexport const isGuideLineConfig = (config: unknown): config is GuideConfig =>\n isObject(config) && config.variant === 'line'\n\n/**\n * Validates column-based guide configurations.\n *\n * @example\n * ```ts\n * isGuideColumnConfig({ columns: 12 }) // true\n * isGuideColumnConfig({ variant: 'line' }) // false\n * ```\n */\nexport const isGuideColumnConfig = (config: unknown): config is GuideConfig =>\n isObject(config) && 'columns' in config && !('variant' in config)\n\n/**\n * Validates auto-calculated guide configurations.\n *\n * @example\n * ```ts\n * isAutoCalculatedGuide({ columnWidth: '200px' }) // true\n * isAutoCalculatedGuide({ columns: 12 }) // false\n * ```\n */\nexport const isAutoCalculatedGuide = (config: unknown): config is GuideConfig =>\n isObject(config) &&\n 'columnWidth' in config &&\n !('variant' in config) &&\n !('columns' in config)\n","import * as React from 'react'\nimport { GuideConfig, GuideColumnsPattern } from '@components'\nimport { isValidGuidePattern } from '@/components/Guide/validation'\nimport { formatValue, convertValue, normalizeValue } from '@utils'\nimport { useMeasure } from './useMeasure'\n\nexport interface GuideResult {\n /** CSS grid template string */\n template: string\n /** Total number of columns */\n columnsCount: number\n /** Final gap size in pixels */\n calculatedGap: number\n /** Whether the configuration is valid */\n isValid: boolean\n}\n\n/**\n * Hook for calculating grid layout parameters based on container dimensions.\n *\n * @remarks\n * This hook handles complex grid calculations for different layout variants:\n * - 'line': Evenly spaced vertical lines\n * - 'pattern': Custom repeating column patterns\n * - 'fixed': Set number of columns with optional width\n * - 'auto': Dynamic columns based on available space\n *\n * Key features:\n * - Responsive grid calculations\n * - Pattern validation\n * - Gap management\n * - Error handling\n *\n * @param ref - Reference to container element\n * @param config - Grid configuration object\n * @returns Grid calculation results\n *\n * @example\n * ```tsx\n * function GridOverlay() {\n * const ref = useRef<HTMLDivElement>(null);\n * const { template, columnsCount } = useGuide(ref, {\n * variant: 'fixed',\n * columns: 12,\n * gap: 16,\n * base: 8\n * });\n *\n * return (\n * <div\n * ref={ref}\n * style={{\n * display: 'grid',\n * gridTemplateColumns: template,\n * gap: calculatedGap\n * }}\n * >\n * {Array(columnsCount).fill(null).map((_, i) => (\n * <div key={i} className=\"grid-line\" />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useGuide(\n ref: React.RefObject<HTMLElement | null>,\n config: GuideConfig\n): GuideResult {\n const { width } = useMeasure(ref)\n const hasWarnedRef = React.useRef<boolean>(false) // Track if warning has been logged\n\n return React.useMemo(() => {\n // Default values\n const variant = config.variant ?? 'line'\n const base = config.base ?? 8\n\n // The gap is already adjusted in createGridConfig for line variants\n // So we should use config.gap directly without further adjustment\n const gap = normalizeValue(config.gap ?? 0, { base })\n\n // Return invalid result if no width\n if (!width) {\n return {\n template: 'none',\n columnsCount: 0,\n calculatedGap: 0,\n isValid: false,\n }\n }\n\n try {\n switch (variant) {\n case 'line': {\n // Simple vertical lines\n // Account for -1px reduction in each gap when gap > 0\n const finalGap = gap === 0 ? 0 : gap - 1\n const actualGapWithLine = finalGap + 1\n\n let columns: number\n\n if (finalGap === 0) {\n // When gap is 0, need a column per pixel + 1\n columns = Math.max(1, Math.floor(width) + 1)\n } else {\n // For line variant with gap > 0:\n // Account for the -1px reduction in each gap\n columns = Math.max(\n 1,\n Math.floor((width + 1) / actualGapWithLine) + 1\n )\n }\n\n return {\n template: `repeat(${columns}, 1px)`,\n columnsCount: columns,\n calculatedGap: gap > 0 ? gap - 1 : gap,\n isValid: true,\n }\n }\n\n case 'pattern': {\n // Custom column pattern\n if (!config.columns || !Array.isArray(config.columns)) {\n throw new Error('Missing or invalid pattern columns')\n }\n\n if (!isValidGuidePattern(config.columns)) {\n throw new Error('Invalid \"pattern\" columns array')\n }\n\n const columnsArr = (config.columns as GuideColumnsPattern).map(\n (col) => {\n if (typeof col === 'number') return `${col}px`\n return col\n }\n )\n\n // Validate no zero widths\n if (columnsArr.some((c) => c === '0' || c === '0px')) {\n return {\n template: 'none',\n columnsCount: 0,\n calculatedGap: 0,\n isValid: false,\n }\n }\n\n return {\n template: columnsArr.join(' '),\n columnsCount: columnsArr.length,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n case 'fixed': {\n // Fixed number of columns\n const colCount =\n typeof config.columns === 'number' ? config.columns : 0\n if (colCount < 1) {\n throw new Error(`Invalid columns count: ${colCount}`)\n }\n const colWidth = config.columnWidth\n ? formatValue(config.columnWidth)\n : '1fr'\n\n return {\n template: `repeat(${colCount}, ${colWidth})`,\n columnsCount: colCount,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n case 'auto': {\n // Auto-filling columns\n const colWidth = config.columnWidth ?? 'auto'\n if (colWidth === 'auto') {\n return {\n template: 'repeat(auto-fill, minmax(0, 1fr))',\n columnsCount: 1,\n calculatedGap: gap,\n isValid: true,\n }\n }\n const colWidthStr =\n typeof colWidth === 'number' ? `${colWidth}px` : colWidth.toString()\n\n const pxVal = convertValue(colWidthStr) ?? 0\n const columns =\n pxVal > 0\n ? Math.max(1, Math.floor((width + gap) / (pxVal + gap)))\n : 1\n\n return {\n template: `repeat(auto-fill, ${colWidthStr})`,\n columnsCount: columns,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n default: {\n if (!hasWarnedRef.current) {\n console.warn(\n `[useGuide] Unknown variant \"${variant}\". Falling back to \"line\".`\n )\n hasWarnedRef.current = true // Mark warning as logged\n }\n const columns = Math.max(1, Math.floor(width / (gap + 1)) + 1)\n return {\n template: `repeat(${columns}, 1px)`,\n columnsCount: columns,\n calculatedGap: gap,\n isValid: true,\n }\n }\n }\n } catch (error) {\n console.warn('Error in useGuide:', error)\n return {\n template: 'none',\n columnsCount: 0,\n calculatedGap: 0,\n isValid: false,\n }\n }\n }, [config, width])\n}\n","import { useMemo } from 'react'\nimport { ConfigSchema, useDefaultConfig } from '@components'\n\n/** Type helper that merges base configuration with component-specific settings. */\nexport type ComponentConfig<K extends keyof ConfigSchema> = ConfigSchema[K] & {\n /** Base unit for spacing calculations */\n base: number\n}\n\n/**\n * Hook for accessing component-specific theme configuration.\n *\n * @remarks\n * This hook provides:\n * - Access to component-specific theme settings\n * - Automatic base unit inheritance\n * - Memoized configuration to prevent unnecessary updates\n * - Type-safe configuration access\n *\n * It merges:\n * - Global base unit settings\n * - Component-specific configurations\n * - Theme-based color schemes\n *\n * @param component - Name of the component requesting configuration\n * @returns Merged configuration for the specific component\n *\n * @example\n * ```tsx\n * function Box() {\n * const config = useConfig('box');\n *\n * return (\n * <div style={{\n * '--box-base': `${config.base}px`,\n * '--box-color': config.colors.line\n * }}>\n * {children}\n * </div>\n * );\n * }\n * ```\n */\nexport function useConfig<K extends keyof ConfigSchema>(\n component: K\n): ComponentConfig<K> {\n const defaultConfig = useDefaultConfig()\n return useMemo(() => {\n return Object.assign(\n { base: defaultConfig.base },\n defaultConfig[component]\n ) as ComponentConfig<K>\n }, [defaultConfig, component])\n}\n","import { useMemo } from 'react'\nimport { DebuggingMode } from '../components/Config/Config'\n\ninterface DebugResult {\n /** Whether debug visuals should be shown */\n isShown: boolean\n /** Whether debug features exist but are hidden */\n isHidden: boolean\n /** Whether debug features are disabled */\n isNone: boolean\n /** Current debugging mode */\n debugging: DebuggingMode | undefined\n}\n\n/**\n * Hook for managing component debug state and visibility.\n *\n * @remarks\n * Determines the active debugging mode by:\n * - Using prop value if provided\n * - Falling back to config value if prop is undefined\n * - Computing visibility states based on active mode\n *\n * This hook helps components:\n * - Control debug visual rendering\n * - Manage debug feature states\n * - Handle prop/config inheritance\n *\n * @param debuggingProp - Optional debugging mode from props\n * @param debuggingConfig - Debugging mode from theme/config\n * @returns Debug state information\n *\n * @example\n * ```tsx\n * function DebugComponent({ debugging: debugProp }) {\n * const { isShown, isHidden, isNone } = useDebug(\n * debugProp,\n * 'hidden' // Default from config\n * );\n *\n * return (\n * <div>\n * {isShown && <DebugOverlay />}\n * {!isNone && <DebugFeatures />}\n * <Content />\n * </div>\n * );\n * }\n * ```\n */\nexport function useDebug(\n debuggingProp?: DebuggingMode,\n debuggingConfig?: DebuggingMode\n): DebugResult {\n return useMemo(() => {\n const effective = debuggingProp ?? debuggingConfig\n return {\n isShown: effective === 'visible',\n isHidden: effective === 'hidden',\n isNone: effective === 'none',\n debugging: effective,\n }\n }, [debuggingProp, debuggingConfig])\n}\n","import * as React from 'react'\nimport { ComponentsProps } from '@components'\nimport { useConfig, useDebug, useVirtual, useMeasure } from '@hooks'\nimport {\n parsePadding,\n normalizeValuePair,\n mergeStyles,\n mergeClasses,\n calculateRowCount,\n formatValue,\n createStyleOverride,\n ClientOnly,\n} from '@utils'\nimport { Variant } from '../types'\nimport styles from './styles.module.css'\n\nexport type BaselineVariant = Exclude<Variant, 'pattern'>\n\nexport type BaselineProps = {\n /** Visual style variant for the baseline guides */\n variant?: BaselineVariant\n /** Explicit width for the overlay (e.g., \"1200px\" or 1200) */\n width?: number | string\n /** Explicit height for the overlay (e.g., \"100vh\" or 800) */\n height?: number | string\n /** Base unit for measurements (defaults to theme value) */\n base?: number\n /** Color override for grid lines */\n color?: string\n /** Flag to enable SSR-compatible mode (simplified initial render) */\n ssrMode?: boolean\n} & ComponentsProps\n\n/** Creates default baseline styles */\nconst createDefaultBaselineStyles = (\n base: number,\n lineColor: string,\n flatColor: string\n): Record<string, string> => ({\n '--bkbw': '100%',\n '--bkbh': '100%',\n '--bkbb': `${base}px`,\n '--bkbcl': lineColor,\n '--bkbcf': flatColor,\n})\n\n/** Create row styles for baseline lines */\ntype RowStyleParams = {\n /** Row index */\n index: number\n /** Base unit for calculations */\n base: number\n /** Baseline visual variant */\n variant: BaselineVariant\n /** Selected color for the baseline */\n chosenColor: string\n /** Theme line color */\n lineColor: string\n /** Theme flat color */\n flatColor: string\n}\n\n/**\n * Creates styles for an individual baseline row.\n * Applies positioning and visual styling based on variant.\n */\nconst createBaselineRowStyle = (\n params: RowStyleParams\n): React.CSSProperties => {\n const { index, base, variant, chosenColor, lineColor, flatColor } = params\n\n // Directly set the CSS variables instead of using createStyleOverride\n return {\n '--bkrt': index === 0 ? '0px' : `${index * base}px`,\n '--bkrh': variant === 'line' ? '1px' : `${base}px`,\n '--bkbc': chosenColor || (variant === 'line' ? lineColor : flatColor),\n } as React.CSSProperties\n}\n\n// Implementation component that only renders on the client side\nconst BaselineImpl = React.memo(function BaselineImpl({\n className,\n debugging,\n style,\n variant,\n height: heightProp,\n width: widthProp,\n base,\n color: colorProp,\n ssrMode: _ssrMode = false,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const { isShown } = useDebug(debugging, config.debugging)\n\n // Use a stable reference that won't cause hydration mismatches\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n\n // Always call hooks, but conditionally use their results\n const {\n width: containerWidth,\n height: containerHeight,\n refresh,\n } = useMeasure(containerRef)\n\n // Effect for handling window resize events\n React.useEffect(() => {\n const handleResize = () => {\n refresh()\n }\n\n window.addEventListener('resize', handleResize)\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }, [refresh])\n\n const [_normWidth, normHeight] = React.useMemo(() => {\n return normalizeValuePair(\n [widthProp, heightProp],\n [containerWidth, containerHeight]\n )\n }, [widthProp, heightProp, containerWidth, containerHeight])\n\n const { top, right, bottom, left } = React.useMemo(\n () => parsePadding(spacingProps),\n [spacingProps]\n )\n\n const padding = React.useMemo(() => {\n const paddingValues = [top, right, bottom, left]\n .map((value) => (value ? `${value}px` : '0'))\n .join(' ')\n\n return paddingValues !== '0 0 0 0' ? paddingValues : undefined\n }, [top, right, bottom, left])\n\n const rowCount = React.useMemo(() => {\n const baseValue = base || config.base\n return calculateRowCount({\n height: normHeight,\n top,\n bottom,\n base: baseValue,\n })\n }, [normHeight, top, bottom, base, config.base])\n\n // Use virtual rendering for performance\n const { start, end } = useVirtual({\n totalLines: rowCount,\n lineHeight: base || config.base,\n containerRef,\n buffer: 160,\n })\n\n const chosenColor =\n colorProp || (variant === 'line' ? config.colors.line : config.colors.flat)\n\n // Create default baseline styles\n const defaultBaselineStyles = React.useMemo(\n () =>\n createDefaultBaselineStyles(\n base || config.base,\n config.colors.line,\n config.colors.flat\n ),\n [base, config.colors.line, config.colors.flat, config.base]\n )\n\n const containerStyles = React.useMemo(() => {\n const widthValue = formatValue(widthProp || '100%')\n const heightValue = formatValue(heightProp || '100%')\n\n // Define dimensions that should be skipped when set to 100%\n const dimensionVars = ['--bkbw', '--bkbh']\n\n return mergeStyles(\n {\n ...createStyleOverride({\n key: '--bkbw',\n value: widthValue,\n defaultStyles: defaultBaselineStyles,\n skipDimensions: { fullSize: dimensionVars },\n }),\n ...createStyleOverride({\n key: '--bkbh',\n value: heightValue,\n defaultStyles: defaultBaselineStyles,\n skipDimensions: { fullSize: dimensionVars },\n }),\n ...createStyleOverride({\n key: '--bkbb',\n value: `${base}px`,\n defaultStyles: defaultBaselineStyles,\n }),\n ...createStyleOverride({\n key: '--bkbcl',\n value: colorProp || config.colors.line,\n defaultStyles: defaultBaselineStyles,\n }),\n ...createStyleOverride({\n key: '--bkbcf',\n value: colorProp || config.colors.flat,\n defaultStyles: defaultBaselineStyles,\n }),\n ...(padding && { padding }),\n } as React.CSSProperties,\n style\n )\n }, [\n widthProp,\n heightProp,\n base,\n colorProp,\n config.colors.line,\n config.colors.flat,\n padding,\n defaultBaselineStyles,\n style,\n ])\n\n const getRowStyle = React.useCallback(\n (index: number) => {\n // Ensure variant is a BaselineVariant\n const safeVariant = variant as BaselineVariant\n const safeBase = base || config.base\n\n return createBaselineRowStyle({\n index,\n base: safeBase,\n variant: safeVariant,\n chosenColor,\n lineColor: config.colors.line,\n flatColor: config.colors.flat,\n })\n },\n [\n base,\n variant,\n chosenColor,\n config.colors.line,\n config.colors.flat,\n config.base,\n ]\n )\n\n return (\n <div\n ref={containerRef}\n data-testid=\"baseline\"\n className={mergeClasses(\n styles.bas,\n isShown ? styles.v : styles.h,\n className\n )}\n style={containerStyles}\n {...spacingProps}\n >\n {isShown &&\n Array.from({ length: end - start }, (_, i) => {\n const rowIndex = i + start\n return (\n <div\n className={styles.row}\n key={rowIndex}\n data-row-index={rowIndex}\n style={getRowStyle(rowIndex)}\n />\n )\n })}\n </div>\n )\n})\n\n/**\n * Renders horizontal guidelines for maintaining vertical rhythm and baseline alignment.\n *\n * @remarks\n * Baseline provides horizontal guides that:\n * - Help maintain consistent vertical spacing\n * - Support visual verification of baseline alignment\n * - Optimize performance through virtual rendering\n * - Adapt to container dimensions\n *\n * @example\n * ```tsx\n * // Basic baseline overlay\n * <Baseline\n * height=\"100vh\"\n * base={8}\n * debugging=\"visible\"\n * />\n *\n * // Custom variant with padding\n * <Baseline\n * variant=\"flat\"\n * height=\"100vh\"\n * base={4}\n * block={[16, 0]}\n * debugging=\"visible\"\n * />\n * ```\n */\nexport const Baseline = React.memo(function Baseline({\n className,\n debugging,\n style,\n variant: variantProp,\n height: heightProp,\n width: widthProp,\n base: baseProp,\n color: colorProp,\n ssrMode = false,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n const { isShown } = useDebug(debugging, config.debugging)\n\n // If debugging isn't enabled, render a hidden element\n // This ensures tests can find the element even when hidden\n if (!isShown) {\n return (\n <div\n className={mergeClasses(styles.b, styles.h, className)}\n style={style}\n data-testid=\"baseline\"\n {...spacingProps}\n />\n )\n }\n\n // Create a simple SSR fallback\n const ssrFallback = (\n <div\n className={mergeClasses(styles.b, styles.h, styles.ssr, className)}\n style={{\n width: widthProp || '100%',\n height: heightProp || '100%',\n ...style,\n }}\n data-testid=\"baseline\"\n />\n )\n\n // Wrap the actual implementation in ClientOnly\n return (\n <ClientOnly fallback={ssrFallback}>\n <BaselineImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n height={heightProp}\n width={widthProp}\n base={base}\n color={colorProp}\n ssrMode={ssrMode}\n {...spacingProps}\n />\n </ClientOnly>\n )\n})\n"],"names":["GUIDE_COLORS","BASELINE_COLORS","SPACER_COLORS","BOX_COLORS","STACK_COLORS","LAYOUT_COLORS","PADDER_COLOR","DEFAULT_CONFIG","ConfigContext","React","useDefaultConfig","mergeConfig","params","parentConfig","base","baseline","guide","spacer","box","stack","layout","padder","Config","children","value","jsx","parseUnit","match","num","unit","formatValue","defaultValue","DEFAULT_CONTEXT","ABSOLUTE_UNIT_CONVERSIONS","RELATIVE_UNITS","convertValue","context","parsed","ctx","clamp","min","max","calculateRowCount","height","top","bottom","totalHeight","normalizeValue","options","doRound","clampOptions","suppressWarnings","conv","normalized","clamped","normalizeValuePair","values","defaults","first","second","parsePadding","spacing","parsePaddingValue","blockEdges","parseBlock","inlineEdges","parseInline","padding","block","inline","right","left","calculateSnappedSpacing","initial","snapping","pad","remainder","createGridSpanStyles","span","colSpan","rowSpan","gridStyles","mergeClasses","classes","mergeStyles","styles","style","assignRef","ref","node","error","mergeRefs","refs","createStyleOverride","defaultStyles","key","val","skipDimensions","_a","_b","_c","rafThrottle","fn","rafId","lastArgs","args","useIsClient","isClient","setIsClient","useState","useEffect","isSSR","safeClientValue","clientFn","fallback","hydratedValue","isHydrated","ssrValue","dynamicValue","ClientOnly","useMeasure","dimensions","setDimensions","measure","rect","next","prev","refresh","observer","useVirtual","totalLines","lineHeight","containerRef","buffer","numericBuffer","useMemo","calculateRange","useCallback","element","offsetTop","viewportTop","viewportBottom","start","end","visibleRange","setVisibleRange","useWindowEvents","updateRangeThrottled","updateRange","useLayoutEffect","events","handler","stableHandler","wrappedHandler","evt","useBaseline","warnOnMisalignment","didSnapRef","hasWarnedRef","initialPadding","isAligned","finalPadding","createDefaultSpacerStyles","textColor","flatColor","lineColor","generateMeasurements","isShown","indicatorNode","normWidth","normHeight","width","jsxs","Fragment","Spacer","heightProp","widthProp","debuggingProp","variantProp","baseProp","colorProp","className","ssrMode","props","config","useConfig","useDebug","variant","setIsHydrated","shouldShowMeasurements","measurements","baseStyles","heightValue","widthValue","baseValue","dimensionVars","customStyles","createPadderContainerStyles","color","stylesObj","createDirectPaddingStyles","enableSpacers","createRenderSpacerFn","debugging","safeVariant","safeDebugging","SpacerElement","widthVal","heightVal","Padder","spacingProps","isNone","internalRef","baselinePadding","stablePadding","setRefs","containerStyles","paddingStyles","renderSpacer","createDefaultLayoutStyles","colors","getGridTemplate","prop","p","createGridGapStyles","gap","rowGap","columnGap","Layout","alignContent","alignItems","columns","justifyContent","justifyItems","rows","layoutRef","gridTemplateColumns","gridTemplateRows","defaultLayoutStyles","gridGapStyles","autoDimensions","createDefaultBoxStyles","createBoxCustomStyles","Box","gridSpanStyles","defaultBoxStyles","boxStyles","DIRECTION_AXIS","createDefaultStackStyles","createStackGapStyles","Stack","align","direction","justify","stackRef","stackGapStyles","formattedRowGap","formattedColumnGap","formattedGap","defaultStackStyles","flexDirection","customOverrides","mergedContainerStyles","createGridConfig","columnWidth","parsedColumns","createDefaultGuideStyles","Guide","gapProp","maxWidth","ssrFallback","GuideImpl","_ssrMode","containerWidth","containerHeight","handleResize","gridConfig","safeGap","template","columnsCount","calculatedGap","useGuide","maxWidthValue","columnWidthValue","handleGapCalculations","finalGap","actualGapWithLine","containerWidthValue","columnCount","_","i","colColor","UNIT_PATTERN","isValidGuideColumnValue","isValidGuidePattern","pattern","columnsArr","col","colCount","colWidth","colWidthStr","pxVal","component","defaultConfig","debuggingConfig","effective","createDefaultBaselineStyles","createBaselineRowStyle","index","chosenColor","BaselineImpl","_normWidth","paddingValues","rowCount","defaultBaselineStyles","getRowStyle","safeBase","rowIndex","Baseline"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../packages/react/src/components/Config/Config.tsx","../packages/dom/src/timing.ts","../packages/dom/src/measure.ts","../packages/react/src/hooks/useMeasure.ts","../packages/dom/src/virtual.ts","../packages/react/src/hooks/useVirtual.ts","../packages/react/src/hooks/useBaseline.ts","../packages/dom/src/viewport.ts","../packages/react/src/hooks/useGuide.ts","../packages/react/src/hooks/useConfig.ts","../packages/react/src/hooks/useDebug.ts","../packages/react/src/hooks/useIsClient.ts","../packages/react/src/utils/ssr.tsx","../packages/react/src/utils/merge.ts","../packages/react/src/components/Baseline/styles.module.css","../packages/react/src/components/Baseline/Baseline.tsx","../packages/react/src/components/Guide/styles.module.css","../packages/react/src/components/Guide/Guide.tsx","../packages/dom/src/ssr.ts","../packages/react/src/components/Spacer/styles.module.css","../packages/react/src/components/Spacer/Spacer.tsx","../packages/react/src/components/Padder/styles.module.css","../packages/react/src/components/Padder/Padder.tsx","../packages/react/src/components/Box/styles.module.css","../packages/react/src/components/Box/Box.tsx"],"sourcesContent":["import * as React from 'react'\nimport type { ConfigSchema } from '@baseline-kit/core/config/schema'\nimport { DEFAULT_CONFIG } from '@baseline-kit/core/config/defaults'\nimport {\n mergeConfig,\n createCSSVariables,\n} from '@baseline-kit/core/config/merge'\n\n// Re-export types that consumers need\nexport type { DebuggingMode } from '@baseline-kit/core/types'\nexport type { ConfigSchema } from '@baseline-kit/core/config/schema'\n\n// Create the context\nconst ConfigContext = React.createContext<ConfigSchema>(DEFAULT_CONFIG)\nConfigContext.displayName = 'ConfigContext'\n\n// Update to use React 19's use hook instead of useContext\nexport const useDefaultConfig = () => React.use(ConfigContext)\n\ntype ConfigProps = {\n children: React.ReactNode\n base?: number\n baseline?: Partial<ConfigSchema['baseline']>\n guide?: Partial<ConfigSchema['guide']>\n spacer?: Partial<ConfigSchema['spacer']>\n box?: Partial<ConfigSchema['box']>\n padder?: Partial<ConfigSchema['padder']>\n}\n\n/**\n * Configuration provider for baseline-kit components.\n */\nexport function Config({\n children,\n base,\n baseline,\n guide,\n spacer,\n box,\n padder,\n}: ConfigProps) {\n const parentConfig = useDefaultConfig()\n\n const value = React.useMemo(() => {\n return mergeConfig({\n parentConfig,\n base,\n baseline,\n guide,\n spacer,\n box,\n padder,\n })\n }, [parentConfig, base, baseline, guide, spacer, box, padder])\n\n return <ConfigContext value={value}>{children}</ConfigContext>\n}\n\n// Re-export createCSSVariables and mergeConfig for consumers\nexport { createCSSVariables, mergeConfig }\n","export const debounce = <T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): [T, () => void] => {\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const cancel = () => {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n }\n\n const debounced = ((...args) => {\n cancel()\n timer = setTimeout(() => fn(...args), delay)\n }) as T\n\n return [debounced, cancel]\n}\n\nexport const rafThrottle = <T extends (...args: never[]) => void>(\n fn: T\n): [T, () => void] => {\n let rafId: number | null = null\n let lastArgs: Parameters<T> | null = null\n\n const cancel = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n lastArgs = null\n }\n }\n\n const throttled = (...args: Parameters<T>) => {\n lastArgs = args\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n\n rafId = requestAnimationFrame(() => {\n fn(...lastArgs!)\n rafId = null\n lastArgs = null\n })\n }\n\n return [throttled as T, cancel]\n}\n","/**\n * Element measurement observer.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface MeasureRect {\n width: number\n height: number\n}\n\nexport interface MeasureObserverHandle {\n /** Force an immediate re-measure */\n refresh(): void\n /** Stop observing */\n disconnect(): void\n}\n\n/**\n * Observes an element's dimensions via ResizeObserver.\n * Calls `onChange` with rounded width/height whenever the size changes.\n */\nexport function createMeasureObserver(\n el: Element,\n onChange: (rect: MeasureRect) => void\n): MeasureObserverHandle {\n let prev: MeasureRect = { width: 0, height: 0 }\n\n const measure = () => {\n try {\n const rect = el.getBoundingClientRect()\n const next: MeasureRect = {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n }\n if (next.width !== prev.width || next.height !== prev.height) {\n prev = next\n onChange(next)\n }\n } catch {\n // element may have been removed\n }\n }\n\n const [throttledMeasure, cancelMeasure] = rafThrottle(measure)\n\n // Initial measurement\n measure()\n\n const observer = new ResizeObserver(throttledMeasure)\n observer.observe(el)\n\n return {\n refresh: throttledMeasure,\n disconnect() {\n observer.disconnect()\n cancelMeasure()\n },\n }\n}\n","import * as React from 'react'\nimport { createMeasureObserver } from '@baseline-kit/dom/measure'\nimport type { MeasureRect } from '@baseline-kit/dom/measure'\n\nexport interface MeasureResult extends MeasureRect {\n refresh: () => void\n}\n\nconst ZERO: MeasureRect = { width: 0, height: 0 }\n\n/**\n * Hook for measuring and tracking DOM element dimensions.\n * Thin wrapper around the imperative createMeasureObserver from @baseline-kit/dom.\n */\nexport function useMeasure(\n ref: React.RefObject<HTMLElement | null>\n): MeasureResult {\n const [dimensions, setDimensions] = React.useState<MeasureRect>(ZERO)\n const handleRef = React.useRef<ReturnType<\n typeof createMeasureObserver\n > | null>(null)\n\n React.useLayoutEffect(() => {\n if (typeof window === 'undefined' || !ref.current) return\n\n const handle = createMeasureObserver(ref.current, (rect) => {\n setDimensions((prev) =>\n prev.width === rect.width && prev.height === rect.height ? prev : rect\n )\n })\n handleRef.current = handle\n\n return () => {\n handle.disconnect()\n handleRef.current = null\n }\n }, [ref])\n\n const refresh = React.useCallback(() => {\n handleRef.current?.refresh()\n }, [])\n\n return { ...dimensions, refresh }\n}\n","/**\n * Virtual scroll range tracker.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface VirtualRange {\n start: number\n end: number\n}\n\nexport interface VirtualTrackerOptions {\n totalItems: number\n itemHeight: number\n buffer?: number\n}\n\nexport interface VirtualTrackerHandle {\n /** Force recalculation */\n refresh(): void\n /** Stop tracking */\n disconnect(): void\n}\n\n/**\n * Tracks which slice of a virtual list is visible in the viewport.\n * Uses IntersectionObserver + window scroll/resize events.\n */\nexport function createVirtualTracker(\n el: Element,\n options: VirtualTrackerOptions,\n onChange: (range: VirtualRange) => void\n): VirtualTrackerHandle {\n const { totalItems, itemHeight, buffer = 0 } = options\n\n if (!Number.isFinite(itemHeight) || itemHeight <= 0) {\n throw new Error(\n 'createVirtualTracker requires itemHeight to be greater than 0'\n )\n }\n\n if (!Number.isFinite(totalItems) || totalItems < 0) {\n throw new Error(\n 'createVirtualTracker requires totalItems to be 0 or greater'\n )\n }\n\n const calculateRange = (): VirtualRange => {\n const rect = el.getBoundingClientRect()\n const offsetTop = rect.top + window.scrollY\n const viewportTop = Math.max(0, window.scrollY - offsetTop - buffer)\n const viewportBottom = viewportTop + window.innerHeight + buffer * 2\n\n const start = Math.max(0, Math.floor(viewportTop / itemHeight))\n const end = Math.min(totalItems, Math.ceil(viewportBottom / itemHeight))\n return { start, end }\n }\n\n let prev: VirtualRange = { start: 0, end: totalItems }\n\n const update = () => {\n const next = calculateRange()\n if (next.start !== prev.start || next.end !== prev.end) {\n prev = next\n onChange(next)\n }\n }\n\n const [throttledUpdate, cancelUpdate] = rafThrottle(update)\n\n const listenerOptions: AddEventListenerOptions = { passive: true }\n\n window.addEventListener('scroll', throttledUpdate, listenerOptions)\n window.addEventListener('resize', throttledUpdate, listenerOptions)\n\n const intersectionObserver = new IntersectionObserver(throttledUpdate, {\n threshold: 0,\n })\n intersectionObserver.observe(el)\n\n throttledUpdate()\n\n return {\n refresh: throttledUpdate,\n disconnect() {\n window.removeEventListener('scroll', throttledUpdate, listenerOptions)\n window.removeEventListener('resize', throttledUpdate, listenerOptions)\n intersectionObserver.disconnect()\n cancelUpdate()\n },\n }\n}\n","import { RefObject, useCallback, useLayoutEffect, useState } from 'react'\nimport { createVirtualTracker } from '@baseline-kit/dom/virtual'\nimport type { VirtualRange } from '@baseline-kit/dom/virtual'\n\ntype VirtualOptions = {\n totalLines: number\n lineHeight: number\n containerRef: RefObject<HTMLDivElement | null>\n buffer?: number | string\n}\n\n/**\n * Hook for optimizing large lists through virtual scrolling.\n * Thin wrapper around the imperative createVirtualTracker from @baseline-kit/dom.\n */\nexport function useVirtual({\n totalLines,\n lineHeight,\n containerRef,\n buffer = 0,\n}: VirtualOptions) {\n const numericBuffer =\n typeof buffer === 'number' ? buffer : parseInt(buffer, 10) || 0\n\n const [visibleRange, setVisibleRange] = useState<VirtualRange>({\n start: 0,\n end: totalLines,\n })\n\n const updateRange = useCallback((range: VirtualRange) => {\n setVisibleRange((prev) =>\n prev.start === range.start && prev.end === range.end ? prev : range\n )\n }, [])\n\n useLayoutEffect(() => {\n if (!containerRef.current) return\n\n const handle = createVirtualTracker(\n containerRef.current,\n { totalItems: totalLines, itemHeight: lineHeight, buffer: numericBuffer },\n updateRange\n )\n\n return () => handle.disconnect()\n }, [containerRef, totalLines, lineHeight, numericBuffer, updateRange])\n\n return visibleRange\n}\n","import * as React from 'react'\nimport type { SnappingMode, Padding } from '@baseline-kit/core'\nimport { parsePadding, calculateSnappedSpacing } from '@baseline-kit/core'\nimport { useMeasure } from './useMeasure'\n\nexport interface BaselineOptions {\n base?: number\n snapping?: SnappingMode\n spacing?: Partial<Padding> | number\n}\n\nexport interface BaselineResult {\n padding: Padding\n isAligned: boolean\n height: number\n}\n\n/**\n * Hook for managing baseline grid alignment in components.\n *\n * Snapping notes\n * --------------\n * `clamp` mode would oscillate without a latch: each snap tweaks the\n * element's padding which changes its measured height, which would\n * trigger another snap, and so on. We snap exactly once per mount on\n * the *first non-zero* measurement, then keep returning the snapped\n * padding for the rest of the element's life. Resizes after the first\n * snap intentionally do not re-snap (avoids visual jitter and the\n * `clamp` oscillation).\n */\nexport function useBaseline(\n ref: React.RefObject<HTMLElement | null>,\n { base = 8, snapping = 'none', spacing = {} }: BaselineOptions = {}\n): BaselineResult {\n if (base < 1) {\n throw new Error('Base must be >= 1 for baseline alignment.')\n }\n\n const { height } = useMeasure(ref)\n const snappedPaddingRef = React.useRef<Padding | null>(null)\n\n return React.useMemo(() => {\n const initialPadding = parsePadding({ padding: spacing })\n const isAligned = height % base === 0\n\n if (snapping === 'none') {\n return { padding: initialPadding, isAligned, height }\n }\n\n // Reuse the cached snap on subsequent renders.\n if (snappedPaddingRef.current) {\n return { padding: snappedPaddingRef.current, isAligned, height }\n }\n\n // Wait for a real measurement before snapping. Without this guard\n // the very first render (height = 0, before useMeasure settles)\n // would compute a no-op snap and prematurely poison the cache,\n // making real measurements never get snapped.\n if (height === 0) {\n return { padding: initialPadding, isAligned, height }\n }\n\n const finalPadding = calculateSnappedSpacing(\n height,\n base,\n initialPadding,\n snapping\n )\n snappedPaddingRef.current = finalPadding\n\n return { padding: finalPadding, isAligned, height }\n }, [base, snapping, spacing, height])\n}\n","import type { ConversionContext } from '@baseline-kit/core'\n\n/**\n * Returns the current browser viewport for vw/vh/vmin/vmax conversion.\n * Returns an empty object on the server so callers fall back to the\n * core defaults without crashing.\n */\nexport function getViewportContext(): Partial<ConversionContext> {\n if (typeof window === 'undefined') return {}\n return {\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n }\n}\n","import * as React from 'react'\nimport type { GuideConfig } from '@baseline-kit/core/types'\nimport { calculateGuideTemplate } from '@baseline-kit/core/utils/grid'\nimport { getViewportContext } from '@baseline-kit/dom/viewport'\nimport { useMeasure } from './useMeasure'\n\nexport type { GuideResult } from '@baseline-kit/core/utils/grid'\n\n/**\n * Hook for calculating grid layout parameters based on container dimensions.\n */\nexport function useGuide(\n ref: React.RefObject<HTMLElement | null>,\n config: GuideConfig\n) {\n const { width } = useMeasure(ref)\n return React.useMemo(\n () => calculateGuideTemplate(width, config, getViewportContext()),\n [config, width]\n )\n}\n","import { useMemo } from 'react'\nimport type { ConfigSchema } from '@baseline-kit/core/config/schema'\nimport { useDefaultConfig } from '../components/Config/Config'\n\n/** Type helper that merges base configuration with component-specific settings. */\nexport type ComponentConfig<K extends keyof ConfigSchema> = ConfigSchema[K] & {\n base: number\n}\n\n/**\n * Hook for accessing component-specific theme configuration.\n */\nexport function useConfig<K extends keyof ConfigSchema>(\n component: K\n): ComponentConfig<K> {\n const defaultConfig = useDefaultConfig()\n return useMemo(() => {\n return Object.assign(\n { base: defaultConfig.base },\n defaultConfig[component]\n ) as ComponentConfig<K>\n }, [defaultConfig, component])\n}\n","import { useMemo } from 'react'\nimport { resolveDebugState } from '@baseline-kit/core/utils/merge'\nimport type { DebuggingMode } from '@baseline-kit/core/types'\n\n/**\n * Hook for managing component debug state and visibility.\n * Delegates to pure resolveDebugState in core.\n */\nexport function useDebug(\n debuggingProp?: DebuggingMode,\n debuggingConfig?: DebuggingMode\n) {\n return useMemo(\n () => resolveDebugState(debuggingProp, debuggingConfig),\n [debuggingProp, debuggingConfig]\n )\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Hook to determine if the code is running on the client side.\n */\nexport function useIsClient() {\n const [isClient, setIsClient] = useState(false)\n\n useEffect(() => {\n setIsClient(true)\n }, [])\n\n return isClient\n}\n","/**\n * React-specific SSR utilities (ClientOnly component)\n */\nimport * as React from 'react'\nimport { useIsClient } from '../hooks/useIsClient'\n\ninterface ClientOnlyProps {\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\n/**\n * A utility component that only renders its children on the client side.\n * @internal Not part of the public API\n */\nexport function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\n const isClient = useIsClient()\n\n if (!isClient) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n","import * as React from 'react'\n\n/**\n * Combines descriptor style records and React style objects.\n * Accepts Record<string, string> from descriptors and React.CSSProperties.\n */\nexport function mergeStyles(\n ...styles: Array<Record<string, string> | React.CSSProperties | undefined>\n): React.CSSProperties {\n return Object.assign({}, ...styles.filter(Boolean))\n}\n\n/**\n * Merges multiple React refs into a single callback ref.\n */\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | null | undefined>\n): React.RefCallback<T> {\n return (node: T | null) => {\n refs.forEach((ref) => {\n if (!ref) return\n if (typeof ref === 'function') {\n ref(node)\n } else {\n Object.assign(ref, { current: node })\n }\n })\n }\n}\n",".bas {\n position: absolute;\n inset: 0;\n pointer-events: none;\n width: var(--bkbl-w);\n height: var(--bkbl-h);\n overflow: hidden;\n contain: layout style paint;\n}\n\n.v {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear;\n}\n\n.h {\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear 180ms;\n}\n\n.row {\n left: 0;\n right: 0;\n position: absolute;\n top: var(--bkbl-rt);\n height: var(--bkbl-rh);\n background-color: var(--bkbl-c);\n}\n\n/* Style for SSR rendering */\n.ssr {\n box-sizing: border-box;\n display: grid;\n position: relative;\n z-index: 1;\n pointer-events: none;\n}\n","import * as React from 'react'\nimport { ComponentsProps } from '../types'\nimport { useConfig, useDebug, useVirtual, useMeasure } from '../../hooks'\nimport { cx, createBaselineDescriptor } from '@baseline-kit/core'\nimport type { BaselineVariant } from '@baseline-kit/core'\nimport { ClientOnly } from '../../utils/ssr'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type { BaselineVariant }\n\nexport type BaselineProps = {\n variant?: BaselineVariant\n width?: number | string\n height?: number | string\n base?: number\n color?: string\n ssrMode?: boolean\n} & ComponentsProps\n\nconst BaselineImpl = React.memo(function BaselineImpl({\n className,\n debugging,\n style,\n variant,\n height: heightProp,\n width: widthProp,\n base,\n color: colorProp,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const { isShown } = useDebug(debugging, config.debugging)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const { width: containerWidth, height: containerHeight } =\n useMeasure(containerRef)\n\n const resolvedBase = base || config.base\n\n const descriptor = React.useMemo(\n () =>\n createBaselineDescriptor({\n base: resolvedBase,\n colors: config.colors,\n variant: (variant as BaselineVariant) ?? config.variant,\n width: widthProp,\n height: heightProp,\n color: colorProp,\n containerWidth,\n containerHeight,\n spacing: spacingProps,\n isVisible: isShown,\n }),\n [\n resolvedBase,\n config.colors,\n config.variant,\n variant,\n widthProp,\n heightProp,\n colorProp,\n containerWidth,\n containerHeight,\n spacingProps,\n isShown,\n ]\n )\n\n const { start, end } = useVirtual({\n totalLines: descriptor.rowCount,\n lineHeight: resolvedBase,\n containerRef,\n buffer: 160,\n })\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n return (\n <div\n ref={containerRef}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n style={containerStyles}\n {...spacingProps}\n >\n {isShown &&\n Array.from({ length: end - start }, (_, i) => {\n const rowIndex = i + start\n return (\n <div\n className={styles.row}\n key={rowIndex}\n data-row-index={rowIndex}\n style={descriptor.getRowStyle(rowIndex)}\n />\n )\n })}\n </div>\n )\n})\n\nexport const Baseline = React.memo(function Baseline({\n className,\n debugging,\n style,\n variant: variantProp,\n height: heightProp,\n width: widthProp,\n base: baseProp,\n color: colorProp,\n ssrMode = false,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n const { isShown } = useDebug(debugging, config.debugging)\n\n if (!isShown) {\n return (\n <div\n className={cx(styles.bas, styles.h, className)}\n style={style}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n {...spacingProps}\n />\n )\n }\n\n const ssrFallback = (\n <div\n className={cx(styles.bas, styles.h, styles.ssr, className)}\n style={{\n width: widthProp ?? '100%',\n height: heightProp ?? '100%',\n ...style,\n }}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n />\n )\n\n if (ssrMode) {\n return ssrFallback\n }\n\n return (\n <ClientOnly fallback={ssrFallback}>\n <BaselineImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n height={heightProp}\n width={widthProp}\n base={base}\n color={colorProp}\n {...spacingProps}\n />\n </ClientOnly>\n )\n})\n",".gde {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n width: var(--bkgd-w, 100%);\n height: var(--bkgd-h, 100%);\n max-width: var(--bkgd-mw, none);\n margin-inline: auto;\n pointer-events: none;\n padding: var(--bkgd-pb, 0) var(--bkgd-pi, 0);\n}\n\n.v {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear;\n}\n\n.h {\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear 180ms;\n}\n\n.line {\n left: -0.5px; /* Alignment correction for line variant */\n}\n\n.cols {\n position: absolute;\n inset: 0;\n display: grid;\n column-gap: var(--bkgd-g);\n grid-template-rows: 1fr;\n grid-template-columns: var(--bkgd-t);\n justify-content: var(--bkgd-j);\n width: var(--bk-wf);\n height: var(--bk-hf);\n overflow: hidden;\n contain: layout style paint;\n}\n\n.col {\n min-width: 0;\n width: var(--bk-wf);\n height: var(--bk-hf);\n}\n\n/* Variant-specific styles */\n.col[data-variant='line'] {\n width: 1px;\n background-color: var(--bkgd-cl);\n}\n\n.cols[data-variant='line'] {\n display: block;\n background-image: repeating-linear-gradient(\n to right,\n var(--bkgd-line-color, var(--bkgd-cl)) 0 1px,\n transparent 1px var(--bkgd-line-period, 1px)\n );\n}\n\n.col[data-variant='pattern'] {\n background-color: var(--bkgd-cp);\n}\n\n.col[data-variant='auto'] {\n background-color: var(--bkgd-ca);\n overflow: hidden;\n}\n\n.col[data-variant='fixed'] {\n background-color: var(--bkgd-cf);\n}\n\n/* Style for SSR rendering */\n.ssr {\n box-sizing: border-box;\n display: grid;\n position: relative;\n z-index: 1;\n pointer-events: none;\n min-height: 100px; /* Ensures a minimum height during SSR */\n}\n","import * as React from 'react'\nimport type { ComponentsProps } from '../types'\nimport { useConfig } from '../../hooks/useConfig'\nimport { useDebug } from '../../hooks/useDebug'\nimport { useMeasure } from '../../hooks/useMeasure'\nimport { useGuide } from '../../hooks/useGuide'\nimport { cx } from '@baseline-kit/core/utils/merge'\nimport {\n createGuideDescriptor,\n createGuideConfig,\n} from '@baseline-kit/core/descriptors/guide'\nimport type { GuideVariant, GuideConfig } from '@baseline-kit/core/types'\nimport { ClientOnly } from '../../utils/ssr'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type { GuideConfig }\n\nexport type GuideProps = {\n align?: React.CSSProperties['justifyContent']\n variant?: GuideVariant\n columns?: number | readonly (string | number | undefined | 'auto')[]\n columnWidth?: React.CSSProperties['width']\n maxWidth?: React.CSSProperties['maxWidth']\n color?: React.CSSProperties['color']\n children?: React.ReactNode\n gap?: number\n ssrMode?: boolean\n} & ComponentsProps &\n Omit<GuideConfig, 'columns' | 'columnWidth' | 'gap'>\n\nexport const Guide = React.memo(function Guide({\n className,\n debugging,\n style,\n variant: variantProp,\n align = 'center',\n gap: gapProp,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ssrMode = false,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const variant = variantProp ?? config.variant\n const gap = typeof gapProp === 'number' ? gapProp : 0\n const { isShown } = useDebug(debugging, config.debugging)\n\n if (!isShown) {\n return (\n <div\n className={cx(styles.gde, styles.h, className)}\n style={style}\n data-testid=\"guide\"\n data-variant={variant}\n aria-hidden=\"true\"\n {...props}\n >\n {children}\n </div>\n )\n }\n\n const ssrFallback = (\n <div\n className={cx(styles.gde, styles.h, styles.ssr, className)}\n style={{\n width: width ?? '100%',\n height: height ?? '100%',\n maxWidth: maxWidth ?? 'none',\n ...style,\n }}\n data-testid=\"guide\"\n data-variant={variant}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n )\n\n if (ssrMode) {\n return ssrFallback\n }\n\n return (\n <ClientOnly fallback={ssrFallback}>\n <GuideImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n align={align}\n gap={gap}\n height={height}\n width={width}\n columns={columns}\n columnWidth={columnWidth}\n maxWidth={maxWidth}\n color={color}\n {...props}\n >\n {children}\n </GuideImpl>\n </ClientOnly>\n )\n})\n\nconst GuideImpl = React.memo(function GuideImpl({\n className,\n debugging,\n style,\n variant,\n align = 'center',\n gap,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const { isShown } = useDebug(debugging, config.debugging)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n useMeasure(containerRef)\n\n const resolvedVariant = (variant ?? config.variant) as GuideVariant\n const resolvedGap = typeof gap === 'number' ? gap : 0\n\n const gridConfig = React.useMemo(\n () =>\n createGuideConfig({\n variant: resolvedVariant,\n base: config.base,\n gap: resolvedGap,\n columns,\n columnWidth: columnWidth as number | string | undefined,\n }),\n [resolvedVariant, config.base, resolvedGap, columns, columnWidth]\n )\n\n const { template, columnsCount, calculatedGap } = useGuide(\n containerRef,\n gridConfig\n )\n\n const descriptor = React.useMemo(\n () =>\n createGuideDescriptor({\n base: config.base,\n colors: config.colors,\n variant: resolvedVariant,\n align: align || 'center',\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isVisible: isShown,\n }),\n [\n config.base,\n config.colors,\n resolvedVariant,\n align,\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isShown,\n ]\n )\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n return (\n <div\n ref={containerRef}\n data-testid=\"guide\"\n aria-hidden=\"true\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n data-variant={variant}\n style={containerStyles}\n {...props}\n >\n {isShown && (\n <div className={styles.cols} data-variant={variant}>\n {!descriptor.isLineVariant &&\n Array.from({ length: descriptor.columnsCount }, (_, i) => (\n <div\n key={i}\n className={styles.col}\n data-column-index={i}\n data-variant={variant}\n style={{ backgroundColor: descriptor.columnColor }}\n />\n ))}\n </div>\n )}\n {children}\n </div>\n )\n})\n","/**\n * Detects if code is running in a server-side environment\n */\nexport const isSSR = typeof window === 'undefined'\n\n/**\n * Default dimensions to use during server-side rendering\n */\nexport const SSR_DIMENSIONS = {\n width: 1024,\n height: 768,\n}\n\n/**\n * Safe window-using function that works in both server and client\n */\nexport function safeClientValue<T>(clientFn: () => T, fallback: T): T {\n if (isSSR) {\n return fallback\n }\n\n try {\n return clientFn()\n } catch {\n return fallback\n }\n}\n\n/**\n * Returns a stable value during SSR and initial render, then switches to\n * the dynamic value after hydration\n */\nexport function hydratedValue<T>(\n isHydrated: boolean,\n ssrValue: T,\n dynamicValue: T\n): T {\n return !isHydrated || isSSR ? ssrValue : dynamicValue\n}\n",".spr {\n position: relative;\n box-sizing: border-box;\n width: var(--bksp-w, 100%);\n height: var(--bksp-h, auto);\n flex-shrink: 0;\n display: block;\n margin: 0;\n padding: 0;\n}\n\n.line::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bksp-cl, hsla(270, 60%, 40%, 0.6));\n z-index: calc(var(--bk-zi, 1));\n}\n\n.flat {\n background-color: var(--bksp-cf, hsla(230, 100%, 70%, 0.2));\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useIsClient } from '../../hooks'\nimport { cx, createSpacerDescriptor } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { ComponentsProps, Variant } from '../types'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type IndicatorNode = (\n value: number,\n type: 'width' | 'height'\n) => React.ReactNode\n\nexport type SpacerProps = {\n width?: React.CSSProperties['width']\n height?: React.CSSProperties['height']\n variant?: Variant\n color?: string\n base?: number\n children?: React.ReactNode\n indicatorNode?: IndicatorNode\n ssrMode?: boolean\n} & ComponentsProps\n\nexport const Spacer = React.memo(function Spacer({\n height: heightProp,\n width: widthProp,\n indicatorNode,\n debugging: debuggingProp,\n variant: variantProp,\n base: baseProp,\n color: colorProp,\n className,\n style,\n children,\n ssrMode = false,\n ...props\n}: SpacerProps) {\n const ref = React.useRef<HTMLDivElement>(null)\n const config = useConfig('spacer')\n const { isShown } = useDebug(debuggingProp, config.debugging)\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n\n const isHydrated = useIsClient()\n\n const descriptor = React.useMemo(\n () =>\n createSpacerDescriptor({\n base,\n colors: config.colors,\n width: widthProp as number | string | undefined,\n height: heightProp as number | string | undefined,\n color: colorProp,\n variant,\n isVisible: isShown,\n }),\n [base, config.colors, widthProp, heightProp, colorProp, variant, isShown]\n )\n\n const shouldShowMeasurements = hydratedValue(\n isHydrated && !ssrMode,\n false,\n isShown && indicatorNode !== undefined\n )\n\n const measurements = React.useMemo(() => {\n if (!shouldShowMeasurements) return null\n const w = descriptor.normWidth\n const h = descriptor.normHeight\n return (\n <>\n {h !== 0 && (\n <span key=\"height\" aria-hidden=\"true\">\n {indicatorNode!(h, 'height')}\n </span>\n )}\n {w !== 0 && (\n <span key=\"width\" aria-hidden=\"true\">\n {indicatorNode!(w, 'width')}\n </span>\n )}\n </>\n )\n }, [\n shouldShowMeasurements,\n indicatorNode,\n descriptor.normWidth,\n descriptor.normHeight,\n ])\n\n const baseStyles = React.useMemo(\n () => mergeStyles(descriptor.style, style),\n [descriptor.style, style]\n )\n\n return (\n <div\n ref={ref}\n data-testid=\"spacer\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n data-variant={variant}\n data-height={\n typeof descriptor.normHeight === 'number'\n ? `${descriptor.normHeight}px`\n : descriptor.normHeight\n }\n style={baseStyles}\n {...props}\n >\n {measurements}\n {children}\n </div>\n )\n})\n",".pad {\n position: relative;\n display: grid;\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto 1fr auto;\n width: var(--bkpd-w, auto);\n height: var(--bkpd-h, auto);\n}\n\n.lay .line::after,\n.stk .line::after {\n border: none;\n}\n\n.v::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bkpd-c, var(--bk-padder-color-theme));\n pointer-events: none;\n z-index: var(--bk-zi);\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline, useIsClient } from '../../hooks'\nimport { cx, parsePadding, createPadderDescriptor } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { mergeStyles, mergeRefs } from '../../utils/merge'\nimport { ComponentsProps, Variant } from '../types'\nimport { Spacer, IndicatorNode } from '../Spacer'\nimport type { DebuggingMode } from '../types'\nimport styles from './styles.module.css'\n\nexport type PadderProps = {\n indicatorNode?: IndicatorNode\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\nconst createRenderSpacerFn = (\n variant: Variant | undefined,\n debugging: DebuggingMode | undefined,\n indicatorNode?: IndicatorNode\n) => {\n const safeVariant = variant || 'line'\n const safeDebugging = debugging || 'none'\n\n const SpacerElement = (\n widthVal: React.CSSProperties['width'],\n heightVal: React.CSSProperties['height']\n ) => (\n <Spacer\n variant={safeVariant}\n debugging={heightVal === 0 || widthVal === 0 ? 'none' : safeDebugging}\n indicatorNode={indicatorNode}\n height={heightVal !== '100%' ? heightVal : undefined}\n width={widthVal !== '100%' ? widthVal : undefined}\n />\n )\n SpacerElement.displayName = 'PadderSpacer'\n return SpacerElement\n}\n\n// Static grid position styles — hoisted to avoid re-creation on render\nconst GRID_FULL_ROW: React.CSSProperties = { gridColumn: '1 / -1' }\nconst GRID_MID_COL: React.CSSProperties = { gridRow: '2 / 3' }\nconst GRID_CENTER: React.CSSProperties = {\n gridRow: '2 / 3',\n gridColumn: '2 / 3',\n}\n\nexport const Padder = React.memo(\n React.forwardRef<HTMLDivElement, PadderProps>(function Padder(\n {\n children,\n className,\n debugging: debuggingProp,\n height,\n indicatorNode,\n style,\n width,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('padder')\n const { variant } = useConfig('spacer')\n const initialPadding = React.useMemo(\n () => parsePadding(spacingProps),\n [spacingProps]\n )\n const { isShown, isNone, debugging } = useDebug(\n debuggingProp,\n config.debugging\n )\n const enableSpacers = !isNone\n\n const isHydrated = useIsClient()\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping: 'height',\n spacing: initialPadding,\n })\n\n const stablePadding = {\n padding: {\n top: initialPadding.top || 0,\n right: initialPadding.right || 0,\n bottom: initialPadding.bottom || 0,\n left: initialPadding.left || 0,\n },\n }\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const setRefs = mergeRefs(ref, internalRef)\n\n const descriptor = React.useMemo(\n () =>\n createPadderDescriptor({\n base: config.base,\n color: config.color,\n width: width as number | string | undefined,\n height: height as number | string | undefined,\n padding,\n enableSpacers,\n isVisible: isShown,\n }),\n [\n config.base,\n config.color,\n width,\n height,\n padding,\n enableSpacers,\n isShown,\n ]\n )\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n const renderSpacer = React.useMemo(\n () => createRenderSpacerFn(variant, debugging, indicatorNode),\n [variant, debugging, indicatorNode]\n )\n\n if (!enableSpacers) {\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={containerStyles}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={containerStyles}\n >\n <>\n {padding.top >= 0 && (\n <div style={GRID_FULL_ROW}>{renderSpacer('100%', padding.top)}</div>\n )}\n {padding.left >= 0 && (\n <div style={GRID_MID_COL}>{renderSpacer(padding.left, '100%')}</div>\n )}\n </>\n <div style={GRID_CENTER}>{children}</div>\n <>\n {padding.right >= 0 && (\n <div style={GRID_MID_COL}>\n {renderSpacer(padding.right, '100%')}\n </div>\n )}\n {padding.bottom >= 0 && (\n <div style={GRID_FULL_ROW}>\n {renderSpacer('100%', padding.bottom)}\n </div>\n )}\n </>\n </div>\n )\n })\n)\n",".box {\n position: relative;\n width: var(--bkbx-w);\n height: var(--bkbx-h);\n}\n\n.v::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bkbx-cl);\n pointer-events: none;\n z-index: var(--bk-zi);\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline, useIsClient } from '../../hooks'\nimport { cx, parsePadding, createBoxDescriptor } from '@baseline-kit/core'\nimport type { SnappingMode } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { mergeStyles, mergeRefs } from '../../utils/merge'\nimport { Config } from '../Config/Config'\nimport { Padder } from '../Padder'\nimport { ComponentsProps } from '../types'\nimport styles from './styles.module.css'\n\nexport type { SnappingMode }\n\nexport type BoxProps = {\n colSpan?: number\n rowSpan?: number\n span?: number\n snapping?: SnappingMode\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\nexport const Box = React.memo(\n React.forwardRef<HTMLDivElement, BoxProps>(function Box(\n {\n children,\n snapping = 'clamp',\n debugging: debuggingProp,\n className,\n colSpan,\n rowSpan,\n span,\n width,\n height,\n style,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('box')\n const { isShown, debugging } = useDebug(debuggingProp, config.debugging)\n\n const isHydrated = useIsClient()\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n const { top, bottom, left, right } = parsePadding(spacingProps)\n\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping,\n spacing: { top, bottom, left, right },\n })\n\n const stablePadding = {\n padding: {\n top: top || 0,\n right: right || 0,\n bottom: bottom || 0,\n left: left || 0,\n },\n }\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const descriptor = React.useMemo(\n () =>\n createBoxDescriptor({\n base: config.base,\n lineColor: config.colors.line,\n width,\n height,\n span,\n colSpan,\n rowSpan,\n isVisible: isShown,\n }),\n [\n config.base,\n config.colors.line,\n width,\n height,\n span,\n colSpan,\n rowSpan,\n isShown,\n ]\n )\n\n const boxStyles = React.useMemo(\n () => mergeStyles(descriptor.boxStyle, style),\n [descriptor.boxStyle, style]\n )\n\n return (\n <div\n ref={mergeRefs(ref, internalRef)}\n data-testid=\"box\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={mergeStyles(boxStyles, descriptor.gridSpanStyle)}\n >\n <Config base={1} spacer={{ variant: 'flat' }}>\n <Padder\n block={[padding.top, padding.bottom]}\n inline={[padding.left, padding.right]}\n width=\"fit-content\"\n height={height}\n debugging={debugging}\n ssrMode={ssrMode}\n >\n {children}\n </Padder>\n </Config>\n </div>\n )\n })\n)\n"],"mappings":"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"}