@blinkk/root-cms 1.0.0-rc.9 → 1.0.1

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/dist/project.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { S as Schema } from './schema-fad0a59a.js';
1
+ import { S as Schema } from './schema--v3Ho5Lj.js';
2
2
  import 'preact';
3
3
 
4
4
  /**
@@ -13,4 +13,4 @@ interface SchemaModule {
13
13
  }
14
14
  declare function getProjectSchemas(): Record<string, Schema>;
15
15
 
16
- export { SchemaModule, getProjectSchemas };
16
+ export { type SchemaModule, getProjectSchemas };
@@ -0,0 +1,73 @@
1
+ import * as preact from 'preact';
2
+ import { FunctionalComponent } from 'preact';
3
+
4
+ interface RichTextBlock {
5
+ type: string;
6
+ data?: any;
7
+ }
8
+ interface RichTextData {
9
+ [key: string]: any;
10
+ blocks: any[];
11
+ }
12
+ type RichTextBlockComponent = FunctionalComponent<any>;
13
+ interface RichTextContextProps {
14
+ components?: Record<string, RichTextBlockComponent>;
15
+ }
16
+ declare const RichTextContext: preact.Context<RichTextContextProps>;
17
+ declare function useRichTextContext(): RichTextContextProps;
18
+ interface RichTextProps {
19
+ data: RichTextData;
20
+ components?: Record<string, RichTextBlockComponent>;
21
+ }
22
+ /** Renders data from the "richtext" field. */
23
+ declare function RichText(props: RichTextProps): preact.JSX.Element;
24
+ declare namespace RichText {
25
+ var ParagraphBlock: (props: RichTextParagraphBlockProps) => preact.JSX.Element | null;
26
+ var HeadingBlock: (props: RichTextHeadingBlockProps) => preact.JSX.Element | null;
27
+ var ListBlock: (props: RichTextListBlockProps) => preact.JSX.Element | null;
28
+ var ImageBlock: (props: RichTextImageBlockProps) => preact.JSX.Element | null;
29
+ var HtmlBlock: (props: RichTextHtmlBlockProps) => preact.JSX.Element | null;
30
+ }
31
+ interface RichTextParagraphBlockProps {
32
+ type: 'paragraph';
33
+ data?: {
34
+ text?: string;
35
+ };
36
+ }
37
+ interface RichTextHeadingBlockProps {
38
+ type: 'heading';
39
+ data?: {
40
+ level?: number;
41
+ text?: string;
42
+ };
43
+ }
44
+ interface ListItem {
45
+ content?: string;
46
+ items?: ListItem[];
47
+ }
48
+ interface RichTextListBlockProps {
49
+ type: 'orderedList' | 'unorderedList';
50
+ data?: {
51
+ style?: 'ordered' | 'unordered';
52
+ items?: ListItem[];
53
+ };
54
+ }
55
+ interface RichTextImageBlockProps {
56
+ type: 'image';
57
+ data?: {
58
+ file?: {
59
+ url: string;
60
+ width: string | number;
61
+ height: string | number;
62
+ alt: string;
63
+ };
64
+ };
65
+ }
66
+ interface RichTextHtmlBlockProps {
67
+ type: 'html';
68
+ data?: {
69
+ html?: string;
70
+ };
71
+ }
72
+
73
+ export { RichText, type RichTextBlock, type RichTextBlockComponent, RichTextContext, type RichTextContextProps, type RichTextData, type RichTextHeadingBlockProps, type RichTextHtmlBlockProps, type RichTextImageBlockProps, type RichTextListBlockProps, type RichTextParagraphBlockProps, type RichTextProps, useRichTextContext };
@@ -0,0 +1,129 @@
1
+ // core/richtext.tsx
2
+ import { useTranslations } from "@blinkk/root";
3
+ import { createContext } from "preact";
4
+ import { useContext } from "preact/hooks";
5
+ import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
6
+ var RichTextContext = createContext({});
7
+ function useRichTextContext() {
8
+ return useContext(RichTextContext);
9
+ }
10
+ function RichText(props) {
11
+ var _a;
12
+ const richTextContext = useRichTextContext();
13
+ const components = {
14
+ heading: RichText.HeadingBlock,
15
+ html: RichText.HtmlBlock,
16
+ image: RichText.ImageBlock,
17
+ orderedList: RichText.ListBlock,
18
+ paragraph: RichText.ParagraphBlock,
19
+ unorderedList: RichText.ListBlock,
20
+ ...richTextContext.components,
21
+ ...props.components
22
+ };
23
+ const blocks = (((_a = props.data) == null ? void 0 : _a.blocks) || []).filter((block) => {
24
+ const blockType = block == null ? void 0 : block.type;
25
+ if (!blockType) {
26
+ return false;
27
+ }
28
+ if (!(blockType in components)) {
29
+ console.warn(`ignoring unknown richtext type: "${blockType}"`);
30
+ return false;
31
+ }
32
+ return true;
33
+ });
34
+ return /* @__PURE__ */ jsx(Fragment, { children: blocks.map((block) => {
35
+ const Block = components[block.type];
36
+ return /* @__PURE__ */ jsx(Block, { ...block });
37
+ }) });
38
+ }
39
+ RichText.ParagraphBlock = (props) => {
40
+ var _a;
41
+ if (!((_a = props.data) == null ? void 0 : _a.text)) {
42
+ return null;
43
+ }
44
+ const t = useTranslations();
45
+ return /* @__PURE__ */ jsx("p", { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
46
+ };
47
+ RichText.HeadingBlock = (props) => {
48
+ var _a;
49
+ if (!((_a = props.data) == null ? void 0 : _a.text)) {
50
+ return null;
51
+ }
52
+ const t = useTranslations();
53
+ const level = props.data.level || 2;
54
+ const Component = `h${level}`;
55
+ return /* @__PURE__ */ jsx(Component, { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
56
+ };
57
+ RichText.ListBlock = (props) => {
58
+ var _a, _b, _c;
59
+ if (!((_b = (_a = props.data) == null ? void 0 : _a.items) == null ? void 0 : _b.length)) {
60
+ return null;
61
+ }
62
+ let style = (_c = props.data) == null ? void 0 : _c.style;
63
+ if (!style) {
64
+ style = props.type === "orderedList" ? "ordered" : "unordered";
65
+ }
66
+ const Component = style === "ordered" ? "ol" : "ul";
67
+ const items = props.data.items;
68
+ const t = useTranslations();
69
+ return /* @__PURE__ */ jsx(Component, { children: items.map((item) => {
70
+ var _a2;
71
+ if (item.content || ((_a2 = item.items) == null ? void 0 : _a2.length)) {
72
+ return /* @__PURE__ */ jsxs("li", { children: [
73
+ item.content && /* @__PURE__ */ jsx(
74
+ RichText.ParagraphBlock,
75
+ {
76
+ type: "paragraph",
77
+ data: { text: item.content }
78
+ }
79
+ ),
80
+ item.items && item.items.length > 0 && /* @__PURE__ */ jsx(
81
+ RichText.ListBlock,
82
+ {
83
+ type: props.type,
84
+ data: { style, items: item.items }
85
+ }
86
+ )
87
+ ] });
88
+ }
89
+ return null;
90
+ }) });
91
+ };
92
+ RichText.ImageBlock = (props) => {
93
+ var _a, _b, _c, _d, _e, _f, _g, _h;
94
+ const imageUrl = (_b = (_a = props.data) == null ? void 0 : _a.file) == null ? void 0 : _b.url;
95
+ if (!imageUrl) {
96
+ return null;
97
+ }
98
+ const width = toNumber((_d = (_c = props.data) == null ? void 0 : _c.file) == null ? void 0 : _d.width);
99
+ const height = toNumber((_f = (_e = props.data) == null ? void 0 : _e.file) == null ? void 0 : _f.height);
100
+ const alt = ((_h = (_g = props.data) == null ? void 0 : _g.file) == null ? void 0 : _h.alt) || "";
101
+ return /* @__PURE__ */ jsx("img", { src: imageUrl, width, height, alt });
102
+ };
103
+ RichText.HtmlBlock = (props) => {
104
+ var _a;
105
+ const html = ((_a = props.data) == null ? void 0 : _a.html) || "";
106
+ if (!html) {
107
+ return null;
108
+ }
109
+ return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } });
110
+ };
111
+ function toNumber(input) {
112
+ if (input === void 0) {
113
+ return 0;
114
+ }
115
+ if (typeof input === "number") {
116
+ return input;
117
+ }
118
+ const parsedNumber = parseFloat(input);
119
+ if (isNaN(parsedNumber)) {
120
+ return 0;
121
+ }
122
+ return parsedNumber;
123
+ }
124
+ export {
125
+ RichText,
126
+ RichTextContext,
127
+ useRichTextContext
128
+ };
129
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9yaWNodGV4dC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7dXNlVHJhbnNsYXRpb25zfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtGdW5jdGlvbmFsQ29tcG9uZW50LCBjcmVhdGVDb250ZXh0fSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHt1c2VDb250ZXh0fSBmcm9tICdwcmVhY3QvaG9va3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHREYXRhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBibG9ja3M6IGFueVtdO1xufVxuXG5leHBvcnQgdHlwZSBSaWNoVGV4dEJsb2NrQ29tcG9uZW50ID0gRnVuY3Rpb25hbENvbXBvbmVudDxhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0Q29udGV4dFByb3BzIHtcbiAgY29tcG9uZW50cz86IFJlY29yZDxzdHJpbmcsIFJpY2hUZXh0QmxvY2tDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgY29uc3QgUmljaFRleHRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxSaWNoVGV4dENvbnRleHRQcm9wcz4oe30pO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmljaFRleHRDb250ZXh0KCk6IFJpY2hUZXh0Q29udGV4dFByb3BzIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoUmljaFRleHRDb250ZXh0KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFByb3BzIHtcbiAgZGF0YTogUmljaFRleHREYXRhO1xuICBjb21wb25lbnRzPzogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD47XG59XG5cbi8qKiBSZW5kZXJzIGRhdGEgZnJvbSB0aGUgXCJyaWNodGV4dFwiIGZpZWxkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJpY2hUZXh0KHByb3BzOiBSaWNoVGV4dFByb3BzKSB7XG4gIGNvbnN0IHJpY2hUZXh0Q29udGV4dCA9IHVzZVJpY2hUZXh0Q29udGV4dCgpO1xuICBjb25zdCBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBSaWNoVGV4dEJsb2NrQ29tcG9uZW50PiA9IHtcbiAgICBoZWFkaW5nOiBSaWNoVGV4dC5IZWFkaW5nQmxvY2ssXG4gICAgaHRtbDogUmljaFRleHQuSHRtbEJsb2NrLFxuICAgIGltYWdlOiBSaWNoVGV4dC5JbWFnZUJsb2NrLFxuICAgIG9yZGVyZWRMaXN0OiBSaWNoVGV4dC5MaXN0QmxvY2ssXG4gICAgcGFyYWdyYXBoOiBSaWNoVGV4dC5QYXJhZ3JhcGhCbG9jayxcbiAgICB1bm9yZGVyZWRMaXN0OiBSaWNoVGV4dC5MaXN0QmxvY2ssXG4gICAgLi4ucmljaFRleHRDb250ZXh0LmNvbXBvbmVudHMsXG4gICAgLi4ucHJvcHMuY29tcG9uZW50cyxcbiAgfTtcbiAgY29uc3QgYmxvY2tzID0gKHByb3BzLmRhdGE/LmJsb2NrcyB8fCBbXSkuZmlsdGVyKChibG9jaykgPT4ge1xuICAgIGNvbnN0IGJsb2NrVHlwZSA9IGJsb2NrPy50eXBlO1xuICAgIGlmICghYmxvY2tUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghKGJsb2NrVHlwZSBpbiBjb21wb25lbnRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpZ25vcmluZyB1bmtub3duIHJpY2h0ZXh0IHR5cGU6IFwiJHtibG9ja1R5cGV9XCJgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7YmxvY2tzLm1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgY29uc3QgQmxvY2sgPSBjb21wb25lbnRzW2Jsb2NrLnR5cGVdO1xuICAgICAgICByZXR1cm4gPEJsb2NrIHsuLi5ibG9ja30gLz47XG4gICAgICB9KX1cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFBhcmFncmFwaEJsb2NrUHJvcHMge1xuICB0eXBlOiAncGFyYWdyYXBoJztcbiAgZGF0YT86IHtcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICB9O1xufVxuXG5SaWNoVGV4dC5QYXJhZ3JhcGhCbG9jayA9IChwcm9wczogUmljaFRleHRQYXJhZ3JhcGhCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8udGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgcmV0dXJuIDxwIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0KHByb3BzLmRhdGEudGV4dCl9fSAvPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRIZWFkaW5nQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdoZWFkaW5nJztcbiAgZGF0YT86IHtcbiAgICBsZXZlbD86IG51bWJlcjtcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICB9O1xufVxuXG50eXBlIEhlYWRpbmdDb21wb25lbnQgPSAnaDEnIHwgJ2gyJyB8ICdoMycgfCAnaDQnIHwgJ2g1JyB8ICdoNic7XG5cblJpY2hUZXh0LkhlYWRpbmdCbG9jayA9IChwcm9wczogUmljaFRleHRIZWFkaW5nQmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/LnRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB0ID0gdXNlVHJhbnNsYXRpb25zKCk7XG4gIGNvbnN0IGxldmVsID0gcHJvcHMuZGF0YS5sZXZlbCB8fCAyO1xuICBjb25zdCBDb21wb25lbnQgPSBgaCR7bGV2ZWx9YCBhcyBIZWFkaW5nQ29tcG9uZW50O1xuICByZXR1cm4gPENvbXBvbmVudCBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogdChwcm9wcy5kYXRhLnRleHQpfX0gLz47XG59O1xuXG5pbnRlcmZhY2UgTGlzdEl0ZW0ge1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBpdGVtcz86IExpc3RJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRMaXN0QmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdvcmRlcmVkTGlzdCcgfCAndW5vcmRlcmVkTGlzdCc7XG4gIGRhdGE/OiB7XG4gICAgc3R5bGU/OiAnb3JkZXJlZCcgfCAndW5vcmRlcmVkJztcbiAgICBpdGVtcz86IExpc3RJdGVtW107XG4gIH07XG59XG5cblJpY2hUZXh0Lkxpc3RCbG9jayA9IChwcm9wczogUmljaFRleHRMaXN0QmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/Lml0ZW1zPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBzdHlsZSA9IHByb3BzLmRhdGE/LnN0eWxlO1xuICBpZiAoIXN0eWxlKSB7XG4gICAgc3R5bGUgPSBwcm9wcy50eXBlID09PSAnb3JkZXJlZExpc3QnID8gJ29yZGVyZWQnIDogJ3Vub3JkZXJlZCc7XG4gIH1cbiAgY29uc3QgQ29tcG9uZW50ID0gc3R5bGUgPT09ICdvcmRlcmVkJyA/ICdvbCcgOiAndWwnO1xuICBjb25zdCBpdGVtcyA9IHByb3BzLmRhdGEuaXRlbXM7XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50PlxuICAgICAge2l0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jb250ZW50IHx8IGl0ZW0uaXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIHtpdGVtLmNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICAgIDxSaWNoVGV4dC5QYXJhZ3JhcGhCbG9ja1xuICAgICAgICAgICAgICAgICAgdHlwZT1cInBhcmFncmFwaFwiXG4gICAgICAgICAgICAgICAgICBkYXRhPXt7dGV4dDogaXRlbS5jb250ZW50fX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aXRlbS5pdGVtcyAmJiBpdGVtLml0ZW1zLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxSaWNoVGV4dC5MaXN0QmxvY2tcbiAgICAgICAgICAgICAgICAgIHR5cGU9e3Byb3BzLnR5cGV9XG4gICAgICAgICAgICAgICAgICBkYXRhPXt7c3R5bGUsIGl0ZW1zOiBpdGVtLml0ZW1zfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSl9XG4gICAgPC9Db21wb25lbnQ+XG4gICk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0SW1hZ2VCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2ltYWdlJztcbiAgZGF0YT86IHtcbiAgICBmaWxlPzoge1xuICAgICAgdXJsOiBzdHJpbmc7XG4gICAgICB3aWR0aDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaGVpZ2h0OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBhbHQ6IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5SaWNoVGV4dC5JbWFnZUJsb2NrID0gKHByb3BzOiBSaWNoVGV4dEltYWdlQmxvY2tQcm9wcykgPT4ge1xuICBjb25zdCBpbWFnZVVybCA9IHByb3BzLmRhdGE/LmZpbGU/LnVybDtcbiAgaWYgKCFpbWFnZVVybCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHdpZHRoID0gdG9OdW1iZXIocHJvcHMuZGF0YT8uZmlsZT8ud2lkdGgpO1xuICBjb25zdCBoZWlnaHQgPSB0b051bWJlcihwcm9wcy5kYXRhPy5maWxlPy5oZWlnaHQpO1xuICBjb25zdCBhbHQgPSBwcm9wcy5kYXRhPy5maWxlPy5hbHQgfHwgJyc7XG4gIHJldHVybiA8aW1nIHNyYz17aW1hZ2VVcmx9IHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IGFsdD17YWx0fSAvPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRIdG1sQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdodG1sJztcbiAgZGF0YT86IHtcbiAgICBodG1sPzogc3RyaW5nO1xuICB9O1xufVxuXG5SaWNoVGV4dC5IdG1sQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SHRtbEJsb2NrUHJvcHMpID0+IHtcbiAgY29uc3QgaHRtbCA9IHByb3BzLmRhdGE/Lmh0bWwgfHwgJyc7XG4gIGlmICghaHRtbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiA8ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBodG1sfX0gLz47XG59O1xuXG5mdW5jdGlvbiB0b051bWJlcihpbnB1dD86IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgY29uc3QgcGFyc2VkTnVtYmVyID0gcGFyc2VGbG9hdChpbnB1dCk7XG4gIGlmIChpc05hTihwYXJzZWROdW1iZXIpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZE51bWJlcjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFRLHVCQUFzQjtBQUM5QixTQUE2QixxQkFBb0I7QUFDakQsU0FBUSxrQkFBaUI7QUFzRHJCLG1CQUdXLEtBdUVILFlBMUVSO0FBcENHLElBQU0sa0JBQWtCLGNBQW9DLENBQUMsQ0FBQztBQUU5RCxTQUFTLHFCQUEyQztBQUN6RCxTQUFPLFdBQVcsZUFBZTtBQUNuQztBQVFPLFNBQVMsU0FBUyxPQUFzQjtBQWhDL0M7QUFpQ0UsUUFBTSxrQkFBa0IsbUJBQW1CO0FB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
@@ -110,13 +110,29 @@ type OneOfField = CommonFieldProps & {
110
110
  types: Schema[];
111
111
  };
112
112
  declare function oneOf(field: Omit<OneOfField, 'type'>): OneOfField;
113
- type Field = StringField | NumberField | DateField | DateTimeField | BooleanField | SelectField | MultiSelectField | ImageField | FileField | ObjectField | ArrayField | OneOfField;
113
+ type RichTextField = CommonFieldProps & {
114
+ type: 'richtext';
115
+ translate?: boolean;
116
+ placeholder?: string;
117
+ };
118
+ declare function richtext(field: Omit<RichTextField, 'type'>): RichTextField;
119
+ type ReferenceField = CommonFieldProps & {
120
+ type: 'reference';
121
+ /** List of collection ids the reference can be chosen from. */
122
+ collections?: string[];
123
+ /** Initial collection to show when picking a reference. */
124
+ initialCollection?: string;
125
+ /** Label for the button. Defaults to "Select". */
126
+ buttonLabel?: string;
127
+ };
128
+ declare function reference(field: Omit<ReferenceField, 'type'>): ReferenceField;
129
+ type Field = StringField | NumberField | DateField | DateTimeField | BooleanField | SelectField | MultiSelectField | ImageField | FileField | ObjectField | ArrayField | OneOfField | RichTextField | ReferenceField;
114
130
  /**
115
131
  * Similar to {@link Field} but with a required `id`.
116
132
  * TODO(stevenle): fix this.
117
133
  */
118
134
  type FieldWithId = Field;
119
- type ObjectLikeField = ImageField | FileField | ObjectField | OneOfField;
135
+ type ObjectLikeField = ImageField | FileField | ObjectField | OneOfField | ReferenceField;
120
136
  interface Schema {
121
137
  name: string;
122
138
  description?: string;
@@ -142,6 +158,9 @@ type Collection = Schema & {
142
158
  preview?: {
143
159
  title?: string;
144
160
  image?: string;
161
+ defaultImage?: {
162
+ src: string;
163
+ };
145
164
  };
146
165
  };
147
166
  declare function defineCollection(collection: Collection): Collection;
@@ -162,6 +181,8 @@ type schema_NumberField = NumberField;
162
181
  type schema_ObjectField = ObjectField;
163
182
  type schema_ObjectLikeField = ObjectLikeField;
164
183
  type schema_OneOfField = OneOfField;
184
+ type schema_ReferenceField = ReferenceField;
185
+ type schema_RichTextField = RichTextField;
165
186
  type schema_Schema = Schema;
166
187
  type schema_SelectField = SelectField;
167
188
  type schema_StringField = StringField;
@@ -179,45 +200,12 @@ declare const schema_multiselect: typeof multiselect;
179
200
  declare const schema_number: typeof number;
180
201
  declare const schema_object: typeof object;
181
202
  declare const schema_oneOf: typeof oneOf;
203
+ declare const schema_reference: typeof reference;
204
+ declare const schema_richtext: typeof richtext;
182
205
  declare const schema_select: typeof select;
183
206
  declare const schema_string: typeof string;
184
207
  declare namespace schema {
185
- export {
186
- schema_ArrayField as ArrayField,
187
- schema_BooleanField as BooleanField,
188
- schema_Collection as Collection,
189
- schema_CommonFieldProps as CommonFieldProps,
190
- schema_DateField as DateField,
191
- schema_DateTimeField as DateTimeField,
192
- schema_Field as Field,
193
- schema_FieldWithId as FieldWithId,
194
- schema_FileField as FileField,
195
- schema_ImageField as ImageField,
196
- schema_MultiSelectField as MultiSelectField,
197
- schema_NumberField as NumberField,
198
- schema_ObjectField as ObjectField,
199
- schema_ObjectLikeField as ObjectLikeField,
200
- schema_OneOfField as OneOfField,
201
- schema_Schema as Schema,
202
- schema_SelectField as SelectField,
203
- schema_StringField as StringField,
204
- schema_array as array,
205
- schema_boolean as boolean,
206
- schema_collection as collection,
207
- schema_date as date,
208
- schema_datetime as datetime,
209
- schema_define as define,
210
- schema_defineCollection as defineCollection,
211
- schema_defineSchema as defineSchema,
212
- schema_file as file,
213
- schema_image as image,
214
- schema_multiselect as multiselect,
215
- schema_number as number,
216
- schema_object as object,
217
- schema_oneOf as oneOf,
218
- schema_select as select,
219
- schema_string as string,
220
- };
208
+ export { type schema_ArrayField as ArrayField, type schema_BooleanField as BooleanField, type schema_Collection as Collection, type schema_CommonFieldProps as CommonFieldProps, type schema_DateField as DateField, type schema_DateTimeField as DateTimeField, type schema_Field as Field, type schema_FieldWithId as FieldWithId, type schema_FileField as FileField, type schema_ImageField as ImageField, type schema_MultiSelectField as MultiSelectField, type schema_NumberField as NumberField, type schema_ObjectField as ObjectField, type schema_ObjectLikeField as ObjectLikeField, type schema_OneOfField as OneOfField, type schema_ReferenceField as ReferenceField, type schema_RichTextField as RichTextField, type schema_Schema as Schema, type schema_SelectField as SelectField, type schema_StringField as StringField, schema_array as array, schema_boolean as boolean, schema_collection as collection, schema_date as date, schema_datetime as datetime, schema_define as define, schema_defineCollection as defineCollection, schema_defineSchema as defineSchema, schema_file as file, schema_image as image, schema_multiselect as multiselect, schema_number as number, schema_object as object, schema_oneOf as oneOf, schema_reference as reference, schema_richtext as richtext, schema_select as select, schema_string as string };
221
209
  }
222
210
 
223
- export { Schema as S, schema as s };
211
+ export { type Schema as S, schema as s };
@@ -163,3 +163,11 @@ body.menu\:open {
163
163
  font-weight: 500;
164
164
  color: #3c4043;
165
165
  }
166
+ .signin__error {
167
+ color: red;
168
+ font-weight: bold;
169
+ text-align: center;
170
+ max-width: 60ch;
171
+ margin: 20px auto 0;
172
+ }
173
+ /*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2lnbmluL3N0eWxlcy9nbG9iYWwuY3NzIiwgIi4uLy4uL3NpZ25pbi9zdHlsZXMvc2lnbmluLmNzcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiOnJvb3Qge1xuICAtLWZvbnQtZmFtaWx5LWRlZmF1bHQ6IFwiSW50ZXJcIiwgc2Fucy1zZXJpZjtcbiAgLS1mb250LWZhbWlseS1tb25vOiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgbW9ub3NwYWNlO1xuICAtLWNvbG9yLXRleHQtZGVmYXVsdDogIzMzMzMzMztcbiAgLS1jb2xvci1ib3JkZXI6ICNFRkVGRUY7XG4gIC0tYnV0dG9uLWJhY2tncm91bmQtaG92ZXI6ICNGNUY1RjU7XG4gIC0tYnV0dG9uLWJhY2tncm91bmQtYWN0aXZlOiAjRTVFNUU1O1xufVxuXG5odG1sIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG59XG5cbiosXG4qOmJlZm9yZSxcbio6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBpbmhlcml0O1xufVxuXG5odG1sLFxuYm9keSB7XG4gIC8qIGZvbnQtZmFtaWx5OiB0b2tlbnMuJGZvbnQtZmFtaWx5LXByaW1hcnk7ICovXG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1kZWZhdWx0KTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLXRleHQtZGVmYXVsdCk7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7XG59XG5cbmltZyxcbnBpY3R1cmUsXG5maWd1cmUsXG52aWRlbyxcbmNhbnZhcyxcbnN2ZyxcbmlmcmFtZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogYXV0bztcbiAgbWFyZ2luOiAwO1xufVxuXG5hIHtcbiAgY29sb3I6IGluaGVyaXQ7XG59XG5cbnNlbGVjdCB7XG4gIGNvbG9yLXNjaGVtZTogbGlnaHQ7XG59XG5cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5wIHtcbiAgbWFyZ2luOiAwO1xufVxuXG5ib2R5Lm1lbnVcXDpvcGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuI3Jvb3Qge1xuICBtYXJnaW46IDAgYXV0bztcbiAgbWluLWhlaWdodDogMTAwdmg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmJvb3RzdHJhcCB7XG4gIGZvbnQtc2l6ZTogNDhweDtcbiAgZm9udC13ZWlnaHQ6IDkwMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwdmg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDQwcHg7XG4gIGdhcDogMzZweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uYm9vdHN0cmFwLWVycm9yIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMTAwcHg7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGFuaW1hdGlvbjogMC41cyBmb3J3YXJkcyBib290c3RyYXAtbG9hZGluZy1lcnJvcjtcbiAgYW5pbWF0aW9uLWRlbGF5OiAxcztcbiAgb3BhY2l0eTogMDtcbn1cblxuQGtleWZyYW1lcyBib290c3RyYXAtbG9hZGluZy1lcnJvciB7XG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cbiIsICIuc2lnbmluIHtcbiAgZm9udC1mYW1pbHk6ICdHb29nbGUgU2FucycsIGFyaWFsLCBzYW5zLXNlcmlmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDQ4cHggMjBweDtcbiAgY29sb3I6ICMzYzQwNDM7XG59XG5cbi5zaWduaW5fX2hlYWRsaW5lIHtcbiAgbWFyZ2luLWJvdHRvbTogNDBweDtcbn1cblxuLnNpZ25pbl9faGVhZGxpbmVfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAzNnB4O1xuICBsaW5lLWhlaWdodDogMS4zO1xuICBmb250LXdlaWdodDogNTAwO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4uc2lnbmluX19oZWFkbGluZV9fYm9keSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLnNpZ25pbl9fYnV0dG9uIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbiAgcGFkZGluZzogOHB4IDExcHg7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGFkY2UwO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIHBhZGRpbmc6IDAgMTJweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4yMThzIGVhc2U7XG59XG5cbi5zaWduaW5fX2J1dHRvbjpob3ZlciB7XG4gIGJvcmRlci1jb2xvcjogI2QyZTNmYztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2NiwgMTMzLCAyNDQsIDAuMDQpO1xufVxuXG4uc2lnbmluX19idXR0b25fX2ljb24ge1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLnNpZ25pbl9fYnV0dG9uX19sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGxldHRlci1zcGFjaW5nOiAuMjVweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6ICMzYzQwNDM7XG59XG5cbi5zaWduaW5fX2Vycm9yIHtcbiAgY29sb3I6IHJlZDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWF4LXdpZHRoOiA2MGNoO1xuICBtYXJnaW46IDIwcHggYXV0byAwO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBO0FBQ0UseUJBQXVCLE9BQU8sRUFBRTtBQUNoQztBQUFBLElBQW9CLFlBQVk7QUFBQSxJQUFFLGNBQWM7QUFBQSxJQUFFLEtBQUs7QUFBQSxJQUFFLE1BQU07QUFBQSxJQUFFLFFBQVE7QUFBQSxJQUFFO0FBQzNFLHdCQUFzQjtBQUN0QixrQkFBZ0I7QUFDaEIsNkJBQTJCO0FBQzNCLDhCQUE0QjtBQUM5QjtBQUVBO0FBQ0UsY0FBWTtBQUNaLGNBQVk7QUFDWixhQUFXO0FBQ1gsZUFBYTtBQUNmO0FBRUE7QUFDQSxDQUFDO0FBQ0QsQ0FBQztBQUNDLGNBQVk7QUFDZDtBQUVBO0FBQ0E7QUFFRSxlQUFhLElBQUk7QUFDakIsU0FBTyxJQUFJO0FBQ1gsVUFBUTtBQUNSLFVBQVE7QUFDUiwwQkFBd0I7QUFDeEIsMkJBQXlCO0FBQ3pCLG1CQUFpQjtBQUNuQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0UsV0FBUztBQUNULGFBQVc7QUFDWCxVQUFRO0FBQ1IsVUFBUTtBQUNWO0FBRUE7QUFDRSxTQUFPO0FBQ1Q7QUFFQTtBQUNFLGdCQUFjO0FBQ2hCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0UsVUFBUTtBQUNWO0FBRUEsSUFBSSxDQUFDO0FBQ0gsWUFBVTtBQUNaO0FBRUEsQ0FBQztBQUNDLFVBQVEsRUFBRTtBQUNWLGNBQVk7QUFDWixZQUFVO0FBQ1o7QUFFQSxDQUFDO0FBQ0MsYUFBVztBQUNYLGVBQWE7QUFDYixTQUFPO0FBQ1AsVUFBUTtBQUNSLFdBQVM7QUFDVCxrQkFBZ0I7QUFDaEIsbUJBQWlCO0FBQ2pCLGVBQWE7QUFDYixjQUFZO0FBQ1osV0FBUztBQUNULE9BQUs7QUFDTCxZQUFVO0FBQ1o7QUFFQSxDQUFDO0FBQ0MsYUFBVztBQUNYLGVBQWE7QUFDYixZQUFVO0FBQ1YsVUFBUTtBQUNSLFFBQU07QUFDTixTQUFPO0FBQ1AsY0FBWTtBQUNaLGFBQVcsS0FBSyxTQUFTO0FBQ3pCLG1CQUFpQjtBQUNqQixXQUFTO0FBQ1g7QUFFQSxXQUwyQjtBQU16QjtBQUNFLGFBQVM7QUFDWDtBQUNBO0FBQ0UsYUFBUztBQUNYO0FBQ0Y7OztBQzdHQSxDQUFDO0FBQ0M7QUFBQSxJQUFhLGFBQWE7QUFBQSxJQUFFLEtBQUs7QUFBQSxJQUFFO0FBQ25DLGNBQVk7QUFDWixXQUFTLEtBQUs7QUFDZCxTQUFPO0FBQ1Q7QUFFQSxDQUFDO0FBQ0MsaUJBQWU7QUFDakI7QUFFQSxDQUFDO0FBQ0MsYUFBVztBQUNYLGVBQWE7QUFDYixlQUFhO0FBQ2IsaUJBQWU7QUFDakI7QUFFQSxDQUFDO0FBQ0MsYUFBVztBQUNYLGVBQWE7QUFDYixlQUFhO0FBQ2Y7QUFFQSxDQUFDO0FBQ0MsZUFBYTtBQUNiLHNCQUFvQjtBQUNwQixtQkFBaUI7QUFDakIsY0FBWTtBQUNaLFdBQVM7QUFDVCxlQUFhO0FBQ2IsY0FBWTtBQUNaLE9BQUs7QUFDTCxXQUFTLElBQUk7QUFDYixjQUFZO0FBQ1osVUFBUSxJQUFJLE1BQU07QUFDbEIsaUJBQWU7QUFDZixVQUFRO0FBQ1IsZUFBYTtBQUNiLFdBQVMsRUFBRTtBQUNYLFVBQVE7QUFDUixjQUFZO0FBQ1osY0FBWSxJQUFJLE9BQU87QUFDekI7QUFFQSxDQXJCQyxjQXFCYztBQUNiLGdCQUFjO0FBQ2Qsb0JBQWtCLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDdkM7QUFFQSxDQUFDO0FBQ0MsU0FBTztBQUNQLFVBQVE7QUFDUixvQkFBa0I7QUFDcEI7QUFFQSxDQUFDO0FBQ0MsYUFBVztBQUNYLGVBQWE7QUFDYixrQkFBZ0I7QUFDaEIsZUFBYTtBQUNiLFNBQU87QUFDVDtBQUVBLENBQUM7QUFDQyxTQUFPO0FBQ1AsZUFBYTtBQUNiLGNBQVk7QUFDWixhQUFXO0FBQ1gsVUFBUSxLQUFLLEtBQUs7QUFDcEI7IiwKICAibmFtZXMiOiBbXQp9Cg== */