element-book
Version:
An [`element-vir`](https://npmjs.com/package/element-vir) drop-in element for building, testing, and demonstrating a collection of elements (or, in other words, a design system).
53 lines (52 loc) • 2.04 kB
JavaScript
/* eslint-disable @typescript-eslint/no-empty-object-type */
import { check } from '@augment-vir/assert';
import { BookEntryType } from '../book-entry-type.js';
import { titleToUrlBreadcrumb } from '../url-breadcrumbs.js';
/**
* A variant of {@link defineBookPage} that allows you specify what the expected global element-book
* values are for the page that you are defining.
*
* @category Main
*/
export function defineBookPageWithGlobals() {
return (pageInit) => {
return defineBookPage(pageInit);
};
}
/**
* Define an element-book page. This is how you create new entries for your element-book instance.
*
* @category Main
*/
export function defineBookPage(pageInit) {
const page = {
...pageInit,
entryType: BookEntryType.Page,
useVerticalExamples: !!pageInit.useVerticalExamples,
elementExamples: {},
descriptionParagraphs: pageInit.descriptionParagraphs ?? [],
controls: pageInit.controls ?? {},
errors: [],
};
const alreadyTakenElementExampleNames = new Set();
if (pageInit.defineExamples) {
pageInit.defineExamples({
defineExample(elementExampleInit) {
const newExample = {
...elementExampleInit,
isVertical: page.useVerticalExamples,
entryType: BookEntryType.ElementExample,
parent: page,
descriptionParagraphs: elementExampleInit.descriptionParagraphs ?? [],
errors: [
alreadyTakenElementExampleNames.has(elementExampleInit.title) &&
new Error(`Example title '${elementExampleInit.title}' in page '${pageInit.title}' is already taken.`),
].filter(check.isTruthy),
};
alreadyTakenElementExampleNames.add(elementExampleInit.title);
page.elementExamples[titleToUrlBreadcrumb(newExample.title)] = newExample;
},
});
}
return page;
}