@blinkk/root-cms 1.0.1-alpha.0 → 1.0.2

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.
@@ -0,0 +1,16 @@
1
+ import { S as Schema } from './schema--v3Ho5Lj.js';
2
+ import 'preact';
3
+
4
+ /**
5
+ * Loads various files or configurations from the project.
6
+ *
7
+ * NOTE: This file needs to be loaded through vite's ssrLoadModule so that
8
+ * `import.meta.glob()` calls are resolved.
9
+ */
10
+
11
+ interface SchemaModule {
12
+ default: Schema;
13
+ }
14
+ declare function getProjectSchemas(): Record<string, Schema>;
15
+
16
+ export { type SchemaModule, getProjectSchemas };
@@ -0,0 +1,21 @@
1
+ // core/project.ts
2
+ var SCHEMA_MODULES = import.meta.glob("/**/*.schema.ts", {
3
+ eager: true
4
+ });
5
+ function getProjectSchemas() {
6
+ const schemas = {};
7
+ for (const fileId in SCHEMA_MODULES) {
8
+ if (fileId.startsWith("/functions/")) {
9
+ continue;
10
+ }
11
+ const schemaModule = SCHEMA_MODULES[fileId];
12
+ if (schemaModule.default) {
13
+ schemas[fileId] = schemaModule.default;
14
+ }
15
+ }
16
+ return schemas;
17
+ }
18
+ export {
19
+ getProjectSchemas
20
+ };
21
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wcm9qZWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIExvYWRzIHZhcmlvdXMgZmlsZXMgb3IgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgcHJvamVjdC5cbiAqXG4gKiBOT1RFOiBUaGlzIGZpbGUgbmVlZHMgdG8gYmUgbG9hZGVkIHRocm91Z2ggdml0ZSdzIHNzckxvYWRNb2R1bGUgc28gdGhhdFxuICogYGltcG9ydC5tZXRhLmdsb2IoKWAgY2FsbHMgYXJlIHJlc29sdmVkLlxuICovXG5cbmltcG9ydCB7U2NoZW1hfSBmcm9tICcuL3NjaGVtYS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hTW9kdWxlIHtcbiAgZGVmYXVsdDogU2NoZW1hO1xufVxuXG5jb25zdCBTQ0hFTUFfTU9EVUxFUyA9IGltcG9ydC5tZXRhLmdsb2I8U2NoZW1hTW9kdWxlPignLyoqLyouc2NoZW1hLnRzJywge1xuICBlYWdlcjogdHJ1ZSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvamVjdFNjaGVtYXMoKTogUmVjb3JkPHN0cmluZywgU2NoZW1hPiB7XG4gIGNvbnN0IHNjaGVtYXM6IFJlY29yZDxzdHJpbmcsIFNjaGVtYT4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlSWQgaW4gU0NIRU1BX01PRFVMRVMpIHtcbiAgICAvLyBJZ25vcmUgdGhlIC9mdW5jdGlvbnMvIGZvbGRlciwgd2hpY2ggaXMgdHlwaWNhbGx5IHVzZWQgZm9yIEdDRiBkZXBsb3lzLlxuICAgIC8vIFRPRE8oc3RldmVubGUpOiBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy5cbiAgICBpZiAoZmlsZUlkLnN0YXJ0c1dpdGgoJy9mdW5jdGlvbnMvJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzY2hlbWFNb2R1bGUgPSBTQ0hFTUFfTU9EVUxFU1tmaWxlSWRdO1xuICAgIGlmIChzY2hlbWFNb2R1bGUuZGVmYXVsdCkge1xuICAgICAgc2NoZW1hc1tmaWxlSWRdID0gc2NoZW1hTW9kdWxlLmRlZmF1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQWFBLElBQU0saUJBQWlCLFlBQVksS0FBbUIsbUJBQW1CO0FBQUEsRUFDdkUsT0FBTztBQUNULENBQUM7QUFFTSxTQUFTLG9CQUE0QztBQUMxRCxRQUFNLFVBQWtDLENBQUM7QUFDekMsYUFBVyxVQUFVLGdCQUFnQjtBQUduQyxRQUFJLE9BQU8sV0FBVyxhQUFhLEdBQUc7QUFDcEM7QUFBQSxJQUNGO0FBQ0EsVUFBTSxlQUFlLGVBQWUsTUFBTTtBQUMxQyxRQUFJLGFBQWEsU0FBUztBQUN4QixjQUFRLE1BQU0sSUFBSSxhQUFhO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -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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
@@ -0,0 +1,211 @@
1
+ import { FunctionalComponent } from 'preact';
2
+
3
+ interface CommonFieldProps {
4
+ type: string;
5
+ id?: string;
6
+ label?: string;
7
+ help?: string;
8
+ placeholder?: string;
9
+ default?: any;
10
+ hidden?: boolean;
11
+ deprecated?: boolean;
12
+ }
13
+ type StringField = CommonFieldProps & {
14
+ type: 'string';
15
+ default?: string;
16
+ translate?: boolean;
17
+ variant?: 'input' | 'textarea';
18
+ /** For textarea variant, the maximum number of rows of text to show. */
19
+ maxRows?: number;
20
+ };
21
+ declare function string(field: Omit<StringField, 'type'>): StringField;
22
+ type NumberField = CommonFieldProps & {
23
+ type: 'number';
24
+ default?: number;
25
+ };
26
+ declare function number(field: Omit<NumberField, 'type'>): NumberField;
27
+ type DateField = CommonFieldProps & {
28
+ type: 'date';
29
+ default?: string;
30
+ };
31
+ declare function date(field: Omit<DateField, 'type'>): DateField;
32
+ type DateTimeField = CommonFieldProps & {
33
+ type: 'datetime';
34
+ default?: string;
35
+ };
36
+ declare function datetime(field: Omit<DateTimeField, 'type'>): DateTimeField;
37
+ type BooleanField = CommonFieldProps & {
38
+ type: 'boolean';
39
+ default?: boolean;
40
+ checkboxLabel?: string;
41
+ };
42
+ declare function boolean(field: Omit<BooleanField, 'type'>): BooleanField;
43
+ type SelectField = CommonFieldProps & {
44
+ type: 'select';
45
+ default?: string;
46
+ options?: Array<{
47
+ value: string;
48
+ label?: string;
49
+ }> | string[];
50
+ translate?: boolean;
51
+ };
52
+ declare function select(field: Omit<SelectField, 'type'>): SelectField;
53
+ type MultiSelectField = Omit<SelectField, 'type'> & {
54
+ type: 'multiselect';
55
+ /** Set to `true` to allow users to create arbitrary values. */
56
+ creatable?: boolean;
57
+ translate?: boolean;
58
+ };
59
+ declare function multiselect(field: Omit<MultiSelectField, 'type'>): MultiSelectField;
60
+ type ImageField = CommonFieldProps & {
61
+ type: 'image';
62
+ translate?: boolean;
63
+ /** List of supported exts, e.g. `['.mp4']`. */
64
+ exts?: string[];
65
+ };
66
+ declare function image(field: Omit<ImageField, 'type'>): ImageField;
67
+ type FileField = CommonFieldProps & {
68
+ type: 'file';
69
+ /** List of supported exts, e.g. `['.mp4']`. */
70
+ exts?: string[];
71
+ /**
72
+ * Whether to preserve the final serving filename when a user uploads a file.
73
+ * By default, the filename is hashed for obfuscation purposes.
74
+ */
75
+ preserveFilename?: boolean;
76
+ };
77
+ declare function file(field: Omit<FileField, 'type'>): FileField;
78
+ type ObjectField = CommonFieldProps & {
79
+ type: 'object';
80
+ fields: FieldWithId[];
81
+ };
82
+ declare function object(field: Omit<ObjectField, 'type'>): ObjectField;
83
+ type ArrayField = CommonFieldProps & {
84
+ type: 'array';
85
+ default?: any[];
86
+ /**
87
+ * String format for the preview line of an item in the array. Placeholder
88
+ * values should use brackets, e.g. `m{_index:02}: {_type}`.
89
+ *
90
+ * Multiple values can be provided, in which case the first preview line with
91
+ * no missing placeholder values will be used.
92
+ *
93
+ * System added placeholder values:
94
+ *
95
+ * - _index: The 0-based index.
96
+ * - _index:02: A left-padded version of _index to 2 digits.
97
+ * - _index:03: A left-padded version of _index to 3 digits.
98
+ * - _type: For array of one-of fields, the type of the selected field.
99
+ */
100
+ preview?: string | string[];
101
+ of: ObjectLikeField;
102
+ /**
103
+ * Label to use for the "add item" button. Defaults to `Add`.
104
+ */
105
+ buttonLabel?: string;
106
+ };
107
+ declare function array(field: Omit<ArrayField, 'type'>): ArrayField;
108
+ type OneOfField = CommonFieldProps & {
109
+ type: 'oneof';
110
+ types: Schema[];
111
+ };
112
+ declare function oneOf(field: Omit<OneOfField, 'type'>): 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;
130
+ /**
131
+ * Similar to {@link Field} but with a required `id`.
132
+ * TODO(stevenle): fix this.
133
+ */
134
+ type FieldWithId = Field;
135
+ type ObjectLikeField = ImageField | FileField | ObjectField | OneOfField | ReferenceField;
136
+ interface Schema {
137
+ name: string;
138
+ description?: string;
139
+ fields: FieldWithId[];
140
+ }
141
+ declare function defineSchema(schema: Schema): Schema;
142
+ /** Defines the schema for a collection or reusable component. */
143
+ declare const define: typeof defineSchema;
144
+ type Collection = Schema & {
145
+ /** URL path where the collection serves from. */
146
+ url?: string;
147
+ /**
148
+ * URL that can be used to render a preview page. Used by the side-by-side
149
+ * editor to render instant previews. If blank, defaults to the `url` config.
150
+ */
151
+ previewUrl?: string;
152
+ /** Page component to render the collection for instant previews */
153
+ Component?: FunctionalComponent;
154
+ /**
155
+ * Defines the fields to use for document preview. Defaults to "title" and
156
+ * "image". Use dot notation for nested fields, e.g. "meta.title".
157
+ */
158
+ preview?: {
159
+ title?: string;
160
+ image?: string;
161
+ defaultImage?: {
162
+ src: string;
163
+ };
164
+ };
165
+ };
166
+ declare function defineCollection(collection: Collection): Collection;
167
+ declare const collection: typeof defineCollection;
168
+
169
+ type schema_ArrayField = ArrayField;
170
+ type schema_BooleanField = BooleanField;
171
+ type schema_Collection = Collection;
172
+ type schema_CommonFieldProps = CommonFieldProps;
173
+ type schema_DateField = DateField;
174
+ type schema_DateTimeField = DateTimeField;
175
+ type schema_Field = Field;
176
+ type schema_FieldWithId = FieldWithId;
177
+ type schema_FileField = FileField;
178
+ type schema_ImageField = ImageField;
179
+ type schema_MultiSelectField = MultiSelectField;
180
+ type schema_NumberField = NumberField;
181
+ type schema_ObjectField = ObjectField;
182
+ type schema_ObjectLikeField = ObjectLikeField;
183
+ type schema_OneOfField = OneOfField;
184
+ type schema_ReferenceField = ReferenceField;
185
+ type schema_RichTextField = RichTextField;
186
+ type schema_Schema = Schema;
187
+ type schema_SelectField = SelectField;
188
+ type schema_StringField = StringField;
189
+ declare const schema_array: typeof array;
190
+ declare const schema_boolean: typeof boolean;
191
+ declare const schema_collection: typeof collection;
192
+ declare const schema_date: typeof date;
193
+ declare const schema_datetime: typeof datetime;
194
+ declare const schema_define: typeof define;
195
+ declare const schema_defineCollection: typeof defineCollection;
196
+ declare const schema_defineSchema: typeof defineSchema;
197
+ declare const schema_file: typeof file;
198
+ declare const schema_image: typeof image;
199
+ declare const schema_multiselect: typeof multiselect;
200
+ declare const schema_number: typeof number;
201
+ declare const schema_object: typeof object;
202
+ declare const schema_oneOf: typeof oneOf;
203
+ declare const schema_reference: typeof reference;
204
+ declare const schema_richtext: typeof richtext;
205
+ declare const schema_select: typeof select;
206
+ declare const schema_string: typeof string;
207
+ declare namespace schema {
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 };
209
+ }
210
+
211
+ export { type Schema as S, schema as s };
@@ -0,0 +1,173 @@
1
+ /* signin/styles/global.css */
2
+ :root {
3
+ --font-family-default: "Inter", sans-serif;
4
+ --font-family-mono:
5
+ ui-monospace,
6
+ SFMono-Regular,
7
+ Menlo,
8
+ Monaco,
9
+ Consolas,
10
+ monospace;
11
+ --color-text-default: #333333;
12
+ --color-border: #EFEFEF;
13
+ --button-background-hover: #F5F5F5;
14
+ --button-background-active: #E5E5E5;
15
+ }
16
+ html {
17
+ box-sizing: border-box;
18
+ overflow-x: hidden;
19
+ font-size: 16px;
20
+ line-height: 1.5;
21
+ }
22
+ *,
23
+ *:before,
24
+ *:after {
25
+ box-sizing: inherit;
26
+ }
27
+ html,
28
+ body {
29
+ font-family: var(--font-family-default);
30
+ color: var(--color-text-default);
31
+ height: 100%;
32
+ margin: 0;
33
+ -webkit-font-smoothing: antialiased;
34
+ -moz-osx-font-smoothing: grayscale;
35
+ scroll-behavior: smooth;
36
+ }
37
+ img,
38
+ picture,
39
+ figure,
40
+ video,
41
+ canvas,
42
+ svg,
43
+ iframe {
44
+ display: block;
45
+ max-width: 100%;
46
+ height: auto;
47
+ margin: 0;
48
+ }
49
+ a {
50
+ color: inherit;
51
+ }
52
+ select {
53
+ color-scheme: light;
54
+ }
55
+ h1,
56
+ h2,
57
+ h3,
58
+ h4,
59
+ h5,
60
+ p {
61
+ margin: 0;
62
+ }
63
+ body.menu\:open {
64
+ overflow: hidden;
65
+ }
66
+ #root {
67
+ margin: 0 auto;
68
+ min-height: 100vh;
69
+ position: relative;
70
+ }
71
+ .bootstrap {
72
+ font-size: 48px;
73
+ font-weight: 900;
74
+ width: 100%;
75
+ height: 100vh;
76
+ display: flex;
77
+ flex-direction: column;
78
+ justify-content: center;
79
+ align-items: center;
80
+ text-align: center;
81
+ padding: 40px;
82
+ gap: 36px;
83
+ position: relative;
84
+ }
85
+ .bootstrap-error {
86
+ font-size: 14px;
87
+ font-weight: 400;
88
+ position: absolute;
89
+ bottom: 100px;
90
+ left: 0;
91
+ right: 0;
92
+ text-align: center;
93
+ animation: 0.5s forwards bootstrap-loading-error;
94
+ animation-delay: 1s;
95
+ opacity: 0;
96
+ }
97
+ @keyframes bootstrap-loading-error {
98
+ 0% {
99
+ opacity: 0;
100
+ }
101
+ 100% {
102
+ opacity: 1;
103
+ }
104
+ }
105
+
106
+ /* signin/styles/signin.css */
107
+ .signin {
108
+ font-family:
109
+ "Google Sans",
110
+ arial,
111
+ sans-serif;
112
+ text-align: center;
113
+ padding: 48px 20px;
114
+ color: #3c4043;
115
+ }
116
+ .signin__headline {
117
+ margin-bottom: 40px;
118
+ }
119
+ .signin__headline__title {
120
+ font-size: 36px;
121
+ line-height: 1.3;
122
+ font-weight: 500;
123
+ margin-bottom: 20px;
124
+ }
125
+ .signin__headline__body {
126
+ font-size: 18px;
127
+ line-height: 1.5;
128
+ font-weight: 500;
129
+ }
130
+ .signin__button {
131
+ align-items: center;
132
+ -webkit-appearance: none;
133
+ -moz-appearance: none;
134
+ appearance: none;
135
+ display: inline-flex;
136
+ align-items: center;
137
+ text-align: center;
138
+ gap: 12px;
139
+ padding: 8px 11px;
140
+ background: white;
141
+ border: 1px solid #dadce0;
142
+ border-radius: 4px;
143
+ cursor: pointer;
144
+ font-family: inherit;
145
+ padding: 0 12px;
146
+ height: 40px;
147
+ box-sizing: border-box;
148
+ transition: all 0.218s ease;
149
+ }
150
+ .signin__button:hover {
151
+ border-color: #d2e3fc;
152
+ background-color: rgba(66, 133, 244, 0.04);
153
+ }
154
+ .signin__button__icon {
155
+ width: 18px;
156
+ height: 18px;
157
+ background-color: white;
158
+ }
159
+ .signin__button__label {
160
+ font-size: 14px;
161
+ line-height: 1;
162
+ letter-spacing: .25px;
163
+ font-weight: 500;
164
+ color: #3c4043;
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== */