@lukas_holdings/castdom 1.0.2 → 1.0.3
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/README.md +6 -0
- package/bin/castdom.js +0 -0
- package/dist/astro.cjs +31 -13
- package/dist/astro.cjs.map +1 -1
- package/dist/astro.d.cts +8 -4
- package/dist/astro.d.ts +8 -4
- package/dist/astro.js +25 -7
- package/dist/astro.js.map +1 -1
- package/dist/{chunk-ZBJB7WVV.js → chunk-275VEEA7.js} +4 -4
- package/dist/{chunk-ZBJB7WVV.js.map → chunk-275VEEA7.js.map} +1 -1
- package/dist/chunk-4LFW65DU.js +38 -0
- package/dist/chunk-4LFW65DU.js.map +1 -0
- package/dist/{chunk-ONS533CQ.js → chunk-6RFGWOGG.js} +3 -3
- package/dist/{chunk-ONS533CQ.js.map → chunk-6RFGWOGG.js.map} +1 -1
- package/dist/{chunk-XS5HAU5E.cjs → chunk-ASS2BFPN.cjs} +8 -8
- package/dist/{chunk-XS5HAU5E.cjs.map → chunk-ASS2BFPN.cjs.map} +1 -1
- package/dist/{chunk-ORY4OMZ5.cjs → chunk-BDIAGFG5.cjs} +4 -4
- package/dist/{chunk-ORY4OMZ5.cjs.map → chunk-BDIAGFG5.cjs.map} +1 -1
- package/dist/{chunk-QLEBTZIB.cjs → chunk-C2D4NZQB.cjs} +7 -7
- package/dist/{chunk-QLEBTZIB.cjs.map → chunk-C2D4NZQB.cjs.map} +1 -1
- package/dist/{chunk-JRQ6EVQP.cjs → chunk-C3VW72Z3.cjs} +10 -2
- package/dist/chunk-C3VW72Z3.cjs.map +1 -0
- package/dist/{chunk-O4OOMGGM.cjs → chunk-CC4LCPVY.cjs} +8 -8
- package/dist/{chunk-O4OOMGGM.cjs.map → chunk-CC4LCPVY.cjs.map} +1 -1
- package/dist/{chunk-ZWZ5ZLJE.js → chunk-GVFBT6MD.js} +3 -3
- package/dist/{chunk-ZWZ5ZLJE.js.map → chunk-GVFBT6MD.js.map} +1 -1
- package/dist/{chunk-COLESJ66.js → chunk-M4OXJTRQ.js} +3 -3
- package/dist/{chunk-COLESJ66.js.map → chunk-M4OXJTRQ.js.map} +1 -1
- package/dist/{chunk-KGLTVTHU.js → chunk-V4FV5XFF.js} +4 -4
- package/dist/{chunk-KGLTVTHU.js.map → chunk-V4FV5XFF.js.map} +1 -1
- package/dist/{chunk-YDT4TPB7.cjs → chunk-W236FF4E.cjs} +11 -11
- package/dist/{chunk-YDT4TPB7.cjs.map → chunk-W236FF4E.cjs.map} +1 -1
- package/dist/cli.js +12 -12
- package/dist/index.cjs +48 -48
- package/dist/index.js +8 -8
- package/dist/next.cjs +15 -15
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +3 -3
- package/dist/next.d.ts +3 -3
- package/dist/next.js +6 -6
- package/dist/next.js.map +1 -1
- package/dist/react.cjs +9 -9
- package/dist/react.js +5 -5
- package/dist/ssr.cjs +12 -12
- package/dist/ssr.js +3 -3
- package/dist/vite.cjs +3 -3
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.cts +1 -1
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +2 -2
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-EJRNKHL5.js +0 -31
- package/dist/chunk-EJRNKHL5.js.map +0 -1
- package/dist/chunk-JRQ6EVQP.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkC3VW72Z3_cjs = require('./chunk-C3VW72Z3.cjs');
|
|
4
4
|
|
|
5
5
|
// src/core/responsive.ts
|
|
6
6
|
function selectBreakpoint(skeleton, viewportWidth) {
|
|
@@ -92,7 +92,7 @@ function diffBreakpoints(base, target, threshold = 2) {
|
|
|
92
92
|
function validateBreakpoints(breakpoints) {
|
|
93
93
|
const unique = [...new Set(breakpoints)].sort((a, b) => a - b);
|
|
94
94
|
if (unique.length === 0) {
|
|
95
|
-
return [...
|
|
95
|
+
return [...chunkC3VW72Z3_cjs.DEFAULTS.breakpoints];
|
|
96
96
|
}
|
|
97
97
|
return unique.filter((bp) => bp >= 200 && bp <= 3840);
|
|
98
98
|
}
|
|
@@ -106,5 +106,5 @@ exports.getStaleBreakpoints = getStaleBreakpoints;
|
|
|
106
106
|
exports.interpolateBones = interpolateBones;
|
|
107
107
|
exports.selectBreakpoint = selectBreakpoint;
|
|
108
108
|
exports.validateBreakpoints = validateBreakpoints;
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
110
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-BDIAGFG5.cjs.map
|
|
110
|
+
//# sourceMappingURL=chunk-BDIAGFG5.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/responsive.ts"],"names":["DEFAULTS"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/core/responsive.ts"],"names":["DEFAULTS"],"mappings":"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","file":"chunk-BDIAGFG5.cjs","sourcesContent":["import type { BreakpointData, Bone, SkeletonData } from \"./types.js\";\nimport { DEFAULTS } from \"./types.js\";\n\n/**\n * Responsive breakpoint system for CastDOM.\n *\n * Handles:\n * - Selecting the best breakpoint for a given viewport width\n * - Interpolating between breakpoints for fluid layouts\n * - Diffing breakpoints to only store changes\n */\n\n/** Select the best breakpoint for a given viewport width */\nexport function selectBreakpoint(\n skeleton: SkeletonData,\n viewportWidth: number\n): BreakpointData | null {\n const bps = [...skeleton.breakpoints].sort(\n (a, b) => a.viewport - b.viewport\n );\n\n if (bps.length === 0) return null;\n if (bps.length === 1) return bps[0];\n\n // Find closest breakpoint\n let best = bps[0];\n let bestDist = Math.abs(viewportWidth - best.viewport);\n\n for (let i = 1; i < bps.length; i++) {\n const dist = Math.abs(viewportWidth - bps[i].viewport);\n if (dist < bestDist) {\n best = bps[i];\n bestDist = dist;\n }\n }\n\n return best;\n}\n\n/**\n * Interpolate bones between two breakpoints for a target viewport width.\n * Provides fluid skeleton sizing between captured breakpoints.\n */\nexport function interpolateBones(\n from: BreakpointData,\n to: BreakpointData,\n targetWidth: number\n): BreakpointData {\n // Calculate interpolation factor\n const range = to.viewport - from.viewport;\n if (range === 0) return from;\n\n const t = Math.max(0, Math.min(1, (targetWidth - from.viewport) / range));\n\n // Interpolate container dimensions\n const containerWidth = lerp(from.containerWidth, to.containerWidth, t);\n const containerHeight = lerp(from.containerHeight, to.containerHeight, t);\n\n // Scale factor for bone positions\n const scaleX = containerWidth / from.containerWidth;\n const scaleY = containerHeight / from.containerHeight;\n\n // If bone counts differ, use the closest breakpoint's bones\n if (from.bones.length !== to.bones.length) {\n const base = t < 0.5 ? from : to;\n const sx = containerWidth / base.containerWidth;\n const sy = containerHeight / base.containerHeight;\n\n return {\n viewport: targetWidth,\n containerWidth,\n containerHeight,\n bones: base.bones.map((bone) => ({\n ...bone,\n x: bone.x * sx,\n y: bone.y * sy,\n w: bone.w * sx,\n h: bone.h * sy,\n })),\n };\n }\n\n // Interpolate matching bones\n const bones: Bone[] = from.bones.map((fromBone, i) => {\n const toBone = to.bones[i];\n return {\n x: lerp(fromBone.x, toBone.x, t),\n y: lerp(fromBone.y, toBone.y, t),\n w: lerp(fromBone.w, toBone.w, t),\n h: lerp(fromBone.h, toBone.h, t),\n r: lerp(fromBone.r, toBone.r, t),\n kind: t < 0.5 ? fromBone.kind : toBone.kind,\n };\n });\n\n return {\n viewport: targetWidth,\n containerWidth,\n containerHeight,\n bones,\n };\n}\n\n/** Linear interpolation */\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/**\n * Compute a diff between two breakpoints.\n * Only stores bones that changed position/size significantly.\n * Used to reduce storage when breakpoints are similar.\n */\nexport function diffBreakpoints(\n base: BreakpointData,\n target: BreakpointData,\n threshold = 2\n): { changed: number[]; bones: Bone[] } {\n const changed: number[] = [];\n const bones: Bone[] = [];\n\n const maxLen = Math.max(base.bones.length, target.bones.length);\n\n for (let i = 0; i < maxLen; i++) {\n const a = base.bones[i];\n const b = target.bones[i];\n\n if (!a || !b) {\n changed.push(i);\n bones.push(b || a);\n continue;\n }\n\n const dx = Math.abs(a.x - b.x);\n const dy = Math.abs(a.y - b.y);\n const dw = Math.abs(a.w - b.w);\n const dh = Math.abs(a.h - b.h);\n\n if (dx > threshold || dy > threshold || dw > threshold || dh > threshold) {\n changed.push(i);\n bones.push(b);\n }\n }\n\n return { changed, bones };\n}\n\n/**\n * Validate breakpoint configuration.\n * Ensures breakpoints are sorted, unique, and reasonable.\n */\nexport function validateBreakpoints(breakpoints: number[]): number[] {\n const unique = [...new Set(breakpoints)].sort((a, b) => a - b);\n\n if (unique.length === 0) {\n return [...DEFAULTS.breakpoints];\n }\n\n // Filter out unreasonable values\n return unique.filter((bp) => bp >= 200 && bp <= 3840);\n}\n\n/**\n * Determine which breakpoints need re-extraction.\n * Compares existing data against current config.\n */\nexport function getStaleBreakpoints(\n skeleton: SkeletonData,\n targetBreakpoints: number[]\n): number[] {\n const existing = new Set(skeleton.breakpoints.map((bp) => bp.viewport));\n return targetBreakpoints.filter((bp) => !existing.has(bp));\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkASS2BFPN_cjs = require('./chunk-ASS2BFPN.cjs');
|
|
4
4
|
|
|
5
5
|
// src/seo/ssr.ts
|
|
6
6
|
function renderSkeleton(skeleton, options) {
|
|
@@ -8,9 +8,9 @@ function renderSkeleton(skeleton, options) {
|
|
|
8
8
|
const hydrationAttrs = options?.hydrationAttrs ?? true;
|
|
9
9
|
let html;
|
|
10
10
|
if (inlineCSS) {
|
|
11
|
-
html =
|
|
11
|
+
html = chunkASS2BFPN_cjs.renderStandalone(skeleton, options?.config);
|
|
12
12
|
} else {
|
|
13
|
-
html =
|
|
13
|
+
html = chunkASS2BFPN_cjs.renderResponsiveHTML(skeleton, options?.config);
|
|
14
14
|
}
|
|
15
15
|
if (hydrationAttrs) {
|
|
16
16
|
html = html.replace(
|
|
@@ -24,7 +24,7 @@ function renderSkeleton(skeleton, options) {
|
|
|
24
24
|
return html;
|
|
25
25
|
}
|
|
26
26
|
function renderSkeletons(skeletons, options) {
|
|
27
|
-
const css =
|
|
27
|
+
const css = chunkASS2BFPN_cjs.generateCriticalCSS(skeletons, options?.config);
|
|
28
28
|
const html = {};
|
|
29
29
|
for (const skeleton of skeletons) {
|
|
30
30
|
html[skeleton.name] = renderSkeleton(skeleton, {
|
|
@@ -36,7 +36,7 @@ function renderSkeletons(skeletons, options) {
|
|
|
36
36
|
return { css, html };
|
|
37
37
|
}
|
|
38
38
|
function renderCriticalStyleTag(skeletons, config) {
|
|
39
|
-
const css =
|
|
39
|
+
const css = chunkASS2BFPN_cjs.generateCriticalCSS(skeletons, config);
|
|
40
40
|
return `<style data-castdom="critical">${css}</style>`;
|
|
41
41
|
}
|
|
42
42
|
function renderHydrationScript() {
|
|
@@ -60,5 +60,5 @@ exports.renderPreloadHints = renderPreloadHints;
|
|
|
60
60
|
exports.renderSSRFragment = renderSSRFragment;
|
|
61
61
|
exports.renderSkeleton = renderSkeleton;
|
|
62
62
|
exports.renderSkeletons = renderSkeletons;
|
|
63
|
-
//# sourceMappingURL=chunk-
|
|
64
|
-
//# sourceMappingURL=chunk-
|
|
63
|
+
//# sourceMappingURL=chunk-C2D4NZQB.cjs.map
|
|
64
|
+
//# sourceMappingURL=chunk-C2D4NZQB.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/seo/ssr.ts"],"names":["renderStandalone","renderResponsiveHTML","generateCriticalCSS"],"mappings":";;;;;AAyCO,SAAS,cAAA,CACd,UACA,OAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,IAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,SAAS,cAAA,IAAkB,IAAA;AAElD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,GAAOA,kCAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,IAAA,GAAOC,sCAAA,CAAqB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA;AAAA,MACV,yBAAA;AAAA,MACA,CAAA,2CAAA,EAA8C,QAAA,CAAS,IAAI,CAAA,qBAAA,EAAwB,SAAS,IAAI,CAAA,yBAAA;AAAA,KAClG;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAA,GAAO,aAAa,IAAI,CAAA,WAAA,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,eAAA,CACd,WACA,OAAA,EAC+C;AAC/C,EAAA,MAAM,GAAA,GAAMC,qCAAA,CAAoB,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAE1D,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,cAAA,CAAe,QAAA,EAAU;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAA,EAAW;AAAA;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACrB;AAMO,SAAS,sBAAA,CACd,WACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAMA,qCAAA,CAAoB,SAAA,EAAW,MAAM,CAAA;AACjD,EAAA,OAAO,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAC9C;AAaO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAA,6XAAA,CAAA;AACT;AAQO,SAAS,iBAAA,CACd,WACA,OAAA,EACgD;AAChD,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,eAAA,CAAgB,WAAW,OAAO,CAAA;AAExD,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAAA,IACrC,qBAAA;AAAsB,GACxB,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAC5B;AAMO,SAAS,kBAAA,GAA6B;AAG3C,EAAA,OAAO,EAAA;AACT","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/seo/ssr.ts"],"names":["renderStandalone","renderResponsiveHTML","generateCriticalCSS"],"mappings":";;;;;AAyCO,SAAS,cAAA,CACd,UACA,OAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,IAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,SAAS,cAAA,IAAkB,IAAA;AAElD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,GAAOA,kCAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,IAAA,GAAOC,sCAAA,CAAqB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA;AAAA,MACV,yBAAA;AAAA,MACA,CAAA,2CAAA,EAA8C,QAAA,CAAS,IAAI,CAAA,qBAAA,EAAwB,SAAS,IAAI,CAAA,yBAAA;AAAA,KAClG;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAA,GAAO,aAAa,IAAI,CAAA,WAAA,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,eAAA,CACd,WACA,OAAA,EAC+C;AAC/C,EAAA,MAAM,GAAA,GAAMC,qCAAA,CAAoB,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAE1D,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,cAAA,CAAe,QAAA,EAAU;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAA,EAAW;AAAA;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACrB;AAMO,SAAS,sBAAA,CACd,WACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAMA,qCAAA,CAAoB,SAAA,EAAW,MAAM,CAAA;AACjD,EAAA,OAAO,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAC9C;AAaO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAA,6XAAA,CAAA;AACT;AAQO,SAAS,iBAAA,CACd,WACA,OAAA,EACgD;AAChD,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,eAAA,CAAgB,WAAW,OAAO,CAAA;AAExD,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAAA,IACrC,qBAAA;AAAsB,GACxB,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAC5B;AAMO,SAAS,kBAAA,GAA6B;AAG3C,EAAA,OAAO,EAAA;AACT","file":"chunk-C2D4NZQB.cjs","sourcesContent":["import type { SkeletonData, CastDOMConfig } from \"../core/types.js\";\nimport { renderStandalone, renderResponsiveHTML, generateCriticalCSS } from \"../core/renderer.js\";\nimport { DEFAULTS } from \"../core/types.js\";\n\n/**\n * SSR (Server-Side Rendering) utilities for CastDOM.\n *\n * These functions generate HTML that can be embedded directly in\n * server-rendered pages. The skeletons render as pure CSS —\n * no JavaScript is needed on the client to display them.\n *\n * Benefits for SEO:\n * - Crawlers see structured placeholder content instead of blank areas\n * - Zero CLS (Cumulative Layout Shift) — skeletons match exact dimensions\n * - Instant visual feedback — no FOUC (Flash of Unstyled Content)\n * - Proper ARIA attributes for accessibility\n */\n\nexport interface SSRRenderOptions {\n /** Include <style> tag with critical CSS (default: true) */\n inlineCSS?: boolean;\n /** Wrap in a <noscript> fallback (default: false) */\n noscript?: boolean;\n /** Add data attributes for hydration (default: true) */\n hydrationAttrs?: boolean;\n /** Custom config overrides */\n config?: Partial<CastDOMConfig>;\n}\n\n/**\n * Render a skeleton to an HTML string for SSR.\n * Includes inline critical CSS for immediate rendering.\n *\n * ```ts\n * // In your server handler / getServerSideProps / loader:\n * import { renderSkeleton } from 'castdom/ssr';\n *\n * const skeletonHTML = renderSkeleton(skeletonData);\n * // Embed in your page HTML\n * ```\n */\nexport function renderSkeleton(\n skeleton: SkeletonData,\n options?: SSRRenderOptions\n): string {\n const inlineCSS = options?.inlineCSS ?? true;\n const hydrationAttrs = options?.hydrationAttrs ?? true;\n\n let html: string;\n if (inlineCSS) {\n html = renderStandalone(skeleton, options?.config);\n } else {\n html = renderResponsiveHTML(skeleton, options?.config);\n }\n\n // Add hydration data attributes\n if (hydrationAttrs) {\n html = html.replace(\n /class=\"castdom-skeleton/,\n `data-castdom-ssr=\"true\" data-castdom-name=\"${skeleton.name}\" data-castdom-hash=\"${skeleton.hash}\" class=\"castdom-skeleton`\n );\n }\n\n // Wrap in noscript if requested\n if (options?.noscript) {\n html = `<noscript>${html}</noscript>`;\n }\n\n return html;\n}\n\n/**\n * Render multiple skeletons with shared CSS (deduplicates the critical CSS).\n *\n * More efficient than calling renderSkeleton() multiple times\n * when you have several skeletons on one page.\n */\nexport function renderSkeletons(\n skeletons: SkeletonData[],\n options?: SSRRenderOptions\n): { css: string; html: Record<string, string> } {\n const css = generateCriticalCSS(skeletons, options?.config);\n\n const html: Record<string, string> = {};\n for (const skeleton of skeletons) {\n html[skeleton.name] = renderSkeleton(skeleton, {\n ...options,\n inlineCSS: false, // CSS is shared\n });\n }\n\n return { css, html };\n}\n\n/**\n * Generate a <style> tag with critical CSS for given skeletons.\n * Place in <head> for optimal rendering performance.\n */\nexport function renderCriticalStyleTag(\n skeletons: SkeletonData[],\n config?: Partial<CastDOMConfig>\n): string {\n const css = generateCriticalCSS(skeletons, config);\n return `<style data-castdom=\"critical\">${css}</style>`;\n}\n\n/**\n * Generate a hydration script that removes SSR skeletons\n * once the client-side app takes over.\n *\n * This is a tiny (~200 byte) inline script that:\n * 1. Waits for DOMContentLoaded\n * 2. Finds all [data-castdom-ssr] elements\n * 3. Removes them once the real content renders\n *\n * The script is safe to inline — no external dependencies.\n */\nexport function renderHydrationScript(): string {\n return `<script data-castdom=\"hydration\">(function(){if(typeof window==='undefined')return;function r(){document.querySelectorAll('[data-castdom-ssr]').forEach(function(el){if(el.nextElementSibling&&!el.nextElementSibling.hasAttribute('data-castdom-ssr')){el.remove()}})}if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',r)}else{setTimeout(r,0)}})()</script>`;\n}\n\n/**\n * Generate a complete SSR skeleton page fragment.\n * Includes: critical CSS + skeleton HTML + hydration script.\n *\n * Designed to be dropped directly into your HTML template.\n */\nexport function renderSSRFragment(\n skeletons: SkeletonData[],\n options?: SSRRenderOptions\n): { head: string; body: Record<string, string> } {\n const { css, html } = renderSkeletons(skeletons, options);\n\n const head = [\n `<style data-castdom=\"critical\">${css}</style>`,\n renderHydrationScript(),\n ].join(\"\\n\");\n\n return { head, body: html };\n}\n\n/**\n * Preload hint generator for skeleton assets.\n * Generates <link> tags for optimal loading.\n */\nexport function renderPreloadHints(): string {\n // CastDOM is CSS-only at runtime, so no assets to preload.\n // This function exists for API consistency and future-proofing.\n return \"\";\n}\n\n// Re-export core utilities for convenience\nexport { generateCriticalCSS } from \"../core/renderer.js\";\nexport { renderStandalone, renderResponsiveHTML } from \"../core/renderer.js\";\n"]}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
4
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
5
|
+
}) : x)(function(x) {
|
|
6
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
7
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
8
|
+
});
|
|
9
|
+
|
|
3
10
|
// src/core/types.ts
|
|
4
11
|
var DEFAULTS = {
|
|
5
12
|
outDir: ".castdom",
|
|
@@ -31,5 +38,6 @@ var BONE_KIND_FROM_INDEX = Object.fromEntries(
|
|
|
31
38
|
exports.BONE_KIND_FROM_INDEX = BONE_KIND_FROM_INDEX;
|
|
32
39
|
exports.BONE_KIND_INDEX = BONE_KIND_INDEX;
|
|
33
40
|
exports.DEFAULTS = DEFAULTS;
|
|
34
|
-
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
41
|
+
exports.__require = __require;
|
|
42
|
+
//# sourceMappingURL=chunk-C3VW72Z3.cjs.map
|
|
43
|
+
//# sourceMappingURL=chunk-C3VW72Z3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts"],"names":[],"mappings":";;;;;;;;;;AAqHO,IAAM,QAAA,GAcT;AAAA,EACF,MAAA,EAAQ,UAAA;AAAA,EACR,WAAA,EAAa,CAAC,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA;AAAA,EAC5B,KAAA,EAAO,SAAA;AAAA,EACP,YAAA,EAAc,SAAA;AAAA,EACd,iBAAA,EAAmB,IAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa,SAAA;AAAA,EACb,YAAA,EAAc,KAAA;AAAA,EACd,GAAA,EAAK;AACP;AAGO,IAAM,eAAA,GAA4C;AAAA,EACvD,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO;AACT;AAEO,IAAM,uBAAiD,MAAA,CAAO,WAAA;AAAA,EACnE,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,CAAa,CAAC;AACpE","file":"chunk-C3VW72Z3.cjs","sourcesContent":["/** A single bone — one rectangular skeleton element */\nexport interface Bone {\n /** X position relative to container (px) */\n x: number;\n /** Y position relative to container (px) */\n y: number;\n /** Width (px) */\n w: number;\n /** Height (px) */\n h: number;\n /** Border radius (px). 9999 = circle */\n r: number;\n /** Element type hint for content-aware rendering */\n kind?: BoneKind;\n}\n\nexport type BoneKind =\n | \"text\"\n | \"heading\"\n | \"image\"\n | \"avatar\"\n | \"button\"\n | \"input\"\n | \"icon\"\n | \"divider\"\n | \"block\";\n\n/** Bone data for a single breakpoint */\nexport interface BreakpointData {\n /** Viewport width this was captured at */\n viewport: number;\n /** Container width at capture time */\n containerWidth: number;\n /** Container height at capture time */\n containerHeight: number;\n /** All bones at this breakpoint */\n bones: Bone[];\n}\n\n/** Complete skeleton definition for a named component */\nexport interface SkeletonData {\n /** Unique name for this skeleton */\n name: string;\n /** Version hash for cache busting */\n hash: string;\n /** Breakpoint data, sorted ascending by viewport width */\n breakpoints: BreakpointData[];\n /** Timestamp of last extraction */\n extractedAt: number;\n}\n\n/** Configuration for CastDOM */\nexport interface CastDOMConfig {\n /** Directory to output generated skeleton data */\n outDir?: string;\n /** Breakpoint widths to capture at (default: [375, 768, 1280]) */\n breakpoints?: number[];\n /** Base color for skeleton bones (default: \"#e0e0e0\") */\n color?: string;\n /** Shimmer highlight color (default: \"#f0f0f0\") */\n shimmerColor?: string;\n /** Animation duration in ms (default: 1500) */\n animationDuration?: number;\n /** Enable content-aware bone detection (default: true) */\n contentAware?: boolean;\n /** Minimum bone size to include in px (default: 4) */\n minBoneSize?: number;\n /** CSS class prefix (default: \"castdom\") */\n classPrefix?: string;\n /** Generate inline styles instead of class-based (default: false) */\n inlineStyles?: boolean;\n /** Enable SSR rendering (default: true) */\n ssr?: boolean;\n /** URL or path to dev server for extraction */\n devServer?: string;\n /** Routes to snapshot for extraction */\n routes?: string[];\n /** Playwright launch options */\n playwright?: {\n headless?: boolean;\n timeout?: number;\n };\n}\n\n/** Registry entry used at runtime */\nexport interface RegistryEntry {\n data: SkeletonData;\n css: string;\n html: Record<number, string>;\n}\n\n/** Extraction target — what to snapshot */\nexport interface ExtractionTarget {\n name: string;\n selector: string;\n route?: string;\n}\n\n/** Result from the extraction process */\nexport interface ExtractionResult {\n target: ExtractionTarget;\n skeleton: SkeletonData;\n}\n\n/** Compressed bone format for wire/storage (delta-encoded) */\nexport interface CompressedBones {\n /** Version of compression format */\n v: 1;\n /** Viewport width */\n vw: number;\n /** Container dimensions [w, h] */\n c: [number, number];\n /** Flat array: [x, y, w, h, r, kind, ...] per bone. kind is enum index. */\n d: number[];\n}\n\n/** Default configuration values */\nexport const DEFAULTS: Required<\n Pick<\n CastDOMConfig,\n | \"outDir\"\n | \"breakpoints\"\n | \"color\"\n | \"shimmerColor\"\n | \"animationDuration\"\n | \"contentAware\"\n | \"minBoneSize\"\n | \"classPrefix\"\n | \"inlineStyles\"\n | \"ssr\"\n >\n> = {\n outDir: \".castdom\",\n breakpoints: [375, 768, 1280],\n color: \"#e0e0e0\",\n shimmerColor: \"#f0f0f0\",\n animationDuration: 1500,\n contentAware: true,\n minBoneSize: 4,\n classPrefix: \"castdom\",\n inlineStyles: false,\n ssr: true,\n};\n\n/** Map bone kind to numeric index for compression */\nexport const BONE_KIND_INDEX: Record<BoneKind, number> = {\n text: 1,\n heading: 2,\n image: 3,\n avatar: 4,\n button: 5,\n input: 6,\n icon: 7,\n divider: 8,\n block: 0,\n};\n\nexport const BONE_KIND_FROM_INDEX: Record<number, BoneKind> = Object.fromEntries(\n Object.entries(BONE_KIND_INDEX).map(([k, v]) => [v, k as BoneKind])\n) as Record<number, BoneKind>;\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkBDIAGFG5_cjs = require('./chunk-BDIAGFG5.cjs');
|
|
4
|
+
var chunkW236FF4E_cjs = require('./chunk-W236FF4E.cjs');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
|
|
7
7
|
function CastDOM({
|
|
@@ -50,7 +50,7 @@ function CastDOM({
|
|
|
50
50
|
onContentShow?.();
|
|
51
51
|
}
|
|
52
52
|
}, [isLoading, onSkeletonShow, onContentShow]);
|
|
53
|
-
const entry =
|
|
53
|
+
const entry = chunkW236FF4E_cjs.get(name);
|
|
54
54
|
if (!isLoading) {
|
|
55
55
|
return react.createElement(
|
|
56
56
|
"div",
|
|
@@ -66,7 +66,7 @@ function CastDOM({
|
|
|
66
66
|
if (!entry) {
|
|
67
67
|
return fallback ? react.createElement("div", { className, style }, fallback) : null;
|
|
68
68
|
}
|
|
69
|
-
const bp =
|
|
69
|
+
const bp = chunkBDIAGFG5_cjs.selectBreakpoint(entry.data, viewportWidth);
|
|
70
70
|
if (!bp) return fallback ? react.createElement("div", { className, style }, fallback) : null;
|
|
71
71
|
return react.createElement(SkeletonRenderer, {
|
|
72
72
|
name,
|
|
@@ -169,7 +169,7 @@ function CastDOMStyle({
|
|
|
169
169
|
});
|
|
170
170
|
}
|
|
171
171
|
function useCastDOM(name) {
|
|
172
|
-
const entry =
|
|
172
|
+
const entry = chunkW236FF4E_cjs.get(name);
|
|
173
173
|
const [vw, setVW] = react.useState(
|
|
174
174
|
typeof window !== "undefined" ? window.innerWidth : 1280
|
|
175
175
|
);
|
|
@@ -179,7 +179,7 @@ function useCastDOM(name) {
|
|
|
179
179
|
window.addEventListener("resize", onResize, { passive: true });
|
|
180
180
|
return () => window.removeEventListener("resize", onResize);
|
|
181
181
|
}, []);
|
|
182
|
-
const breakpoint = entry ?
|
|
182
|
+
const breakpoint = entry ? chunkBDIAGFG5_cjs.selectBreakpoint(entry.data, vw) : null;
|
|
183
183
|
return {
|
|
184
184
|
exists: !!entry,
|
|
185
185
|
data: entry?.data ?? null,
|
|
@@ -194,5 +194,5 @@ exports.CastDOM = CastDOM;
|
|
|
194
194
|
exports.CastDOMStyle = CastDOMStyle;
|
|
195
195
|
exports.react_default = react_default;
|
|
196
196
|
exports.useCastDOM = useCastDOM;
|
|
197
|
-
//# sourceMappingURL=chunk-
|
|
198
|
-
//# sourceMappingURL=chunk-
|
|
197
|
+
//# sourceMappingURL=chunk-CC4LCPVY.cjs.map
|
|
198
|
+
//# sourceMappingURL=chunk-CC4LCPVY.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/react.tsx"],"names":["useState","useRef","useEffect","get","createElement","selectBreakpoint","useCallback","useMemo"],"mappings":"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","file":"chunk-O4OOMGGM.cjs","sourcesContent":["\"use client\";\n\nimport {\n type ReactNode,\n type CSSProperties,\n useState,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n createElement,\n} from \"react\";\nimport type { SkeletonData, BreakpointData, CastDOMConfig } from \"../core/types.js\";\nimport { get as getFromRegistry } from \"../core/registry.js\";\nimport { selectBreakpoint } from \"../core/responsive.js\";\n\nexport interface CastDOMProps {\n /** Name of the registered skeleton */\n name: string;\n /** Children to render once loaded */\n children: ReactNode;\n /** Whether the content is still loading (default: false when children mount) */\n loading?: boolean;\n /** Custom fallback while skeleton data loads from registry */\n fallback?: ReactNode;\n /** Animation type override */\n animation?: \"shimmer\" | \"pulse\" | \"wave\" | \"none\";\n /** Base color override */\n color?: string;\n /** Shimmer highlight color override */\n shimmerColor?: string;\n /** Animation duration override (ms) */\n duration?: number;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Callback when skeleton is shown */\n onSkeletonShow?: () => void;\n /** Callback when real content replaces skeleton */\n onContentShow?: () => void;\n /** Aria label for the loading state */\n ariaLabel?: string;\n}\n\n/**\n * <CastDOM> — wraps your component and shows an extracted skeleton while loading.\n *\n * Usage:\n * ```tsx\n * <CastDOM name=\"user-card\" loading={isLoading}>\n * <UserCard data={data} />\n * </CastDOM>\n * ```\n *\n * The skeleton auto-resolves from the global registry.\n * Register skeletons once at app entry with `loadManifest()`.\n */\nexport function CastDOM({\n name,\n children,\n loading,\n fallback,\n animation = \"shimmer\",\n color,\n shimmerColor,\n duration,\n className,\n style,\n onSkeletonShow,\n onContentShow,\n ariaLabel,\n}: CastDOMProps): ReactNode {\n const [isLoading, setIsLoading] = useState(loading ?? true);\n const [viewportWidth, setViewportWidth] = useState<number>(\n typeof window !== \"undefined\" ? window.innerWidth : 1280\n );\n const containerRef = useRef<HTMLDivElement>(null);\n const shownRef = useRef(false);\n\n // Track loading state\n useEffect(() => {\n if (loading !== undefined) {\n setIsLoading(loading);\n }\n }, [loading]);\n\n // Auto-detect loading completion when loading prop is not provided\n useEffect(() => {\n if (loading === undefined && children) {\n setIsLoading(false);\n }\n }, [loading, children]);\n\n // Track viewport width for responsive skeletons\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const onResize = () => setViewportWidth(window.innerWidth);\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n // Callbacks\n useEffect(() => {\n if (isLoading && !shownRef.current) {\n shownRef.current = true;\n onSkeletonShow?.();\n }\n if (!isLoading && shownRef.current) {\n onContentShow?.();\n }\n }, [isLoading, onSkeletonShow, onContentShow]);\n\n // Get skeleton from registry\n const entry = getFromRegistry(name);\n\n if (!isLoading) {\n return createElement(\n \"div\",\n {\n ref: containerRef,\n className,\n style,\n \"data-castdom\": name,\n },\n children\n );\n }\n\n // No skeleton data — show fallback or nothing\n if (!entry) {\n return fallback\n ? createElement(\"div\", { className, style }, fallback)\n : null;\n }\n\n // Select best breakpoint\n const bp = selectBreakpoint(entry.data, viewportWidth);\n if (!bp) return fallback ? createElement(\"div\", { className, style }, fallback) : null;\n\n // Render skeleton\n return createElement(SkeletonRenderer, {\n name,\n breakpoint: bp,\n animation,\n color,\n shimmerColor,\n duration,\n className,\n style,\n ariaLabel,\n });\n}\n\n/** Internal skeleton renderer — pure CSS, no JS animation runtime */\ninterface SkeletonRendererProps {\n name: string;\n breakpoint: BreakpointData;\n animation: \"shimmer\" | \"pulse\" | \"wave\" | \"none\";\n color?: string;\n shimmerColor?: string;\n duration?: number;\n className?: string;\n style?: CSSProperties;\n ariaLabel?: string;\n}\n\nfunction SkeletonRenderer({\n name,\n breakpoint,\n animation,\n color = \"#e0e0e0\",\n shimmerColor = \"#f0f0f0\",\n duration = 1500,\n className,\n style,\n ariaLabel,\n}: SkeletonRendererProps): ReactNode {\n const bones = breakpoint.bones;\n\n const containerStyle: CSSProperties = {\n position: \"relative\",\n width: breakpoint.containerWidth,\n height: breakpoint.containerHeight,\n overflow: \"hidden\",\n ...style,\n };\n\n const getBackground = useCallback(() => {\n switch (animation) {\n case \"shimmer\":\n return `linear-gradient(90deg, ${color} 25%, ${shimmerColor} 50%, ${color} 75%)`;\n case \"pulse\":\n case \"wave\":\n case \"none\":\n return color;\n }\n }, [animation, color, shimmerColor]);\n\n const getAnimationCSS = useCallback((): string => {\n switch (animation) {\n case \"shimmer\":\n return `castdom-shimmer ${duration}ms ease-in-out infinite`;\n case \"pulse\":\n return `castdom-pulse ${duration}ms ease-in-out infinite`;\n case \"wave\":\n return `castdom-wave ${duration}ms ease-in-out infinite`;\n case \"none\":\n return \"none\";\n }\n }, [animation, duration]);\n\n return createElement(\n \"div\",\n {\n className: `castdom-skeleton castdom-${name}${className ? ` ${className}` : \"\"}`,\n style: containerStyle,\n role: \"status\",\n \"aria-busy\": true,\n \"aria-label\": ariaLabel ?? `Loading ${name}`,\n },\n bones.map((bone, i) =>\n createElement(\"div\", {\n key: i,\n className: \"castdom-bone\",\n \"aria-hidden\": true,\n style: {\n position: \"absolute\" as const,\n left: bone.x,\n top: bone.y,\n width: bone.w,\n height: bone.h,\n borderRadius: bone.r >= 9999 ? \"50%\" : bone.r,\n background: getBackground(),\n backgroundSize: animation === \"shimmer\" ? \"200% 100%\" : undefined,\n animation: getAnimationCSS(),\n animationDelay: animation === \"wave\" ? `${i * 50}ms` : undefined,\n } satisfies CSSProperties,\n })\n )\n );\n}\n\n/**\n * <CastDOMStyle> — renders the critical CSS for registered skeletons.\n * Place this in your <head> or layout for optimal performance.\n *\n * ```tsx\n * <head>\n * <CastDOMStyle skeletons={[\"user-card\", \"feed-item\"]} />\n * </head>\n * ```\n */\nexport function CastDOMStyle({\n skeletons,\n}: {\n skeletons?: string[];\n}): ReactNode {\n const css = useMemo(() => {\n const parts: string[] = [\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 ];\n return parts.join(\"\");\n }, []);\n\n return createElement(\"style\", {\n dangerouslySetInnerHTML: { __html: css },\n \"data-castdom\": \"critical\",\n });\n}\n\n/**\n * Hook: useCastDOM — programmatic access to skeleton data.\n */\nexport function useCastDOM(name: string) {\n const entry = getFromRegistry(name);\n const [vw, setVW] = useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1280\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setVW(window.innerWidth);\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const breakpoint = entry ? selectBreakpoint(entry.data, vw) : null;\n\n return {\n exists: !!entry,\n data: entry?.data ?? null,\n breakpoint,\n css: entry?.css ?? \"\",\n html: breakpoint ? entry?.html[breakpoint.viewport] ?? \"\" : \"\",\n };\n}\n\nexport default CastDOM;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/react.tsx"],"names":["useState","useRef","useEffect","get","createElement","selectBreakpoint","useCallback","useMemo"],"mappings":"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","file":"chunk-CC4LCPVY.cjs","sourcesContent":["\"use client\";\n\nimport {\n type ReactNode,\n type CSSProperties,\n useState,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n createElement,\n} from \"react\";\nimport type { SkeletonData, BreakpointData, CastDOMConfig } from \"../core/types.js\";\nimport { get as getFromRegistry } from \"../core/registry.js\";\nimport { selectBreakpoint } from \"../core/responsive.js\";\n\nexport interface CastDOMProps {\n /** Name of the registered skeleton */\n name: string;\n /** Children to render once loaded */\n children: ReactNode;\n /** Whether the content is still loading (default: false when children mount) */\n loading?: boolean;\n /** Custom fallback while skeleton data loads from registry */\n fallback?: ReactNode;\n /** Animation type override */\n animation?: \"shimmer\" | \"pulse\" | \"wave\" | \"none\";\n /** Base color override */\n color?: string;\n /** Shimmer highlight color override */\n shimmerColor?: string;\n /** Animation duration override (ms) */\n duration?: number;\n /** Additional CSS class */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Callback when skeleton is shown */\n onSkeletonShow?: () => void;\n /** Callback when real content replaces skeleton */\n onContentShow?: () => void;\n /** Aria label for the loading state */\n ariaLabel?: string;\n}\n\n/**\n * <CastDOM> — wraps your component and shows an extracted skeleton while loading.\n *\n * Usage:\n * ```tsx\n * <CastDOM name=\"user-card\" loading={isLoading}>\n * <UserCard data={data} />\n * </CastDOM>\n * ```\n *\n * The skeleton auto-resolves from the global registry.\n * Register skeletons once at app entry with `loadManifest()`.\n */\nexport function CastDOM({\n name,\n children,\n loading,\n fallback,\n animation = \"shimmer\",\n color,\n shimmerColor,\n duration,\n className,\n style,\n onSkeletonShow,\n onContentShow,\n ariaLabel,\n}: CastDOMProps): ReactNode {\n const [isLoading, setIsLoading] = useState(loading ?? true);\n const [viewportWidth, setViewportWidth] = useState<number>(\n typeof window !== \"undefined\" ? window.innerWidth : 1280\n );\n const containerRef = useRef<HTMLDivElement>(null);\n const shownRef = useRef(false);\n\n // Track loading state\n useEffect(() => {\n if (loading !== undefined) {\n setIsLoading(loading);\n }\n }, [loading]);\n\n // Auto-detect loading completion when loading prop is not provided\n useEffect(() => {\n if (loading === undefined && children) {\n setIsLoading(false);\n }\n }, [loading, children]);\n\n // Track viewport width for responsive skeletons\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const onResize = () => setViewportWidth(window.innerWidth);\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n // Callbacks\n useEffect(() => {\n if (isLoading && !shownRef.current) {\n shownRef.current = true;\n onSkeletonShow?.();\n }\n if (!isLoading && shownRef.current) {\n onContentShow?.();\n }\n }, [isLoading, onSkeletonShow, onContentShow]);\n\n // Get skeleton from registry\n const entry = getFromRegistry(name);\n\n if (!isLoading) {\n return createElement(\n \"div\",\n {\n ref: containerRef,\n className,\n style,\n \"data-castdom\": name,\n },\n children\n );\n }\n\n // No skeleton data — show fallback or nothing\n if (!entry) {\n return fallback\n ? createElement(\"div\", { className, style }, fallback)\n : null;\n }\n\n // Select best breakpoint\n const bp = selectBreakpoint(entry.data, viewportWidth);\n if (!bp) return fallback ? createElement(\"div\", { className, style }, fallback) : null;\n\n // Render skeleton\n return createElement(SkeletonRenderer, {\n name,\n breakpoint: bp,\n animation,\n color,\n shimmerColor,\n duration,\n className,\n style,\n ariaLabel,\n });\n}\n\n/** Internal skeleton renderer — pure CSS, no JS animation runtime */\ninterface SkeletonRendererProps {\n name: string;\n breakpoint: BreakpointData;\n animation: \"shimmer\" | \"pulse\" | \"wave\" | \"none\";\n color?: string;\n shimmerColor?: string;\n duration?: number;\n className?: string;\n style?: CSSProperties;\n ariaLabel?: string;\n}\n\nfunction SkeletonRenderer({\n name,\n breakpoint,\n animation,\n color = \"#e0e0e0\",\n shimmerColor = \"#f0f0f0\",\n duration = 1500,\n className,\n style,\n ariaLabel,\n}: SkeletonRendererProps): ReactNode {\n const bones = breakpoint.bones;\n\n const containerStyle: CSSProperties = {\n position: \"relative\",\n width: breakpoint.containerWidth,\n height: breakpoint.containerHeight,\n overflow: \"hidden\",\n ...style,\n };\n\n const getBackground = useCallback(() => {\n switch (animation) {\n case \"shimmer\":\n return `linear-gradient(90deg, ${color} 25%, ${shimmerColor} 50%, ${color} 75%)`;\n case \"pulse\":\n case \"wave\":\n case \"none\":\n return color;\n }\n }, [animation, color, shimmerColor]);\n\n const getAnimationCSS = useCallback((): string => {\n switch (animation) {\n case \"shimmer\":\n return `castdom-shimmer ${duration}ms ease-in-out infinite`;\n case \"pulse\":\n return `castdom-pulse ${duration}ms ease-in-out infinite`;\n case \"wave\":\n return `castdom-wave ${duration}ms ease-in-out infinite`;\n case \"none\":\n return \"none\";\n }\n }, [animation, duration]);\n\n return createElement(\n \"div\",\n {\n className: `castdom-skeleton castdom-${name}${className ? ` ${className}` : \"\"}`,\n style: containerStyle,\n role: \"status\",\n \"aria-busy\": true,\n \"aria-label\": ariaLabel ?? `Loading ${name}`,\n },\n bones.map((bone, i) =>\n createElement(\"div\", {\n key: i,\n className: \"castdom-bone\",\n \"aria-hidden\": true,\n style: {\n position: \"absolute\" as const,\n left: bone.x,\n top: bone.y,\n width: bone.w,\n height: bone.h,\n borderRadius: bone.r >= 9999 ? \"50%\" : bone.r,\n background: getBackground(),\n backgroundSize: animation === \"shimmer\" ? \"200% 100%\" : undefined,\n animation: getAnimationCSS(),\n animationDelay: animation === \"wave\" ? `${i * 50}ms` : undefined,\n } satisfies CSSProperties,\n })\n )\n );\n}\n\n/**\n * <CastDOMStyle> — renders the critical CSS for registered skeletons.\n * Place this in your <head> or layout for optimal performance.\n *\n * ```tsx\n * <head>\n * <CastDOMStyle skeletons={[\"user-card\", \"feed-item\"]} />\n * </head>\n * ```\n */\nexport function CastDOMStyle({\n skeletons,\n}: {\n skeletons?: string[];\n}): ReactNode {\n const css = useMemo(() => {\n const parts: string[] = [\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 ];\n return parts.join(\"\");\n }, []);\n\n return createElement(\"style\", {\n dangerouslySetInnerHTML: { __html: css },\n \"data-castdom\": \"critical\",\n });\n}\n\n/**\n * Hook: useCastDOM — programmatic access to skeleton data.\n */\nexport function useCastDOM(name: string) {\n const entry = getFromRegistry(name);\n const [vw, setVW] = useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1280\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setVW(window.innerWidth);\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const breakpoint = entry ? selectBreakpoint(entry.data, vw) : null;\n\n return {\n exists: !!entry,\n data: entry?.data ?? null,\n breakpoint,\n css: entry?.css ?? \"\",\n html: breakpoint ? entry?.html[breakpoint.viewport] ?? \"\" : \"\",\n };\n}\n\nexport default CastDOM;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULTS } from './chunk-
|
|
1
|
+
import { DEFAULTS } from './chunk-4LFW65DU.js';
|
|
2
2
|
|
|
3
3
|
// src/core/renderer.ts
|
|
4
4
|
function resolveConfig(config) {
|
|
@@ -99,5 +99,5 @@ function renderStandalone(skeleton, config) {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
export { generateCSS, generateCriticalCSS, renderBonesHTML, renderResponsiveHTML, renderStandalone };
|
|
102
|
-
//# sourceMappingURL=chunk-
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
102
|
+
//# sourceMappingURL=chunk-GVFBT6MD.js.map
|
|
103
|
+
//# sourceMappingURL=chunk-GVFBT6MD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/renderer.ts"],"names":[],"mappings":"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","file":"chunk-ZWZ5ZLJE.js","sourcesContent":["import type {\n Bone,\n BreakpointData,\n SkeletonData,\n CastDOMConfig,\n} from \"./types.js\";\nimport { DEFAULTS } from \"./types.js\";\n\ntype RenderConfig = Pick<\n Required<CastDOMConfig>,\n \"color\" | \"shimmerColor\" | \"animationDuration\" | \"classPrefix\" | \"inlineStyles\"\n>;\n\nfunction resolveConfig(config?: Partial<CastDOMConfig>): RenderConfig {\n return {\n color: config?.color ?? DEFAULTS.color,\n shimmerColor: config?.shimmerColor ?? DEFAULTS.shimmerColor,\n animationDuration: config?.animationDuration ?? DEFAULTS.animationDuration,\n classPrefix: config?.classPrefix ?? DEFAULTS.classPrefix,\n inlineStyles: config?.inlineStyles ?? DEFAULTS.inlineStyles,\n };\n}\n\n/** Render a single bone to an HTML string */\nfunction renderBone(bone: Bone, config: RenderConfig, index: number): string {\n const { color, shimmerColor, animationDuration, classPrefix, inlineStyles } = config;\n const radius = bone.r >= 9999 ? \"50%\" : `${bone.r}px`;\n\n if (inlineStyles) {\n const gradient = `linear-gradient(90deg, ${color} 25%, ${shimmerColor} 50%, ${color} 75%)`;\n return `<div aria-hidden=\"true\" style=\"position:absolute;left:${bone.x}px;top:${bone.y}px;width:${bone.w}px;height:${bone.h}px;border-radius:${radius};background:${gradient};background-size:200% 100%;animation:${classPrefix}-shimmer ${animationDuration}ms ease-in-out infinite\"></div>`;\n }\n\n return `<div class=\"${classPrefix}-bone\" style=\"left:${bone.x}px;top:${bone.y}px;width:${bone.w}px;height:${bone.h}px;border-radius:${radius}\" aria-hidden=\"true\"></div>`;\n}\n\n/**\n * Render all bones for a breakpoint to HTML.\n * The output is a pure CSS skeleton — no JS needed to display.\n */\nexport function renderBonesHTML(\n name: string,\n bp: BreakpointData,\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const bones = bp.bones\n .map((bone, i) => renderBone(bone, cfg, i))\n .join(\"\");\n\n return `<div class=\"${cfg.classPrefix}-skeleton ${cfg.classPrefix}-${name}\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading ${name}\" style=\"position:relative;width:${bp.containerWidth}px;height:${bp.containerHeight}px;overflow:hidden\">${bones}</div>`;\n}\n\n/**\n * Render a responsive skeleton with all breakpoints.\n * Uses CSS container queries + media queries for breakpoint switching.\n */\nexport function renderResponsiveHTML(\n skeleton: SkeletonData,\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const breakpoints = [...skeleton.breakpoints].sort(\n (a, b) => a.viewport - b.viewport\n );\n\n if (breakpoints.length === 0) return \"\";\n if (breakpoints.length === 1) {\n return renderBonesHTML(skeleton.name, breakpoints[0], config);\n }\n\n // Render each breakpoint variant, hidden by default\n const variants = breakpoints.map((bp, idx) => {\n const bonesHTML = bp.bones\n .map((bone, i) => renderBone(bone, cfg, i))\n .join(\"\");\n\n return `<div class=\"${cfg.classPrefix}-bp ${cfg.classPrefix}-bp-${bp.viewport}\" style=\"position:relative;width:100%;height:${bp.containerHeight}px;overflow:hidden;display:none\">${bonesHTML}</div>`;\n });\n\n return `<div class=\"${cfg.classPrefix}-skeleton ${cfg.classPrefix}-${skeleton.name}\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading ${skeleton.name}\">${variants.join(\"\")}</div>`;\n}\n\n/**\n * Generate CSS for a skeleton definition.\n * Includes responsive media queries to show/hide the correct breakpoint variant.\n */\nexport function generateCSS(\n skeleton: SkeletonData,\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const { classPrefix: p, color, shimmerColor, animationDuration } = cfg;\n const breakpoints = [...skeleton.breakpoints].sort(\n (a, b) => a.viewport - b.viewport\n );\n const name = skeleton.name;\n\n const parts: string[] = [];\n\n // Base bone styles\n parts.push(\n `.${p}-${name} .${p}-bone{position:absolute;background:linear-gradient(90deg,${color} 25%,${shimmerColor} 50%,${color} 75%);background-size:200% 100%;animation:${p}-shimmer ${animationDuration}ms ease-in-out infinite}`\n );\n\n // Responsive breakpoint switching via media queries\n if (breakpoints.length > 1) {\n for (let i = 0; i < breakpoints.length; i++) {\n const bp = breakpoints[i];\n const next = breakpoints[i + 1];\n const prev = breakpoints[i - 1];\n\n let query: string;\n if (i === 0) {\n // Smallest: up to midpoint between this and next\n const max = Math.floor((bp.viewport + next!.viewport) / 2) - 1;\n query = `@media(max-width:${max}px)`;\n } else if (i === breakpoints.length - 1) {\n // Largest: from midpoint between prev and this\n const min = Math.floor((prev!.viewport + bp.viewport) / 2);\n query = `@media(min-width:${min}px)`;\n } else {\n // Middle: between midpoints\n const min = Math.floor((prev!.viewport + bp.viewport) / 2);\n const max = Math.floor((bp.viewport + next!.viewport) / 2) - 1;\n query = `@media(min-width:${min}px) and (max-width:${max}px)`;\n }\n\n parts.push(\n `${query}{.${p}-${name} .${p}-bp-${bp.viewport}{display:block}}`\n );\n }\n } else if (breakpoints.length === 1) {\n // Single breakpoint — always visible\n parts.push(\n `.${p}-${name} .${p}-bp-${breakpoints[0].viewport}{display:block}`\n );\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Generate critical inline CSS for above-the-fold skeletons.\n * This CSS is designed to be embedded in <style> tags for instant rendering.\n */\nexport function generateCriticalCSS(\n skeletons: SkeletonData[],\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const parts: string[] = [];\n\n // Base keyframes (only once)\n parts.push(\n `@keyframes ${cfg.classPrefix}-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}`\n );\n\n // Reduced motion\n parts.push(\n `@media(prefers-reduced-motion:reduce){.${cfg.classPrefix}-bone{animation:none!important}}`\n );\n\n // Per-skeleton styles\n for (const skeleton of skeletons) {\n parts.push(generateCSS(skeleton, config));\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Generate a complete, self-contained HTML skeleton\n * that can be embedded directly in server-rendered pages.\n * Includes inline <style> — no external CSS needed.\n */\nexport function renderStandalone(\n skeleton: SkeletonData,\n config?: Partial<CastDOMConfig>\n): string {\n const css = generateCriticalCSS([skeleton], config);\n const html = renderResponsiveHTML(skeleton, config);\n return `<style>${css}</style>${html}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/renderer.ts"],"names":[],"mappings":";;;AAaA,SAAS,cAAc,MAAA,EAA+C;AACpE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,QAAA,CAAS,KAAA;AAAA,IACjC,YAAA,EAAc,MAAA,EAAQ,YAAA,IAAgB,QAAA,CAAS,YAAA;AAAA,IAC/C,iBAAA,EAAmB,MAAA,EAAQ,iBAAA,IAAqB,QAAA,CAAS,iBAAA;AAAA,IACzD,WAAA,EAAa,MAAA,EAAQ,WAAA,IAAe,QAAA,CAAS,WAAA;AAAA,IAC7C,YAAA,EAAc,MAAA,EAAQ,YAAA,IAAgB,QAAA,CAAS;AAAA,GACjD;AACF;AAGA,SAAS,UAAA,CAAW,IAAA,EAAY,MAAA,EAAsB,KAAA,EAAuB;AAC3E,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,iBAAA,EAAmB,WAAA,EAAa,cAAa,GAAI,MAAA;AAC9E,EAAA,MAAM,SAAS,IAAA,CAAK,CAAA,IAAK,OAAO,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAC,CAAA,EAAA,CAAA;AAEjD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,WAAW,CAAA,uBAAA,EAA0B,KAAK,CAAA,MAAA,EAAS,YAAY,SAAS,KAAK,CAAA,KAAA,CAAA;AACnF,IAAA,OAAO,yDAAyD,IAAA,CAAK,CAAC,UAAU,IAAA,CAAK,CAAC,YAAY,IAAA,CAAK,CAAC,aAAa,IAAA,CAAK,CAAC,oBAAoB,MAAM,CAAA,YAAA,EAAe,QAAQ,CAAA,qCAAA,EAAwC,WAAW,YAAY,iBAAiB,CAAA,+BAAA,CAAA;AAAA,EAC9P;AAEA,EAAA,OAAO,CAAA,YAAA,EAAe,WAAW,CAAA,mBAAA,EAAsB,IAAA,CAAK,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,CAAC,CAAA,SAAA,EAAY,KAAK,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,CAAC,oBAAoB,MAAM,CAAA,2BAAA,CAAA;AAC9I;AAMO,SAAS,eAAA,CACd,IAAA,EACA,EAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,cAAc,MAAM,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CACd,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM,UAAA,CAAW,IAAA,EAAM,GAAM,CAAC,CAAA,CACzC,KAAK,EAAE,CAAA;AAEV,EAAA,OAAO,eAAe,GAAA,CAAI,WAAW,CAAA,UAAA,EAAa,GAAA,CAAI,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,qDAAA,EAAwD,IAAI,oCAAoC,EAAA,CAAG,cAAc,aAAa,EAAA,CAAG,eAAe,uBAAuB,KAAK,CAAA,MAAA,CAAA;AACvP;AAMO,SAAS,oBAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,cAAc,MAAM,CAAA;AAChC,EAAA,MAAM,WAAA,GAAc,CAAC,GAAG,QAAA,CAAS,WAAW,CAAA,CAAE,IAAA;AAAA,IAC5C,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE;AAAA,GAC3B;AAEA,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACrC,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,gBAAgB,QAAA,CAAS,IAAA,EAAM,WAAA,CAAY,CAAC,GAAG,MAAM,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,CAAC,IAAI,GAAA,KAAQ;AAC5C,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,KAAA,CAClB,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM,UAAA,CAAW,IAAA,EAAM,GAAM,CAAC,CAAA,CACzC,KAAK,EAAE,CAAA;AAEV,IAAA,OAAO,CAAA,YAAA,EAAe,GAAA,CAAI,WAAW,CAAA,IAAA,EAAO,GAAA,CAAI,WAAW,CAAA,IAAA,EAAO,EAAA,CAAG,QAAQ,CAAA,6CAAA,EAAgD,EAAA,CAAG,eAAe,oCAAoC,SAAS,CAAA,MAAA,CAAA;AAAA,EAC9L,CAAC,CAAA;AAED,EAAA,OAAO,eAAe,GAAA,CAAI,WAAW,CAAA,UAAA,EAAa,GAAA,CAAI,WAAW,CAAA,CAAA,EAAI,QAAA,CAAS,IAAI,CAAA,qDAAA,EAAwD,SAAS,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA;AAC/K;AAMO,SAAS,WAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,cAAc,MAAM,CAAA;AAChC,EAAA,MAAM,EAAE,WAAA,EAAa,CAAA,EAAG,KAAA,EAAO,YAAA,EAAc,mBAAkB,GAAI,GAAA;AACnE,EAAA,MAAM,WAAA,GAAc,CAAC,GAAG,QAAA,CAAS,WAAW,CAAA,CAAE,IAAA;AAAA,IAC5C,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE;AAAA,GAC3B;AACA,EAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAEtB,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,IAAI,KAAK,CAAC,CAAA,yDAAA,EAA4D,KAAK,CAAA,KAAA,EAAQ,YAAY,CAAA,KAAA,EAAQ,KAAK,CAAA,0CAAA,EAA6C,CAAC,YAAY,iBAAiB,CAAA,wBAAA;AAAA,GAClM;AAGA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AAC9B,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AAE9B,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,MAAM,CAAA,EAAG;AAEX,QAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAA,CAAO,EAAA,CAAG,WAAW,IAAA,CAAM,QAAA,IAAY,CAAC,CAAA,GAAI,CAAA;AAC7D,QAAA,KAAA,GAAQ,oBAAoB,GAAG,CAAA,GAAA,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,CAAA,KAAM,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAEvC,QAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAA,CAAO,KAAM,QAAA,GAAW,EAAA,CAAG,YAAY,CAAC,CAAA;AACzD,QAAA,KAAA,GAAQ,oBAAoB,GAAG,CAAA,GAAA,CAAA;AAAA,MACjC,CAAA,MAAO;AAEL,QAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAA,CAAO,KAAM,QAAA,GAAW,EAAA,CAAG,YAAY,CAAC,CAAA;AACzD,QAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAA,CAAO,EAAA,CAAG,WAAW,IAAA,CAAM,QAAA,IAAY,CAAC,CAAA,GAAI,CAAA;AAC7D,QAAA,KAAA,GAAQ,CAAA,iBAAA,EAAoB,GAAG,CAAA,mBAAA,EAAsB,GAAG,CAAA,GAAA,CAAA;AAAA,MAC1D;AAEA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,CAAC,CAAA,IAAA,EAAO,EAAA,CAAG,QAAQ,CAAA,gBAAA;AAAA,OAChD;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAEnC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,CAAC,CAAA,IAAA,EAAO,WAAA,CAAY,CAAC,CAAA,CAAE,QAAQ,CAAA,eAAA;AAAA,KACnD;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAMO,SAAS,mBAAA,CACd,WACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,cAAc,MAAM,CAAA;AAChC,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,WAAA,EAAc,IAAI,WAAW,CAAA,yEAAA;AAAA,GAC/B;AAGA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,uCAAA,EAA0C,IAAI,WAAW,CAAA,gCAAA;AAAA,GAC3D;AAGA,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAOO,SAAS,gBAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,CAAC,QAAQ,GAAG,MAAM,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,QAAA,EAAU,MAAM,CAAA;AAClD,EAAA,OAAO,CAAA,OAAA,EAAU,GAAG,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA;AACrC","file":"chunk-GVFBT6MD.js","sourcesContent":["import type {\n Bone,\n BreakpointData,\n SkeletonData,\n CastDOMConfig,\n} from \"./types.js\";\nimport { DEFAULTS } from \"./types.js\";\n\ntype RenderConfig = Pick<\n Required<CastDOMConfig>,\n \"color\" | \"shimmerColor\" | \"animationDuration\" | \"classPrefix\" | \"inlineStyles\"\n>;\n\nfunction resolveConfig(config?: Partial<CastDOMConfig>): RenderConfig {\n return {\n color: config?.color ?? DEFAULTS.color,\n shimmerColor: config?.shimmerColor ?? DEFAULTS.shimmerColor,\n animationDuration: config?.animationDuration ?? DEFAULTS.animationDuration,\n classPrefix: config?.classPrefix ?? DEFAULTS.classPrefix,\n inlineStyles: config?.inlineStyles ?? DEFAULTS.inlineStyles,\n };\n}\n\n/** Render a single bone to an HTML string */\nfunction renderBone(bone: Bone, config: RenderConfig, index: number): string {\n const { color, shimmerColor, animationDuration, classPrefix, inlineStyles } = config;\n const radius = bone.r >= 9999 ? \"50%\" : `${bone.r}px`;\n\n if (inlineStyles) {\n const gradient = `linear-gradient(90deg, ${color} 25%, ${shimmerColor} 50%, ${color} 75%)`;\n return `<div aria-hidden=\"true\" style=\"position:absolute;left:${bone.x}px;top:${bone.y}px;width:${bone.w}px;height:${bone.h}px;border-radius:${radius};background:${gradient};background-size:200% 100%;animation:${classPrefix}-shimmer ${animationDuration}ms ease-in-out infinite\"></div>`;\n }\n\n return `<div class=\"${classPrefix}-bone\" style=\"left:${bone.x}px;top:${bone.y}px;width:${bone.w}px;height:${bone.h}px;border-radius:${radius}\" aria-hidden=\"true\"></div>`;\n}\n\n/**\n * Render all bones for a breakpoint to HTML.\n * The output is a pure CSS skeleton — no JS needed to display.\n */\nexport function renderBonesHTML(\n name: string,\n bp: BreakpointData,\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const bones = bp.bones\n .map((bone, i) => renderBone(bone, cfg, i))\n .join(\"\");\n\n return `<div class=\"${cfg.classPrefix}-skeleton ${cfg.classPrefix}-${name}\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading ${name}\" style=\"position:relative;width:${bp.containerWidth}px;height:${bp.containerHeight}px;overflow:hidden\">${bones}</div>`;\n}\n\n/**\n * Render a responsive skeleton with all breakpoints.\n * Uses CSS container queries + media queries for breakpoint switching.\n */\nexport function renderResponsiveHTML(\n skeleton: SkeletonData,\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const breakpoints = [...skeleton.breakpoints].sort(\n (a, b) => a.viewport - b.viewport\n );\n\n if (breakpoints.length === 0) return \"\";\n if (breakpoints.length === 1) {\n return renderBonesHTML(skeleton.name, breakpoints[0], config);\n }\n\n // Render each breakpoint variant, hidden by default\n const variants = breakpoints.map((bp, idx) => {\n const bonesHTML = bp.bones\n .map((bone, i) => renderBone(bone, cfg, i))\n .join(\"\");\n\n return `<div class=\"${cfg.classPrefix}-bp ${cfg.classPrefix}-bp-${bp.viewport}\" style=\"position:relative;width:100%;height:${bp.containerHeight}px;overflow:hidden;display:none\">${bonesHTML}</div>`;\n });\n\n return `<div class=\"${cfg.classPrefix}-skeleton ${cfg.classPrefix}-${skeleton.name}\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading ${skeleton.name}\">${variants.join(\"\")}</div>`;\n}\n\n/**\n * Generate CSS for a skeleton definition.\n * Includes responsive media queries to show/hide the correct breakpoint variant.\n */\nexport function generateCSS(\n skeleton: SkeletonData,\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const { classPrefix: p, color, shimmerColor, animationDuration } = cfg;\n const breakpoints = [...skeleton.breakpoints].sort(\n (a, b) => a.viewport - b.viewport\n );\n const name = skeleton.name;\n\n const parts: string[] = [];\n\n // Base bone styles\n parts.push(\n `.${p}-${name} .${p}-bone{position:absolute;background:linear-gradient(90deg,${color} 25%,${shimmerColor} 50%,${color} 75%);background-size:200% 100%;animation:${p}-shimmer ${animationDuration}ms ease-in-out infinite}`\n );\n\n // Responsive breakpoint switching via media queries\n if (breakpoints.length > 1) {\n for (let i = 0; i < breakpoints.length; i++) {\n const bp = breakpoints[i];\n const next = breakpoints[i + 1];\n const prev = breakpoints[i - 1];\n\n let query: string;\n if (i === 0) {\n // Smallest: up to midpoint between this and next\n const max = Math.floor((bp.viewport + next!.viewport) / 2) - 1;\n query = `@media(max-width:${max}px)`;\n } else if (i === breakpoints.length - 1) {\n // Largest: from midpoint between prev and this\n const min = Math.floor((prev!.viewport + bp.viewport) / 2);\n query = `@media(min-width:${min}px)`;\n } else {\n // Middle: between midpoints\n const min = Math.floor((prev!.viewport + bp.viewport) / 2);\n const max = Math.floor((bp.viewport + next!.viewport) / 2) - 1;\n query = `@media(min-width:${min}px) and (max-width:${max}px)`;\n }\n\n parts.push(\n `${query}{.${p}-${name} .${p}-bp-${bp.viewport}{display:block}}`\n );\n }\n } else if (breakpoints.length === 1) {\n // Single breakpoint — always visible\n parts.push(\n `.${p}-${name} .${p}-bp-${breakpoints[0].viewport}{display:block}`\n );\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Generate critical inline CSS for above-the-fold skeletons.\n * This CSS is designed to be embedded in <style> tags for instant rendering.\n */\nexport function generateCriticalCSS(\n skeletons: SkeletonData[],\n config?: Partial<CastDOMConfig>\n): string {\n const cfg = resolveConfig(config);\n const parts: string[] = [];\n\n // Base keyframes (only once)\n parts.push(\n `@keyframes ${cfg.classPrefix}-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}`\n );\n\n // Reduced motion\n parts.push(\n `@media(prefers-reduced-motion:reduce){.${cfg.classPrefix}-bone{animation:none!important}}`\n );\n\n // Per-skeleton styles\n for (const skeleton of skeletons) {\n parts.push(generateCSS(skeleton, config));\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Generate a complete, self-contained HTML skeleton\n * that can be embedded directly in server-rendered pages.\n * Includes inline <style> — no external CSS needed.\n */\nexport function renderStandalone(\n skeleton: SkeletonData,\n config?: Partial<CastDOMConfig>\n): string {\n const css = generateCriticalCSS([skeleton], config);\n const html = renderResponsiveHTML(skeleton, config);\n return `<style>${css}</style>${html}`;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { renderStandalone, renderResponsiveHTML, generateCriticalCSS } from './chunk-
|
|
1
|
+
import { renderStandalone, renderResponsiveHTML, generateCriticalCSS } from './chunk-GVFBT6MD.js';
|
|
2
2
|
|
|
3
3
|
// src/seo/ssr.ts
|
|
4
4
|
function renderSkeleton(skeleton, options) {
|
|
@@ -53,5 +53,5 @@ function renderPreloadHints() {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export { renderCriticalStyleTag, renderHydrationScript, renderPreloadHints, renderSSRFragment, renderSkeleton, renderSkeletons };
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
56
|
+
//# sourceMappingURL=chunk-M4OXJTRQ.js.map
|
|
57
|
+
//# sourceMappingURL=chunk-M4OXJTRQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/seo/ssr.ts"],"names":[],"mappings":";;;AAyCO,SAAS,cAAA,CACd,UACA,OAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,IAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,SAAS,cAAA,IAAkB,IAAA;AAElD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,GAAO,gBAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,oBAAA,CAAqB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA;AAAA,MACV,yBAAA;AAAA,MACA,CAAA,2CAAA,EAA8C,QAAA,CAAS,IAAI,CAAA,qBAAA,EAAwB,SAAS,IAAI,CAAA,yBAAA;AAAA,KAClG;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAA,GAAO,aAAa,IAAI,CAAA,WAAA,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,eAAA,CACd,WACA,OAAA,EAC+C;AAC/C,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAE1D,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,cAAA,CAAe,QAAA,EAAU;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAA,EAAW;AAAA;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACrB;AAMO,SAAS,sBAAA,CACd,WACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,SAAA,EAAW,MAAM,CAAA;AACjD,EAAA,OAAO,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAC9C;AAaO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAA,6XAAA,CAAA;AACT;AAQO,SAAS,iBAAA,CACd,WACA,OAAA,EACgD;AAChD,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,eAAA,CAAgB,WAAW,OAAO,CAAA;AAExD,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAAA,IACrC,qBAAA;AAAsB,GACxB,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAC5B;AAMO,SAAS,kBAAA,GAA6B;AAG3C,EAAA,OAAO,EAAA;AACT","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/seo/ssr.ts"],"names":[],"mappings":";;;AAyCO,SAAS,cAAA,CACd,UACA,OAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,IAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,SAAS,cAAA,IAAkB,IAAA;AAElD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,GAAO,gBAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,oBAAA,CAAqB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA;AAAA,MACV,yBAAA;AAAA,MACA,CAAA,2CAAA,EAA8C,QAAA,CAAS,IAAI,CAAA,qBAAA,EAAwB,SAAS,IAAI,CAAA,yBAAA;AAAA,KAClG;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAA,GAAO,aAAa,IAAI,CAAA,WAAA,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,eAAA,CACd,WACA,OAAA,EAC+C;AAC/C,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAE1D,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,cAAA,CAAe,QAAA,EAAU;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAA,EAAW;AAAA;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACrB;AAMO,SAAS,sBAAA,CACd,WACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,SAAA,EAAW,MAAM,CAAA;AACjD,EAAA,OAAO,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAC9C;AAaO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAA,6XAAA,CAAA;AACT;AAQO,SAAS,iBAAA,CACd,WACA,OAAA,EACgD;AAChD,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,eAAA,CAAgB,WAAW,OAAO,CAAA;AAExD,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,kCAAkC,GAAG,CAAA,QAAA,CAAA;AAAA,IACrC,qBAAA;AAAsB,GACxB,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAC5B;AAMO,SAAS,kBAAA,GAA6B;AAG3C,EAAA,OAAO,EAAA;AACT","file":"chunk-M4OXJTRQ.js","sourcesContent":["import type { SkeletonData, CastDOMConfig } from \"../core/types.js\";\nimport { renderStandalone, renderResponsiveHTML, generateCriticalCSS } from \"../core/renderer.js\";\nimport { DEFAULTS } from \"../core/types.js\";\n\n/**\n * SSR (Server-Side Rendering) utilities for CastDOM.\n *\n * These functions generate HTML that can be embedded directly in\n * server-rendered pages. The skeletons render as pure CSS —\n * no JavaScript is needed on the client to display them.\n *\n * Benefits for SEO:\n * - Crawlers see structured placeholder content instead of blank areas\n * - Zero CLS (Cumulative Layout Shift) — skeletons match exact dimensions\n * - Instant visual feedback — no FOUC (Flash of Unstyled Content)\n * - Proper ARIA attributes for accessibility\n */\n\nexport interface SSRRenderOptions {\n /** Include <style> tag with critical CSS (default: true) */\n inlineCSS?: boolean;\n /** Wrap in a <noscript> fallback (default: false) */\n noscript?: boolean;\n /** Add data attributes for hydration (default: true) */\n hydrationAttrs?: boolean;\n /** Custom config overrides */\n config?: Partial<CastDOMConfig>;\n}\n\n/**\n * Render a skeleton to an HTML string for SSR.\n * Includes inline critical CSS for immediate rendering.\n *\n * ```ts\n * // In your server handler / getServerSideProps / loader:\n * import { renderSkeleton } from 'castdom/ssr';\n *\n * const skeletonHTML = renderSkeleton(skeletonData);\n * // Embed in your page HTML\n * ```\n */\nexport function renderSkeleton(\n skeleton: SkeletonData,\n options?: SSRRenderOptions\n): string {\n const inlineCSS = options?.inlineCSS ?? true;\n const hydrationAttrs = options?.hydrationAttrs ?? true;\n\n let html: string;\n if (inlineCSS) {\n html = renderStandalone(skeleton, options?.config);\n } else {\n html = renderResponsiveHTML(skeleton, options?.config);\n }\n\n // Add hydration data attributes\n if (hydrationAttrs) {\n html = html.replace(\n /class=\"castdom-skeleton/,\n `data-castdom-ssr=\"true\" data-castdom-name=\"${skeleton.name}\" data-castdom-hash=\"${skeleton.hash}\" class=\"castdom-skeleton`\n );\n }\n\n // Wrap in noscript if requested\n if (options?.noscript) {\n html = `<noscript>${html}</noscript>`;\n }\n\n return html;\n}\n\n/**\n * Render multiple skeletons with shared CSS (deduplicates the critical CSS).\n *\n * More efficient than calling renderSkeleton() multiple times\n * when you have several skeletons on one page.\n */\nexport function renderSkeletons(\n skeletons: SkeletonData[],\n options?: SSRRenderOptions\n): { css: string; html: Record<string, string> } {\n const css = generateCriticalCSS(skeletons, options?.config);\n\n const html: Record<string, string> = {};\n for (const skeleton of skeletons) {\n html[skeleton.name] = renderSkeleton(skeleton, {\n ...options,\n inlineCSS: false, // CSS is shared\n });\n }\n\n return { css, html };\n}\n\n/**\n * Generate a <style> tag with critical CSS for given skeletons.\n * Place in <head> for optimal rendering performance.\n */\nexport function renderCriticalStyleTag(\n skeletons: SkeletonData[],\n config?: Partial<CastDOMConfig>\n): string {\n const css = generateCriticalCSS(skeletons, config);\n return `<style data-castdom=\"critical\">${css}</style>`;\n}\n\n/**\n * Generate a hydration script that removes SSR skeletons\n * once the client-side app takes over.\n *\n * This is a tiny (~200 byte) inline script that:\n * 1. Waits for DOMContentLoaded\n * 2. Finds all [data-castdom-ssr] elements\n * 3. Removes them once the real content renders\n *\n * The script is safe to inline — no external dependencies.\n */\nexport function renderHydrationScript(): string {\n return `<script data-castdom=\"hydration\">(function(){if(typeof window==='undefined')return;function r(){document.querySelectorAll('[data-castdom-ssr]').forEach(function(el){if(el.nextElementSibling&&!el.nextElementSibling.hasAttribute('data-castdom-ssr')){el.remove()}})}if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',r)}else{setTimeout(r,0)}})()</script>`;\n}\n\n/**\n * Generate a complete SSR skeleton page fragment.\n * Includes: critical CSS + skeleton HTML + hydration script.\n *\n * Designed to be dropped directly into your HTML template.\n */\nexport function renderSSRFragment(\n skeletons: SkeletonData[],\n options?: SSRRenderOptions\n): { head: string; body: Record<string, string> } {\n const { css, html } = renderSkeletons(skeletons, options);\n\n const head = [\n `<style data-castdom=\"critical\">${css}</style>`,\n renderHydrationScript(),\n ].join(\"\\n\");\n\n return { head, body: html };\n}\n\n/**\n * Preload hint generator for skeleton assets.\n * Generates <link> tags for optimal loading.\n */\nexport function renderPreloadHints(): string {\n // CastDOM is CSS-only at runtime, so no assets to preload.\n // This function exists for API consistency and future-proofing.\n return \"\";\n}\n\n// Re-export core utilities for convenience\nexport { generateCriticalCSS } from \"../core/renderer.js\";\nexport { renderStandalone, renderResponsiveHTML } from \"../core/renderer.js\";\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { generateCSS, renderBonesHTML } from './chunk-
|
|
2
|
-
import { DEFAULTS } from './chunk-
|
|
1
|
+
import { generateCSS, renderBonesHTML } from './chunk-GVFBT6MD.js';
|
|
2
|
+
import { DEFAULTS } from './chunk-4LFW65DU.js';
|
|
3
3
|
|
|
4
4
|
// src/core/registry.ts
|
|
5
5
|
var store = /* @__PURE__ */ new Map();
|
|
@@ -69,5 +69,5 @@ function getBaseCSS(prefix, config) {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
export { clear, configure, get, getAllCSS, has, loadManifest, names, register, registerAll, remove };
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
73
|
-
//# sourceMappingURL=chunk-
|
|
72
|
+
//# sourceMappingURL=chunk-V4FV5XFF.js.map
|
|
73
|
+
//# sourceMappingURL=chunk-V4FV5XFF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/registry.ts"],"names":[],"mappings":";;;;AAWA,IAAM,KAAA,uBAAY,GAAA,EAA2B;AAC7C,IAAI,YAAA,GAEA;AAAA,EACF,OAAO,QAAA,CAAS,KAAA;AAAA,EAChB,cAAc,QAAA,CAAS,YAAA;AAAA,EACvB,mBAAmB,QAAA,CAAS,iBAAA;AAAA,EAC5B,aAAa,QAAA,CAAS,WAAA;AAAA,EACtB,cAAc,QAAA,CAAS;AACzB,CAAA;AAGO,SAAS,UACd,MAAA,EACM;AACN,EAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,GAAG,MAAA,EAAO;AAE5C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAA,EAAO;AACjC,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACrC,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AACF;AAGA,SAAS,WAAW,IAAA,EAAmC;AACrD,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,EAAM,YAAY,CAAA;AAC1C,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,IAAA,IAAA,CAAK,GAAG,QAAQ,CAAA,GAAI,gBAAgB,IAAA,CAAK,IAAA,EAAM,IAAI,YAAY,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK;AAC3B;AAGO,SAAS,SAAS,IAAA,EAA0B;AACjD,EAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AACvC;AAGO,SAAS,YAAY,SAAA,EAAiC;AAC3D,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf;AACF;AAGO,SAAS,aAAa,QAAA,EAA+C;AAC1E,EAAA,WAAA,CAAY,SAAS,SAAS,CAAA;AAChC;AAGO,SAAS,IAAI,IAAA,EAAyC;AAC3D,EAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACvB;AAGO,SAAS,IAAI,IAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACvB;AAGO,SAAS,KAAA,GAAkB;AAChC,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,IAAA,EAAM,CAAA;AACzB;AAGO,SAAS,OAAO,IAAA,EAAuB;AAC5C,EAAA,OAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAC1B;AAGO,SAAS,KAAA,GAAc;AAC5B,EAAA,KAAA,CAAM,KAAA,EAAM;AACd;AAGO,SAAS,SAAA,GAAoB;AAClC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAG7B,EAAA,MAAM,SAAS,YAAA,CAAa,WAAA;AAC5B,EAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,MAAoB,CAAC,CAAA;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,MAAA,EAAO,EAAG;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAGA,SAAS,UAAA,CACP,QACA,MAAA,EACQ;AACR,EAAA,OAAO,CAAA,WAAA,EAAc,MAAM,CAAA,gHAAA,EAAmH,MAAM,CAAA,gCAAA,CAAA;AACtJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/core/registry.ts"],"names":[],"mappings":";;;;AAWA,IAAM,KAAA,uBAAY,GAAA,EAA2B;AAC7C,IAAI,YAAA,GAEA;AAAA,EACF,OAAO,QAAA,CAAS,KAAA;AAAA,EAChB,cAAc,QAAA,CAAS,YAAA;AAAA,EACvB,mBAAmB,QAAA,CAAS,iBAAA;AAAA,EAC5B,aAAa,QAAA,CAAS,WAAA;AAAA,EACtB,cAAc,QAAA,CAAS;AACzB,CAAA;AAGO,SAAS,UACd,MAAA,EACM;AACN,EAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,GAAG,MAAA,EAAO;AAE5C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAA,EAAO;AACjC,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACrC,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AACF;AAGA,SAAS,WAAW,IAAA,EAAmC;AACrD,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,EAAM,YAAY,CAAA;AAC1C,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,IAAA,IAAA,CAAK,GAAG,QAAQ,CAAA,GAAI,gBAAgB,IAAA,CAAK,IAAA,EAAM,IAAI,YAAY,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK;AAC3B;AAGO,SAAS,SAAS,IAAA,EAA0B;AACjD,EAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AACvC;AAGO,SAAS,YAAY,SAAA,EAAiC;AAC3D,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf;AACF;AAGO,SAAS,aAAa,QAAA,EAA+C;AAC1E,EAAA,WAAA,CAAY,SAAS,SAAS,CAAA;AAChC;AAGO,SAAS,IAAI,IAAA,EAAyC;AAC3D,EAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACvB;AAGO,SAAS,IAAI,IAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACvB;AAGO,SAAS,KAAA,GAAkB;AAChC,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,IAAA,EAAM,CAAA;AACzB;AAGO,SAAS,OAAO,IAAA,EAAuB;AAC5C,EAAA,OAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAC1B;AAGO,SAAS,KAAA,GAAc;AAC5B,EAAA,KAAA,CAAM,KAAA,EAAM;AACd;AAGO,SAAS,SAAA,GAAoB;AAClC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAG7B,EAAA,MAAM,SAAS,YAAA,CAAa,WAAA;AAC5B,EAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,MAAoB,CAAC,CAAA;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,MAAA,EAAO,EAAG;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAGA,SAAS,UAAA,CACP,QACA,MAAA,EACQ;AACR,EAAA,OAAO,CAAA,WAAA,EAAc,MAAM,CAAA,gHAAA,EAAmH,MAAM,CAAA,gCAAA,CAAA;AACtJ","file":"chunk-V4FV5XFF.js","sourcesContent":["import type { RegistryEntry, SkeletonData, CastDOMConfig } from \"./types.js\";\nimport { generateCSS } from \"./renderer.js\";\nimport { renderBonesHTML } from \"./renderer.js\";\nimport { DEFAULTS } from \"./types.js\";\n\n/**\n * Global skeleton registry.\n * Stores all registered skeleton data and provides lookup by name.\n * Import once at app entry — all <CastDOM> components auto-resolve from here.\n */\n\nconst store = new Map<string, RegistryEntry>();\nlet globalConfig: Required<\n Pick<CastDOMConfig, \"color\" | \"shimmerColor\" | \"animationDuration\" | \"classPrefix\" | \"inlineStyles\">\n> = {\n color: DEFAULTS.color,\n shimmerColor: DEFAULTS.shimmerColor,\n animationDuration: DEFAULTS.animationDuration,\n classPrefix: DEFAULTS.classPrefix,\n inlineStyles: DEFAULTS.inlineStyles,\n};\n\n/** Configure global registry settings */\nexport function configure(\n config: Partial<typeof globalConfig>\n): void {\n globalConfig = { ...globalConfig, ...config };\n // Re-generate CSS/HTML for all registered skeletons\n for (const [name, entry] of store) {\n const updated = buildEntry(entry.data);\n store.set(name, updated);\n }\n}\n\n/** Build a registry entry from skeleton data */\nfunction buildEntry(data: SkeletonData): RegistryEntry {\n const css = generateCSS(data, globalConfig);\n const html: Record<number, string> = {};\n for (const bp of data.breakpoints) {\n html[bp.viewport] = renderBonesHTML(data.name, bp, globalConfig);\n }\n return { data, css, html };\n}\n\n/** Register a single skeleton */\nexport function register(data: SkeletonData): void {\n store.set(data.name, buildEntry(data));\n}\n\n/** Register multiple skeletons at once */\nexport function registerAll(skeletons: SkeletonData[]): void {\n for (const data of skeletons) {\n register(data);\n }\n}\n\n/** Load and register skeletons from a generated manifest file */\nexport function loadManifest(manifest: { skeletons: SkeletonData[] }): void {\n registerAll(manifest.skeletons);\n}\n\n/** Get a registered skeleton by name */\nexport function get(name: string): RegistryEntry | undefined {\n return store.get(name);\n}\n\n/** Check if a skeleton is registered */\nexport function has(name: string): boolean {\n return store.has(name);\n}\n\n/** Get all registered skeleton names */\nexport function names(): string[] {\n return [...store.keys()];\n}\n\n/** Remove a skeleton from the registry */\nexport function remove(name: string): boolean {\n return store.delete(name);\n}\n\n/** Clear all registered skeletons */\nexport function clear(): void {\n store.clear();\n}\n\n/** Get the combined CSS for all registered skeletons */\nexport function getAllCSS(): string {\n const parts: string[] = [];\n const seen = new Set<string>();\n\n // Add base animation CSS once\n const prefix = globalConfig.classPrefix;\n parts.push(getBaseCSS(prefix, globalConfig));\n\n for (const entry of store.values()) {\n if (!seen.has(entry.data.name)) {\n parts.push(entry.css);\n seen.add(entry.data.name);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\n/** Get base CSS (keyframes + shared styles) */\nfunction getBaseCSS(\n prefix: string,\n config: typeof globalConfig\n): string {\n return `@keyframes ${prefix}-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}@media(prefers-reduced-motion:reduce){.${prefix}-bone{animation:none!important}}`;\n}\n"]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkASS2BFPN_cjs = require('./chunk-ASS2BFPN.cjs');
|
|
4
|
+
var chunkC3VW72Z3_cjs = require('./chunk-C3VW72Z3.cjs');
|
|
5
5
|
|
|
6
6
|
// src/core/registry.ts
|
|
7
7
|
var store = /* @__PURE__ */ new Map();
|
|
8
8
|
var globalConfig = {
|
|
9
|
-
color:
|
|
10
|
-
shimmerColor:
|
|
11
|
-
animationDuration:
|
|
12
|
-
classPrefix:
|
|
13
|
-
inlineStyles:
|
|
9
|
+
color: chunkC3VW72Z3_cjs.DEFAULTS.color,
|
|
10
|
+
shimmerColor: chunkC3VW72Z3_cjs.DEFAULTS.shimmerColor,
|
|
11
|
+
animationDuration: chunkC3VW72Z3_cjs.DEFAULTS.animationDuration,
|
|
12
|
+
classPrefix: chunkC3VW72Z3_cjs.DEFAULTS.classPrefix,
|
|
13
|
+
inlineStyles: chunkC3VW72Z3_cjs.DEFAULTS.inlineStyles
|
|
14
14
|
};
|
|
15
15
|
function configure(config) {
|
|
16
16
|
globalConfig = { ...globalConfig, ...config };
|
|
@@ -20,10 +20,10 @@ function configure(config) {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
function buildEntry(data) {
|
|
23
|
-
const css =
|
|
23
|
+
const css = chunkASS2BFPN_cjs.generateCSS(data, globalConfig);
|
|
24
24
|
const html = {};
|
|
25
25
|
for (const bp of data.breakpoints) {
|
|
26
|
-
html[bp.viewport] =
|
|
26
|
+
html[bp.viewport] = chunkASS2BFPN_cjs.renderBonesHTML(data.name, bp, globalConfig);
|
|
27
27
|
}
|
|
28
28
|
return { data, css, html };
|
|
29
29
|
}
|
|
@@ -80,5 +80,5 @@ exports.names = names;
|
|
|
80
80
|
exports.register = register;
|
|
81
81
|
exports.registerAll = registerAll;
|
|
82
82
|
exports.remove = remove;
|
|
83
|
-
//# sourceMappingURL=chunk-
|
|
84
|
-
//# sourceMappingURL=chunk-
|
|
83
|
+
//# sourceMappingURL=chunk-W236FF4E.cjs.map
|
|
84
|
+
//# sourceMappingURL=chunk-W236FF4E.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/registry.ts"],"names":["DEFAULTS","generateCSS","renderBonesHTML"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/core/registry.ts"],"names":["DEFAULTS","generateCSS","renderBonesHTML"],"mappings":"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","file":"chunk-W236FF4E.cjs","sourcesContent":["import type { RegistryEntry, SkeletonData, CastDOMConfig } from \"./types.js\";\nimport { generateCSS } from \"./renderer.js\";\nimport { renderBonesHTML } from \"./renderer.js\";\nimport { DEFAULTS } from \"./types.js\";\n\n/**\n * Global skeleton registry.\n * Stores all registered skeleton data and provides lookup by name.\n * Import once at app entry — all <CastDOM> components auto-resolve from here.\n */\n\nconst store = new Map<string, RegistryEntry>();\nlet globalConfig: Required<\n Pick<CastDOMConfig, \"color\" | \"shimmerColor\" | \"animationDuration\" | \"classPrefix\" | \"inlineStyles\">\n> = {\n color: DEFAULTS.color,\n shimmerColor: DEFAULTS.shimmerColor,\n animationDuration: DEFAULTS.animationDuration,\n classPrefix: DEFAULTS.classPrefix,\n inlineStyles: DEFAULTS.inlineStyles,\n};\n\n/** Configure global registry settings */\nexport function configure(\n config: Partial<typeof globalConfig>\n): void {\n globalConfig = { ...globalConfig, ...config };\n // Re-generate CSS/HTML for all registered skeletons\n for (const [name, entry] of store) {\n const updated = buildEntry(entry.data);\n store.set(name, updated);\n }\n}\n\n/** Build a registry entry from skeleton data */\nfunction buildEntry(data: SkeletonData): RegistryEntry {\n const css = generateCSS(data, globalConfig);\n const html: Record<number, string> = {};\n for (const bp of data.breakpoints) {\n html[bp.viewport] = renderBonesHTML(data.name, bp, globalConfig);\n }\n return { data, css, html };\n}\n\n/** Register a single skeleton */\nexport function register(data: SkeletonData): void {\n store.set(data.name, buildEntry(data));\n}\n\n/** Register multiple skeletons at once */\nexport function registerAll(skeletons: SkeletonData[]): void {\n for (const data of skeletons) {\n register(data);\n }\n}\n\n/** Load and register skeletons from a generated manifest file */\nexport function loadManifest(manifest: { skeletons: SkeletonData[] }): void {\n registerAll(manifest.skeletons);\n}\n\n/** Get a registered skeleton by name */\nexport function get(name: string): RegistryEntry | undefined {\n return store.get(name);\n}\n\n/** Check if a skeleton is registered */\nexport function has(name: string): boolean {\n return store.has(name);\n}\n\n/** Get all registered skeleton names */\nexport function names(): string[] {\n return [...store.keys()];\n}\n\n/** Remove a skeleton from the registry */\nexport function remove(name: string): boolean {\n return store.delete(name);\n}\n\n/** Clear all registered skeletons */\nexport function clear(): void {\n store.clear();\n}\n\n/** Get the combined CSS for all registered skeletons */\nexport function getAllCSS(): string {\n const parts: string[] = [];\n const seen = new Set<string>();\n\n // Add base animation CSS once\n const prefix = globalConfig.classPrefix;\n parts.push(getBaseCSS(prefix, globalConfig));\n\n for (const entry of store.values()) {\n if (!seen.has(entry.data.name)) {\n parts.push(entry.css);\n seen.add(entry.data.name);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\n/** Get base CSS (keyframes + shared styles) */\nfunction getBaseCSS(\n prefix: string,\n config: typeof globalConfig\n): string {\n return `@keyframes ${prefix}-shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}@media(prefers-reduced-motion:reduce){.${prefix}-bone{animation:none!important}}`;\n}\n"]}
|