@reblu/site-blocks 0.7.0 → 0.9.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.
- package/CHANGELOG.md +35 -0
- package/README.md +172 -43
- package/dist/index.cjs +486 -157
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +110 -4
- package/dist/index.d.ts +110 -4
- package/dist/index.js +483 -158
- package/dist/index.js.map +1 -1
- package/dist/seo.cjs +59 -0
- package/dist/seo.cjs.map +1 -0
- package/dist/seo.d.cts +47 -0
- package/dist/seo.d.ts +47 -0
- package/dist/seo.js +31 -0
- package/dist/seo.js.map +1 -0
- package/package.json +15 -4
package/dist/seo.cjs
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/seo.ts
|
|
21
|
+
var seo_exports = {};
|
|
22
|
+
__export(seo_exports, {
|
|
23
|
+
buildFaqPageJsonLd: () => buildFaqPageJsonLd,
|
|
24
|
+
collectFaqItems: () => collectFaqItems
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(seo_exports);
|
|
27
|
+
|
|
28
|
+
// src/lib/block-order.ts
|
|
29
|
+
function sortBlocksByOrder(blocks) {
|
|
30
|
+
return [...blocks].sort((a, b) => a.order - b.order);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// src/lib/faq-json-ld.ts
|
|
34
|
+
function normaliseText(value) {
|
|
35
|
+
return value.replace(/\s+/g, " ").trim();
|
|
36
|
+
}
|
|
37
|
+
function buildFaqPageJsonLd(items) {
|
|
38
|
+
const mainEntity = [];
|
|
39
|
+
for (const item of items) {
|
|
40
|
+
const name = normaliseText(item.q);
|
|
41
|
+
const text = normaliseText(item.a);
|
|
42
|
+
if (!name || !text) continue;
|
|
43
|
+
mainEntity.push({ "@type": "Question", name, acceptedAnswer: { "@type": "Answer", text } });
|
|
44
|
+
}
|
|
45
|
+
if (mainEntity.length === 0) return null;
|
|
46
|
+
return { "@context": "https://schema.org", "@type": "FAQPage", mainEntity };
|
|
47
|
+
}
|
|
48
|
+
function collectFaqItems(blocks) {
|
|
49
|
+
if (!blocks) return [];
|
|
50
|
+
return sortBlocksByOrder(blocks).flatMap(
|
|
51
|
+
(block) => block.blockType === "faq" ? block.data.items : []
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
55
|
+
0 && (module.exports = {
|
|
56
|
+
buildFaqPageJsonLd,
|
|
57
|
+
collectFaqItems
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=seo.cjs.map
|
package/dist/seo.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/seo.ts","../src/lib/block-order.ts","../src/lib/faq-json-ld.ts"],"sourcesContent":["// `@reblu/site-blocks/seo` — directive-free structured-data helpers (REB-850).\n//\n// NO `'use client'` here, ever: these are called from Server Components and\n// `generateMetadata`. A helper reachable only through a client entry is a client\n// reference on the server and throws when called there (REB-846).\n// `test/seo-entry.test.ts` enforces this on the emitted dist, not the source.\nexport {\n buildFaqPageJsonLd,\n collectFaqItems,\n type FaqItem,\n type FaqPageJsonLd,\n} from './lib/faq-json-ld'\n","/**\n * The single ordering rule for page blocks: ascending `order`, stable for ties,\n * never mutating the input. `PageBlocks` (what the page shows) and\n * `collectFaqItems` (what the FAQPage structured data says) both use it, so the\n * two can never disagree on question order.\n */\nexport function sortBlocksByOrder<T extends { order: number }>(blocks: readonly T[]): T[] {\n return [...blocks].sort((a, b) => a.order - b.order)\n}\n","import type { PageBlock } from '@reblu/site-contracts'\n\nimport { sortBlocksByOrder } from './block-order'\n\n/**\n * REB-850 — schema.org `FAQPage` structured data for a page's FAQ blocks.\n *\n * Pure and framework-free on purpose: it is exported from the directive-free\n * `@reblu/site-blocks/seo` entry (and the RSC-safe root), so a Server Component\n * or `generateMetadata` can call it. REB-846 is the failure this avoids — a\n * helper reachable ONLY through a `'use client'` entry is a client reference on\n * the server, and calling it from a Server Component throws.\n *\n * The caller serialises the result; pair it with `@reblu/site-next`'s\n * `<JsonLd>`, which escapes the `</script>` boundary.\n */\n\n/** One question/answer pair — the `faq` block's `data.items[number]` shape. */\nexport interface FaqItem {\n q: string\n a: string\n}\n\nexport interface FaqPageJsonLd {\n '@context': 'https://schema.org'\n '@type': 'FAQPage'\n mainEntity: Array<{\n '@type': 'Question'\n name: string\n acceptedAnswer: { '@type': 'Answer'; text: string }\n }>\n}\n\n/**\n * Questions and answers are PLAIN TEXT — authored in a Textarea and rendered by\n * `FaqAccordion` as escaped text. The structured data must say exactly what the\n * page shows, so nothing is stripped or decoded: `a < b`, `<b>` and `&` are\n * content. Only whitespace is collapsed (the accordion keeps line breaks; the\n * visible words are identical). Escaping the `</script>` boundary is the\n * serialiser's job (`<JsonLd>`), not this function's.\n */\nfunction normaliseText(value: string): string {\n return value.replace(/\\s+/g, ' ').trim()\n}\n\n/**\n * Builds a schema.org `FAQPage` object from question/answer pairs.\n *\n * Items whose question or answer is blank are skipped, and the function\n * returns `null` when nothing is left — an empty `FAQPage` is invalid\n * structured data, so the caller simply renders no script.\n */\nexport function buildFaqPageJsonLd(items: readonly FaqItem[]): FaqPageJsonLd | null {\n const mainEntity: FaqPageJsonLd['mainEntity'] = []\n for (const item of items) {\n const name = normaliseText(item.q)\n const text = normaliseText(item.a)\n if (!name || !text) continue\n mainEntity.push({ '@type': 'Question', name, acceptedAnswer: { '@type': 'Answer', text } })\n }\n if (mainEntity.length === 0) return null\n return { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity }\n}\n\n/**\n * Every `faq` block's items, in the order `PageBlocks` renders them (ascending\n * `order`, via the shared `sortBlocksByOrder`) — feed the result to\n * {@link buildFaqPageJsonLd}.\n */\nexport function collectFaqItems(blocks: readonly PageBlock[] | null | undefined): FaqItem[] {\n if (!blocks) return []\n return sortBlocksByOrder(blocks).flatMap((block) =>\n block.blockType === 'faq' ? block.data.items : [],\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMO,SAAS,kBAA+C,QAA2B;AACxF,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrD;;;ACiCA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AASO,SAAS,mBAAmB,OAAiD;AAClF,QAAM,aAA0C,CAAC;AACjD,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,cAAc,KAAK,CAAC;AACjC,UAAM,OAAO,cAAc,KAAK,CAAC;AACjC,QAAI,CAAC,QAAQ,CAAC,KAAM;AACpB,eAAW,KAAK,EAAE,SAAS,YAAY,MAAM,gBAAgB,EAAE,SAAS,UAAU,KAAK,EAAE,CAAC;AAAA,EAC5F;AACA,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO,EAAE,YAAY,sBAAsB,SAAS,WAAW,WAAW;AAC5E;AAOO,SAAS,gBAAgB,QAA4D;AAC1F,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,SAAO,kBAAkB,MAAM,EAAE;AAAA,IAAQ,CAAC,UACxC,MAAM,cAAc,QAAQ,MAAM,KAAK,QAAQ,CAAC;AAAA,EAClD;AACF;","names":[]}
|
package/dist/seo.d.cts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { PageBlock } from '@reblu/site-contracts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* REB-850 — schema.org `FAQPage` structured data for a page's FAQ blocks.
|
|
5
|
+
*
|
|
6
|
+
* Pure and framework-free on purpose: it is exported from the directive-free
|
|
7
|
+
* `@reblu/site-blocks/seo` entry (and the RSC-safe root), so a Server Component
|
|
8
|
+
* or `generateMetadata` can call it. REB-846 is the failure this avoids — a
|
|
9
|
+
* helper reachable ONLY through a `'use client'` entry is a client reference on
|
|
10
|
+
* the server, and calling it from a Server Component throws.
|
|
11
|
+
*
|
|
12
|
+
* The caller serialises the result; pair it with `@reblu/site-next`'s
|
|
13
|
+
* `<JsonLd>`, which escapes the `</script>` boundary.
|
|
14
|
+
*/
|
|
15
|
+
/** One question/answer pair — the `faq` block's `data.items[number]` shape. */
|
|
16
|
+
interface FaqItem {
|
|
17
|
+
q: string;
|
|
18
|
+
a: string;
|
|
19
|
+
}
|
|
20
|
+
interface FaqPageJsonLd {
|
|
21
|
+
'@context': 'https://schema.org';
|
|
22
|
+
'@type': 'FAQPage';
|
|
23
|
+
mainEntity: Array<{
|
|
24
|
+
'@type': 'Question';
|
|
25
|
+
name: string;
|
|
26
|
+
acceptedAnswer: {
|
|
27
|
+
'@type': 'Answer';
|
|
28
|
+
text: string;
|
|
29
|
+
};
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Builds a schema.org `FAQPage` object from question/answer pairs.
|
|
34
|
+
*
|
|
35
|
+
* Items whose question or answer is blank are skipped, and the function
|
|
36
|
+
* returns `null` when nothing is left — an empty `FAQPage` is invalid
|
|
37
|
+
* structured data, so the caller simply renders no script.
|
|
38
|
+
*/
|
|
39
|
+
declare function buildFaqPageJsonLd(items: readonly FaqItem[]): FaqPageJsonLd | null;
|
|
40
|
+
/**
|
|
41
|
+
* Every `faq` block's items, in the order `PageBlocks` renders them (ascending
|
|
42
|
+
* `order`, via the shared `sortBlocksByOrder`) — feed the result to
|
|
43
|
+
* {@link buildFaqPageJsonLd}.
|
|
44
|
+
*/
|
|
45
|
+
declare function collectFaqItems(blocks: readonly PageBlock[] | null | undefined): FaqItem[];
|
|
46
|
+
|
|
47
|
+
export { type FaqItem, type FaqPageJsonLd, buildFaqPageJsonLd, collectFaqItems };
|
package/dist/seo.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { PageBlock } from '@reblu/site-contracts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* REB-850 — schema.org `FAQPage` structured data for a page's FAQ blocks.
|
|
5
|
+
*
|
|
6
|
+
* Pure and framework-free on purpose: it is exported from the directive-free
|
|
7
|
+
* `@reblu/site-blocks/seo` entry (and the RSC-safe root), so a Server Component
|
|
8
|
+
* or `generateMetadata` can call it. REB-846 is the failure this avoids — a
|
|
9
|
+
* helper reachable ONLY through a `'use client'` entry is a client reference on
|
|
10
|
+
* the server, and calling it from a Server Component throws.
|
|
11
|
+
*
|
|
12
|
+
* The caller serialises the result; pair it with `@reblu/site-next`'s
|
|
13
|
+
* `<JsonLd>`, which escapes the `</script>` boundary.
|
|
14
|
+
*/
|
|
15
|
+
/** One question/answer pair — the `faq` block's `data.items[number]` shape. */
|
|
16
|
+
interface FaqItem {
|
|
17
|
+
q: string;
|
|
18
|
+
a: string;
|
|
19
|
+
}
|
|
20
|
+
interface FaqPageJsonLd {
|
|
21
|
+
'@context': 'https://schema.org';
|
|
22
|
+
'@type': 'FAQPage';
|
|
23
|
+
mainEntity: Array<{
|
|
24
|
+
'@type': 'Question';
|
|
25
|
+
name: string;
|
|
26
|
+
acceptedAnswer: {
|
|
27
|
+
'@type': 'Answer';
|
|
28
|
+
text: string;
|
|
29
|
+
};
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Builds a schema.org `FAQPage` object from question/answer pairs.
|
|
34
|
+
*
|
|
35
|
+
* Items whose question or answer is blank are skipped, and the function
|
|
36
|
+
* returns `null` when nothing is left — an empty `FAQPage` is invalid
|
|
37
|
+
* structured data, so the caller simply renders no script.
|
|
38
|
+
*/
|
|
39
|
+
declare function buildFaqPageJsonLd(items: readonly FaqItem[]): FaqPageJsonLd | null;
|
|
40
|
+
/**
|
|
41
|
+
* Every `faq` block's items, in the order `PageBlocks` renders them (ascending
|
|
42
|
+
* `order`, via the shared `sortBlocksByOrder`) — feed the result to
|
|
43
|
+
* {@link buildFaqPageJsonLd}.
|
|
44
|
+
*/
|
|
45
|
+
declare function collectFaqItems(blocks: readonly PageBlock[] | null | undefined): FaqItem[];
|
|
46
|
+
|
|
47
|
+
export { type FaqItem, type FaqPageJsonLd, buildFaqPageJsonLd, collectFaqItems };
|
package/dist/seo.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// src/lib/block-order.ts
|
|
2
|
+
function sortBlocksByOrder(blocks) {
|
|
3
|
+
return [...blocks].sort((a, b) => a.order - b.order);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
// src/lib/faq-json-ld.ts
|
|
7
|
+
function normaliseText(value) {
|
|
8
|
+
return value.replace(/\s+/g, " ").trim();
|
|
9
|
+
}
|
|
10
|
+
function buildFaqPageJsonLd(items) {
|
|
11
|
+
const mainEntity = [];
|
|
12
|
+
for (const item of items) {
|
|
13
|
+
const name = normaliseText(item.q);
|
|
14
|
+
const text = normaliseText(item.a);
|
|
15
|
+
if (!name || !text) continue;
|
|
16
|
+
mainEntity.push({ "@type": "Question", name, acceptedAnswer: { "@type": "Answer", text } });
|
|
17
|
+
}
|
|
18
|
+
if (mainEntity.length === 0) return null;
|
|
19
|
+
return { "@context": "https://schema.org", "@type": "FAQPage", mainEntity };
|
|
20
|
+
}
|
|
21
|
+
function collectFaqItems(blocks) {
|
|
22
|
+
if (!blocks) return [];
|
|
23
|
+
return sortBlocksByOrder(blocks).flatMap(
|
|
24
|
+
(block) => block.blockType === "faq" ? block.data.items : []
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
buildFaqPageJsonLd,
|
|
29
|
+
collectFaqItems
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=seo.js.map
|
package/dist/seo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/block-order.ts","../src/lib/faq-json-ld.ts"],"sourcesContent":["/**\n * The single ordering rule for page blocks: ascending `order`, stable for ties,\n * never mutating the input. `PageBlocks` (what the page shows) and\n * `collectFaqItems` (what the FAQPage structured data says) both use it, so the\n * two can never disagree on question order.\n */\nexport function sortBlocksByOrder<T extends { order: number }>(blocks: readonly T[]): T[] {\n return [...blocks].sort((a, b) => a.order - b.order)\n}\n","import type { PageBlock } from '@reblu/site-contracts'\n\nimport { sortBlocksByOrder } from './block-order'\n\n/**\n * REB-850 — schema.org `FAQPage` structured data for a page's FAQ blocks.\n *\n * Pure and framework-free on purpose: it is exported from the directive-free\n * `@reblu/site-blocks/seo` entry (and the RSC-safe root), so a Server Component\n * or `generateMetadata` can call it. REB-846 is the failure this avoids — a\n * helper reachable ONLY through a `'use client'` entry is a client reference on\n * the server, and calling it from a Server Component throws.\n *\n * The caller serialises the result; pair it with `@reblu/site-next`'s\n * `<JsonLd>`, which escapes the `</script>` boundary.\n */\n\n/** One question/answer pair — the `faq` block's `data.items[number]` shape. */\nexport interface FaqItem {\n q: string\n a: string\n}\n\nexport interface FaqPageJsonLd {\n '@context': 'https://schema.org'\n '@type': 'FAQPage'\n mainEntity: Array<{\n '@type': 'Question'\n name: string\n acceptedAnswer: { '@type': 'Answer'; text: string }\n }>\n}\n\n/**\n * Questions and answers are PLAIN TEXT — authored in a Textarea and rendered by\n * `FaqAccordion` as escaped text. The structured data must say exactly what the\n * page shows, so nothing is stripped or decoded: `a < b`, `<b>` and `&` are\n * content. Only whitespace is collapsed (the accordion keeps line breaks; the\n * visible words are identical). Escaping the `</script>` boundary is the\n * serialiser's job (`<JsonLd>`), not this function's.\n */\nfunction normaliseText(value: string): string {\n return value.replace(/\\s+/g, ' ').trim()\n}\n\n/**\n * Builds a schema.org `FAQPage` object from question/answer pairs.\n *\n * Items whose question or answer is blank are skipped, and the function\n * returns `null` when nothing is left — an empty `FAQPage` is invalid\n * structured data, so the caller simply renders no script.\n */\nexport function buildFaqPageJsonLd(items: readonly FaqItem[]): FaqPageJsonLd | null {\n const mainEntity: FaqPageJsonLd['mainEntity'] = []\n for (const item of items) {\n const name = normaliseText(item.q)\n const text = normaliseText(item.a)\n if (!name || !text) continue\n mainEntity.push({ '@type': 'Question', name, acceptedAnswer: { '@type': 'Answer', text } })\n }\n if (mainEntity.length === 0) return null\n return { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity }\n}\n\n/**\n * Every `faq` block's items, in the order `PageBlocks` renders them (ascending\n * `order`, via the shared `sortBlocksByOrder`) — feed the result to\n * {@link buildFaqPageJsonLd}.\n */\nexport function collectFaqItems(blocks: readonly PageBlock[] | null | undefined): FaqItem[] {\n if (!blocks) return []\n return sortBlocksByOrder(blocks).flatMap((block) =>\n block.blockType === 'faq' ? block.data.items : [],\n )\n}\n"],"mappings":";AAMO,SAAS,kBAA+C,QAA2B;AACxF,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrD;;;ACiCA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AASO,SAAS,mBAAmB,OAAiD;AAClF,QAAM,aAA0C,CAAC;AACjD,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,cAAc,KAAK,CAAC;AACjC,UAAM,OAAO,cAAc,KAAK,CAAC;AACjC,QAAI,CAAC,QAAQ,CAAC,KAAM;AACpB,eAAW,KAAK,EAAE,SAAS,YAAY,MAAM,gBAAgB,EAAE,SAAS,UAAU,KAAK,EAAE,CAAC;AAAA,EAC5F;AACA,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO,EAAE,YAAY,sBAAsB,SAAS,WAAW,WAAW;AAC5E;AAOO,SAAS,gBAAgB,QAA4D;AAC1F,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,SAAO,kBAAkB,MAAM,EAAE;AAAA,IAAQ,CAAC,UACxC,MAAM,cAAc,QAAQ,MAAM,KAAK,QAAQ,CAAC;AAAA,EAClD;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reblu/site-blocks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Data-driven presentational organisms for Reblu SITEs (Collection, MarkdownRenderer, Treatment, Specialty, ProfileCard, ProductCard) — clean, token-driven, white-label.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Reblu — Adolfo Unturbe",
|
|
@@ -52,6 +52,16 @@
|
|
|
52
52
|
"types": "./dist/client.d.cts",
|
|
53
53
|
"default": "./dist/client.cjs"
|
|
54
54
|
}
|
|
55
|
+
},
|
|
56
|
+
"./seo": {
|
|
57
|
+
"import": {
|
|
58
|
+
"types": "./dist/seo.d.ts",
|
|
59
|
+
"default": "./dist/seo.js"
|
|
60
|
+
},
|
|
61
|
+
"require": {
|
|
62
|
+
"types": "./dist/seo.d.cts",
|
|
63
|
+
"default": "./dist/seo.cjs"
|
|
64
|
+
}
|
|
55
65
|
}
|
|
56
66
|
},
|
|
57
67
|
"publishConfig": {
|
|
@@ -60,8 +70,8 @@
|
|
|
60
70
|
"dependencies": {
|
|
61
71
|
"class-variance-authority": "^0.7.1",
|
|
62
72
|
"html-react-parser": "5.2.17",
|
|
63
|
-
"@reblu/site-contracts": "^1.
|
|
64
|
-
"@reblu/site-ui": "^0.
|
|
73
|
+
"@reblu/site-contracts": "^1.8.0",
|
|
74
|
+
"@reblu/site-ui": "^0.7.0"
|
|
65
75
|
},
|
|
66
76
|
"peerDependencies": {
|
|
67
77
|
"react": ">=19",
|
|
@@ -89,7 +99,8 @@
|
|
|
89
99
|
"typescript": "^5.8.3",
|
|
90
100
|
"unist-util-visit": "^5.1.0",
|
|
91
101
|
"vitest": "^4.0.15",
|
|
92
|
-
"@reblu/config": "0.0.1"
|
|
102
|
+
"@reblu/config": "0.0.1",
|
|
103
|
+
"@reblu/site-client": "^5.3.1"
|
|
93
104
|
},
|
|
94
105
|
"scripts": {
|
|
95
106
|
"build": "tsup",
|