@otl-core/style-utils 1.1.34 → 1.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -124,6 +124,7 @@ function generateResponsiveSpacingCSS(className, config) {
124
124
  const normalizedMargin = normalizeResponsiveValue(config.margin);
125
125
  const normalizedPadding = normalizeResponsiveValue(config.padding);
126
126
  const normalizedGap = normalizeResponsiveValue(config.gap);
127
+ const normalizedHeight = normalizeResponsiveValue(config.height);
127
128
  const normalizedShadow = normalizeResponsiveValue(config.shadow);
128
129
  const normalizedFontSize = normalizeResponsiveValue(config.fontSize);
129
130
  const border = {
@@ -154,6 +155,13 @@ function generateResponsiveSpacingCSS(className, config) {
154
155
  lg: normalizedGap.lg,
155
156
  xl: normalizedGap.xl
156
157
  };
158
+ const height = {
159
+ base: normalizedHeight.base,
160
+ sm: normalizedHeight.sm,
161
+ md: normalizedHeight.md,
162
+ lg: normalizedHeight.lg,
163
+ xl: normalizedHeight.xl
164
+ };
157
165
  const shadow = {
158
166
  base: normalizedShadow.base,
159
167
  sm: normalizedShadow.sm,
@@ -193,6 +201,9 @@ function generateResponsiveSpacingCSS(className, config) {
193
201
  if (gap.base) {
194
202
  baseStyles.push(`gap:${gap.base}`);
195
203
  }
204
+ if (height.base) {
205
+ baseStyles.push(`height:${height.base}`);
206
+ }
196
207
  if (shadow.base) {
197
208
  baseStyles.push(`box-shadow:${shadowToCSS(shadow.base)}`);
198
209
  }
@@ -208,9 +219,10 @@ function generateResponsiveSpacingCSS(className, config) {
208
219
  const marginBp = margin[bpKey];
209
220
  const paddingBp = padding[bpKey];
210
221
  const gapBp = gap[bpKey];
222
+ const heightBp = height[bpKey];
211
223
  const shadowBp = shadow[bpKey];
212
224
  const fontSizeBp = fontSize[bpKey];
213
- if (borderBp || marginBp || paddingBp || gapBp || shadowBp || fontSizeBp) {
225
+ if (borderBp || marginBp || paddingBp || gapBp || heightBp || shadowBp || fontSizeBp) {
214
226
  const styles = [];
215
227
  if (borderBp) {
216
228
  const resolvedBorderBp = resolveBorderToCSS(borderBp);
@@ -232,6 +244,9 @@ function generateResponsiveSpacingCSS(className, config) {
232
244
  if (gapBp) {
233
245
  styles.push(`gap:${gapBp}`);
234
246
  }
247
+ if (heightBp) {
248
+ styles.push(`height:${heightBp}`);
249
+ }
235
250
  if (shadowBp) {
236
251
  styles.push(`box-shadow:${shadowToCSS(shadowBp)}`);
237
252
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/classnames.utils.ts","../src/css.utils.ts","../src/animations.utils.ts"],"names":["twMerge","clsx"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Utility for merging Tailwind CSS class names\n * Combines clsx for conditional classes with tailwind-merge to handle conflicts\n */\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names intelligently\n * - Uses clsx for conditional classes\n * - Uses tailwind-merge to deduplicate and resolve conflicts\n *\n * @example\n * cn(\"px-2 py-1\", condition && \"bg-blue-500\")\n * cn({ \"font-bold\": isActive }, \"text-lg\")\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * CSS Resolution Utilities\n * Converts CMS type system values (ColorReference, BorderConfig, ResponsiveValue)\n * into CSS strings for rendering.\n */\n\nimport type {\n BorderConfig,\n ColorReference,\n ResponsiveConfig,\n ResponsiveValue,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\n\n/**\n * Private type guard — inlined to avoid circular dependency on cms-utils\n */\nfunction isResponsiveConfig<T>(\n value: ResponsiveValue<T>,\n): value is ResponsiveConfig<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"base\" in value &&\n !Array.isArray(value)\n );\n}\n\n/**\n * Minify CSS by removing comments, extra whitespace, and unnecessary characters\n */\nexport function minifyCSS(css: string): string {\n return css\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([{}:;,>+~()[\\]])\\s*/g, \"$1\")\n .replace(/:\\s+/g, \":\")\n .replace(/;}/g, \"}\")\n .replace(/:0px/g, \":0\")\n .replace(/:0em/g, \":0\")\n .replace(/:0rem/g, \":0\")\n .trim();\n}\n\n/**\n * Resolve a ColorReference to a CSS color string\n */\nexport function resolveColorToCSS(\n colorRef: ColorReference | undefined,\n target?: \"background\" | \"foreground\",\n): string | undefined {\n if (!colorRef) return undefined;\n if (typeof colorRef !== \"object\") return undefined;\n\n // Determine which target to use: parameter, or colorRef.target (if exists), or default to background\n const resolvedTarget =\n target ??\n (colorRef.type !== \"custom\" ? colorRef.target : undefined) ??\n \"background\";\n\n if (colorRef.type === \"custom\") {\n if (typeof colorRef.value === \"string\") {\n return resolvedTarget === \"foreground\" ? undefined : colorRef.value;\n }\n return resolvedTarget === \"foreground\"\n ? colorRef.value.foreground\n : colorRef.value.background;\n } else if (colorRef.type === \"theme\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n } else if (colorRef.type === \"variable\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n }\n\n return undefined;\n}\n\n/**\n * Resolve multiple ColorReferences to CSS color strings\n */\nexport function resolveColorsToCSS<\n T extends Record<string, ColorReference | undefined>,\n>(colorRefs: T): Partial<Record<keyof T, string>> {\n const resolved: Partial<Record<keyof T, string>> = {};\n\n for (const key in colorRefs) {\n const colorRef = colorRefs[key];\n if (colorRef) {\n const color = resolveColorToCSS(colorRef);\n if (color) {\n resolved[key] = color;\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolve a BorderConfig to CSS border properties\n */\nexport function resolveBorderToCSS(\n borderConfig: BorderConfig | undefined,\n): Record<string, string> | undefined {\n if (!borderConfig) return undefined;\n\n const result: Record<string, string> = {};\n\n const resolveSide = (\n side:\n | { width?: string; style?: string; color?: ColorReference }\n | undefined,\n defaultWidth?: string,\n defaultStyle?: string,\n defaultColor?: ColorReference,\n ): string | undefined => {\n const width = side?.width || defaultWidth;\n const style = side?.style || defaultStyle;\n const color = side?.color || defaultColor;\n\n if (!width || !style || !color) return undefined;\n\n const resolvedColor = resolveColorToCSS(color);\n if (!resolvedColor) return undefined;\n\n return `${width} ${style} ${resolvedColor}`;\n };\n\n const hasIndividualSides =\n borderConfig.top ||\n borderConfig.right ||\n borderConfig.bottom ||\n borderConfig.left;\n\n if (hasIndividualSides) {\n const topBorder = resolveSide(\n borderConfig.top,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (topBorder) result.borderTop = topBorder;\n\n const rightBorder = resolveSide(\n borderConfig.right,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (rightBorder) result.borderRight = rightBorder;\n\n const bottomBorder = resolveSide(\n borderConfig.bottom,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (bottomBorder) result.borderBottom = bottomBorder;\n\n const leftBorder = resolveSide(\n borderConfig.left,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (leftBorder) result.borderLeft = leftBorder;\n } else if (borderConfig.width && borderConfig.style && borderConfig.color) {\n const color = resolveColorToCSS(borderConfig.color);\n if (color) {\n result.border = `${borderConfig.width} ${borderConfig.style} ${color}`;\n }\n }\n\n if (borderConfig.radius) {\n result.borderRadius = borderConfig.radius;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Normalize an optional ResponsiveValue into a flat object with optional breakpoint keys.\n */\nexport function normalizeResponsiveValue<T>(\n value: ResponsiveValue<T> | undefined,\n): {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n} {\n if (!value) return {};\n\n if (isResponsiveConfig(value)) {\n return {\n base: value.base,\n sm: value.sm,\n md: value.md,\n lg: value.lg,\n xl: value.xl,\n \"2xl\": value[\"2xl\"],\n };\n }\n\n return { base: value };\n}\n\nexport interface ResponsiveSpacingConfig {\n border?: ResponsiveValue<BorderConfig>;\n margin?: ResponsiveValue<string>;\n padding?: ResponsiveValue<string>;\n gap?: ResponsiveValue<string>;\n shadow?: ResponsiveValue<ShadowConfig>;\n fontSize?: ResponsiveValue<string>;\n}\n\nconst BREAKPOINTS = [\n { key: \"Sm\", minWidth: \"640px\" },\n { key: \"Md\", minWidth: \"768px\" },\n { key: \"Lg\", minWidth: \"1024px\" },\n { key: \"Xl\", minWidth: \"1280px\" },\n];\n\n/**\n * Generate responsive CSS for spacing (margin, padding, gap, border) with media queries\n */\nexport function generateResponsiveSpacingCSS(\n className: string,\n config: ResponsiveSpacingConfig,\n): string | null {\n const css: string[] = [];\n const targetClass = `.${className}`;\n\n const normalizedBorder = normalizeResponsiveValue(config.border);\n const normalizedMargin = normalizeResponsiveValue(config.margin);\n const normalizedPadding = normalizeResponsiveValue(config.padding);\n const normalizedGap = normalizeResponsiveValue(config.gap);\n const normalizedShadow = normalizeResponsiveValue(config.shadow);\n const normalizedFontSize = normalizeResponsiveValue(config.fontSize);\n\n const border = {\n base: normalizedBorder.base,\n sm: normalizedBorder.sm,\n md: normalizedBorder.md,\n lg: normalizedBorder.lg,\n xl: normalizedBorder.xl,\n };\n\n const margin = {\n base: normalizedMargin.base,\n sm: normalizedMargin.sm,\n md: normalizedMargin.md,\n lg: normalizedMargin.lg,\n xl: normalizedMargin.xl,\n };\n\n const padding = {\n base: normalizedPadding.base,\n sm: normalizedPadding.sm,\n md: normalizedPadding.md,\n lg: normalizedPadding.lg,\n xl: normalizedPadding.xl,\n };\n\n const gap = {\n base: normalizedGap.base,\n sm: normalizedGap.sm,\n md: normalizedGap.md,\n lg: normalizedGap.lg,\n xl: normalizedGap.xl,\n };\n\n const shadow = {\n base: normalizedShadow.base,\n sm: normalizedShadow.sm,\n md: normalizedShadow.md,\n lg: normalizedShadow.lg,\n xl: normalizedShadow.xl,\n };\n\n const fontSize = {\n base: normalizedFontSize.base,\n sm: normalizedFontSize.sm,\n md: normalizedFontSize.md,\n lg: normalizedFontSize.lg,\n xl: normalizedFontSize.xl,\n };\n\n const shadowToCSS = (s: ShadowConfig): string => {\n const parts = [s.offsetX, s.offsetY, s.blurRadius, s.spreadRadius, s.color];\n return s.inset ? `inset ${parts.join(\" \")}` : parts.join(\" \");\n };\n\n const baseStyles: string[] = [];\n\n if (border.base) {\n const resolvedBorder = resolveBorderToCSS(border.base);\n if (resolvedBorder) {\n Object.entries(resolvedBorder).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n baseStyles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (margin.base) {\n baseStyles.push(`margin:${margin.base}`);\n }\n\n if (padding.base) {\n baseStyles.push(`padding:${padding.base}`);\n }\n\n if (gap.base) {\n baseStyles.push(`gap:${gap.base}`);\n }\n\n if (shadow.base) {\n baseStyles.push(`box-shadow:${shadowToCSS(shadow.base)}`);\n }\n\n if (fontSize.base) {\n baseStyles.push(`font-size:${fontSize.base}`);\n }\n\n if (baseStyles.length > 0) {\n css.push(`${targetClass}{${baseStyles.join(\";\")}}`);\n }\n\n BREAKPOINTS.forEach(({ key, minWidth }) => {\n const bpKey = key.toLowerCase() as \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n const borderBp = border[bpKey];\n const marginBp = margin[bpKey];\n const paddingBp = padding[bpKey];\n const gapBp = gap[bpKey];\n const shadowBp = shadow[bpKey];\n const fontSizeBp = fontSize[bpKey];\n\n if (borderBp || marginBp || paddingBp || gapBp || shadowBp || fontSizeBp) {\n const styles: string[] = [];\n\n if (borderBp) {\n const resolvedBorderBp = resolveBorderToCSS(borderBp);\n if (resolvedBorderBp) {\n Object.entries(resolvedBorderBp).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n styles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (marginBp) {\n styles.push(`margin:${marginBp}`);\n }\n\n if (paddingBp) {\n styles.push(`padding:${paddingBp}`);\n }\n\n if (gapBp) {\n styles.push(`gap:${gapBp}`);\n }\n\n if (shadowBp) {\n styles.push(`box-shadow:${shadowToCSS(shadowBp)}`);\n }\n\n if (fontSizeBp) {\n styles.push(`font-size:${fontSizeBp}`);\n }\n\n if (styles.length > 0) {\n css.push(\n `@media(min-width:${minWidth}){${targetClass}{${styles.join(\";\")}}}`,\n );\n }\n }\n });\n\n return css.length > 0 ? minifyCSS(css.join(\"\")) : null;\n}\n","/**\n * CSS Animation Utilities\n * Generates CSS keyframe animations and transitions for navigation components.\n */\n\n/**\n * Generate CSS keyframe animations for toggle icons (hamburger, kebab, meatball, grid)\n */\nexport function generateToggleIconAnimations(): string[] {\n return [\n `@keyframes hamburger-top-open{0%{top:25%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(-45deg)}}`,\n `@keyframes hamburger-top-close{0%{top:50%;transform:translateY(-50%) rotate(-45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:25%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-bottom-open{0%{top:75%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(45deg)}}`,\n `@keyframes hamburger-bottom-close{0%{top:50%;transform:translateY(-50%) rotate(45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:75%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes hamburger-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes kebab-top-open{0%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes kebab-top-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-bottom-open{0%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes kebab-bottom-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes kebab-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes meatballs-left-open{0%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes meatballs-left-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-right-open{0%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes meatballs-right-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes meatballs-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes grid-tl-open{0%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes grid-tl-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes grid-tr-hide{0%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-tr-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}100%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-hide{0%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}100%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-br-open{0%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes grid-br-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n ];\n}\n\n/**\n * Generate CSS transitions for mobile menu open/close\n */\nexport function generateMobileMenuAnimations(): string[] {\n return [\n `.mobile-menu-enter{max-height:0;opacity:0}`,\n `.mobile-menu-enter-active{max-height:500px;opacity:1;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n `.mobile-menu-exit{max-height:500px;opacity:1}`,\n `.mobile-menu-exit-active{max-height:0;opacity:0;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n ];\n}\n\n/**\n * Generate CSS transitions for desktop dropdown open/close\n */\nexport function generateDesktopDropdownAnimations(): string[] {\n return [\n `.desktop-dropdown-enter{opacity:0;transform:translateY(-8px)}`,\n `.desktop-dropdown-enter-active{opacity:1;transform:translateY(0);transition:opacity 200ms ease-out,transform 200ms ease-out}`,\n `.desktop-dropdown-exit{opacity:1;transform:translateY(0)}`,\n `.desktop-dropdown-exit-active{opacity:0;transform:translateY(-8px);transition:opacity 200ms ease-in,transform 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS transitions for same-layer dropdown open/close (grid-template-rows animation)\n */\nexport function generateSameLayerDropdownAnimations(): string[] {\n return [\n `.same-layer-dropdown-enter{grid-template-rows:0fr;opacity:0}`,\n `.same-layer-dropdown-enter-active{grid-template-rows:1fr;opacity:1;transition:grid-template-rows 250ms ease-out,opacity 200ms ease-out}`,\n `.same-layer-dropdown-exit{grid-template-rows:1fr;opacity:1}`,\n `.same-layer-dropdown-exit-active{grid-template-rows:0fr;opacity:0;transition:grid-template-rows 250ms ease-in,opacity 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS for custom scrollbar styling on mobile dropdowns\n */\nexport function generateScrollbarStyles(): string[] {\n return [\n `.mobile-dropdown-nav{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,0.2) transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar{width:0.5rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-track{background:transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.2);border-radius:0.25rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,0.3)}`,\n `@media(prefers-color-scheme:dark){.mobile-dropdown-nav{scrollbar-color:rgba(255,255,255,0.2) transparent}.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.2)}.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,0.3)}}`,\n ];\n}\n"]}
1
+ {"version":3,"sources":["../src/classnames.utils.ts","../src/css.utils.ts","../src/animations.utils.ts"],"names":["twMerge","clsx"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Utility for merging Tailwind CSS class names\n * Combines clsx for conditional classes with tailwind-merge to handle conflicts\n */\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names intelligently\n * - Uses clsx for conditional classes\n * - Uses tailwind-merge to deduplicate and resolve conflicts\n *\n * @example\n * cn(\"px-2 py-1\", condition && \"bg-blue-500\")\n * cn({ \"font-bold\": isActive }, \"text-lg\")\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * CSS Resolution Utilities\n * Converts CMS type system values (ColorReference, BorderConfig, ResponsiveValue)\n * into CSS strings for rendering.\n */\n\nimport type {\n BorderConfig,\n ColorReference,\n ResponsiveConfig,\n ResponsiveValue,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\n\n/**\n * Private type guard — inlined to avoid circular dependency on cms-utils\n */\nfunction isResponsiveConfig<T>(\n value: ResponsiveValue<T>,\n): value is ResponsiveConfig<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"base\" in value &&\n !Array.isArray(value)\n );\n}\n\n/**\n * Minify CSS by removing comments, extra whitespace, and unnecessary characters\n */\nexport function minifyCSS(css: string): string {\n return css\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([{}:;,>+~()[\\]])\\s*/g, \"$1\")\n .replace(/:\\s+/g, \":\")\n .replace(/;}/g, \"}\")\n .replace(/:0px/g, \":0\")\n .replace(/:0em/g, \":0\")\n .replace(/:0rem/g, \":0\")\n .trim();\n}\n\n/**\n * Resolve a ColorReference to a CSS color string\n */\nexport function resolveColorToCSS(\n colorRef: ColorReference | undefined,\n target?: \"background\" | \"foreground\",\n): string | undefined {\n if (!colorRef) return undefined;\n if (typeof colorRef !== \"object\") return undefined;\n\n // Determine which target to use: parameter, or colorRef.target (if exists), or default to background\n const resolvedTarget =\n target ??\n (colorRef.type !== \"custom\" ? colorRef.target : undefined) ??\n \"background\";\n\n if (colorRef.type === \"custom\") {\n if (typeof colorRef.value === \"string\") {\n return resolvedTarget === \"foreground\" ? undefined : colorRef.value;\n }\n return resolvedTarget === \"foreground\"\n ? colorRef.value.foreground\n : colorRef.value.background;\n } else if (colorRef.type === \"theme\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n } else if (colorRef.type === \"variable\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n }\n\n return undefined;\n}\n\n/**\n * Resolve multiple ColorReferences to CSS color strings\n */\nexport function resolveColorsToCSS<\n T extends Record<string, ColorReference | undefined>,\n>(colorRefs: T): Partial<Record<keyof T, string>> {\n const resolved: Partial<Record<keyof T, string>> = {};\n\n for (const key in colorRefs) {\n const colorRef = colorRefs[key];\n if (colorRef) {\n const color = resolveColorToCSS(colorRef);\n if (color) {\n resolved[key] = color;\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolve a BorderConfig to CSS border properties\n */\nexport function resolveBorderToCSS(\n borderConfig: BorderConfig | undefined,\n): Record<string, string> | undefined {\n if (!borderConfig) return undefined;\n\n const result: Record<string, string> = {};\n\n const resolveSide = (\n side:\n | { width?: string; style?: string; color?: ColorReference }\n | undefined,\n defaultWidth?: string,\n defaultStyle?: string,\n defaultColor?: ColorReference,\n ): string | undefined => {\n const width = side?.width || defaultWidth;\n const style = side?.style || defaultStyle;\n const color = side?.color || defaultColor;\n\n if (!width || !style || !color) return undefined;\n\n const resolvedColor = resolveColorToCSS(color);\n if (!resolvedColor) return undefined;\n\n return `${width} ${style} ${resolvedColor}`;\n };\n\n const hasIndividualSides =\n borderConfig.top ||\n borderConfig.right ||\n borderConfig.bottom ||\n borderConfig.left;\n\n if (hasIndividualSides) {\n const topBorder = resolveSide(\n borderConfig.top,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (topBorder) result.borderTop = topBorder;\n\n const rightBorder = resolveSide(\n borderConfig.right,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (rightBorder) result.borderRight = rightBorder;\n\n const bottomBorder = resolveSide(\n borderConfig.bottom,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (bottomBorder) result.borderBottom = bottomBorder;\n\n const leftBorder = resolveSide(\n borderConfig.left,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (leftBorder) result.borderLeft = leftBorder;\n } else if (borderConfig.width && borderConfig.style && borderConfig.color) {\n const color = resolveColorToCSS(borderConfig.color);\n if (color) {\n result.border = `${borderConfig.width} ${borderConfig.style} ${color}`;\n }\n }\n\n if (borderConfig.radius) {\n result.borderRadius = borderConfig.radius;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Normalize an optional ResponsiveValue into a flat object with optional breakpoint keys.\n */\nexport function normalizeResponsiveValue<T>(\n value: ResponsiveValue<T> | undefined,\n): {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n} {\n if (!value) return {};\n\n if (isResponsiveConfig(value)) {\n return {\n base: value.base,\n sm: value.sm,\n md: value.md,\n lg: value.lg,\n xl: value.xl,\n \"2xl\": value[\"2xl\"],\n };\n }\n\n return { base: value };\n}\n\nexport interface ResponsiveSpacingConfig {\n border?: ResponsiveValue<BorderConfig>;\n margin?: ResponsiveValue<string>;\n padding?: ResponsiveValue<string>;\n gap?: ResponsiveValue<string>;\n height?: ResponsiveValue<string>;\n shadow?: ResponsiveValue<ShadowConfig>;\n fontSize?: ResponsiveValue<string>;\n}\n\nconst BREAKPOINTS = [\n { key: \"Sm\", minWidth: \"640px\" },\n { key: \"Md\", minWidth: \"768px\" },\n { key: \"Lg\", minWidth: \"1024px\" },\n { key: \"Xl\", minWidth: \"1280px\" },\n];\n\n/**\n * Generate responsive CSS for spacing (margin, padding, gap, border) with media queries\n */\nexport function generateResponsiveSpacingCSS(\n className: string,\n config: ResponsiveSpacingConfig,\n): string | null {\n const css: string[] = [];\n const targetClass = `.${className}`;\n\n const normalizedBorder = normalizeResponsiveValue(config.border);\n const normalizedMargin = normalizeResponsiveValue(config.margin);\n const normalizedPadding = normalizeResponsiveValue(config.padding);\n const normalizedGap = normalizeResponsiveValue(config.gap);\n const normalizedHeight = normalizeResponsiveValue(config.height);\n const normalizedShadow = normalizeResponsiveValue(config.shadow);\n const normalizedFontSize = normalizeResponsiveValue(config.fontSize);\n\n const border = {\n base: normalizedBorder.base,\n sm: normalizedBorder.sm,\n md: normalizedBorder.md,\n lg: normalizedBorder.lg,\n xl: normalizedBorder.xl,\n };\n\n const margin = {\n base: normalizedMargin.base,\n sm: normalizedMargin.sm,\n md: normalizedMargin.md,\n lg: normalizedMargin.lg,\n xl: normalizedMargin.xl,\n };\n\n const padding = {\n base: normalizedPadding.base,\n sm: normalizedPadding.sm,\n md: normalizedPadding.md,\n lg: normalizedPadding.lg,\n xl: normalizedPadding.xl,\n };\n\n const gap = {\n base: normalizedGap.base,\n sm: normalizedGap.sm,\n md: normalizedGap.md,\n lg: normalizedGap.lg,\n xl: normalizedGap.xl,\n };\n\n const height = {\n base: normalizedHeight.base,\n sm: normalizedHeight.sm,\n md: normalizedHeight.md,\n lg: normalizedHeight.lg,\n xl: normalizedHeight.xl,\n };\n\n const shadow = {\n base: normalizedShadow.base,\n sm: normalizedShadow.sm,\n md: normalizedShadow.md,\n lg: normalizedShadow.lg,\n xl: normalizedShadow.xl,\n };\n\n const fontSize = {\n base: normalizedFontSize.base,\n sm: normalizedFontSize.sm,\n md: normalizedFontSize.md,\n lg: normalizedFontSize.lg,\n xl: normalizedFontSize.xl,\n };\n\n const shadowToCSS = (s: ShadowConfig): string => {\n const parts = [s.offsetX, s.offsetY, s.blurRadius, s.spreadRadius, s.color];\n return s.inset ? `inset ${parts.join(\" \")}` : parts.join(\" \");\n };\n\n const baseStyles: string[] = [];\n\n if (border.base) {\n const resolvedBorder = resolveBorderToCSS(border.base);\n if (resolvedBorder) {\n Object.entries(resolvedBorder).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n baseStyles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (margin.base) {\n baseStyles.push(`margin:${margin.base}`);\n }\n\n if (padding.base) {\n baseStyles.push(`padding:${padding.base}`);\n }\n\n if (gap.base) {\n baseStyles.push(`gap:${gap.base}`);\n }\n\n if (height.base) {\n baseStyles.push(`height:${height.base}`);\n }\n\n if (shadow.base) {\n baseStyles.push(`box-shadow:${shadowToCSS(shadow.base)}`);\n }\n\n if (fontSize.base) {\n baseStyles.push(`font-size:${fontSize.base}`);\n }\n\n if (baseStyles.length > 0) {\n css.push(`${targetClass}{${baseStyles.join(\";\")}}`);\n }\n\n BREAKPOINTS.forEach(({ key, minWidth }) => {\n const bpKey = key.toLowerCase() as \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n const borderBp = border[bpKey];\n const marginBp = margin[bpKey];\n const paddingBp = padding[bpKey];\n const gapBp = gap[bpKey];\n const heightBp = height[bpKey];\n const shadowBp = shadow[bpKey];\n const fontSizeBp = fontSize[bpKey];\n\n if (\n borderBp ||\n marginBp ||\n paddingBp ||\n gapBp ||\n heightBp ||\n shadowBp ||\n fontSizeBp\n ) {\n const styles: string[] = [];\n\n if (borderBp) {\n const resolvedBorderBp = resolveBorderToCSS(borderBp);\n if (resolvedBorderBp) {\n Object.entries(resolvedBorderBp).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n styles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (marginBp) {\n styles.push(`margin:${marginBp}`);\n }\n\n if (paddingBp) {\n styles.push(`padding:${paddingBp}`);\n }\n\n if (gapBp) {\n styles.push(`gap:${gapBp}`);\n }\n\n if (heightBp) {\n styles.push(`height:${heightBp}`);\n }\n\n if (shadowBp) {\n styles.push(`box-shadow:${shadowToCSS(shadowBp)}`);\n }\n\n if (fontSizeBp) {\n styles.push(`font-size:${fontSizeBp}`);\n }\n\n if (styles.length > 0) {\n css.push(\n `@media(min-width:${minWidth}){${targetClass}{${styles.join(\";\")}}}`,\n );\n }\n }\n });\n\n return css.length > 0 ? minifyCSS(css.join(\"\")) : null;\n}\n","/**\n * CSS Animation Utilities\n * Generates CSS keyframe animations and transitions for navigation components.\n */\n\n/**\n * Generate CSS keyframe animations for toggle icons (hamburger, kebab, meatball, grid)\n */\nexport function generateToggleIconAnimations(): string[] {\n return [\n `@keyframes hamburger-top-open{0%{top:25%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(-45deg)}}`,\n `@keyframes hamburger-top-close{0%{top:50%;transform:translateY(-50%) rotate(-45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:25%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-bottom-open{0%{top:75%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(45deg)}}`,\n `@keyframes hamburger-bottom-close{0%{top:50%;transform:translateY(-50%) rotate(45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:75%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes hamburger-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes kebab-top-open{0%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes kebab-top-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-bottom-open{0%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes kebab-bottom-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes kebab-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes meatballs-left-open{0%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes meatballs-left-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-right-open{0%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes meatballs-right-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes meatballs-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes grid-tl-open{0%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes grid-tl-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes grid-tr-hide{0%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-tr-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}100%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-hide{0%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}100%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-br-open{0%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes grid-br-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n ];\n}\n\n/**\n * Generate CSS transitions for mobile menu open/close\n */\nexport function generateMobileMenuAnimations(): string[] {\n return [\n `.mobile-menu-enter{max-height:0;opacity:0}`,\n `.mobile-menu-enter-active{max-height:500px;opacity:1;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n `.mobile-menu-exit{max-height:500px;opacity:1}`,\n `.mobile-menu-exit-active{max-height:0;opacity:0;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n ];\n}\n\n/**\n * Generate CSS transitions for desktop dropdown open/close\n */\nexport function generateDesktopDropdownAnimations(): string[] {\n return [\n `.desktop-dropdown-enter{opacity:0;transform:translateY(-8px)}`,\n `.desktop-dropdown-enter-active{opacity:1;transform:translateY(0);transition:opacity 200ms ease-out,transform 200ms ease-out}`,\n `.desktop-dropdown-exit{opacity:1;transform:translateY(0)}`,\n `.desktop-dropdown-exit-active{opacity:0;transform:translateY(-8px);transition:opacity 200ms ease-in,transform 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS transitions for same-layer dropdown open/close (grid-template-rows animation)\n */\nexport function generateSameLayerDropdownAnimations(): string[] {\n return [\n `.same-layer-dropdown-enter{grid-template-rows:0fr;opacity:0}`,\n `.same-layer-dropdown-enter-active{grid-template-rows:1fr;opacity:1;transition:grid-template-rows 250ms ease-out,opacity 200ms ease-out}`,\n `.same-layer-dropdown-exit{grid-template-rows:1fr;opacity:1}`,\n `.same-layer-dropdown-exit-active{grid-template-rows:0fr;opacity:0;transition:grid-template-rows 250ms ease-in,opacity 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS for custom scrollbar styling on mobile dropdowns\n */\nexport function generateScrollbarStyles(): string[] {\n return [\n `.mobile-dropdown-nav{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,0.2) transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar{width:0.5rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-track{background:transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.2);border-radius:0.25rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,0.3)}`,\n `@media(prefers-color-scheme:dark){.mobile-dropdown-nav{scrollbar-color:rgba(255,255,255,0.2) transparent}.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.2)}.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,0.3)}}`,\n ];\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -55,6 +55,7 @@ interface ResponsiveSpacingConfig {
55
55
  margin?: ResponsiveValue<string>;
56
56
  padding?: ResponsiveValue<string>;
57
57
  gap?: ResponsiveValue<string>;
58
+ height?: ResponsiveValue<string>;
58
59
  shadow?: ResponsiveValue<ShadowConfig>;
59
60
  fontSize?: ResponsiveValue<string>;
60
61
  }
package/dist/index.d.ts CHANGED
@@ -55,6 +55,7 @@ interface ResponsiveSpacingConfig {
55
55
  margin?: ResponsiveValue<string>;
56
56
  padding?: ResponsiveValue<string>;
57
57
  gap?: ResponsiveValue<string>;
58
+ height?: ResponsiveValue<string>;
58
59
  shadow?: ResponsiveValue<ShadowConfig>;
59
60
  fontSize?: ResponsiveValue<string>;
60
61
  }
package/dist/index.js CHANGED
@@ -122,6 +122,7 @@ function generateResponsiveSpacingCSS(className, config) {
122
122
  const normalizedMargin = normalizeResponsiveValue(config.margin);
123
123
  const normalizedPadding = normalizeResponsiveValue(config.padding);
124
124
  const normalizedGap = normalizeResponsiveValue(config.gap);
125
+ const normalizedHeight = normalizeResponsiveValue(config.height);
125
126
  const normalizedShadow = normalizeResponsiveValue(config.shadow);
126
127
  const normalizedFontSize = normalizeResponsiveValue(config.fontSize);
127
128
  const border = {
@@ -152,6 +153,13 @@ function generateResponsiveSpacingCSS(className, config) {
152
153
  lg: normalizedGap.lg,
153
154
  xl: normalizedGap.xl
154
155
  };
156
+ const height = {
157
+ base: normalizedHeight.base,
158
+ sm: normalizedHeight.sm,
159
+ md: normalizedHeight.md,
160
+ lg: normalizedHeight.lg,
161
+ xl: normalizedHeight.xl
162
+ };
155
163
  const shadow = {
156
164
  base: normalizedShadow.base,
157
165
  sm: normalizedShadow.sm,
@@ -191,6 +199,9 @@ function generateResponsiveSpacingCSS(className, config) {
191
199
  if (gap.base) {
192
200
  baseStyles.push(`gap:${gap.base}`);
193
201
  }
202
+ if (height.base) {
203
+ baseStyles.push(`height:${height.base}`);
204
+ }
194
205
  if (shadow.base) {
195
206
  baseStyles.push(`box-shadow:${shadowToCSS(shadow.base)}`);
196
207
  }
@@ -206,9 +217,10 @@ function generateResponsiveSpacingCSS(className, config) {
206
217
  const marginBp = margin[bpKey];
207
218
  const paddingBp = padding[bpKey];
208
219
  const gapBp = gap[bpKey];
220
+ const heightBp = height[bpKey];
209
221
  const shadowBp = shadow[bpKey];
210
222
  const fontSizeBp = fontSize[bpKey];
211
- if (borderBp || marginBp || paddingBp || gapBp || shadowBp || fontSizeBp) {
223
+ if (borderBp || marginBp || paddingBp || gapBp || heightBp || shadowBp || fontSizeBp) {
212
224
  const styles = [];
213
225
  if (borderBp) {
214
226
  const resolvedBorderBp = resolveBorderToCSS(borderBp);
@@ -230,6 +242,9 @@ function generateResponsiveSpacingCSS(className, config) {
230
242
  if (gapBp) {
231
243
  styles.push(`gap:${gapBp}`);
232
244
  }
245
+ if (heightBp) {
246
+ styles.push(`height:${heightBp}`);
247
+ }
233
248
  if (shadowBp) {
234
249
  styles.push(`box-shadow:${shadowToCSS(shadowBp)}`);
235
250
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/classnames.utils.ts","../src/css.utils.ts","../src/animations.utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Utility for merging Tailwind CSS class names\n * Combines clsx for conditional classes with tailwind-merge to handle conflicts\n */\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names intelligently\n * - Uses clsx for conditional classes\n * - Uses tailwind-merge to deduplicate and resolve conflicts\n *\n * @example\n * cn(\"px-2 py-1\", condition && \"bg-blue-500\")\n * cn({ \"font-bold\": isActive }, \"text-lg\")\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * CSS Resolution Utilities\n * Converts CMS type system values (ColorReference, BorderConfig, ResponsiveValue)\n * into CSS strings for rendering.\n */\n\nimport type {\n BorderConfig,\n ColorReference,\n ResponsiveConfig,\n ResponsiveValue,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\n\n/**\n * Private type guard — inlined to avoid circular dependency on cms-utils\n */\nfunction isResponsiveConfig<T>(\n value: ResponsiveValue<T>,\n): value is ResponsiveConfig<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"base\" in value &&\n !Array.isArray(value)\n );\n}\n\n/**\n * Minify CSS by removing comments, extra whitespace, and unnecessary characters\n */\nexport function minifyCSS(css: string): string {\n return css\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([{}:;,>+~()[\\]])\\s*/g, \"$1\")\n .replace(/:\\s+/g, \":\")\n .replace(/;}/g, \"}\")\n .replace(/:0px/g, \":0\")\n .replace(/:0em/g, \":0\")\n .replace(/:0rem/g, \":0\")\n .trim();\n}\n\n/**\n * Resolve a ColorReference to a CSS color string\n */\nexport function resolveColorToCSS(\n colorRef: ColorReference | undefined,\n target?: \"background\" | \"foreground\",\n): string | undefined {\n if (!colorRef) return undefined;\n if (typeof colorRef !== \"object\") return undefined;\n\n // Determine which target to use: parameter, or colorRef.target (if exists), or default to background\n const resolvedTarget =\n target ??\n (colorRef.type !== \"custom\" ? colorRef.target : undefined) ??\n \"background\";\n\n if (colorRef.type === \"custom\") {\n if (typeof colorRef.value === \"string\") {\n return resolvedTarget === \"foreground\" ? undefined : colorRef.value;\n }\n return resolvedTarget === \"foreground\"\n ? colorRef.value.foreground\n : colorRef.value.background;\n } else if (colorRef.type === \"theme\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n } else if (colorRef.type === \"variable\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n }\n\n return undefined;\n}\n\n/**\n * Resolve multiple ColorReferences to CSS color strings\n */\nexport function resolveColorsToCSS<\n T extends Record<string, ColorReference | undefined>,\n>(colorRefs: T): Partial<Record<keyof T, string>> {\n const resolved: Partial<Record<keyof T, string>> = {};\n\n for (const key in colorRefs) {\n const colorRef = colorRefs[key];\n if (colorRef) {\n const color = resolveColorToCSS(colorRef);\n if (color) {\n resolved[key] = color;\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolve a BorderConfig to CSS border properties\n */\nexport function resolveBorderToCSS(\n borderConfig: BorderConfig | undefined,\n): Record<string, string> | undefined {\n if (!borderConfig) return undefined;\n\n const result: Record<string, string> = {};\n\n const resolveSide = (\n side:\n | { width?: string; style?: string; color?: ColorReference }\n | undefined,\n defaultWidth?: string,\n defaultStyle?: string,\n defaultColor?: ColorReference,\n ): string | undefined => {\n const width = side?.width || defaultWidth;\n const style = side?.style || defaultStyle;\n const color = side?.color || defaultColor;\n\n if (!width || !style || !color) return undefined;\n\n const resolvedColor = resolveColorToCSS(color);\n if (!resolvedColor) return undefined;\n\n return `${width} ${style} ${resolvedColor}`;\n };\n\n const hasIndividualSides =\n borderConfig.top ||\n borderConfig.right ||\n borderConfig.bottom ||\n borderConfig.left;\n\n if (hasIndividualSides) {\n const topBorder = resolveSide(\n borderConfig.top,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (topBorder) result.borderTop = topBorder;\n\n const rightBorder = resolveSide(\n borderConfig.right,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (rightBorder) result.borderRight = rightBorder;\n\n const bottomBorder = resolveSide(\n borderConfig.bottom,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (bottomBorder) result.borderBottom = bottomBorder;\n\n const leftBorder = resolveSide(\n borderConfig.left,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (leftBorder) result.borderLeft = leftBorder;\n } else if (borderConfig.width && borderConfig.style && borderConfig.color) {\n const color = resolveColorToCSS(borderConfig.color);\n if (color) {\n result.border = `${borderConfig.width} ${borderConfig.style} ${color}`;\n }\n }\n\n if (borderConfig.radius) {\n result.borderRadius = borderConfig.radius;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Normalize an optional ResponsiveValue into a flat object with optional breakpoint keys.\n */\nexport function normalizeResponsiveValue<T>(\n value: ResponsiveValue<T> | undefined,\n): {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n} {\n if (!value) return {};\n\n if (isResponsiveConfig(value)) {\n return {\n base: value.base,\n sm: value.sm,\n md: value.md,\n lg: value.lg,\n xl: value.xl,\n \"2xl\": value[\"2xl\"],\n };\n }\n\n return { base: value };\n}\n\nexport interface ResponsiveSpacingConfig {\n border?: ResponsiveValue<BorderConfig>;\n margin?: ResponsiveValue<string>;\n padding?: ResponsiveValue<string>;\n gap?: ResponsiveValue<string>;\n shadow?: ResponsiveValue<ShadowConfig>;\n fontSize?: ResponsiveValue<string>;\n}\n\nconst BREAKPOINTS = [\n { key: \"Sm\", minWidth: \"640px\" },\n { key: \"Md\", minWidth: \"768px\" },\n { key: \"Lg\", minWidth: \"1024px\" },\n { key: \"Xl\", minWidth: \"1280px\" },\n];\n\n/**\n * Generate responsive CSS for spacing (margin, padding, gap, border) with media queries\n */\nexport function generateResponsiveSpacingCSS(\n className: string,\n config: ResponsiveSpacingConfig,\n): string | null {\n const css: string[] = [];\n const targetClass = `.${className}`;\n\n const normalizedBorder = normalizeResponsiveValue(config.border);\n const normalizedMargin = normalizeResponsiveValue(config.margin);\n const normalizedPadding = normalizeResponsiveValue(config.padding);\n const normalizedGap = normalizeResponsiveValue(config.gap);\n const normalizedShadow = normalizeResponsiveValue(config.shadow);\n const normalizedFontSize = normalizeResponsiveValue(config.fontSize);\n\n const border = {\n base: normalizedBorder.base,\n sm: normalizedBorder.sm,\n md: normalizedBorder.md,\n lg: normalizedBorder.lg,\n xl: normalizedBorder.xl,\n };\n\n const margin = {\n base: normalizedMargin.base,\n sm: normalizedMargin.sm,\n md: normalizedMargin.md,\n lg: normalizedMargin.lg,\n xl: normalizedMargin.xl,\n };\n\n const padding = {\n base: normalizedPadding.base,\n sm: normalizedPadding.sm,\n md: normalizedPadding.md,\n lg: normalizedPadding.lg,\n xl: normalizedPadding.xl,\n };\n\n const gap = {\n base: normalizedGap.base,\n sm: normalizedGap.sm,\n md: normalizedGap.md,\n lg: normalizedGap.lg,\n xl: normalizedGap.xl,\n };\n\n const shadow = {\n base: normalizedShadow.base,\n sm: normalizedShadow.sm,\n md: normalizedShadow.md,\n lg: normalizedShadow.lg,\n xl: normalizedShadow.xl,\n };\n\n const fontSize = {\n base: normalizedFontSize.base,\n sm: normalizedFontSize.sm,\n md: normalizedFontSize.md,\n lg: normalizedFontSize.lg,\n xl: normalizedFontSize.xl,\n };\n\n const shadowToCSS = (s: ShadowConfig): string => {\n const parts = [s.offsetX, s.offsetY, s.blurRadius, s.spreadRadius, s.color];\n return s.inset ? `inset ${parts.join(\" \")}` : parts.join(\" \");\n };\n\n const baseStyles: string[] = [];\n\n if (border.base) {\n const resolvedBorder = resolveBorderToCSS(border.base);\n if (resolvedBorder) {\n Object.entries(resolvedBorder).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n baseStyles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (margin.base) {\n baseStyles.push(`margin:${margin.base}`);\n }\n\n if (padding.base) {\n baseStyles.push(`padding:${padding.base}`);\n }\n\n if (gap.base) {\n baseStyles.push(`gap:${gap.base}`);\n }\n\n if (shadow.base) {\n baseStyles.push(`box-shadow:${shadowToCSS(shadow.base)}`);\n }\n\n if (fontSize.base) {\n baseStyles.push(`font-size:${fontSize.base}`);\n }\n\n if (baseStyles.length > 0) {\n css.push(`${targetClass}{${baseStyles.join(\";\")}}`);\n }\n\n BREAKPOINTS.forEach(({ key, minWidth }) => {\n const bpKey = key.toLowerCase() as \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n const borderBp = border[bpKey];\n const marginBp = margin[bpKey];\n const paddingBp = padding[bpKey];\n const gapBp = gap[bpKey];\n const shadowBp = shadow[bpKey];\n const fontSizeBp = fontSize[bpKey];\n\n if (borderBp || marginBp || paddingBp || gapBp || shadowBp || fontSizeBp) {\n const styles: string[] = [];\n\n if (borderBp) {\n const resolvedBorderBp = resolveBorderToCSS(borderBp);\n if (resolvedBorderBp) {\n Object.entries(resolvedBorderBp).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n styles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (marginBp) {\n styles.push(`margin:${marginBp}`);\n }\n\n if (paddingBp) {\n styles.push(`padding:${paddingBp}`);\n }\n\n if (gapBp) {\n styles.push(`gap:${gapBp}`);\n }\n\n if (shadowBp) {\n styles.push(`box-shadow:${shadowToCSS(shadowBp)}`);\n }\n\n if (fontSizeBp) {\n styles.push(`font-size:${fontSizeBp}`);\n }\n\n if (styles.length > 0) {\n css.push(\n `@media(min-width:${minWidth}){${targetClass}{${styles.join(\";\")}}}`,\n );\n }\n }\n });\n\n return css.length > 0 ? minifyCSS(css.join(\"\")) : null;\n}\n","/**\n * CSS Animation Utilities\n * Generates CSS keyframe animations and transitions for navigation components.\n */\n\n/**\n * Generate CSS keyframe animations for toggle icons (hamburger, kebab, meatball, grid)\n */\nexport function generateToggleIconAnimations(): string[] {\n return [\n `@keyframes hamburger-top-open{0%{top:25%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(-45deg)}}`,\n `@keyframes hamburger-top-close{0%{top:50%;transform:translateY(-50%) rotate(-45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:25%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-bottom-open{0%{top:75%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(45deg)}}`,\n `@keyframes hamburger-bottom-close{0%{top:50%;transform:translateY(-50%) rotate(45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:75%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes hamburger-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes kebab-top-open{0%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes kebab-top-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-bottom-open{0%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes kebab-bottom-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes kebab-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes meatballs-left-open{0%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes meatballs-left-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-right-open{0%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes meatballs-right-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes meatballs-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes grid-tl-open{0%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes grid-tl-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes grid-tr-hide{0%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-tr-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}100%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-hide{0%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}100%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-br-open{0%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes grid-br-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n ];\n}\n\n/**\n * Generate CSS transitions for mobile menu open/close\n */\nexport function generateMobileMenuAnimations(): string[] {\n return [\n `.mobile-menu-enter{max-height:0;opacity:0}`,\n `.mobile-menu-enter-active{max-height:500px;opacity:1;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n `.mobile-menu-exit{max-height:500px;opacity:1}`,\n `.mobile-menu-exit-active{max-height:0;opacity:0;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n ];\n}\n\n/**\n * Generate CSS transitions for desktop dropdown open/close\n */\nexport function generateDesktopDropdownAnimations(): string[] {\n return [\n `.desktop-dropdown-enter{opacity:0;transform:translateY(-8px)}`,\n `.desktop-dropdown-enter-active{opacity:1;transform:translateY(0);transition:opacity 200ms ease-out,transform 200ms ease-out}`,\n `.desktop-dropdown-exit{opacity:1;transform:translateY(0)}`,\n `.desktop-dropdown-exit-active{opacity:0;transform:translateY(-8px);transition:opacity 200ms ease-in,transform 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS transitions for same-layer dropdown open/close (grid-template-rows animation)\n */\nexport function generateSameLayerDropdownAnimations(): string[] {\n return [\n `.same-layer-dropdown-enter{grid-template-rows:0fr;opacity:0}`,\n `.same-layer-dropdown-enter-active{grid-template-rows:1fr;opacity:1;transition:grid-template-rows 250ms ease-out,opacity 200ms ease-out}`,\n `.same-layer-dropdown-exit{grid-template-rows:1fr;opacity:1}`,\n `.same-layer-dropdown-exit-active{grid-template-rows:0fr;opacity:0;transition:grid-template-rows 250ms ease-in,opacity 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS for custom scrollbar styling on mobile dropdowns\n */\nexport function generateScrollbarStyles(): string[] {\n return [\n `.mobile-dropdown-nav{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,0.2) transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar{width:0.5rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-track{background:transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.2);border-radius:0.25rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,0.3)}`,\n `@media(prefers-color-scheme:dark){.mobile-dropdown-nav{scrollbar-color:rgba(255,255,255,0.2) transparent}.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.2)}.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,0.3)}}`,\n ];\n}\n"]}
1
+ {"version":3,"sources":["../src/classnames.utils.ts","../src/css.utils.ts","../src/animations.utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Utility for merging Tailwind CSS class names\n * Combines clsx for conditional classes with tailwind-merge to handle conflicts\n */\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names intelligently\n * - Uses clsx for conditional classes\n * - Uses tailwind-merge to deduplicate and resolve conflicts\n *\n * @example\n * cn(\"px-2 py-1\", condition && \"bg-blue-500\")\n * cn({ \"font-bold\": isActive }, \"text-lg\")\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * CSS Resolution Utilities\n * Converts CMS type system values (ColorReference, BorderConfig, ResponsiveValue)\n * into CSS strings for rendering.\n */\n\nimport type {\n BorderConfig,\n ColorReference,\n ResponsiveConfig,\n ResponsiveValue,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\n\n/**\n * Private type guard — inlined to avoid circular dependency on cms-utils\n */\nfunction isResponsiveConfig<T>(\n value: ResponsiveValue<T>,\n): value is ResponsiveConfig<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"base\" in value &&\n !Array.isArray(value)\n );\n}\n\n/**\n * Minify CSS by removing comments, extra whitespace, and unnecessary characters\n */\nexport function minifyCSS(css: string): string {\n return css\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([{}:;,>+~()[\\]])\\s*/g, \"$1\")\n .replace(/:\\s+/g, \":\")\n .replace(/;}/g, \"}\")\n .replace(/:0px/g, \":0\")\n .replace(/:0em/g, \":0\")\n .replace(/:0rem/g, \":0\")\n .trim();\n}\n\n/**\n * Resolve a ColorReference to a CSS color string\n */\nexport function resolveColorToCSS(\n colorRef: ColorReference | undefined,\n target?: \"background\" | \"foreground\",\n): string | undefined {\n if (!colorRef) return undefined;\n if (typeof colorRef !== \"object\") return undefined;\n\n // Determine which target to use: parameter, or colorRef.target (if exists), or default to background\n const resolvedTarget =\n target ??\n (colorRef.type !== \"custom\" ? colorRef.target : undefined) ??\n \"background\";\n\n if (colorRef.type === \"custom\") {\n if (typeof colorRef.value === \"string\") {\n return resolvedTarget === \"foreground\" ? undefined : colorRef.value;\n }\n return resolvedTarget === \"foreground\"\n ? colorRef.value.foreground\n : colorRef.value.background;\n } else if (colorRef.type === \"theme\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n } else if (colorRef.type === \"variable\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n }\n\n return undefined;\n}\n\n/**\n * Resolve multiple ColorReferences to CSS color strings\n */\nexport function resolveColorsToCSS<\n T extends Record<string, ColorReference | undefined>,\n>(colorRefs: T): Partial<Record<keyof T, string>> {\n const resolved: Partial<Record<keyof T, string>> = {};\n\n for (const key in colorRefs) {\n const colorRef = colorRefs[key];\n if (colorRef) {\n const color = resolveColorToCSS(colorRef);\n if (color) {\n resolved[key] = color;\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolve a BorderConfig to CSS border properties\n */\nexport function resolveBorderToCSS(\n borderConfig: BorderConfig | undefined,\n): Record<string, string> | undefined {\n if (!borderConfig) return undefined;\n\n const result: Record<string, string> = {};\n\n const resolveSide = (\n side:\n | { width?: string; style?: string; color?: ColorReference }\n | undefined,\n defaultWidth?: string,\n defaultStyle?: string,\n defaultColor?: ColorReference,\n ): string | undefined => {\n const width = side?.width || defaultWidth;\n const style = side?.style || defaultStyle;\n const color = side?.color || defaultColor;\n\n if (!width || !style || !color) return undefined;\n\n const resolvedColor = resolveColorToCSS(color);\n if (!resolvedColor) return undefined;\n\n return `${width} ${style} ${resolvedColor}`;\n };\n\n const hasIndividualSides =\n borderConfig.top ||\n borderConfig.right ||\n borderConfig.bottom ||\n borderConfig.left;\n\n if (hasIndividualSides) {\n const topBorder = resolveSide(\n borderConfig.top,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (topBorder) result.borderTop = topBorder;\n\n const rightBorder = resolveSide(\n borderConfig.right,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (rightBorder) result.borderRight = rightBorder;\n\n const bottomBorder = resolveSide(\n borderConfig.bottom,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (bottomBorder) result.borderBottom = bottomBorder;\n\n const leftBorder = resolveSide(\n borderConfig.left,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color,\n );\n if (leftBorder) result.borderLeft = leftBorder;\n } else if (borderConfig.width && borderConfig.style && borderConfig.color) {\n const color = resolveColorToCSS(borderConfig.color);\n if (color) {\n result.border = `${borderConfig.width} ${borderConfig.style} ${color}`;\n }\n }\n\n if (borderConfig.radius) {\n result.borderRadius = borderConfig.radius;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Normalize an optional ResponsiveValue into a flat object with optional breakpoint keys.\n */\nexport function normalizeResponsiveValue<T>(\n value: ResponsiveValue<T> | undefined,\n): {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n} {\n if (!value) return {};\n\n if (isResponsiveConfig(value)) {\n return {\n base: value.base,\n sm: value.sm,\n md: value.md,\n lg: value.lg,\n xl: value.xl,\n \"2xl\": value[\"2xl\"],\n };\n }\n\n return { base: value };\n}\n\nexport interface ResponsiveSpacingConfig {\n border?: ResponsiveValue<BorderConfig>;\n margin?: ResponsiveValue<string>;\n padding?: ResponsiveValue<string>;\n gap?: ResponsiveValue<string>;\n height?: ResponsiveValue<string>;\n shadow?: ResponsiveValue<ShadowConfig>;\n fontSize?: ResponsiveValue<string>;\n}\n\nconst BREAKPOINTS = [\n { key: \"Sm\", minWidth: \"640px\" },\n { key: \"Md\", minWidth: \"768px\" },\n { key: \"Lg\", minWidth: \"1024px\" },\n { key: \"Xl\", minWidth: \"1280px\" },\n];\n\n/**\n * Generate responsive CSS for spacing (margin, padding, gap, border) with media queries\n */\nexport function generateResponsiveSpacingCSS(\n className: string,\n config: ResponsiveSpacingConfig,\n): string | null {\n const css: string[] = [];\n const targetClass = `.${className}`;\n\n const normalizedBorder = normalizeResponsiveValue(config.border);\n const normalizedMargin = normalizeResponsiveValue(config.margin);\n const normalizedPadding = normalizeResponsiveValue(config.padding);\n const normalizedGap = normalizeResponsiveValue(config.gap);\n const normalizedHeight = normalizeResponsiveValue(config.height);\n const normalizedShadow = normalizeResponsiveValue(config.shadow);\n const normalizedFontSize = normalizeResponsiveValue(config.fontSize);\n\n const border = {\n base: normalizedBorder.base,\n sm: normalizedBorder.sm,\n md: normalizedBorder.md,\n lg: normalizedBorder.lg,\n xl: normalizedBorder.xl,\n };\n\n const margin = {\n base: normalizedMargin.base,\n sm: normalizedMargin.sm,\n md: normalizedMargin.md,\n lg: normalizedMargin.lg,\n xl: normalizedMargin.xl,\n };\n\n const padding = {\n base: normalizedPadding.base,\n sm: normalizedPadding.sm,\n md: normalizedPadding.md,\n lg: normalizedPadding.lg,\n xl: normalizedPadding.xl,\n };\n\n const gap = {\n base: normalizedGap.base,\n sm: normalizedGap.sm,\n md: normalizedGap.md,\n lg: normalizedGap.lg,\n xl: normalizedGap.xl,\n };\n\n const height = {\n base: normalizedHeight.base,\n sm: normalizedHeight.sm,\n md: normalizedHeight.md,\n lg: normalizedHeight.lg,\n xl: normalizedHeight.xl,\n };\n\n const shadow = {\n base: normalizedShadow.base,\n sm: normalizedShadow.sm,\n md: normalizedShadow.md,\n lg: normalizedShadow.lg,\n xl: normalizedShadow.xl,\n };\n\n const fontSize = {\n base: normalizedFontSize.base,\n sm: normalizedFontSize.sm,\n md: normalizedFontSize.md,\n lg: normalizedFontSize.lg,\n xl: normalizedFontSize.xl,\n };\n\n const shadowToCSS = (s: ShadowConfig): string => {\n const parts = [s.offsetX, s.offsetY, s.blurRadius, s.spreadRadius, s.color];\n return s.inset ? `inset ${parts.join(\" \")}` : parts.join(\" \");\n };\n\n const baseStyles: string[] = [];\n\n if (border.base) {\n const resolvedBorder = resolveBorderToCSS(border.base);\n if (resolvedBorder) {\n Object.entries(resolvedBorder).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n baseStyles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (margin.base) {\n baseStyles.push(`margin:${margin.base}`);\n }\n\n if (padding.base) {\n baseStyles.push(`padding:${padding.base}`);\n }\n\n if (gap.base) {\n baseStyles.push(`gap:${gap.base}`);\n }\n\n if (height.base) {\n baseStyles.push(`height:${height.base}`);\n }\n\n if (shadow.base) {\n baseStyles.push(`box-shadow:${shadowToCSS(shadow.base)}`);\n }\n\n if (fontSize.base) {\n baseStyles.push(`font-size:${fontSize.base}`);\n }\n\n if (baseStyles.length > 0) {\n css.push(`${targetClass}{${baseStyles.join(\";\")}}`);\n }\n\n BREAKPOINTS.forEach(({ key, minWidth }) => {\n const bpKey = key.toLowerCase() as \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n const borderBp = border[bpKey];\n const marginBp = margin[bpKey];\n const paddingBp = padding[bpKey];\n const gapBp = gap[bpKey];\n const heightBp = height[bpKey];\n const shadowBp = shadow[bpKey];\n const fontSizeBp = fontSize[bpKey];\n\n if (\n borderBp ||\n marginBp ||\n paddingBp ||\n gapBp ||\n heightBp ||\n shadowBp ||\n fontSizeBp\n ) {\n const styles: string[] = [];\n\n if (borderBp) {\n const resolvedBorderBp = resolveBorderToCSS(borderBp);\n if (resolvedBorderBp) {\n Object.entries(resolvedBorderBp).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n styles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (marginBp) {\n styles.push(`margin:${marginBp}`);\n }\n\n if (paddingBp) {\n styles.push(`padding:${paddingBp}`);\n }\n\n if (gapBp) {\n styles.push(`gap:${gapBp}`);\n }\n\n if (heightBp) {\n styles.push(`height:${heightBp}`);\n }\n\n if (shadowBp) {\n styles.push(`box-shadow:${shadowToCSS(shadowBp)}`);\n }\n\n if (fontSizeBp) {\n styles.push(`font-size:${fontSizeBp}`);\n }\n\n if (styles.length > 0) {\n css.push(\n `@media(min-width:${minWidth}){${targetClass}{${styles.join(\";\")}}}`,\n );\n }\n }\n });\n\n return css.length > 0 ? minifyCSS(css.join(\"\")) : null;\n}\n","/**\n * CSS Animation Utilities\n * Generates CSS keyframe animations and transitions for navigation components.\n */\n\n/**\n * Generate CSS keyframe animations for toggle icons (hamburger, kebab, meatball, grid)\n */\nexport function generateToggleIconAnimations(): string[] {\n return [\n `@keyframes hamburger-top-open{0%{top:25%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(-45deg)}}`,\n `@keyframes hamburger-top-close{0%{top:50%;transform:translateY(-50%) rotate(-45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:25%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-bottom-open{0%{top:75%;transform:translateY(-50%) rotate(0deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:50%;transform:translateY(-50%) rotate(45deg)}}`,\n `@keyframes hamburger-bottom-close{0%{top:50%;transform:translateY(-50%) rotate(45deg)}50%{top:50%;transform:translateY(-50%) rotate(0deg)}100%{top:75%;transform:translateY(-50%) rotate(0deg)}}`,\n `@keyframes hamburger-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes hamburger-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes kebab-top-open{0%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes kebab-top-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:25%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-bottom-open{0%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes kebab-bottom-close{0%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{top:50%;width:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{top:75%;width:var(--dot-width);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes kebab-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes kebab-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes meatballs-left-open{0%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes meatballs-left-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-right-open{0%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes meatballs-right-close{0%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(-45deg)}50%{left:50%;height:100%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;height:var(--dot-height);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes meatballs-middle-hide{0%{opacity:1}50%{opacity:1}50.01%{opacity:0}100%{opacity:0}}`,\n `@keyframes meatballs-middle-show{0%{opacity:0}49.99%{opacity:0}50%{opacity:1}100%{opacity:1}}`,\n `@keyframes grid-tl-open{0%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}}`,\n `@keyframes grid-tl-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(-45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:25%;top:25%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n `@keyframes grid-tr-hide{0%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-tr-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}100%{left:75%;top:25%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-hide{0%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}33%{left:50%;top:50%;opacity:1;transform:translate(-50%,-50%)}33.01%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}100%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-bl-show{0%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}66.99%{left:50%;top:50%;opacity:0;transform:translate(-50%,-50%)}67%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}100%{left:25%;top:75%;opacity:1;transform:translate(-50%,-50%)}}`,\n `@keyframes grid-br-open{0%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}33%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}100%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}}`,\n `@keyframes grid-br-close{0%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(45deg)}33%{left:50%;top:50%;width:100%;height:12.5%;transform:translate(-50%,-50%) rotate(0deg)}66%{left:50%;top:50%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}100%{left:75%;top:75%;width:var(--square-size);height:var(--square-size);transform:translate(-50%,-50%) rotate(0deg)}}`,\n ];\n}\n\n/**\n * Generate CSS transitions for mobile menu open/close\n */\nexport function generateMobileMenuAnimations(): string[] {\n return [\n `.mobile-menu-enter{max-height:0;opacity:0}`,\n `.mobile-menu-enter-active{max-height:500px;opacity:1;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n `.mobile-menu-exit{max-height:500px;opacity:1}`,\n `.mobile-menu-exit-active{max-height:0;opacity:0;transition:max-height 300ms ease-in-out,opacity 300ms ease-in-out}`,\n ];\n}\n\n/**\n * Generate CSS transitions for desktop dropdown open/close\n */\nexport function generateDesktopDropdownAnimations(): string[] {\n return [\n `.desktop-dropdown-enter{opacity:0;transform:translateY(-8px)}`,\n `.desktop-dropdown-enter-active{opacity:1;transform:translateY(0);transition:opacity 200ms ease-out,transform 200ms ease-out}`,\n `.desktop-dropdown-exit{opacity:1;transform:translateY(0)}`,\n `.desktop-dropdown-exit-active{opacity:0;transform:translateY(-8px);transition:opacity 200ms ease-in,transform 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS transitions for same-layer dropdown open/close (grid-template-rows animation)\n */\nexport function generateSameLayerDropdownAnimations(): string[] {\n return [\n `.same-layer-dropdown-enter{grid-template-rows:0fr;opacity:0}`,\n `.same-layer-dropdown-enter-active{grid-template-rows:1fr;opacity:1;transition:grid-template-rows 250ms ease-out,opacity 200ms ease-out}`,\n `.same-layer-dropdown-exit{grid-template-rows:1fr;opacity:1}`,\n `.same-layer-dropdown-exit-active{grid-template-rows:0fr;opacity:0;transition:grid-template-rows 250ms ease-in,opacity 200ms ease-in}`,\n ];\n}\n\n/**\n * Generate CSS for custom scrollbar styling on mobile dropdowns\n */\nexport function generateScrollbarStyles(): string[] {\n return [\n `.mobile-dropdown-nav{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,0.2) transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar{width:0.5rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-track{background:transparent}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.2);border-radius:0.25rem}`,\n `.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,0.3)}`,\n `@media(prefers-color-scheme:dark){.mobile-dropdown-nav{scrollbar-color:rgba(255,255,255,0.2) transparent}.mobile-dropdown-nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.2)}.mobile-dropdown-nav::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,0.3)}}`,\n ];\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otl-core/style-utils",
3
- "version": "1.1.34",
3
+ "version": "1.1.36",
4
4
  "type": "module",
5
5
  "description": "CSS rendering utilities for OTL CMS — color/border/shadow resolution, responsive CSS generation, animation keyframes",
6
6
  "main": "./dist/index.cjs",
@@ -37,7 +37,7 @@
37
37
  "url": "https://github.com/otl-core/style-utils.git"
38
38
  },
39
39
  "dependencies": {
40
- "@otl-core/cms-types": "^1.1.34",
40
+ "@otl-core/cms-types": "^1.1.36",
41
41
  "clsx": "^2.1.1",
42
42
  "tailwind-merge": "^3.3.1"
43
43
  },