@blinkk/root-cms 1.0.0-rc.0 → 1.0.0-rc.10

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,119 @@
1
+ // richtext/richtext.tsx
2
+ import { useTranslations } from "@blinkk/root";
3
+ import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
4
+ function RichText(props) {
5
+ var _a;
6
+ const components = {
7
+ heading: RichText.HeadingBlock,
8
+ html: RichText.HtmlBlock,
9
+ image: RichText.ImageBlock,
10
+ orderedList: RichText.ListBlock,
11
+ paragraph: RichText.ParagraphBlock,
12
+ unorderedList: RichText.ListBlock,
13
+ ...props.components
14
+ };
15
+ const blocks = (((_a = props.data) == null ? void 0 : _a.blocks) || []).filter((block) => {
16
+ const blockType = block == null ? void 0 : block.type;
17
+ if (!blockType) {
18
+ return false;
19
+ }
20
+ if (!(blockType in components)) {
21
+ console.warn(`ignoring unknown richtext type: "${blockType}"`);
22
+ return false;
23
+ }
24
+ return true;
25
+ });
26
+ return /* @__PURE__ */ jsx(Fragment, { children: blocks.map((block) => {
27
+ const Block = components[block.type];
28
+ return /* @__PURE__ */ jsx(Block, { ...block });
29
+ }) });
30
+ }
31
+ RichText.ParagraphBlock = (props) => {
32
+ var _a;
33
+ if (!((_a = props.data) == null ? void 0 : _a.text)) {
34
+ return null;
35
+ }
36
+ const t = useTranslations();
37
+ return /* @__PURE__ */ jsx("p", { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
38
+ };
39
+ RichText.HeadingBlock = (props) => {
40
+ var _a;
41
+ if (!((_a = props.data) == null ? void 0 : _a.text)) {
42
+ return null;
43
+ }
44
+ const t = useTranslations();
45
+ const level = props.data.level || 2;
46
+ const Component = `h${level}`;
47
+ return /* @__PURE__ */ jsx(Component, { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
48
+ };
49
+ RichText.ListBlock = (props) => {
50
+ var _a, _b, _c;
51
+ if (!((_b = (_a = props.data) == null ? void 0 : _a.items) == null ? void 0 : _b.length)) {
52
+ return null;
53
+ }
54
+ let style = (_c = props.data) == null ? void 0 : _c.style;
55
+ if (!style) {
56
+ style = props.type === "orderedList" ? "ordered" : "unordered";
57
+ }
58
+ const Component = style === "ordered" ? "ol" : "ul";
59
+ const items = props.data.items;
60
+ const t = useTranslations();
61
+ return /* @__PURE__ */ jsx(Component, { children: items.map((item) => {
62
+ var _a2;
63
+ if (item.content || ((_a2 = item.items) == null ? void 0 : _a2.length)) {
64
+ return /* @__PURE__ */ jsxs("li", { children: [
65
+ item.content && /* @__PURE__ */ jsx(
66
+ RichText.ParagraphBlock,
67
+ {
68
+ type: "paragraph",
69
+ data: { text: item.content }
70
+ }
71
+ ),
72
+ item.items && item.items.length > 0 && /* @__PURE__ */ jsx(
73
+ RichText.ListBlock,
74
+ {
75
+ type: props.type,
76
+ data: { style, items: item.items }
77
+ }
78
+ )
79
+ ] });
80
+ }
81
+ return null;
82
+ }) });
83
+ };
84
+ RichText.ImageBlock = (props) => {
85
+ var _a, _b, _c, _d, _e, _f, _g, _h;
86
+ const imageUrl = (_b = (_a = props.data) == null ? void 0 : _a.file) == null ? void 0 : _b.url;
87
+ if (!imageUrl) {
88
+ return null;
89
+ }
90
+ const width = toNumber((_d = (_c = props.data) == null ? void 0 : _c.file) == null ? void 0 : _d.width);
91
+ const height = toNumber((_f = (_e = props.data) == null ? void 0 : _e.file) == null ? void 0 : _f.height);
92
+ const alt = ((_h = (_g = props.data) == null ? void 0 : _g.file) == null ? void 0 : _h.alt) || "";
93
+ return /* @__PURE__ */ jsx("img", { src: imageUrl, width, height, alt });
94
+ };
95
+ RichText.HtmlBlock = (props) => {
96
+ var _a;
97
+ const html = ((_a = props.data) == null ? void 0 : _a.html) || "";
98
+ if (!html) {
99
+ return null;
100
+ }
101
+ return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } });
102
+ };
103
+ function toNumber(input) {
104
+ if (input === void 0) {
105
+ return 0;
106
+ }
107
+ if (typeof input === "number") {
108
+ return input;
109
+ }
110
+ const parsedNumber = parseFloat(input);
111
+ if (isNaN(parsedNumber)) {
112
+ return 0;
113
+ }
114
+ return parsedNumber;
115
+ }
116
+ export {
117
+ RichText
118
+ };
119
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcmljaHRleHQvcmljaHRleHQudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge3VzZVRyYW5zbGF0aW9uc30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7RnVuY3Rpb25hbENvbXBvbmVudH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB7UmljaFRleHREYXRhfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgUmljaFRleHRCbG9ja0NvbXBvbmVudCA9IEZ1bmN0aW9uYWxDb21wb25lbnQ8YW55PjtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFByb3BzIHtcbiAgZGF0YTogUmljaFRleHREYXRhO1xuICBjb21wb25lbnRzPzogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD47XG59XG5cbi8qKiBSZW5kZXJzIGRhdGEgZnJvbSB0aGUgXCJyaWNodGV4dFwiIGZpZWxkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJpY2hUZXh0KHByb3BzOiBSaWNoVGV4dFByb3BzKSB7XG4gIGNvbnN0IGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIFJpY2hUZXh0QmxvY2tDb21wb25lbnQ+ID0ge1xuICAgIGhlYWRpbmc6IFJpY2hUZXh0LkhlYWRpbmdCbG9jayxcbiAgICBodG1sOiBSaWNoVGV4dC5IdG1sQmxvY2ssXG4gICAgaW1hZ2U6IFJpY2hUZXh0LkltYWdlQmxvY2ssXG4gICAgb3JkZXJlZExpc3Q6IFJpY2hUZXh0Lkxpc3RCbG9jayxcbiAgICBwYXJhZ3JhcGg6IFJpY2hUZXh0LlBhcmFncmFwaEJsb2NrLFxuICAgIHVub3JkZXJlZExpc3Q6IFJpY2hUZXh0Lkxpc3RCbG9jayxcbiAgICAuLi5wcm9wcy5jb21wb25lbnRzLFxuICB9O1xuICBjb25zdCBibG9ja3MgPSAocHJvcHMuZGF0YT8uYmxvY2tzIHx8IFtdKS5maWx0ZXIoKGJsb2NrKSA9PiB7XG4gICAgY29uc3QgYmxvY2tUeXBlID0gYmxvY2s/LnR5cGU7XG4gICAgaWYgKCFibG9ja1R5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCEoYmxvY2tUeXBlIGluIGNvbXBvbmVudHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGlnbm9yaW5nIHVua25vd24gcmljaHRleHQgdHlwZTogXCIke2Jsb2NrVHlwZX1cImApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtibG9ja3MubWFwKChibG9jaykgPT4ge1xuICAgICAgICBjb25zdCBCbG9jayA9IGNvbXBvbmVudHNbYmxvY2sudHlwZV07XG4gICAgICAgIHJldHVybiA8QmxvY2sgey4uLmJsb2NrfSAvPjtcbiAgICAgIH0pfVxuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0UGFyYWdyYXBoQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdwYXJhZ3JhcGgnO1xuICBkYXRhPzoge1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gIH07XG59XG5cblJpY2hUZXh0LlBhcmFncmFwaEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dFBhcmFncmFwaEJsb2NrUHJvcHMpID0+IHtcbiAgaWYgKCFwcm9wcy5kYXRhPy50ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICByZXR1cm4gPHAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHQocHJvcHMuZGF0YS50ZXh0KX19IC8+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEhlYWRpbmdCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2hlYWRpbmcnO1xuICBkYXRhPzoge1xuICAgIGxldmVsPzogbnVtYmVyO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbnR5cGUgSGVhZGluZ0NvbXBvbmVudCA9ICdoMScgfCAnaDInIHwgJ2gzJyB8ICdoNCcgfCAnaDUnIHwgJ2g2JztcblxuUmljaFRleHQuSGVhZGluZ0Jsb2NrID0gKHByb3BzOiBSaWNoVGV4dEhlYWRpbmdCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8udGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgY29uc3QgbGV2ZWwgPSBwcm9wcy5kYXRhLmxldmVsIHx8IDI7XG4gIGNvbnN0IENvbXBvbmVudCA9IGBoJHtsZXZlbH1gIGFzIEhlYWRpbmdDb21wb25lbnQ7XG4gIHJldHVybiA8Q29tcG9uZW50IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0KHByb3BzLmRhdGEudGV4dCl9fSAvPjtcbn07XG5cbmludGVyZmFjZSBMaXN0SXRlbSB7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIGl0ZW1zPzogTGlzdEl0ZW1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dExpc3RCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ29yZGVyZWRMaXN0JyB8ICd1bm9yZGVyZWRMaXN0JztcbiAgZGF0YT86IHtcbiAgICBzdHlsZT86ICdvcmRlcmVkJyB8ICd1bm9yZGVyZWQnO1xuICAgIGl0ZW1zPzogTGlzdEl0ZW1bXTtcbiAgfTtcbn1cblxuUmljaFRleHQuTGlzdEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dExpc3RCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8uaXRlbXM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IHN0eWxlID0gcHJvcHMuZGF0YT8uc3R5bGU7XG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IHByb3BzLnR5cGUgPT09ICdvcmRlcmVkTGlzdCcgPyAnb3JkZXJlZCcgOiAndW5vcmRlcmVkJztcbiAgfVxuICBjb25zdCBDb21wb25lbnQgPSBzdHlsZSA9PT0gJ29yZGVyZWQnID8gJ29sJyA6ICd1bCc7XG4gIGNvbnN0IGl0ZW1zID0gcHJvcHMuZGF0YS5pdGVtcztcbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnQ+XG4gICAgICB7aXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNvbnRlbnQgfHwgaXRlbS5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAge2l0ZW0uY29udGVudCAmJiAoXG4gICAgICAgICAgICAgICAgPFJpY2hUZXh0LlBhcmFncmFwaEJsb2NrXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicGFyYWdyYXBoXCJcbiAgICAgICAgICAgICAgICAgIGRhdGE9e3t0ZXh0OiBpdGVtLmNvbnRlbnR9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgPFJpY2hUZXh0Lkxpc3RCbG9ja1xuICAgICAgICAgICAgICAgICAgdHlwZT17cHJvcHMudHlwZX1cbiAgICAgICAgICAgICAgICAgIGRhdGE9e3tzdHlsZSwgaXRlbXM6IGl0ZW0uaXRlbXN9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KX1cbiAgICA8L0NvbXBvbmVudD5cbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRJbWFnZUJsb2NrUHJvcHMge1xuICB0eXBlOiAnaW1hZ2UnO1xuICBkYXRhPzoge1xuICAgIGZpbGU/OiB7XG4gICAgICB1cmw6IHN0cmluZztcbiAgICAgIHdpZHRoOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBoZWlnaHQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGFsdDogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cblJpY2hUZXh0LkltYWdlQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SW1hZ2VCbG9ja1Byb3BzKSA9PiB7XG4gIGNvbnN0IGltYWdlVXJsID0gcHJvcHMuZGF0YT8uZmlsZT8udXJsO1xuICBpZiAoIWltYWdlVXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgd2lkdGggPSB0b051bWJlcihwcm9wcy5kYXRhPy5maWxlPy53aWR0aCk7XG4gIGNvbnN0IGhlaWdodCA9IHRvTnVtYmVyKHByb3BzLmRhdGE/LmZpbGU/LmhlaWdodCk7XG4gIGNvbnN0IGFsdCA9IHByb3BzLmRhdGE/LmZpbGU/LmFsdCB8fCAnJztcbiAgcmV0dXJuIDxpbWcgc3JjPXtpbWFnZVVybH0gd2lkdGg9e3dpZHRofSBoZWlnaHQ9e2hlaWdodH0gYWx0PXthbHR9IC8+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEh0bWxCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2h0bWwnO1xuICBkYXRhPzoge1xuICAgIGh0bWw/OiBzdHJpbmc7XG4gIH07XG59XG5cblJpY2hUZXh0Lkh0bWxCbG9jayA9IChwcm9wczogUmljaFRleHRIdG1sQmxvY2tQcm9wcykgPT4ge1xuICBjb25zdCBodG1sID0gcHJvcHMuZGF0YT8uaHRtbCB8fCAnJztcbiAgaWYgKCFodG1sKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIDxkaXYgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGh0bWx9fSAvPjtcbn07XG5cbmZ1bmN0aW9uIHRvTnVtYmVyKGlucHV0Pzogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICBjb25zdCBwYXJzZWROdW1iZXIgPSBwYXJzZUZsb2F0KGlucHV0KTtcbiAgaWYgKGlzTmFOKHBhcnNlZE51bWJlcikpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gcGFyc2VkTnVtYmVyO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVEsdUJBQXNCO0FBa0MxQixtQkFHVyxLQXVFSCxZQTFFUjtBQXRCRyxTQUFTLFNBQVMsT0FBc0I7QUFaL0M7QUFhRSxRQUFNLGFBQXFEO0FBQUEsSUFDekQsU0FBUyxTQUFTO0FBQUEsSUFDbEIsTUFBTSxTQUFTO0FBQUEsSUFDZixPQUFPLFNBQVM7QUFBQSxJQUNoQixhQUFhLFNBQVM7QUFBQSxJQUN0QixXQUFXLFNBQVM7QUFBQSxJQUNwQixlQUFlLFNBQVM7QUFBQSxJQUN4QixHQUFHLE1BQU07QUFBQSxFQUNYO0FBQ0EsUUFBTSxZQUFVLFdBQU0sU0FBTixtQkFBWSxXQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVTtBQUMxRCxVQUFNLFlBQVksK0JBQU87QUFDekIsUUFBSSxDQUFDLFdBQVc7QUFDZCxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksRUFBRSxhQUFhLGFBQWE7QUFDOUIsY0FBUSxLQUFLLG9DQUFvQyxTQUFTLEdBQUc7QUFDN0QsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0QsU0FDRSxnQ0FDRyxpQkFBTyxJQUFJLENBQUMsVUFBVTtBQUNyQixVQUFNLFFBQVEsV0FBVyxNQUFNLElBQUk7QUFDbkMsV0FBTyxvQkFBQyxTQUFPLEdBQUcsT0FBTztBQUFBLEVBQzNCLENBQUMsR0FDSDtBQUVKO0FBU0EsU0FBUyxpQkFBaUIsQ0FBQyxVQUF1QztBQWxEbEU7QUFtREUsTUFBSSxHQUFDLFdBQU0sU0FBTixtQkFBWSxPQUFNO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxJQUFJLGdCQUFnQjtBQUMxQixTQUFPLG9CQUFDLE9BQUUseUJBQXlCLEVB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
@@ -68,6 +68,11 @@ type FileField = CommonFieldProps & {
68
68
  type: 'file';
69
69
  /** List of supported exts, e.g. `['.mp4']`. */
70
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;
71
76
  };
72
77
  declare function file(field: Omit<FileField, 'type'>): FileField;
73
78
  type ObjectField = CommonFieldProps & {
@@ -105,7 +110,13 @@ type OneOfField = CommonFieldProps & {
105
110
  types: Schema[];
106
111
  };
107
112
  declare function oneOf(field: Omit<OneOfField, 'type'>): OneOfField;
108
- 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 Field = StringField | NumberField | DateField | DateTimeField | BooleanField | SelectField | MultiSelectField | ImageField | FileField | ObjectField | ArrayField | OneOfField | RichTextField;
109
120
  /**
110
121
  * Similar to {@link Field} but with a required `id`.
111
122
  * TODO(stevenle): fix this.
@@ -157,6 +168,7 @@ type schema_NumberField = NumberField;
157
168
  type schema_ObjectField = ObjectField;
158
169
  type schema_ObjectLikeField = ObjectLikeField;
159
170
  type schema_OneOfField = OneOfField;
171
+ type schema_RichTextField = RichTextField;
160
172
  type schema_Schema = Schema;
161
173
  type schema_SelectField = SelectField;
162
174
  type schema_StringField = StringField;
@@ -174,6 +186,7 @@ declare const schema_multiselect: typeof multiselect;
174
186
  declare const schema_number: typeof number;
175
187
  declare const schema_object: typeof object;
176
188
  declare const schema_oneOf: typeof oneOf;
189
+ declare const schema_richtext: typeof richtext;
177
190
  declare const schema_select: typeof select;
178
191
  declare const schema_string: typeof string;
179
192
  declare namespace schema {
@@ -193,6 +206,7 @@ declare namespace schema {
193
206
  schema_ObjectField as ObjectField,
194
207
  schema_ObjectLikeField as ObjectLikeField,
195
208
  schema_OneOfField as OneOfField,
209
+ schema_RichTextField as RichTextField,
196
210
  schema_Schema as Schema,
197
211
  schema_SelectField as SelectField,
198
212
  schema_StringField as StringField,
@@ -210,6 +224,7 @@ declare namespace schema {
210
224
  schema_number as number,
211
225
  schema_object as object,
212
226
  schema_oneOf as oneOf,
227
+ schema_richtext as richtext,
213
228
  schema_select as select,
214
229
  schema_string as string,
215
230
  };
@@ -105,74 +105,61 @@ body.menu\:open {
105
105
 
106
106
  /* signin/styles/signin.css */
107
107
  .signin {
108
- background: #F5F5F5;
109
- display: flex;
110
- flex-direction: column;
111
- gap: 20px;
112
- width: 100%;
113
- min-height: 100vh;
114
- justify-content: center;
115
- align-items: center;
116
- }
117
- .signin__card {
118
- background: #FFFFFF;
119
- border-radius: 12px;
120
- width: 380px;
121
- display: flex;
122
- flex-direction: column;
123
- align-items: center;
124
- justify-content: center;
125
- gap: 48px;
126
- padding: 150px 24px;
127
- }
128
- .signin__card__header {
129
- display: flex;
130
- flex-direction: column;
131
- align-items: center;
132
- justify-content: center;
108
+ font-family:
109
+ "Google Sans",
110
+ arial,
111
+ sans-serif;
133
112
  text-align: center;
134
- gap: 8px;
113
+ padding: 48px 20px;
114
+ color: #3c4043;
135
115
  }
136
- .signin__card__header__icon {
137
- padding: 12px;
138
- border: 4px solid black;
139
- border-radius: 50%;
140
- display: flex;
141
- align-items: center;
142
- justify-content: center;
116
+ .signin__headline {
117
+ margin-bottom: 40px;
143
118
  }
144
- .signin__card__header__icon svg {
145
- display: block;
146
- margin-top: -6px;
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;
147
129
  }
148
130
  .signin__button {
149
131
  align-items: center;
150
132
  -webkit-appearance: none;
151
133
  -moz-appearance: none;
152
134
  appearance: none;
153
- background: #1a73e8;
154
- border: 0;
155
- border-radius: 2px;
156
- color: #fff !important;
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;
157
143
  cursor: pointer;
158
- display: flex;
159
- font-family:
160
- "Google Sans",
161
- Arial,
162
- Helvetica,
163
- sans-serif;
164
- font-size: 16px;
165
- font-weight: 500;
166
- letter-spacing: 0.25px;
167
- justify-content: center;
168
- line-height: 1.625;
169
- padding: 8px 48px;
170
- text-decoration: none;
171
- gap: 16px;
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);
172
153
  }
173
154
  .signin__button__icon {
174
- width: 32px;
175
- height: 32px;
155
+ width: 18px;
156
+ height: 18px;
176
157
  background-color: white;
177
- padding: 4px;
158
+ }
159
+ .signin__button__label {
160
+ font-size: 14px;
161
+ line-height: 1;
162
+ letter-spacing: .25px;
163
+ font-weight: 500;
164
+ color: #3c4043;
178
165
  }