UNPKG

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
/* 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; }