nibula 2.3.0 → 2.4.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/.eleventy.js +29 -8
- package/CHANGELOG.md +25 -0
- package/bin/create.js +6 -6
- package/bin/delegate.js +0 -16
- package/package.json +1 -1
- package/src/frontend/components/global/footer.njk +8 -11
- package/src/frontend/components/global/header.njk +1 -1
- package/src/frontend/components/not-found.njk +1 -1
- package/src/frontend/data/site.json +3 -3
- package/src/frontend/js/modules/exampleModule.js +1 -0
- package/src/frontend/layouts/base.njk +2 -2
- package/src/frontend/routes/404.njk +3 -3
- package/src/frontend/routes/index.njk +3 -3
- package/src/frontend/scss/_global.scss +1 -16
- package/src/frontend/scss/_root.scss +1 -5
- package/src/frontend/scss/modules/_footer.scss +17 -9
- package/src/frontend/scss/modules/_header.scss +23 -20
- package/src/frontend/scss/modules/_typography.scss +1 -9
- package/src/frontend/scss/pages/homepage.scss +4 -14
- package/src/frontend/ts/global.ts +1 -1
- package/src/frontend/ts/modules/exampleModule.ts +1 -0
- package/tools/cli/ui.js +1 -1
- package/tools/config/messages.json +1 -2
- package/tools/config/settings.json +1 -11
- package/tools/lib/pageActions.js +3 -11
- package/tools/lib/pageArtifacts.js +2 -19
- package/tools/res/templates/template.njk +3 -3
- package/tools/res/templates/template.scss +5 -15
- package/src/frontend/scss/modules/_animations.scss +0 -25
- package/src/frontend/scss/modules/_mobile.scss +0 -30
package/.eleventy.js
CHANGED
|
@@ -47,6 +47,23 @@ module.exports = function (eleventyConfig) {
|
|
|
47
47
|
});
|
|
48
48
|
|
|
49
49
|
eleventyConfig.amendLibrary("md", (markdownLibrary) => {
|
|
50
|
+
markdownLibrary.renderer.rules.link_open = function (
|
|
51
|
+
tokens,
|
|
52
|
+
idx,
|
|
53
|
+
options,
|
|
54
|
+
env,
|
|
55
|
+
self,
|
|
56
|
+
) {
|
|
57
|
+
const href = tokens[idx].attrGet("href");
|
|
58
|
+
|
|
59
|
+
if (href && (href.startsWith("http://") || href.startsWith("https://"))) {
|
|
60
|
+
tokens[idx].attrSet("target", "_blank");
|
|
61
|
+
tokens[idx].attrSet("rel", "noopener noreferrer");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return self.renderToken(tokens, idx, options);
|
|
65
|
+
};
|
|
66
|
+
|
|
50
67
|
markdownLibrary
|
|
51
68
|
.use(markdownItAnchor, {
|
|
52
69
|
level: ANCHOR_LEVELS,
|
|
@@ -70,6 +87,16 @@ module.exports = function (eleventyConfig) {
|
|
|
70
87
|
// Passthrough copy
|
|
71
88
|
// ---------------------------------------------------------------------------
|
|
72
89
|
|
|
90
|
+
eleventyConfig.addPassthroughCopy({
|
|
91
|
+
// Prism syntax highlighting theme
|
|
92
|
+
"node_modules/prismjs/themes/prism-tomorrow.css": "css/prism.css",
|
|
93
|
+
|
|
94
|
+
// Bootstrap
|
|
95
|
+
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js":
|
|
96
|
+
"js/bootstrap.bundle.min.js",
|
|
97
|
+
"node_modules/bootstrap-icons/font/fonts": "css/fonts",
|
|
98
|
+
});
|
|
99
|
+
|
|
73
100
|
// Project assets
|
|
74
101
|
eleventyConfig.addPassthroughCopy("src/frontend/assets");
|
|
75
102
|
eleventyConfig.addPassthroughCopy("src/frontend/robots.txt");
|
|
@@ -80,12 +107,7 @@ module.exports = function (eleventyConfig) {
|
|
|
80
107
|
"src/frontend/hosting/web.config": "web.config",
|
|
81
108
|
});
|
|
82
109
|
|
|
83
|
-
//
|
|
84
|
-
eleventyConfig.addPassthroughCopy({
|
|
85
|
-
"node_modules/prismjs/themes/prism-tomorrow.css": "css/prism.css",
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
// CSS frameworks — uncomment the one you are using
|
|
110
|
+
// node_modules dependencies
|
|
89
111
|
eleventyConfig.addPassthroughCopy({
|
|
90
112
|
// Bootstrap
|
|
91
113
|
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js":
|
|
@@ -107,7 +129,7 @@ module.exports = function (eleventyConfig) {
|
|
|
107
129
|
// ---------------------------------------------------------------------------
|
|
108
130
|
|
|
109
131
|
eleventyConfig.addFilter(
|
|
110
|
-
"
|
|
132
|
+
"componentsPath",
|
|
111
133
|
(name) => `${MARKDOWN_BASE_PATH}${name}`,
|
|
112
134
|
);
|
|
113
135
|
|
|
@@ -145,7 +167,6 @@ module.exports = function (eleventyConfig) {
|
|
|
145
167
|
// ---------------------------------------------------------------------------
|
|
146
168
|
|
|
147
169
|
return {
|
|
148
|
-
markdownTemplateEngine: TEMPLATE_ENGINE,
|
|
149
170
|
htmlTemplateEngine: TEMPLATE_ENGINE,
|
|
150
171
|
|
|
151
172
|
dir: {
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,31 @@ All notable changes to Nibula are documented here.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.4.1] 2026-08-24
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- Changed template.njk snippets for renderFile
|
|
12
|
+
- markdown files used as components will now require {class="class"} or {id="id"} instead of {#id} or {.class}
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- Fixed json data files passed in renderfile to markdown files not rendering
|
|
16
|
+
|
|
17
|
+
## [2.4.0] - 2026-08-23
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- `ignoreMissing` on header and footer includes in `base.njk`, so a project without those components still builds
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Copyright notice centered below a rule in the footer
|
|
24
|
+
- Removed `_animations.scss` and `_mobile.scss` from the default SCSS modules — responsive rules now live in the module they belong to
|
|
25
|
+
- Reviewed commented snippets across SCSS, JS and TS templates
|
|
26
|
+
- Raised scaffold dependency floors: `esbuild` to `^0.28.2` and `@11ty/eleventy-img` to `^7.0.0` close known advisories; `@11ty/eleventy`, `sass`, `uikit` and `concurrently` aligned to current releases
|
|
27
|
+
- In new pages.njk files, renderfiel will be inside a div and not in an article tag
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- Removing a page with the CLI no longer deletes its build output — the output directory is a build artifact and may be live in production
|
|
31
|
+
- Corrected the local CLI version label
|
|
32
|
+
|
|
8
33
|
## [2.3.0] - 2026-08-19
|
|
9
34
|
|
|
10
35
|
### Added
|
package/bin/create.js
CHANGED
|
@@ -156,8 +156,8 @@ const PROJECT_PACKAGE = {
|
|
|
156
156
|
"assistant": "nib cli"
|
|
157
157
|
},
|
|
158
158
|
dependencies: {
|
|
159
|
-
'@11ty/eleventy': '^3.1.
|
|
160
|
-
'@11ty/eleventy-img': '^
|
|
159
|
+
'@11ty/eleventy': '^3.1.6',
|
|
160
|
+
'@11ty/eleventy-img': '^7.0.0',
|
|
161
161
|
'@11ty/eleventy-plugin-syntaxhighlight': '^5.0.2',
|
|
162
162
|
'bootstrap': '^5.3.8',
|
|
163
163
|
'bootstrap-icons': '^1.13.1',
|
|
@@ -166,13 +166,13 @@ const PROJECT_PACKAGE = {
|
|
|
166
166
|
'glob': '^13.0.6',
|
|
167
167
|
'markdown-it-anchor': '^9.2.1',
|
|
168
168
|
'markdown-it-attrs': '^5.0.1',
|
|
169
|
-
'uikit': '^3.25.
|
|
169
|
+
'uikit': '^3.25.21',
|
|
170
170
|
},
|
|
171
171
|
devDependencies: {
|
|
172
172
|
'nibula': `^${SELF_VERSION}`,
|
|
173
|
-
'concurrently': '^9.2.
|
|
174
|
-
'esbuild': '^0.
|
|
175
|
-
'sass': '^1.
|
|
173
|
+
'concurrently': '^9.2.4',
|
|
174
|
+
'esbuild': '^0.28.2',
|
|
175
|
+
'sass': '^1.103.1',
|
|
176
176
|
},
|
|
177
177
|
};
|
|
178
178
|
|
package/bin/delegate.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { spawnSync } = require('child_process');
|
|
4
|
-
const { color } = require('../tools/lib/colors');
|
|
5
|
-
const { message } = require('../tools/lib/logger');
|
|
6
4
|
|
|
7
5
|
const PACKAGE_NAME = 'nibula';
|
|
8
6
|
const NODE_MODULES = 'node_modules';
|
|
@@ -22,14 +20,6 @@ function realPath(target) {
|
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
22
|
|
|
25
|
-
function readVersion(packageRoot) {
|
|
26
|
-
try {
|
|
27
|
-
return JSON.parse(fs.readFileSync(path.join(packageRoot, PACKAGE_FILE), 'utf8')).version;
|
|
28
|
-
} catch {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
23
|
function delegateToLocal(projectRoot) {
|
|
34
24
|
if (process.env[LOCAL_FLAG] === LOCAL_FLAG_VALUE) return;
|
|
35
25
|
|
|
@@ -41,12 +31,6 @@ function delegateToLocal(projectRoot) {
|
|
|
41
31
|
const localEntry = path.join(localRoot, ENTRY_FILE);
|
|
42
32
|
if (!fs.existsSync(localEntry)) return;
|
|
43
33
|
|
|
44
|
-
const localVersion = readVersion(localRoot);
|
|
45
|
-
|
|
46
|
-
if (localVersion && localVersion !== globalVersion) {
|
|
47
|
-
console.log(`${color.dim}${message('cli.usingLocalVersion', { local: localVersion, global: globalVersion })}${color.reset}`);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
34
|
const result = spawnSync(process.execPath, [localEntry, ...process.argv.slice(2)], {
|
|
51
35
|
stdio: 'inherit',
|
|
52
36
|
cwd: process.cwd(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nibula",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "A beginner-friendly static site generator built on Eleventy that stays close to vanilla HTML, CSS and JS — with a page-management CLI, an optional PHP backend, and SEO files generated for you.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"11ty",
|
|
@@ -5,21 +5,18 @@
|
|
|
5
5
|
</div>
|
|
6
6
|
<div>
|
|
7
7
|
<h6>Legal</h6>
|
|
8
|
-
<small>
|
|
9
8
|
<ul>
|
|
10
9
|
<li><a href="{{ site.legal.privacy }}">Privacy Policy</a></li>
|
|
11
10
|
<li><a href="{{ site.legal.cookie }}">Cookie Policy</a></li>
|
|
12
11
|
<li><a href="{{ site.legal.terms }}">Terms and conditions</a></li>
|
|
13
12
|
</ul>
|
|
14
|
-
</small>
|
|
15
13
|
</div>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
</h6>
|
|
14
|
+
|
|
15
|
+
<hr />
|
|
16
|
+
|
|
17
|
+
<div class="copyright">
|
|
18
|
+
<p>
|
|
19
|
+
© {{ site.legal.copyright.year }} {{ site.site_name }} - {{ site.legal.copyright.text }}
|
|
20
|
+
</p>
|
|
24
21
|
</div>
|
|
25
|
-
</footer>
|
|
22
|
+
</footer>
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"theme": "dark",
|
|
11
11
|
"logo": "/assets/brand/logo.svg",
|
|
12
12
|
"legal": {
|
|
13
|
-
"privacy": "",
|
|
14
|
-
"cookie": "",
|
|
15
|
-
"terms": "",
|
|
13
|
+
"privacy": "/privacy/",
|
|
14
|
+
"cookie": "/cookies/",
|
|
15
|
+
"terms": "/terms/",
|
|
16
16
|
"copyright": {
|
|
17
17
|
"year": "2026",
|
|
18
18
|
"text": "All rights reserved."
|
|
@@ -99,13 +99,13 @@
|
|
|
99
99
|
|
|
100
100
|
<body>
|
|
101
101
|
|
|
102
|
-
{% include "global/header.njk" %}
|
|
102
|
+
{% include "global/header.njk" ignore missing %}
|
|
103
103
|
|
|
104
104
|
<main>
|
|
105
105
|
{{ content | safe }}
|
|
106
106
|
</main>
|
|
107
107
|
|
|
108
|
-
{% include "global/footer.njk" %}
|
|
108
|
+
{% include "global/footer.njk" ignore missing %}
|
|
109
109
|
|
|
110
110
|
{#╔══════════════════╗
|
|
111
111
|
║ SCRIPTS ║
|
|
@@ -9,7 +9,7 @@ layout: base.njk
|
|
|
9
9
|
|
|
10
10
|
{# Markdown files live in components/ too. Pass the data the file needs #}
|
|
11
11
|
{#
|
|
12
|
-
<
|
|
13
|
-
{% renderFile "your-file.md" |
|
|
14
|
-
</
|
|
12
|
+
<div class="markdown-body">
|
|
13
|
+
{% renderFile "your-file.md" | componentsPath, { alias: fileName }, "njk,md" %}
|
|
14
|
+
</div>
|
|
15
15
|
#}
|
|
@@ -9,7 +9,7 @@ layout: base.njk
|
|
|
9
9
|
|
|
10
10
|
{# Markdown files live in components/ too. Pass the data the file needs #}
|
|
11
11
|
{#
|
|
12
|
-
<
|
|
13
|
-
{% renderFile "your-file.md" |
|
|
14
|
-
</
|
|
12
|
+
<div class="markdown-body">
|
|
13
|
+
{% renderFile "your-file.md" | componentsPath, { alias: fileName }, "njk,md" %}
|
|
14
|
+
</div>
|
|
15
15
|
#}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
//==========================
|
|
2
|
-
// CSS RULES FOR THE ENTIRE SITE
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
1
|
// Getting root rules from _root.scss
|
|
6
|
-
@use 'root' as root;
|
|
2
|
+
@use 'root' as root; // Usage: root.$value-name
|
|
7
3
|
|
|
8
4
|
// Frameworks imports
|
|
9
5
|
@import "modules/frameworks/bootstrap";
|
|
@@ -20,13 +16,6 @@
|
|
|
20
16
|
@import "modules/header";
|
|
21
17
|
@import "modules/footer";
|
|
22
18
|
|
|
23
|
-
@import "modules/animations";
|
|
24
|
-
@import "modules/mobile";
|
|
25
|
-
|
|
26
|
-
//==========================
|
|
27
|
-
// Global css rules for the entire site
|
|
28
|
-
//==========================
|
|
29
|
-
|
|
30
19
|
*,
|
|
31
20
|
*::before,
|
|
32
21
|
*::after {
|
|
@@ -43,8 +32,4 @@ body {
|
|
|
43
32
|
|
|
44
33
|
main {
|
|
45
34
|
flex: 1;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
a {
|
|
49
|
-
text-decoration: none !important;
|
|
50
35
|
}
|
|
@@ -3,12 +3,8 @@
|
|
|
3
3
|
// overwritten by other imported files with the same variable names.
|
|
4
4
|
// Use @use 'root' as root; to avoid namespace collisions.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
//==========================
|
|
8
|
-
// STRUCTURE
|
|
9
|
-
//==========================
|
|
10
6
|
$header-height: 10vh;
|
|
11
7
|
$header-padding-y: 15px;
|
|
12
8
|
$header-padding-x: 15px;
|
|
13
9
|
|
|
14
|
-
$
|
|
10
|
+
$header-footer-color: #11474b;
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
//==========================
|
|
2
|
-
// CSS RULES FOR FOOTER
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
1
|
// Getting root rules from _root.scss
|
|
6
|
-
@use "../root" as root;
|
|
2
|
+
@use "../root" as root; // Usage: root.$value-name
|
|
7
3
|
|
|
8
4
|
footer {
|
|
9
5
|
display: flex;
|
|
6
|
+
flex-wrap: wrap;
|
|
10
7
|
justify-content: space-around;
|
|
11
8
|
width: 100%;
|
|
12
9
|
padding: root.$header-padding-y root.$header-padding-x;
|
|
13
|
-
background-color:
|
|
10
|
+
background-color: root.$header-footer-color;
|
|
14
11
|
|
|
15
12
|
h6 {
|
|
16
13
|
margin-bottom: 0.75rem;
|
|
@@ -22,8 +19,19 @@ footer {
|
|
|
22
19
|
margin: 0;
|
|
23
20
|
}
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
hr {
|
|
23
|
+
width: 100%;
|
|
24
|
+
border: 0;
|
|
25
|
+
border-top: 1px solid rgba(255, 255, 255, 0.2);
|
|
26
|
+
margin: 1.5rem 0 1rem 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.copyright {
|
|
30
|
+
flex-basis: 100%;
|
|
31
|
+
text-align: center;
|
|
32
|
+
|
|
33
|
+
p {
|
|
34
|
+
margin: 0;
|
|
35
|
+
}
|
|
28
36
|
}
|
|
29
37
|
}
|
|
@@ -1,27 +1,30 @@
|
|
|
1
|
-
//==========================
|
|
2
|
-
// CSS RULES FOR HEADER
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
1
|
// Getting root rules from _root.scss
|
|
6
|
-
@use "../root" as root;
|
|
2
|
+
@use "../root" as root; // Usage: root.$value-name
|
|
7
3
|
|
|
8
4
|
header {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
height: root.$header-height;
|
|
6
|
+
width: 100%;
|
|
7
|
+
display: flex;
|
|
8
|
+
justify-content: center;
|
|
9
|
+
align-items: center;
|
|
10
|
+
padding: root.$header-padding-y root.$header-padding-x;
|
|
11
|
+
background-color: root.$header-footer-color;
|
|
16
12
|
}
|
|
17
13
|
|
|
18
14
|
nav {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
15
|
+
display: flex;
|
|
16
|
+
justify-content: space-between;
|
|
17
|
+
align-items: center;
|
|
18
|
+
width: 100%;
|
|
24
19
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
.logo {
|
|
21
|
+
max-height: root.$header-height;
|
|
22
|
+
width: auto;
|
|
23
|
+
text-decoration: none !important;
|
|
24
|
+
|
|
25
|
+
img {
|
|
26
|
+
height: 50px;
|
|
27
|
+
width: auto;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
//==========================
|
|
2
|
-
// CSS RULES FOR TYPOGRAPHY
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
1
|
// Getting root rules from _root.scss
|
|
6
|
-
@use "../root" as root;
|
|
2
|
+
@use "../root" as root; // Usage: root.$value-name
|
|
7
3
|
|
|
8
4
|
html {
|
|
9
5
|
font-size: 16px;
|
|
@@ -12,8 +8,4 @@ html {
|
|
|
12
8
|
|
|
13
9
|
body {
|
|
14
10
|
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
a {
|
|
18
|
-
text-decoration: none;
|
|
19
11
|
}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
|
-
// Use @use with a namespace to avoid framework variable conflicts:
|
|
6
|
-
// Example: root.$primary
|
|
7
|
-
@use "../root" as root;
|
|
1
|
+
// Getting root rules from _root.scss
|
|
2
|
+
@use "../root" as root; // Usage: root.$value-name
|
|
8
3
|
|
|
9
4
|
// This global module contains the import framework, necessary modules for each page and any other common styles
|
|
10
5
|
@import "../global";
|
|
@@ -12,12 +7,7 @@
|
|
|
12
7
|
// Import any other module you need by import down here
|
|
13
8
|
// @import "../modules/moduleName";
|
|
14
9
|
|
|
15
|
-
|
|
16
|
-
// PAGE CUSTOM CSS RULES
|
|
17
|
-
//==========================
|
|
18
|
-
|
|
19
|
-
// Add any custom rule specific to this page below
|
|
20
|
-
// These rules override the framework and module styles
|
|
10
|
+
// Add any custom rule specific to this page below:
|
|
21
11
|
// body {
|
|
22
12
|
// background-color: root.$primary;
|
|
23
|
-
// }
|
|
13
|
+
// }
|
package/tools/cli/ui.js
CHANGED
|
@@ -22,7 +22,7 @@ const LOCAL_VERSION = require('../../package.json').version;
|
|
|
22
22
|
const GLOBAL_VERSION = process.env[GLOBAL_VERSION_FLAG];
|
|
23
23
|
|
|
24
24
|
const TITLE_SUFFIX = GLOBAL_VERSION && GLOBAL_VERSION !== LOCAL_VERSION
|
|
25
|
-
? `
|
|
25
|
+
? ` v${LOCAL_VERSION}`
|
|
26
26
|
: '';
|
|
27
27
|
|
|
28
28
|
const PLAIN_TITLE = `${BOX_TITLE}${TITLE_SUFFIX}`;
|
|
@@ -61,7 +61,6 @@
|
|
|
61
61
|
"nothingToClean": "(i) nothing to clean \u2192 {path}"
|
|
62
62
|
},
|
|
63
63
|
"cli": {
|
|
64
|
-
"usingLocalVersion": "Nibula cli local version ({local})",
|
|
65
64
|
"createPrompt": "Name of the new page: ",
|
|
66
65
|
"removePrompt": "Name of the page to remove: ",
|
|
67
66
|
"renameFromPrompt": "Page to rename: ",
|
|
@@ -70,7 +69,7 @@
|
|
|
70
69
|
"menuPrompt": "Choose an option: ",
|
|
71
70
|
"layoutPrompt": "Select a layout (arrow keys, Enter to confirm):",
|
|
72
71
|
"currentOutputPath": "Current path: \"{path}\"",
|
|
73
|
-
"confirmRemove": "This permanently deletes
|
|
72
|
+
"confirmRemove": "This permanently deletes the source files for \"{name}\". Rebuild to update the output.",
|
|
74
73
|
"cancelled": "Cancelled.",
|
|
75
74
|
"pageNotFound": "Page \"{name}\" does not exist.",
|
|
76
75
|
"sameName": "Old and new name are the same.",
|
|
@@ -71,20 +71,10 @@
|
|
|
71
71
|
"styleTemplate": "template.scss",
|
|
72
72
|
"routeTemplate": "template.njk",
|
|
73
73
|
"layoutExtension": "njk",
|
|
74
|
-
"outputFiles": [
|
|
75
|
-
"js/pages/{camelName}.js",
|
|
76
|
-
"css/pages/{camelName}.css",
|
|
77
|
-
"{pageName}.html",
|
|
78
|
-
"pages/{pageName}.html"
|
|
79
|
-
],
|
|
80
|
-
"outputDirectories": [
|
|
81
|
-
"{pageName}",
|
|
82
|
-
"pages/{pageName}"
|
|
83
|
-
],
|
|
84
74
|
"defaultData": {
|
|
85
75
|
"seo": {
|
|
86
76
|
"title": "{title}",
|
|
87
|
-
"description": "
|
|
77
|
+
"description": "Description",
|
|
88
78
|
"keywords": "",
|
|
89
79
|
"noindex": false,
|
|
90
80
|
"canonical": ""
|
package/tools/lib/pageActions.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const settings = require('../config/settings.json');
|
|
3
3
|
const { PATHS } = require('./paths');
|
|
4
|
-
const { exists, readText, writeText, copyFile, moveFile, removeFile,
|
|
4
|
+
const { exists, readText, writeText, copyFile, moveFile, removeFile, removeDirectoryIfEmpty } = require('./files');
|
|
5
5
|
const { log } = require('./logger');
|
|
6
6
|
const { formatText } = require('./text');
|
|
7
7
|
const { languageSettings } = require('./project');
|
|
@@ -120,8 +120,8 @@ function removePage(pageName) {
|
|
|
120
120
|
}
|
|
121
121
|
if (!readPagesData()) return;
|
|
122
122
|
|
|
123
|
-
const { source
|
|
124
|
-
const files = [source.style, source.script, source.route
|
|
123
|
+
const { source } = getPageArtifacts(pageName);
|
|
124
|
+
const files = [source.style, source.script, source.route];
|
|
125
125
|
|
|
126
126
|
for (const file of files) {
|
|
127
127
|
try {
|
|
@@ -131,14 +131,6 @@ function removePage(pageName) {
|
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
for (const directory of output.directories) {
|
|
135
|
-
try {
|
|
136
|
-
if (removeDirectory(directory)) log('page.fileDeleted', { path: directory });
|
|
137
|
-
} catch (error) {
|
|
138
|
-
log('page.deleteFailed', { path: directory, error: error.message });
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
134
|
removePageData(pageName);
|
|
143
135
|
|
|
144
136
|
const sourceDirectories = [source.style, source.script, source.route].map(file => path.dirname(file));
|
|
@@ -3,18 +3,7 @@ const settings = require('../config/settings.json');
|
|
|
3
3
|
const { PATHS } = require('./paths');
|
|
4
4
|
const { exists } = require('./files');
|
|
5
5
|
const { languageSettings, scriptPagesDirectory } = require('./project');
|
|
6
|
-
const {
|
|
7
|
-
const { toCamelCase, formatText } = require('./text');
|
|
8
|
-
|
|
9
|
-
const PATH_SEPARATOR = '/';
|
|
10
|
-
|
|
11
|
-
function outputRoot() {
|
|
12
|
-
return path.join(PATHS.root, getCurrentOutputPath() || settings.project.defaultOutputDirectory);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function resolveOutput(root, template, values) {
|
|
16
|
-
return path.join(root, ...formatText(template, values).split(PATH_SEPARATOR));
|
|
17
|
-
}
|
|
6
|
+
const { toCamelCase } = require('./text');
|
|
18
7
|
|
|
19
8
|
function routeFile(pageName) {
|
|
20
9
|
return path.join(PATHS.routes, `${pageName}.${settings.page.routeExtension}`);
|
|
@@ -26,8 +15,6 @@ function pageExists(pageName) {
|
|
|
26
15
|
|
|
27
16
|
function getPageArtifacts(pageName) {
|
|
28
17
|
const camelName = toCamelCase(pageName);
|
|
29
|
-
const values = { camelName, pageName };
|
|
30
|
-
const root = outputRoot();
|
|
31
18
|
|
|
32
19
|
return {
|
|
33
20
|
camelName,
|
|
@@ -36,11 +23,7 @@ function getPageArtifacts(pageName) {
|
|
|
36
23
|
script: path.join(scriptPagesDirectory(), `${camelName}.${languageSettings().extension}`),
|
|
37
24
|
route: routeFile(pageName),
|
|
38
25
|
},
|
|
39
|
-
output: {
|
|
40
|
-
files: settings.page.outputFiles.map((template) => resolveOutput(root, template, values)),
|
|
41
|
-
directories: settings.page.outputDirectories.map((template) => resolveOutput(root, template, values)),
|
|
42
|
-
},
|
|
43
26
|
};
|
|
44
27
|
}
|
|
45
28
|
|
|
46
|
-
module.exports = { getPageArtifacts, pageExists };
|
|
29
|
+
module.exports = { getPageArtifacts, pageExists };
|
|
@@ -9,7 +9,7 @@ layout: base.njk
|
|
|
9
9
|
|
|
10
10
|
{# Markdown files live in components/ too. Pass the data the file needs #}
|
|
11
11
|
{#
|
|
12
|
-
<
|
|
13
|
-
{% renderFile "your-file.md" |
|
|
14
|
-
</
|
|
12
|
+
<div class="markdown-body">
|
|
13
|
+
{% renderFile "your-file.md" | componentsPath, { alias: fileName }, "njk,md" %}
|
|
14
|
+
</div>
|
|
15
15
|
#}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
|
-
// Use @use with a namespace to avoid framework variable conflicts:
|
|
6
|
-
// Example: root.$primary
|
|
7
|
-
@use "../root" as root;
|
|
1
|
+
// Getting root rules from _root.scss
|
|
2
|
+
@use "../root" as root; // Usage: root.$value-name
|
|
8
3
|
|
|
9
4
|
// This global module contains the import framework, necessary modules for each page and any other common styles
|
|
10
5
|
@import "../global";
|
|
@@ -12,12 +7,7 @@
|
|
|
12
7
|
// Import any other module you need by import down here
|
|
13
8
|
// @import "../modules/moduleName";
|
|
14
9
|
|
|
15
|
-
|
|
16
|
-
// PAGE CUSTOM CSS RULES
|
|
17
|
-
//==========================
|
|
18
|
-
|
|
19
|
-
// Add any custom rule specific to this page below
|
|
20
|
-
// These rules override the framework and module styles
|
|
10
|
+
// Add any custom rule specific to this page below:
|
|
21
11
|
// body {
|
|
22
|
-
// background-color: root.$primary
|
|
23
|
-
// }
|
|
12
|
+
// background-color: root.$primary;
|
|
13
|
+
// }
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
//==========================
|
|
2
|
-
// CSS RULES FOR ANIMATIONS
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
|
-
// Getting root rules from _root.scss
|
|
6
|
-
@use "../root" as root;
|
|
7
|
-
|
|
8
|
-
.fade-in {
|
|
9
|
-
animation: fadeIn 1s;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
@keyframes fadeIn {
|
|
13
|
-
from {
|
|
14
|
-
opacity: 0;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
to {
|
|
18
|
-
opacity: 1;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
@keyframes spin {
|
|
23
|
-
from { transform: rotate(0deg); }
|
|
24
|
-
to { transform: rotate(360deg); }
|
|
25
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
//==========================
|
|
2
|
-
// CSS RULES FOR RESPONSIVE
|
|
3
|
-
//==========================
|
|
4
|
-
|
|
5
|
-
// Getting root rules from _root.scss
|
|
6
|
-
@use "../root" as root;
|
|
7
|
-
|
|
8
|
-
//==========================
|
|
9
|
-
// MEDIA QUERIES
|
|
10
|
-
//==========================
|
|
11
|
-
|
|
12
|
-
@media (max-width: 1400px) {
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
@media (max-width: 1200px) {
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
@media (max-width: 992px) {
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
@media (max-width: 768px) {
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
@media (max-width: 576px) {
|
|
29
|
-
|
|
30
|
-
}
|