@rettangoli/sites 0.1.0

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/README.md ADDED
@@ -0,0 +1,103 @@
1
+ # Sitic
2
+
3
+ Generate static sites using Markdown and YAML. Straightforward, zero-complexity. Complete toolkit for landing pages, blogs, documentation, admin dashboards, and more.
4
+
5
+ ## Features
6
+
7
+ - **Content-First Approach**: Write content in Markdown, structure with YAML
8
+ - **No HTML/JS Required**: Create complex sites without writing a single line of code
9
+ - **Versatile**: Build landing pages, documentation, blogs, admin dashboards, slides and more
10
+ - **Component-Based**: Reusable components for consistent design
11
+ - **Template System**: Liquid templates for flexible layouts
12
+ - **Customizable**: Create custom components and templates
13
+
14
+ ## Quick Start
15
+
16
+ 1. Create a project structure:
17
+
18
+ ```
19
+ my-site/
20
+ ├── sitic/
21
+ │ ├── data.yaml # Global site data
22
+ │ ├── templates # Tempaltes
23
+ │ ├── components # Components
24
+ │ └── records/ # Data records (optional)
25
+ └── pages/ # Your content pages
26
+ ├── index.md
27
+ └── about.md
28
+ ```
29
+
30
+ 2. Create a simple page (index.md):
31
+
32
+ ```markdown
33
+ ---
34
+ layout: core/base
35
+ title: My Site
36
+ ---
37
+
38
+ ```yaml components
39
+ - component: core/hero1
40
+ data:
41
+ hero:
42
+ subtitle: Welcome
43
+ message: This is my first Sitic site
44
+ - component: core/spacer
45
+ data:
46
+ height: 50
47
+ - component: core/features1
48
+ data:
49
+ features:
50
+ - title: Easy to Use
51
+ description: Just write Markdown and YAML
52
+ - title: Fast
53
+ description: Generate static sites quickly
54
+ - title: Flexible
55
+ description: Create any type of site
56
+ ```
57
+
58
+ 3. Build your site:
59
+
60
+ ```bash
61
+ sitic build
62
+ ```
63
+
64
+ Your site will be generated in the `_site` directory.
65
+
66
+ ## CLI Options
67
+
68
+ ```bash
69
+ # Basic usage
70
+ sitic build
71
+
72
+ # Specify custom directories
73
+ sitic build --resources ./custom-sitic-folder
74
+ ```
75
+
76
+ ## Component System
77
+
78
+ Siti uses a component-based approach that allows you to build complex layouts using simple YAML:
79
+
80
+ ```yaml
81
+ - component: core/hero1
82
+ data:
83
+ hero:
84
+ subtitle: Section Title
85
+ message: Your message here
86
+ ```
87
+
88
+ ## Templates
89
+
90
+ The template system uses Liquid for flexible layouts. Create custom templates in the `templates` directory.
91
+
92
+ ## Examples
93
+
94
+ Check out the `examples` directory for complete site examples, including:
95
+
96
+ - Landing pages
97
+ - Documentation sites
98
+ - Blogs
99
+ - Admin dashboards
100
+
101
+ ## License
102
+
103
+ MIT
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@rettangoli/sites",
3
+ "version": "0.1.0",
4
+ "description": "Generate static sites using Markdown and YAML. Straightforward, zero-complexity. Complete toolkit for landing pages, blogs, documentation, admin dashboards, and more.git remote add origin git@github.com:yuusoft-org/sitic.git",
5
+ "author": {
6
+ "name": "Luciano Hanyon Wu",
7
+ "email": "han4wluc@yuusoft.com"
8
+ },
9
+ "main": "./src/index.js",
10
+ "exports": {
11
+ ".": "./src/index.js",
12
+ "./cli": "./src/cli/index.js"
13
+ },
14
+ "files": [
15
+ "src",
16
+ "components",
17
+ "templates"
18
+ ],
19
+ "dependencies": {
20
+ "commander": "^13.1.0",
21
+ "html-minifier-terser": "^7.2.0",
22
+ "js-yaml": "^4.1.0",
23
+ "liquidjs": "^10.21.0",
24
+ "luxon": "^3.6.1",
25
+ "markdown-it": "^14.1.0",
26
+ "markdown-it-async": "^2.2.0",
27
+ "shiki": "^3.3.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/bun": "^1.2.8"
31
+ },
32
+ "type": "module",
33
+ "bin": {
34
+ "sitic": "src/cli.js"
35
+ },
36
+ "license": "MIT",
37
+ "keywords": [
38
+ "static",
39
+ "site",
40
+ "generator",
41
+ "markdown",
42
+ "yaml",
43
+ "landing",
44
+ "page",
45
+ "blog",
46
+ "documentation",
47
+ "admin",
48
+ "dashboard"
49
+ ],
50
+ "bugs": {
51
+ "url": "https://github.com/yuusoft-org/sitic/issues"
52
+ },
53
+ "homepage": "https://github.com/yuusoft-org/sitic#readme"
54
+ }
@@ -0,0 +1,166 @@
1
+ import { join, dirname } from "path";
2
+ import { fileURLToPath } from "url";
3
+ import { DateTime } from "luxon";
4
+
5
+ // Create the equivalent of __dirname for ES modules
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+
9
+ import {
10
+ safeYamlLoad,
11
+ safeReadFile,
12
+ deepMerge,
13
+ createTemplateRenderer,
14
+ createFolderIfNotExists,
15
+ configureMarkdown,
16
+ loadCollections,
17
+ createFileFormatHandlers,
18
+ loadItems,
19
+ copyDirRecursive,
20
+ } from "../common.js";
21
+ import { rm } from "fs/promises";
22
+
23
+ /**
24
+ * Copy pages to site with processing
25
+ * @param {Object} options - Options for copying pages
26
+ * @param {string} options.resourcesPath - Path to resources directory
27
+ * @param {string} options.pagesPath - Path to pages directory
28
+ * @param {string} options.outputPath - Path to output directory
29
+ */
30
+ export const copyPagesToSite = async (options) => {
31
+ const {
32
+ resourcesPath = "./sitic",
33
+ pagesPath = "./pages",
34
+ outputPath = "./_site",
35
+ } = options;
36
+
37
+ const dataPath = join(resourcesPath, "data.yaml");
38
+ const templatesPath = join(resourcesPath, "templates");
39
+ const componentsPath = join(resourcesPath, "components");
40
+ const recordsPath = join(resourcesPath, "records");
41
+
42
+ // Load hello.yaml template data
43
+ const inputYaml = await safeReadFile(dataPath);
44
+
45
+ const templates = await loadItems({
46
+ path: join(__dirname, "./templates"),
47
+ name: "templates",
48
+ isYaml: false,
49
+ keepExtension: true,
50
+ });
51
+
52
+ if (templatesPath) {
53
+ const customTemplates = await loadItems({
54
+ path: templatesPath,
55
+ name: "templates",
56
+ isYaml: false,
57
+ keepExtension: true,
58
+ });
59
+ Object.assign(templates, customTemplates);
60
+ }
61
+
62
+ // Load data
63
+ const records = await loadItems({
64
+ path: recordsPath,
65
+ name: "records",
66
+ isYaml: true,
67
+ });
68
+
69
+ const components = await loadItems({
70
+ path: join(__dirname, "./components"),
71
+ name: "components",
72
+ isYaml: false,
73
+ });
74
+
75
+ if (componentsPath) {
76
+ const customComponents = await loadItems({
77
+ path: componentsPath,
78
+ name: "components",
79
+ isYaml: false,
80
+ });
81
+ Object.assign(components, customComponents);
82
+ }
83
+
84
+ const collections = await loadCollections(pagesPath);
85
+
86
+ const liquidParse = createTemplateRenderer({
87
+ templates,
88
+ filters: {
89
+ json: (obj) => JSON.stringify(obj),
90
+ "json-escaped": (obj) => {
91
+ if (!obj) {
92
+ return "";
93
+ }
94
+ return encodeURIComponent(JSON.stringify(obj));
95
+ },
96
+ postDate: (dateObj) => {
97
+ if (!dateObj || typeof dateObj !== 'string') {
98
+ return ''; // Return empty string or some default value if dateObj is undefined or not a string
99
+ }
100
+ try {
101
+ return DateTime.fromFormat(dateObj, "yyyy-MM-dd").toLocaleString(
102
+ DateTime.DATE_MED
103
+ );
104
+ } catch (error) {
105
+ console.error(`Error formatting date "${dateObj}":`, error.message);
106
+ return dateObj; // Return the original date string if parsing fails
107
+ }
108
+ },
109
+ },
110
+ });
111
+
112
+ let data;
113
+ try {
114
+ data = safeYamlLoad(liquidParse(inputYaml, { collections }));
115
+ } catch (error) {
116
+ console.error("Error creating template renderer:", error);
117
+ throw error;
118
+ }
119
+
120
+ // Create global data object for templates
121
+ const globalData = {
122
+ data,
123
+ collections,
124
+ records,
125
+ };
126
+
127
+ const yamlComponentRenderer = (content) => {
128
+ const renderedContent = liquidParse(content, globalData);
129
+ const yamlContent = safeYamlLoad(renderedContent);
130
+
131
+ return yamlContent
132
+ .map(({ component, data }) => {
133
+ const foundComponent = components[component];
134
+ if (!foundComponent) {
135
+ throw new Error(`Component not found for ${component}`);
136
+ }
137
+ return liquidParse(foundComponent, deepMerge(globalData, data));
138
+ })
139
+ .join("\n");
140
+ };
141
+
142
+ const md = configureMarkdown({
143
+ yamlComponentRenderer,
144
+ });
145
+
146
+ const fileFormatHandlers = createFileFormatHandlers({
147
+ basePath: pagesPath,
148
+ templates,
149
+ liquidParse,
150
+ data: globalData.data,
151
+ collections,
152
+ md,
153
+ });
154
+
155
+ try {
156
+ await rm(outputPath, { recursive: true, force: true });
157
+ await createFolderIfNotExists(outputPath);
158
+ await copyDirRecursive(pagesPath, outputPath, fileFormatHandlers);
159
+ console.log(`Pages copied from ${pagesPath} to ${outputPath} successfully`);
160
+ } catch (error) {
161
+ console.error(
162
+ `Error copying pages from ${pagesPath} to ${outputPath}:`,
163
+ error
164
+ );
165
+ }
166
+ };
@@ -0,0 +1,19 @@
1
+ <rtgl-text><a href="{{ back.href }}" aria-label="{{ back.text }}">{{ back.text }}</a></rtgl-text>
2
+ <rtgl-text s="h2" mt="l">{{ title }}</rtgl-text>
3
+ <rtgl-view mt="l">
4
+ {{ subtitle }}
5
+ </rtgl-view>
6
+ <rtgl-view g="l" mt="xl">
7
+ {%- for item in items -%}
8
+
9
+ <rtgl-view w="f" d="h" av="c">
10
+ {% if item.date %}
11
+ <rtgl-view d="h" w="120">
12
+ <rtgl-text>{{ item.date | postDate }}</rtgl-text>
13
+ </rtgl-view>
14
+ {% endif %}
15
+ <rtgl-text s="lg"><a href="{{ item.url }}">{{ item.title }}</a></rtgl-text>
16
+ </rtgl-view>
17
+
18
+ {%- endfor -%}
19
+ </rtgl-view>
@@ -0,0 +1,9 @@
1
+ <rtgl-view w="f" ph="xl">
2
+ <rtgl-view w="f" ah="c" bw="s" br="l" p="xl">
3
+ <rtgl-text s="h3" ta="c" mt="l"> {{ cta.title }} </rtgl-text>
4
+ <rtgl-text mt="l" ta="c" c="mu-fg"> {{ cta.description }} </rtgl-text>
5
+ <rtgl-button mt="xl" href="{{ cta.cta.href }}" target="_blank" rel="noreferrer"> {{
6
+ cta.cta.text
7
+ }} </rtgl-button>
8
+ </rtgl-view>
9
+ </rtgl-view>
@@ -0,0 +1,24 @@
1
+ <rtgl-view d="h" h="64"></rtgl-view>
2
+ <rtgl-view pv="xl" mv="xl" mh="l" g="xl" ah="c">
3
+ <rtgl-text s="h2" at="c"> {{ feature.title }} </rtgl-text>
4
+ <rtgl-view d="h" w="f" g="xl" av="c" mt="l">
5
+ <rtgl-view flex="2" mb="m" g="m" style="min-width: 320px;">
6
+ <rtgl-text s="bl" mt="l"> {{ feature.description }} </rtgl-text>
7
+ <ul>
8
+ <rtgl-view >
9
+ {%- for item in feature.items -%}
10
+ <li>
11
+ <rtgl-view>
12
+ <rtgl-text mt="l"><b> {{ item.label }}:</b> {{ item.description }} </rtgl-text>
13
+ </rtgl-view>
14
+ </li>
15
+ {%- endfor -%}
16
+ </rtgl-view>
17
+ </ul>
18
+ </rtgl-view>
19
+ <rtgl-view flex="3" style="min-width: 320px; overflow: hidden;" bw="xs" br="s">
20
+ <rtgl-image src="{{ feature.picture }}" w="f" alt="{{ feature.imageAlt | default: feature.title }}"></rtgl-image>
21
+ </rtgl-view>
22
+ </rtgl-view>
23
+ </rtgl-view>
24
+ <rtgl-view d="h" h="64"></rtgl-view>
@@ -0,0 +1,4 @@
1
+ <rtgl-view ah="c" w="f">
2
+ <rtgl-text s="h1"> {{ hero.title }} </rtgl-text>
3
+ <rtgl-text s="lg" mt="l" at="c"> {{ hero.message }} <rtgl-text>
4
+ </rtgl-view>
@@ -0,0 +1,31 @@
1
+ {%- if hero.video -%}
2
+ <rtgl-view h="8vh"></rtgl-view>
3
+ {%- else -%}
4
+ <rtgl-view h="20vh"></rtgl-view>
5
+ {%- endif -%}
6
+ <rtgl-view w="f" pv="xl" av="c" ah="c" ph="xl">
7
+ <rtgl-text s="h1" ta="c" mb="lg"> {{ hero.title }} </rtgl-text>
8
+ {%- for subtitle in hero.subtitles -%}
9
+ <rtgl-text s="lg" ta="c"> {{ subtitle }} </rtgl-text>
10
+ {%- endfor -%}
11
+ {%- if hero.cta -%}
12
+ <rtgl-button mt="xl" href="{{ hero.cta.href }}" {% if hero.cta.openNewTab %}target="_blank" rel="noreferrer"{% endif %}> {{
13
+ hero.cta.text
14
+ }} </rtgl-button>
15
+ {%- endif -%}
16
+ </rtgl-view>
17
+
18
+ {%- if hero.video-%}
19
+ <rtgl-view w="f" ah="c" mt="xl">
20
+
21
+ <rtgl-view lg-h="calc((100vw - 32px) / 1.777)" lg-w="calc(100vw - 32px)" h="calc(66.66vw / 1.777)" w="66.66vw"
22
+ bw="xs" br="xs" shadow="sm">
23
+ <video playsinline loop controls width="100%" aria-label="{{ hero.video.title | default: 'Video content' }}">
24
+ <source src="{{ hero.video.url }}" type="video/mp4">
25
+ </video>
26
+ </rtgl-view>
27
+ </rtgl-view>
28
+ {%- else -%}
29
+ <rtgl-view h="20vh">
30
+ </rtgl-view>
31
+ {%- endif -%}
@@ -0,0 +1,15 @@
1
+ <rtgl-view g="m" w="f" mt="xl">
2
+ <rtgl-text s="h3">{{ sectionTitle }}</rtgl-text>
3
+ <rtgl-view g="l" w="f">
4
+ {% for item in items %}
5
+ <a href="{{ item.href }}" style="display: contents; color: inherit;">
6
+ <rtgl-view bgc="mu" bw="s" br="m" p="m" w="f" g="xs">
7
+ <rtgl-view d="h" g="m">
8
+ <rtgl-text s="h4">{{ item.label }}</rtgl-text>
9
+ </rtgl-view>
10
+ <rtgl-text>{{ item.description }}</rtgl-text>
11
+ </rtgl-view>
12
+ </a>
13
+ {% endfor %}
14
+ </rtgl-view>
15
+ </rtgl-view>
@@ -0,0 +1 @@
1
+ <rtgl-view h="{{ height }}"></rtgl-view>
@@ -0,0 +1,2 @@
1
+ <rtgl-table columns="{{ columns | json-escaped }}" rows="{{ rows | json-escaped }}" id="xxx">
2
+ </rtgl-table>
@@ -0,0 +1,5 @@
1
+ import { copyPagesToSite } from './build.js';
2
+
3
+ export {
4
+ copyPagesToSite,
5
+ }
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ {% include "core/htmlHeader.html" %}
6
+ {% include "core/htmlHeaderTable.html" %}
7
+ </head>
8
+
9
+ <body class="dark">
10
+ <rtgl-view w="f" ah="c" h="f">
11
+ <rtgl-view d="h" w="f" h="f">
12
+ <rtgl-sidebar title="{{ docs.title | json-escaped }}" items="{{ admin.items | json-escaped }}"></rtgl-sidebar>
13
+ <rtgl-view h="100vh" w="f" sv id="content-container" ph="l">
14
+ {{ content }}
15
+ <rtgl-view h="50vh"></rtgl-view>
16
+ </rtgl-view>
17
+ </rtgl-view>
18
+ </rtgl-view>
19
+ </body>
20
+
21
+ </html>
@@ -0,0 +1,102 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ {% include "core/htmlHeader.html" %}
6
+ </head>
7
+
8
+ <body>
9
+ <rtgl-view bgc="su" w="f" ah="c">
10
+ <rtgl-view md-w="100vw" lg-w="768" w="1024" p="lg">
11
+ {% include "core/navbar.html" %}
12
+ <rtgl-view h="48"></rtgl-view>
13
+ <rtgl-text s="dm" mt="lg">Agreements</rtgl-text>
14
+
15
+
16
+ <rtgl-text s="tl" mt="lg">Current Effective Agreements</rtgl-text>
17
+
18
+ <rtgl-view h="24"></rtgl-view>
19
+
20
+ {%- for agreement in collections['agreement'] -%}
21
+ {%- if agreement.status == 'Effective' -%}
22
+ <rtgl-view h="32" av="c" mt="lg">
23
+ <rtgl-text s="ll">
24
+ <a href="{{ agreement.url }}">{{ agreement.title }} {{ agreement.version }}</a>
25
+ </rtgl-text>
26
+ </rtgl-view>
27
+ {%- endif -%}
28
+ {%- endfor -%}
29
+
30
+
31
+ <rtgl-view h="48"></rtgl-view>
32
+ <rtgl-text s="tl">Past agreements changelog</rtgl-text>
33
+
34
+ <rtgl-view h="32" av="c" mt="lg">
35
+ <rtgl-text s="tm">
36
+ Privacy Policy
37
+ </rtgl-text>
38
+ </rtgl-view>
39
+
40
+ <rtgl-view w="calc(100vw - 32px)" sh>
41
+ <rtgl-view w="640px">
42
+ <rtgl-view d="h">
43
+ <rtgl-view w="120"><rtgl-text s="bm">Version</rtgl-text></rtgl-view>
44
+ <rtgl-view w="120"><rtgl-text s="bm">Effective Date</rtgl-text></rtgl-view>
45
+ <rtgl-view w="120"><rtgl-text s="bm">Status</rtgl-text></rtgl-view>
46
+ <rtgl-view w="240"><rtgl-text s="bm">Changes</rtgl-text></rtgl-view>
47
+ </rtgl-view>
48
+
49
+ {%- for agreement in collections['privacy-policy'] -%}
50
+ <rtgl-view d="h">
51
+ <rtgl-view w="120"><rtgl-text s="bm"><a href="{{ agreement.url }}">{{ agreement.version
52
+ }}</a></rtgl-text></rtgl-view>
53
+ <rtgl-view w="120"><rtgl-text s="bm">{{ agreement.effective_date | postDate }}</rtgl-text></rtgl-view>
54
+ <rtgl-view w="120"><rtgl-text s="bm">{{ agreement.status }}</rtgl-text></rtgl-view>
55
+ <rtgl-view w="240"><rtgl-text s="bm">
56
+ {%- for change in agreement.summary_of_changes -%}
57
+ <li>{{ change }}</li>
58
+ {%- endfor -%}
59
+ </rtgl-text></rtgl-view>
60
+ </rtgl-view>
61
+ {%- endfor -%}
62
+ </rtgl-view>
63
+ </rtgl-view>
64
+
65
+ <rtgl-view h="32" av="c" mt="lg">
66
+ <rtgl-text s="tm">
67
+ Terms of Service
68
+ </rtgl-text>
69
+ </rtgl-view>
70
+
71
+ <rtgl-view w="calc(100vw - 32px)" sh>
72
+ <rtgl-view w="640px">
73
+ <rtgl-view d="h">
74
+ <rtgl-view w="120"><rtgl-text s="bm">Version</rtgl-text></rtgl-view>
75
+ <rtgl-view w="120"><rtgl-text s="bm">Effective Date</rtgl-text></rtgl-view>
76
+ <rtgl-view w="120"><rtgl-text s="bm">Status</rtgl-text></rtgl-view>
77
+ <rtgl-view w="240"><rtgl-text s="bm">Changes</rtgl-text></rtgl-view>
78
+ </rtgl-view>
79
+
80
+ {%- for agreement in collections['terms-of-service'] -%}
81
+ <rtgl-view d="h">
82
+ <rtgl-view w="120"><rtgl-text s="bm"><a href="{{ agreement.url }}">{{ agreement.version
83
+ }}</a></rtgl-text></rtgl-view>
84
+ <rtgl-view w="120"><rtgl-text s="bm">{{ agreement.effective_date | postDate }}</rtgl-text></rtgl-view>
85
+ <rtgl-view w="120"><rtgl-text s="bm">{{ agreement.status }}</rtgl-text></rtgl-view>
86
+ <rtgl-view w="240"><rtgl-text s="bm">
87
+ {%- for change in agreement.summary_of_changes -%}
88
+ <li>{{ change }}</li>
89
+ {%- endfor -%}
90
+ </rtgl-text></rtgl-view>
91
+ </rtgl-view>
92
+ {%- endfor -%}
93
+ </rtgl-view>
94
+ </rtgl-view>
95
+ </rtgl-view>
96
+
97
+ {% include "core/footer.html" %}
98
+ </rtgl-view>
99
+
100
+ </body>
101
+
102
+ </html>
@@ -0,0 +1,35 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ {% include "core/htmlHeader.html" %}
6
+ </head>
7
+
8
+ <body class="dark">
9
+ <rtgl-view id="top" bgc="su" w="f" ah="c">
10
+ <rtgl-view md-w="100vw" w="768" p="lg">
11
+ <rtgl-view h="72"></rtgl-view>
12
+ <rtgl-text><a href="{{ layoutConfiguration.back.href | default: "/" }}">{{ layoutConfiguration.back.label | default: "Back" }}
13
+ </a></rtgl-text>
14
+ <rtgl-text s="h1" mt="lg"><a href="#" style="display: contents;">{{ title }}</a></rtgl-text>
15
+ {% if date %}
16
+ <rtgl-text mt="sm">{{ date | postDate }}</rtgl-text>
17
+ {% endif %}
18
+ <rtgl-view mt="lg" id="content-container" w="f">
19
+ {{ content }}
20
+ <rtgl-view h="128"></rtgl-view>
21
+ <rtgl-view w="f" ah="c">
22
+ <rtgl-text s="lg"><a href="#top">Back to top</a></rtgl-text>
23
+ </rtgl-view>
24
+ </rtgl-view>
25
+ </rtgl-view>
26
+
27
+ <rtgl-view pos="fix" cor="right" style="top: 32px" sv w="256" h="100vh" p="xl" g="lg" xl-hidden>
28
+ <rtgl-page-outline id="page-outline"></rtgl-page-outline>
29
+ </rtgl-view>
30
+ {% include "core/footer.html" %}
31
+ {% include "core/navbar.html" %}
32
+ </rtgl-view>
33
+ </body>
34
+
35
+ </html>
@@ -0,0 +1,28 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ {% include "core/htmlHeader.html" %}
6
+ </head>
7
+
8
+ {% assign base_template_size_attrs = "w=\"768\"" %}
9
+ {% unless layoutConfiguration.size == "small" %}
10
+ {% assign base_template_size_attrs = "w=\"1024\" lg-w=\"768\"" %}
11
+ {% endunless %}
12
+
13
+ <body class="dark">
14
+ <rtgl-view h="48"></rtgl-view>
15
+ <rtgl-view w="f" ah="c">
16
+ <rtgl-view
17
+ md-w="100vw"
18
+ {{ base_template_size_attrs }}
19
+ ph="lg"
20
+ pb="lg">
21
+ {{ content }}
22
+ </rtgl-view>
23
+ {% include "core/footer.html" %}
24
+ </rtgl-view>
25
+ {% include "core/navbar.html" %}
26
+ </body>
27
+
28
+ </html>
@@ -0,0 +1,28 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ {% include "core/htmlHeader.html" %}
6
+ </head>
7
+
8
+ <body class="dark">
9
+ <rtgl-view bgc="bg" w="f" ah="c" h="f">
10
+ <rtgl-view d="h" w="f" h="f">
11
+ <rtgl-view md-hidden h="100vh">
12
+ <rtgl-sidebar header="{{ docs.header | json-escaped }}" items="{{ docs.items | json-escaped }}"></rtgl-sidebar>
13
+ </rtgl-view>
14
+ <rtgl-view flex="1" ah="c" h="100vh">
15
+ <rtgl-view pv="lg" md-w="100vw" w="720" ph="xl" sv id="content-container">
16
+ <rtgl-text s="h1" mb="md">{{ title }}</rtgl-text>
17
+ {{ content }}
18
+ <rtgl-view h="50vh"></rtgl-view>
19
+ </rtgl-view>
20
+ </rtgl-view>
21
+ <rtgl-view sv w="256" h="100vh" p="xl" g="lg" xl-hidden>
22
+ <rtgl-page-outline id="page-outline" target-id="content-container"></rtgl-page-outline>
23
+ </rtgl-view>
24
+ </rtgl-view>
25
+ </rtgl-view>
26
+ </body>
27
+
28
+ </html>