@lukas_holdings/castdom 1.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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +707 -0
  3. package/bin/castdom.js +2 -0
  4. package/dist/astro.cjs +86 -0
  5. package/dist/astro.cjs.map +1 -0
  6. package/dist/astro.d.cts +88 -0
  7. package/dist/astro.d.ts +88 -0
  8. package/dist/astro.js +80 -0
  9. package/dist/astro.js.map +1 -0
  10. package/dist/chunk-COLESJ66.js +57 -0
  11. package/dist/chunk-COLESJ66.js.map +1 -0
  12. package/dist/chunk-EJRNKHL5.js +31 -0
  13. package/dist/chunk-EJRNKHL5.js.map +1 -0
  14. package/dist/chunk-JRQ6EVQP.cjs +35 -0
  15. package/dist/chunk-JRQ6EVQP.cjs.map +1 -0
  16. package/dist/chunk-KGLTVTHU.js +73 -0
  17. package/dist/chunk-KGLTVTHU.js.map +1 -0
  18. package/dist/chunk-O4OOMGGM.cjs +198 -0
  19. package/dist/chunk-O4OOMGGM.cjs.map +1 -0
  20. package/dist/chunk-ONS533CQ.js +104 -0
  21. package/dist/chunk-ONS533CQ.js.map +1 -0
  22. package/dist/chunk-ORY4OMZ5.cjs +110 -0
  23. package/dist/chunk-ORY4OMZ5.cjs.map +1 -0
  24. package/dist/chunk-QLEBTZIB.cjs +64 -0
  25. package/dist/chunk-QLEBTZIB.cjs.map +1 -0
  26. package/dist/chunk-XS5HAU5E.cjs +109 -0
  27. package/dist/chunk-XS5HAU5E.cjs.map +1 -0
  28. package/dist/chunk-YDT4TPB7.cjs +84 -0
  29. package/dist/chunk-YDT4TPB7.cjs.map +1 -0
  30. package/dist/chunk-ZBJB7WVV.js +193 -0
  31. package/dist/chunk-ZBJB7WVV.js.map +1 -0
  32. package/dist/chunk-ZWZ5ZLJE.js +103 -0
  33. package/dist/chunk-ZWZ5ZLJE.js.map +1 -0
  34. package/dist/cli.js +135 -0
  35. package/dist/index.cjs +540 -0
  36. package/dist/index.cjs.map +1 -0
  37. package/dist/index.d.cts +176 -0
  38. package/dist/index.d.ts +176 -0
  39. package/dist/index.js +440 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/next.cjs +65 -0
  42. package/dist/next.cjs.map +1 -0
  43. package/dist/next.d.cts +72 -0
  44. package/dist/next.d.ts +72 -0
  45. package/dist/next.js +48 -0
  46. package/dist/next.js.map +1 -0
  47. package/dist/react.cjs +30 -0
  48. package/dist/react.cjs.map +1 -0
  49. package/dist/react.d.cts +70 -0
  50. package/dist/react.d.ts +70 -0
  51. package/dist/react.js +7 -0
  52. package/dist/react.js.map +1 -0
  53. package/dist/renderer-B1R7u2wm.d.ts +30 -0
  54. package/dist/renderer-Bfzjr6l9.d.cts +30 -0
  55. package/dist/ssr.cjs +46 -0
  56. package/dist/ssr.cjs.map +1 -0
  57. package/dist/ssr.d.cts +83 -0
  58. package/dist/ssr.d.ts +83 -0
  59. package/dist/ssr.js +5 -0
  60. package/dist/ssr.js.map +1 -0
  61. package/dist/types-ChD5jENU.d.cts +105 -0
  62. package/dist/types-ChD5jENU.d.ts +105 -0
  63. package/dist/vite.cjs +83 -0
  64. package/dist/vite.cjs.map +1 -0
  65. package/dist/vite.d.cts +81 -0
  66. package/dist/vite.d.ts +81 -0
  67. package/dist/vite.js +77 -0
  68. package/dist/vite.js.map +1 -0
  69. package/package.json +130 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/compress.ts","../src/core/animation.ts","../src/core/extractor.ts","../src/components/vanilla.ts"],"names":["BONE_KIND_INDEX","BONE_KIND_FROM_INDEX","DEFAULTS","style","loadManifest","register","get","selectBreakpoint","renderStandalone","generateCriticalCSS"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n Bone,\n BreakpointData,\n CompressedBones,\n BoneKind,\n} from \"./types.js\";\nimport { BONE_KIND_INDEX, BONE_KIND_FROM_INDEX } from \"./types.js\";\n\n/**\n * Compress bone data for storage/wire transfer.\n *\n * Strategy:\n * - Quantize all values to integers (multiply by 2, round, store as int)\n * - Delta-encode x/y positions (sorted top-to-bottom, left-to-right)\n * - Pack into a flat number array: [x, y, w, h, r, kind, ...]\n *\n * Achieves ~60-70% size reduction vs raw JSON.\n */\nexport function compressBones(bp: BreakpointData): CompressedBones {\n // Sort bones top-to-bottom, left-to-right for better delta encoding\n const sorted = [...bp.bones].sort((a, b) => a.y - b.y || a.x - b.x);\n\n const data: number[] = [];\n let prevX = 0;\n let prevY = 0;\n\n for (const bone of sorted) {\n // Quantize to half-pixels (multiply by 2 to store as int)\n const x = Math.round(bone.x * 2);\n const y = Math.round(bone.y * 2);\n const w = Math.round(bone.w * 2);\n const h = Math.round(bone.h * 2);\n const r = Math.round(bone.r * 2);\n const kind = BONE_KIND_INDEX[bone.kind ?? \"block\"];\n\n // Delta encode position\n data.push(x - prevX, y - prevY, w, h, r, kind);\n prevX = x;\n prevY = y;\n }\n\n return {\n v: 1,\n vw: bp.viewport,\n c: [\n Math.round(bp.containerWidth * 2),\n Math.round(bp.containerHeight * 2),\n ],\n d: data,\n };\n}\n\n/** Decompress bone data back to a BreakpointData */\nexport function decompressBones(compressed: CompressedBones): BreakpointData {\n const bones: Bone[] = [];\n const d = compressed.d;\n let prevX = 0;\n let prevY = 0;\n\n for (let i = 0; i < d.length; i += 6) {\n const dx = d[i];\n const dy = d[i + 1];\n const w = d[i + 2];\n const h = d[i + 3];\n const r = d[i + 4];\n const kindIdx = d[i + 5];\n\n prevX += dx;\n prevY += dy;\n\n bones.push({\n x: prevX / 2,\n y: prevY / 2,\n w: w / 2,\n h: h / 2,\n r: r / 2,\n kind: BONE_KIND_FROM_INDEX[kindIdx] ?? \"block\",\n });\n }\n\n return {\n viewport: compressed.vw,\n containerWidth: compressed.c[0] / 2,\n containerHeight: compressed.c[1] / 2,\n bones,\n };\n}\n\n/**\n * Encode compressed bones to a base64 string for embedding.\n * Uses a simple variable-length integer encoding for even smaller output.\n */\nexport function encodeBonesToBase64(compressed: CompressedBones): string {\n const header = [compressed.v, compressed.vw, compressed.c[0], compressed.c[1]];\n const allNums = [...header, compressed.d.length, ...compressed.d];\n\n // Zigzag encode signed integers, then varint encode\n const bytes: number[] = [];\n for (const n of allNums) {\n // Zigzag: map signed to unsigned\n const z = n >= 0 ? n * 2 : -n * 2 - 1;\n // Varint: 7 bits per byte, high bit = continuation\n let val = z;\n while (val >= 0x80) {\n bytes.push((val & 0x7f) | 0x80);\n val >>>= 7;\n }\n bytes.push(val & 0x7f);\n }\n\n // Convert to base64\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(new Uint8Array(bytes)).toString(\"base64\");\n }\n // Browser fallback\n return btoa(String.fromCharCode(...bytes));\n}\n\n/** Decode base64-encoded bones back to CompressedBones */\nexport function decodeBonesToBase64(b64: string): CompressedBones {\n let bytes: Uint8Array;\n\n if (typeof Buffer !== \"undefined\") {\n bytes = Buffer.from(b64, \"base64\");\n } else {\n const raw = atob(b64);\n bytes = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i++) bytes[i] = raw.charCodeAt(i);\n }\n\n // Decode varints\n const nums: number[] = [];\n let pos = 0;\n while (pos < bytes.length) {\n let val = 0;\n let shift = 0;\n let b: number;\n do {\n b = bytes[pos++];\n val |= (b & 0x7f) << shift;\n shift += 7;\n } while (b & 0x80);\n // Zigzag decode\n nums.push(val & 1 ? -(val >>> 1) - 1 : val >>> 1);\n }\n\n const v = nums[0] as 1;\n const vw = nums[1];\n const c: [number, number] = [nums[2], nums[3]];\n const dLen = nums[4];\n const d = nums.slice(5, 5 + dLen);\n\n return { v, vw, c, d };\n}\n","import type { CastDOMConfig } from \"./types.js\";\nimport { DEFAULTS } from \"./types.js\";\n\n/**\n * CSS animation generator for CastDOM skeletons.\n *\n * Generates optimized CSS animations:\n * - Shimmer (default): gradient sweep from left to right\n * - Pulse: opacity fade in/out\n * - Wave: staggered reveal animation\n * - None: static placeholder (for prefers-reduced-motion)\n */\n\nexport type AnimationType = \"shimmer\" | \"pulse\" | \"wave\" | \"none\";\n\nexport interface AnimationConfig {\n type?: AnimationType;\n duration?: number;\n color?: string;\n shimmerColor?: string;\n classPrefix?: string;\n /** Stagger delay between bones for wave animation (ms) */\n stagger?: number;\n}\n\n/** Generate the CSS keyframes for a given animation type */\nexport function generateKeyframes(config?: AnimationConfig): string {\n const type = config?.type ?? \"shimmer\";\n const prefix = config?.classPrefix ?? DEFAULTS.classPrefix;\n const duration = config?.duration ?? DEFAULTS.animationDuration;\n\n switch (type) {\n case \"shimmer\":\n return `@keyframes ${prefix}-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}`;\n\n case \"pulse\":\n return `@keyframes ${prefix}-pulse{0%,100%{opacity:1}50%{opacity:0.4}}`;\n\n case \"wave\":\n return `@keyframes ${prefix}-wave{0%{opacity:0.4}50%{opacity:1}100%{opacity:0.4}}`;\n\n case \"none\":\n return \"\";\n }\n}\n\n/** Generate the CSS for bone elements with a given animation type */\nexport function generateBoneAnimation(config?: AnimationConfig): string {\n const type = config?.type ?? \"shimmer\";\n const prefix = config?.classPrefix ?? DEFAULTS.classPrefix;\n const duration = config?.duration ?? DEFAULTS.animationDuration;\n const color = config?.color ?? DEFAULTS.color;\n const shimmerColor = config?.shimmerColor ?? DEFAULTS.shimmerColor;\n\n switch (type) {\n case \"shimmer\":\n return `background:linear-gradient(90deg,${color} 25%,${shimmerColor} 50%,${color} 75%);background-size:200% 100%;animation:${prefix}-shimmer ${duration}ms ease-in-out infinite`;\n\n case \"pulse\":\n return `background:${color};animation:${prefix}-pulse ${duration}ms ease-in-out infinite`;\n\n case \"wave\":\n return `background:${color};animation:${prefix}-wave ${duration}ms ease-in-out infinite`;\n\n case \"none\":\n return `background:${color}`;\n }\n}\n\n/**\n * Generate stagger delays for wave animation.\n * Each bone gets a progressively delayed start.\n */\nexport function generateStaggerCSS(\n skeletonName: string,\n boneCount: number,\n config?: AnimationConfig\n): string {\n const prefix = config?.classPrefix ?? DEFAULTS.classPrefix;\n const stagger = config?.stagger ?? 50;\n const rules: string[] = [];\n\n for (let i = 0; i < boneCount; i++) {\n rules.push(\n `.${prefix}-${skeletonName} .${prefix}-bone:nth-child(${i + 1}){animation-delay:${i * stagger}ms}`\n );\n }\n\n return rules.join(\"\");\n}\n\n/**\n * Generate complete animation CSS bundle for a skeleton.\n * Includes keyframes, bone styles, and reduced-motion fallback.\n */\nexport function generateAnimationCSS(\n skeletonName: string,\n boneCount: number,\n config?: AnimationConfig\n): string {\n const prefix = config?.classPrefix ?? DEFAULTS.classPrefix;\n const type = config?.type ?? \"shimmer\";\n\n const parts: string[] = [];\n\n // Keyframes\n const kf = generateKeyframes(config);\n if (kf) parts.push(kf);\n\n // Bone animation\n const anim = generateBoneAnimation(config);\n parts.push(`.${prefix}-${skeletonName} .${prefix}-bone{position:absolute;${anim}}`);\n\n // Stagger for wave\n if (type === \"wave\") {\n parts.push(generateStaggerCSS(skeletonName, boneCount, config));\n }\n\n // Reduced motion fallback\n parts.push(\n `@media(prefers-reduced-motion:reduce){.${prefix}-${skeletonName} .${prefix}-bone{animation:none!important}}`\n );\n\n return parts.join(\"\\n\");\n}\n","import type { Bone, BoneKind, BreakpointData, CastDOMConfig } from \"./types.js\";\nimport { DEFAULTS } from \"./types.js\";\n\n/**\n * DOM Extractor — runs in the browser context.\n * Reads getBoundingClientRect() on every visible element inside a container\n * and produces a flat array of bones.\n *\n * This is injected into the page via Playwright during the build step,\n * or can be called directly in dev mode.\n */\n\nconst INLINE_TAGS = new Set([\n \"A\", \"ABBR\", \"B\", \"BDO\", \"BR\", \"CITE\", \"CODE\", \"DFN\", \"EM\", \"I\",\n \"KBD\", \"MARK\", \"Q\", \"S\", \"SAMP\", \"SMALL\", \"SPAN\", \"STRONG\", \"SUB\",\n \"SUP\", \"TIME\", \"U\", \"VAR\", \"WBR\",\n]);\n\nconst SKIP_TAGS = new Set([\n \"SCRIPT\", \"STYLE\", \"NOSCRIPT\", \"TEMPLATE\", \"SVG\", \"CANVAS\",\n \"VIDEO\", \"AUDIO\", \"IFRAME\", \"OBJECT\", \"EMBED\",\n]);\n\n/** Detect the semantic kind of a DOM element */\nfunction detectKind(el: Element): BoneKind {\n const tag = el.tagName;\n\n if (tag === \"IMG\" || tag === \"PICTURE\") {\n const w = el.getBoundingClientRect().width;\n const h = el.getBoundingClientRect().height;\n const ratio = Math.min(w, h) / Math.max(w, h);\n if (ratio > 0.85 && w < 120) return \"avatar\";\n return \"image\";\n }\n\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return \"input\";\n if (tag === \"BUTTON\" || el.getAttribute(\"role\") === \"button\") return \"button\";\n if (tag === \"HR\") return \"divider\";\n if (/^H[1-6]$/.test(tag)) return \"heading\";\n if (tag === \"SVG\" || tag === \"svg\") return \"icon\";\n\n // Check for avatar-like elements (small, round images via CSS)\n const style = getComputedStyle(el);\n const borderRadius = parseInt(style.borderRadius, 10);\n const rect = el.getBoundingClientRect();\n if (borderRadius >= rect.width / 2 && rect.width < 120 && rect.width > 16) {\n return \"avatar\";\n }\n\n // Text detection\n if (el.childNodes.length > 0) {\n const hasDirectText = Array.from(el.childNodes).some(\n (n) => n.nodeType === Node.TEXT_NODE && n.textContent?.trim()\n );\n if (hasDirectText && INLINE_TAGS.has(tag)) return \"text\";\n if (hasDirectText && tag === \"P\") return \"text\";\n }\n\n return \"block\";\n}\n\n/** Compute border radius for a bone */\nfunction computeRadius(el: Element, kind: BoneKind): number {\n if (kind === \"avatar\") return 9999;\n if (kind === \"button\") {\n const style = getComputedStyle(el);\n return Math.min(parseInt(style.borderRadius, 10) || 6, 9999);\n }\n\n const style = getComputedStyle(el);\n const r = parseInt(style.borderRadius, 10);\n return isNaN(r) ? 0 : Math.min(r, 9999);\n}\n\n/** Check if element is visible */\nfunction isVisible(el: Element): boolean {\n const style = getComputedStyle(el);\n if (style.display === \"none\") return false;\n if (style.visibility === \"hidden\") return false;\n if (parseFloat(style.opacity) === 0) return false;\n\n const rect = el.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n\n/** Check if element is a leaf (should be a bone, not traversed further) */\nfunction isLeaf(el: Element, contentAware: boolean): boolean {\n const tag = el.tagName;\n\n // Always leaf: replaced elements, form controls\n if (\n tag === \"IMG\" || tag === \"PICTURE\" || tag === \"INPUT\" ||\n tag === \"TEXTAREA\" || tag === \"SELECT\" || tag === \"BUTTON\" ||\n tag === \"HR\" || tag === \"SVG\" || tag === \"svg\"\n ) {\n return true;\n }\n\n // If content-aware, check for text-only leaves\n if (contentAware) {\n const hasOnlyText = Array.from(el.childNodes).every(\n (n) => n.nodeType === Node.TEXT_NODE || INLINE_TAGS.has((n as Element).tagName)\n );\n if (hasOnlyText && el.textContent?.trim()) return true;\n }\n\n // No children = leaf\n if (el.children.length === 0) return true;\n\n return false;\n}\n\nexport interface ExtractOptions {\n contentAware?: boolean;\n minBoneSize?: number;\n}\n\n/**\n * Extract bones from a container element.\n * Call this in the browser context (via Playwright or directly).\n */\nexport function extractBones(\n container: Element,\n options: ExtractOptions = {}\n): BreakpointData {\n const contentAware = options.contentAware ?? DEFAULTS.contentAware;\n const minSize = options.minBoneSize ?? DEFAULTS.minBoneSize;\n const containerRect = container.getBoundingClientRect();\n const bones: Bone[] = [];\n\n function walk(el: Element): void {\n if (SKIP_TAGS.has(el.tagName)) return;\n if (!isVisible(el)) return;\n\n if (isLeaf(el, contentAware)) {\n const rect = el.getBoundingClientRect();\n\n // Skip tiny elements\n if (rect.width < minSize || rect.height < minSize) return;\n\n const kind = contentAware ? detectKind(el) : \"block\";\n const r = computeRadius(el, kind);\n\n // Quantize to nearest 0.5px for smaller output\n bones.push({\n x: Math.round((rect.left - containerRect.left) * 2) / 2,\n y: Math.round((rect.top - containerRect.top) * 2) / 2,\n w: Math.round(rect.width * 2) / 2,\n h: Math.round(rect.height * 2) / 2,\n r,\n kind,\n });\n return;\n }\n\n // Traverse children\n for (const child of el.children) {\n walk(child);\n }\n }\n\n walk(container);\n\n return {\n viewport: window.innerWidth,\n containerWidth: Math.round(containerRect.width * 2) / 2,\n containerHeight: Math.round(containerRect.height * 2) / 2,\n bones,\n };\n}\n\n/**\n * Serializable extraction function — returns a string that can be\n * evaluated in a Playwright page context.\n */\nexport function getExtractorScript(\n selector: string,\n options: ExtractOptions = {}\n): string {\n // Serialize the entire extraction logic for injection\n return `\n(function() {\n ${isVisible.toString()}\n ${isLeaf.toString()}\n ${detectKind.toString()}\n ${computeRadius.toString()}\n\n var INLINE_TAGS = new Set(${JSON.stringify([...INLINE_TAGS])});\n var SKIP_TAGS = new Set(${JSON.stringify([...SKIP_TAGS])});\n var DEFAULTS = { contentAware: true, minBoneSize: 4 };\n\n ${extractBones.toString()}\n\n var container = document.querySelector(${JSON.stringify(selector)});\n if (!container) throw new Error('CastDOM: Container not found: ' + ${JSON.stringify(selector)});\n return extractBones(container, ${JSON.stringify(options)});\n})()\n `.trim();\n}\n","import type { SkeletonData, CastDOMConfig } from \"../core/types.js\";\nimport { get as getFromRegistry, register, loadManifest } from \"../core/registry.js\";\nimport { renderStandalone, renderResponsiveHTML, generateCriticalCSS } from \"../core/renderer.js\";\nimport { selectBreakpoint } from \"../core/responsive.js\";\nimport { DEFAULTS } from \"../core/types.js\";\n\n/**\n * Vanilla JS API for CastDOM.\n * Use this when you're not using React or another framework.\n *\n * Usage:\n * ```js\n * import { createCastDOM } from 'castdom';\n *\n * const castdom = createCastDOM();\n * castdom.loadManifest(manifest);\n *\n * // Show skeleton\n * castdom.show('user-card', document.getElementById('container'));\n *\n * // Later, hide skeleton and show real content\n * castdom.hide('user-card', document.getElementById('container'));\n * ```\n */\n\nexport interface CastDOMInstance {\n /** Load skeleton data from a manifest */\n loadManifest(manifest: { skeletons: SkeletonData[] }): void;\n /** Register a single skeleton */\n register(data: SkeletonData): void;\n /** Show a skeleton in a container element */\n show(name: string, container: HTMLElement): void;\n /** Hide the skeleton and restore the container */\n hide(name: string, container: HTMLElement): void;\n /** Toggle skeleton visibility based on loading state */\n toggle(name: string, container: HTMLElement, loading: boolean): void;\n /** Get the HTML string for a skeleton (for manual insertion) */\n html(name: string, viewportWidth?: number): string;\n /** Get the CSS for all registered skeletons */\n css(): string;\n /** Inject critical CSS into the document head */\n injectCSS(): void;\n /** Destroy the instance and clean up */\n destroy(): void;\n}\n\nconst ACTIVE_ATTR = \"data-castdom-active\";\nconst SKELETON_ATTR = \"data-castdom-skeleton\";\n\nexport function createCastDOM(config?: Partial<CastDOMConfig>): CastDOMInstance {\n let styleEl: HTMLStyleElement | null = null;\n let cssInjected = false;\n const activeContainers = new Set<HTMLElement>();\n\n function ensureCSS(): void {\n if (cssInjected || typeof document === \"undefined\") return;\n\n styleEl = document.createElement(\"style\");\n styleEl.setAttribute(\"data-castdom\", \"critical\");\n styleEl.textContent = [\n `@keyframes castdom-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}`,\n `@keyframes castdom-pulse{0%,100%{opacity:1}50%{opacity:0.4}}`,\n `@keyframes castdom-wave{0%{opacity:0.4}50%{opacity:1}100%{opacity:0.4}}`,\n `@media(prefers-reduced-motion:reduce){.castdom-bone{animation:none!important}}`,\n ].join(\"\");\n document.head.appendChild(styleEl);\n cssInjected = true;\n }\n\n return {\n loadManifest(manifest) {\n loadManifest(manifest);\n },\n\n register(data) {\n register(data);\n },\n\n show(name, container) {\n const entry = getFromRegistry(name);\n if (!entry) {\n console.warn(`CastDOM: Skeleton \"${name}\" not found in registry`);\n return;\n }\n\n ensureCSS();\n\n // Store original content\n if (!container.hasAttribute(ACTIVE_ATTR)) {\n container.setAttribute(ACTIVE_ATTR, \"true\");\n // Hide children but keep them in DOM\n for (const child of Array.from(container.children)) {\n if (!child.hasAttribute(SKELETON_ATTR)) {\n (child as HTMLElement).style.display = \"none\";\n }\n }\n }\n\n // Create skeleton element\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 1280;\n const bp = selectBreakpoint(entry.data, vw);\n if (!bp) return;\n\n const skeletonDiv = document.createElement(\"div\");\n skeletonDiv.setAttribute(SKELETON_ATTR, name);\n skeletonDiv.innerHTML = renderStandalone(entry.data, config);\n container.appendChild(skeletonDiv);\n activeContainers.add(container);\n },\n\n hide(name, container) {\n // Remove skeleton\n const skeleton = container.querySelector(`[${SKELETON_ATTR}=\"${name}\"]`);\n if (skeleton) skeleton.remove();\n\n // Restore children\n container.removeAttribute(ACTIVE_ATTR);\n for (const child of Array.from(container.children)) {\n if (!(child as HTMLElement).hasAttribute(SKELETON_ATTR)) {\n (child as HTMLElement).style.display = \"\";\n }\n }\n activeContainers.delete(container);\n },\n\n toggle(name, container, loading) {\n if (loading) {\n this.show(name, container);\n } else {\n this.hide(name, container);\n }\n },\n\n html(name, viewportWidth) {\n const entry = getFromRegistry(name);\n if (!entry) return \"\";\n return renderStandalone(entry.data, config);\n },\n\n css() {\n return generateCriticalCSS(\n Array.from(activeContainers)\n .map((c) => {\n const name = c.querySelector(`[${SKELETON_ATTR}]`)?.getAttribute(SKELETON_ATTR);\n return name ? getFromRegistry(name)?.data : undefined;\n })\n .filter(Boolean) as SkeletonData[],\n config\n );\n },\n\n injectCSS() {\n ensureCSS();\n },\n\n destroy() {\n // Remove all active skeletons\n for (const container of activeContainers) {\n const skeletons = container.querySelectorAll(`[${SKELETON_ATTR}]`);\n for (const s of skeletons) s.remove();\n container.removeAttribute(ACTIVE_ATTR);\n for (const child of Array.from(container.children)) {\n (child as HTMLElement).style.display = \"\";\n }\n }\n activeContainers.clear();\n\n // Remove injected CSS\n if (styleEl) {\n styleEl.remove();\n styleEl = null;\n cssInjected = false;\n }\n },\n };\n}\n\nexport default createCastDOM;\n"]}
@@ -0,0 +1,176 @@
1
+ import { C as CastDOMConfig, R as RegistryEntry, S as SkeletonData, B as BreakpointData, a as Bone, b as CompressedBones } from './types-ChD5jENU.cjs';
2
+ export { c as BONE_KIND_FROM_INDEX, d as BONE_KIND_INDEX, e as BoneKind, D as DEFAULTS, E as ExtractionResult, f as ExtractionTarget } from './types-ChD5jENU.cjs';
3
+ export { g as generateCSS, a as generateCriticalCSS, r as renderBonesHTML, b as renderResponsiveHTML, c as renderStandalone } from './renderer-Bfzjr6l9.cjs';
4
+
5
+ declare let globalConfig: Required<Pick<CastDOMConfig, "color" | "shimmerColor" | "animationDuration" | "classPrefix" | "inlineStyles">>;
6
+ /** Configure global registry settings */
7
+ declare function configure(config: Partial<typeof globalConfig>): void;
8
+ /** Register a single skeleton */
9
+ declare function register(data: SkeletonData): void;
10
+ /** Register multiple skeletons at once */
11
+ declare function registerAll(skeletons: SkeletonData[]): void;
12
+ /** Load and register skeletons from a generated manifest file */
13
+ declare function loadManifest(manifest: {
14
+ skeletons: SkeletonData[];
15
+ }): void;
16
+ /** Get a registered skeleton by name */
17
+ declare function get(name: string): RegistryEntry | undefined;
18
+ /** Check if a skeleton is registered */
19
+ declare function has(name: string): boolean;
20
+ /** Get all registered skeleton names */
21
+ declare function names(): string[];
22
+ /** Remove a skeleton from the registry */
23
+ declare function remove(name: string): boolean;
24
+ /** Clear all registered skeletons */
25
+ declare function clear(): void;
26
+ /** Get the combined CSS for all registered skeletons */
27
+ declare function getAllCSS(): string;
28
+
29
+ /**
30
+ * Responsive breakpoint system for CastDOM.
31
+ *
32
+ * Handles:
33
+ * - Selecting the best breakpoint for a given viewport width
34
+ * - Interpolating between breakpoints for fluid layouts
35
+ * - Diffing breakpoints to only store changes
36
+ */
37
+ /** Select the best breakpoint for a given viewport width */
38
+ declare function selectBreakpoint(skeleton: SkeletonData, viewportWidth: number): BreakpointData | null;
39
+ /**
40
+ * Interpolate bones between two breakpoints for a target viewport width.
41
+ * Provides fluid skeleton sizing between captured breakpoints.
42
+ */
43
+ declare function interpolateBones(from: BreakpointData, to: BreakpointData, targetWidth: number): BreakpointData;
44
+ /**
45
+ * Compute a diff between two breakpoints.
46
+ * Only stores bones that changed position/size significantly.
47
+ * Used to reduce storage when breakpoints are similar.
48
+ */
49
+ declare function diffBreakpoints(base: BreakpointData, target: BreakpointData, threshold?: number): {
50
+ changed: number[];
51
+ bones: Bone[];
52
+ };
53
+ /**
54
+ * Validate breakpoint configuration.
55
+ * Ensures breakpoints are sorted, unique, and reasonable.
56
+ */
57
+ declare function validateBreakpoints(breakpoints: number[]): number[];
58
+ /**
59
+ * Determine which breakpoints need re-extraction.
60
+ * Compares existing data against current config.
61
+ */
62
+ declare function getStaleBreakpoints(skeleton: SkeletonData, targetBreakpoints: number[]): number[];
63
+
64
+ /**
65
+ * Compress bone data for storage/wire transfer.
66
+ *
67
+ * Strategy:
68
+ * - Quantize all values to integers (multiply by 2, round, store as int)
69
+ * - Delta-encode x/y positions (sorted top-to-bottom, left-to-right)
70
+ * - Pack into a flat number array: [x, y, w, h, r, kind, ...]
71
+ *
72
+ * Achieves ~60-70% size reduction vs raw JSON.
73
+ */
74
+ declare function compressBones(bp: BreakpointData): CompressedBones;
75
+ /** Decompress bone data back to a BreakpointData */
76
+ declare function decompressBones(compressed: CompressedBones): BreakpointData;
77
+ /**
78
+ * Encode compressed bones to a base64 string for embedding.
79
+ * Uses a simple variable-length integer encoding for even smaller output.
80
+ */
81
+ declare function encodeBonesToBase64(compressed: CompressedBones): string;
82
+ /** Decode base64-encoded bones back to CompressedBones */
83
+ declare function decodeBonesToBase64(b64: string): CompressedBones;
84
+
85
+ /**
86
+ * CSS animation generator for CastDOM skeletons.
87
+ *
88
+ * Generates optimized CSS animations:
89
+ * - Shimmer (default): gradient sweep from left to right
90
+ * - Pulse: opacity fade in/out
91
+ * - Wave: staggered reveal animation
92
+ * - None: static placeholder (for prefers-reduced-motion)
93
+ */
94
+ type AnimationType = "shimmer" | "pulse" | "wave" | "none";
95
+ interface AnimationConfig {
96
+ type?: AnimationType;
97
+ duration?: number;
98
+ color?: string;
99
+ shimmerColor?: string;
100
+ classPrefix?: string;
101
+ /** Stagger delay between bones for wave animation (ms) */
102
+ stagger?: number;
103
+ }
104
+ /** Generate the CSS keyframes for a given animation type */
105
+ declare function generateKeyframes(config?: AnimationConfig): string;
106
+ /** Generate the CSS for bone elements with a given animation type */
107
+ declare function generateBoneAnimation(config?: AnimationConfig): string;
108
+ /**
109
+ * Generate stagger delays for wave animation.
110
+ * Each bone gets a progressively delayed start.
111
+ */
112
+ declare function generateStaggerCSS(skeletonName: string, boneCount: number, config?: AnimationConfig): string;
113
+ /**
114
+ * Generate complete animation CSS bundle for a skeleton.
115
+ * Includes keyframes, bone styles, and reduced-motion fallback.
116
+ */
117
+ declare function generateAnimationCSS(skeletonName: string, boneCount: number, config?: AnimationConfig): string;
118
+
119
+ interface ExtractOptions {
120
+ contentAware?: boolean;
121
+ minBoneSize?: number;
122
+ }
123
+ /**
124
+ * Extract bones from a container element.
125
+ * Call this in the browser context (via Playwright or directly).
126
+ */
127
+ declare function extractBones(container: Element, options?: ExtractOptions): BreakpointData;
128
+ /**
129
+ * Serializable extraction function — returns a string that can be
130
+ * evaluated in a Playwright page context.
131
+ */
132
+ declare function getExtractorScript(selector: string, options?: ExtractOptions): string;
133
+
134
+ /**
135
+ * Vanilla JS API for CastDOM.
136
+ * Use this when you're not using React or another framework.
137
+ *
138
+ * Usage:
139
+ * ```js
140
+ * import { createCastDOM } from 'castdom';
141
+ *
142
+ * const castdom = createCastDOM();
143
+ * castdom.loadManifest(manifest);
144
+ *
145
+ * // Show skeleton
146
+ * castdom.show('user-card', document.getElementById('container'));
147
+ *
148
+ * // Later, hide skeleton and show real content
149
+ * castdom.hide('user-card', document.getElementById('container'));
150
+ * ```
151
+ */
152
+ interface CastDOMInstance {
153
+ /** Load skeleton data from a manifest */
154
+ loadManifest(manifest: {
155
+ skeletons: SkeletonData[];
156
+ }): void;
157
+ /** Register a single skeleton */
158
+ register(data: SkeletonData): void;
159
+ /** Show a skeleton in a container element */
160
+ show(name: string, container: HTMLElement): void;
161
+ /** Hide the skeleton and restore the container */
162
+ hide(name: string, container: HTMLElement): void;
163
+ /** Toggle skeleton visibility based on loading state */
164
+ toggle(name: string, container: HTMLElement, loading: boolean): void;
165
+ /** Get the HTML string for a skeleton (for manual insertion) */
166
+ html(name: string, viewportWidth?: number): string;
167
+ /** Get the CSS for all registered skeletons */
168
+ css(): string;
169
+ /** Inject critical CSS into the document head */
170
+ injectCSS(): void;
171
+ /** Destroy the instance and clean up */
172
+ destroy(): void;
173
+ }
174
+ declare function createCastDOM(config?: Partial<CastDOMConfig>): CastDOMInstance;
175
+
176
+ export { type AnimationConfig, type AnimationType, Bone, BreakpointData, CastDOMConfig, type CastDOMInstance, CompressedBones, type ExtractOptions, RegistryEntry, SkeletonData, clear, compressBones, configure, createCastDOM, decodeBonesToBase64, decompressBones, diffBreakpoints, encodeBonesToBase64, extractBones, generateAnimationCSS, generateBoneAnimation, generateKeyframes, generateStaggerCSS, get, getAllCSS, getExtractorScript, getStaleBreakpoints, has, interpolateBones, loadManifest, names, register, registerAll, remove, selectBreakpoint, validateBreakpoints };
@@ -0,0 +1,176 @@
1
+ import { C as CastDOMConfig, R as RegistryEntry, S as SkeletonData, B as BreakpointData, a as Bone, b as CompressedBones } from './types-ChD5jENU.js';
2
+ export { c as BONE_KIND_FROM_INDEX, d as BONE_KIND_INDEX, e as BoneKind, D as DEFAULTS, E as ExtractionResult, f as ExtractionTarget } from './types-ChD5jENU.js';
3
+ export { g as generateCSS, a as generateCriticalCSS, r as renderBonesHTML, b as renderResponsiveHTML, c as renderStandalone } from './renderer-B1R7u2wm.js';
4
+
5
+ declare let globalConfig: Required<Pick<CastDOMConfig, "color" | "shimmerColor" | "animationDuration" | "classPrefix" | "inlineStyles">>;
6
+ /** Configure global registry settings */
7
+ declare function configure(config: Partial<typeof globalConfig>): void;
8
+ /** Register a single skeleton */
9
+ declare function register(data: SkeletonData): void;
10
+ /** Register multiple skeletons at once */
11
+ declare function registerAll(skeletons: SkeletonData[]): void;
12
+ /** Load and register skeletons from a generated manifest file */
13
+ declare function loadManifest(manifest: {
14
+ skeletons: SkeletonData[];
15
+ }): void;
16
+ /** Get a registered skeleton by name */
17
+ declare function get(name: string): RegistryEntry | undefined;
18
+ /** Check if a skeleton is registered */
19
+ declare function has(name: string): boolean;
20
+ /** Get all registered skeleton names */
21
+ declare function names(): string[];
22
+ /** Remove a skeleton from the registry */
23
+ declare function remove(name: string): boolean;
24
+ /** Clear all registered skeletons */
25
+ declare function clear(): void;
26
+ /** Get the combined CSS for all registered skeletons */
27
+ declare function getAllCSS(): string;
28
+
29
+ /**
30
+ * Responsive breakpoint system for CastDOM.
31
+ *
32
+ * Handles:
33
+ * - Selecting the best breakpoint for a given viewport width
34
+ * - Interpolating between breakpoints for fluid layouts
35
+ * - Diffing breakpoints to only store changes
36
+ */
37
+ /** Select the best breakpoint for a given viewport width */
38
+ declare function selectBreakpoint(skeleton: SkeletonData, viewportWidth: number): BreakpointData | null;
39
+ /**
40
+ * Interpolate bones between two breakpoints for a target viewport width.
41
+ * Provides fluid skeleton sizing between captured breakpoints.
42
+ */
43
+ declare function interpolateBones(from: BreakpointData, to: BreakpointData, targetWidth: number): BreakpointData;
44
+ /**
45
+ * Compute a diff between two breakpoints.
46
+ * Only stores bones that changed position/size significantly.
47
+ * Used to reduce storage when breakpoints are similar.
48
+ */
49
+ declare function diffBreakpoints(base: BreakpointData, target: BreakpointData, threshold?: number): {
50
+ changed: number[];
51
+ bones: Bone[];
52
+ };
53
+ /**
54
+ * Validate breakpoint configuration.
55
+ * Ensures breakpoints are sorted, unique, and reasonable.
56
+ */
57
+ declare function validateBreakpoints(breakpoints: number[]): number[];
58
+ /**
59
+ * Determine which breakpoints need re-extraction.
60
+ * Compares existing data against current config.
61
+ */
62
+ declare function getStaleBreakpoints(skeleton: SkeletonData, targetBreakpoints: number[]): number[];
63
+
64
+ /**
65
+ * Compress bone data for storage/wire transfer.
66
+ *
67
+ * Strategy:
68
+ * - Quantize all values to integers (multiply by 2, round, store as int)
69
+ * - Delta-encode x/y positions (sorted top-to-bottom, left-to-right)
70
+ * - Pack into a flat number array: [x, y, w, h, r, kind, ...]
71
+ *
72
+ * Achieves ~60-70% size reduction vs raw JSON.
73
+ */
74
+ declare function compressBones(bp: BreakpointData): CompressedBones;
75
+ /** Decompress bone data back to a BreakpointData */
76
+ declare function decompressBones(compressed: CompressedBones): BreakpointData;
77
+ /**
78
+ * Encode compressed bones to a base64 string for embedding.
79
+ * Uses a simple variable-length integer encoding for even smaller output.
80
+ */
81
+ declare function encodeBonesToBase64(compressed: CompressedBones): string;
82
+ /** Decode base64-encoded bones back to CompressedBones */
83
+ declare function decodeBonesToBase64(b64: string): CompressedBones;
84
+
85
+ /**
86
+ * CSS animation generator for CastDOM skeletons.
87
+ *
88
+ * Generates optimized CSS animations:
89
+ * - Shimmer (default): gradient sweep from left to right
90
+ * - Pulse: opacity fade in/out
91
+ * - Wave: staggered reveal animation
92
+ * - None: static placeholder (for prefers-reduced-motion)
93
+ */
94
+ type AnimationType = "shimmer" | "pulse" | "wave" | "none";
95
+ interface AnimationConfig {
96
+ type?: AnimationType;
97
+ duration?: number;
98
+ color?: string;
99
+ shimmerColor?: string;
100
+ classPrefix?: string;
101
+ /** Stagger delay between bones for wave animation (ms) */
102
+ stagger?: number;
103
+ }
104
+ /** Generate the CSS keyframes for a given animation type */
105
+ declare function generateKeyframes(config?: AnimationConfig): string;
106
+ /** Generate the CSS for bone elements with a given animation type */
107
+ declare function generateBoneAnimation(config?: AnimationConfig): string;
108
+ /**
109
+ * Generate stagger delays for wave animation.
110
+ * Each bone gets a progressively delayed start.
111
+ */
112
+ declare function generateStaggerCSS(skeletonName: string, boneCount: number, config?: AnimationConfig): string;
113
+ /**
114
+ * Generate complete animation CSS bundle for a skeleton.
115
+ * Includes keyframes, bone styles, and reduced-motion fallback.
116
+ */
117
+ declare function generateAnimationCSS(skeletonName: string, boneCount: number, config?: AnimationConfig): string;
118
+
119
+ interface ExtractOptions {
120
+ contentAware?: boolean;
121
+ minBoneSize?: number;
122
+ }
123
+ /**
124
+ * Extract bones from a container element.
125
+ * Call this in the browser context (via Playwright or directly).
126
+ */
127
+ declare function extractBones(container: Element, options?: ExtractOptions): BreakpointData;
128
+ /**
129
+ * Serializable extraction function — returns a string that can be
130
+ * evaluated in a Playwright page context.
131
+ */
132
+ declare function getExtractorScript(selector: string, options?: ExtractOptions): string;
133
+
134
+ /**
135
+ * Vanilla JS API for CastDOM.
136
+ * Use this when you're not using React or another framework.
137
+ *
138
+ * Usage:
139
+ * ```js
140
+ * import { createCastDOM } from 'castdom';
141
+ *
142
+ * const castdom = createCastDOM();
143
+ * castdom.loadManifest(manifest);
144
+ *
145
+ * // Show skeleton
146
+ * castdom.show('user-card', document.getElementById('container'));
147
+ *
148
+ * // Later, hide skeleton and show real content
149
+ * castdom.hide('user-card', document.getElementById('container'));
150
+ * ```
151
+ */
152
+ interface CastDOMInstance {
153
+ /** Load skeleton data from a manifest */
154
+ loadManifest(manifest: {
155
+ skeletons: SkeletonData[];
156
+ }): void;
157
+ /** Register a single skeleton */
158
+ register(data: SkeletonData): void;
159
+ /** Show a skeleton in a container element */
160
+ show(name: string, container: HTMLElement): void;
161
+ /** Hide the skeleton and restore the container */
162
+ hide(name: string, container: HTMLElement): void;
163
+ /** Toggle skeleton visibility based on loading state */
164
+ toggle(name: string, container: HTMLElement, loading: boolean): void;
165
+ /** Get the HTML string for a skeleton (for manual insertion) */
166
+ html(name: string, viewportWidth?: number): string;
167
+ /** Get the CSS for all registered skeletons */
168
+ css(): string;
169
+ /** Inject critical CSS into the document head */
170
+ injectCSS(): void;
171
+ /** Destroy the instance and clean up */
172
+ destroy(): void;
173
+ }
174
+ declare function createCastDOM(config?: Partial<CastDOMConfig>): CastDOMInstance;
175
+
176
+ export { type AnimationConfig, type AnimationType, Bone, BreakpointData, CastDOMConfig, type CastDOMInstance, CompressedBones, type ExtractOptions, RegistryEntry, SkeletonData, clear, compressBones, configure, createCastDOM, decodeBonesToBase64, decompressBones, diffBreakpoints, encodeBonesToBase64, extractBones, generateAnimationCSS, generateBoneAnimation, generateKeyframes, generateStaggerCSS, get, getAllCSS, getExtractorScript, getStaleBreakpoints, has, interpolateBones, loadManifest, names, register, registerAll, remove, selectBreakpoint, validateBreakpoints };