create-berna-stencil 1.0.49 → 1.0.51

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.
Files changed (177) hide show
  1. package/_tools/modules/updateIncludes.js +1 -1
  2. package/bin/create.js +2 -2
  3. package/docs/Components.md +54 -33
  4. package/docs/Head and SEO.md +33 -6
  5. package/docs/Styling with SCSS.md +8 -6
  6. package/package.json +58 -62
  7. package/src/backend/_core/vendor/composer/autoload_static.php +10 -10
  8. package/src/backend/_core/vendor/composer/installed.json +6 -6
  9. package/src/backend/_core/vendor/composer/installed.php +2 -2
  10. package/src/backend/_core/vendor/graham-campbell/result-type/.gitattributes +9 -0
  11. package/src/backend/_core/vendor/graham-campbell/result-type/.github/CODE_OF_CONDUCT.md +132 -0
  12. package/src/backend/_core/vendor/graham-campbell/result-type/.github/CONTRIBUTING.md +31 -0
  13. package/src/backend/_core/vendor/graham-campbell/result-type/.github/FUNDING.yml +2 -0
  14. package/src/backend/_core/vendor/graham-campbell/result-type/.github/SECURITY.md +14 -0
  15. package/src/backend/_core/vendor/graham-campbell/result-type/.github/workflows/stale.yml +11 -0
  16. package/src/backend/_core/vendor/graham-campbell/result-type/.github/workflows/tests.yml +40 -0
  17. package/src/backend/_core/vendor/graham-campbell/result-type/CHANGELOG.md +53 -0
  18. package/src/backend/_core/vendor/graham-campbell/result-type/LICENSE +21 -21
  19. package/src/backend/_core/vendor/graham-campbell/result-type/README.md +42 -0
  20. package/src/backend/_core/vendor/graham-campbell/result-type/composer.json +33 -33
  21. package/src/backend/_core/vendor/graham-campbell/result-type/phpunit.xml.dist +13 -0
  22. package/src/backend/_core/vendor/graham-campbell/result-type/src/Error.php +121 -121
  23. package/src/backend/_core/vendor/graham-campbell/result-type/src/Result.php +69 -69
  24. package/src/backend/_core/vendor/graham-campbell/result-type/src/Success.php +120 -120
  25. package/src/backend/_core/vendor/graham-campbell/result-type/tests/ResultTest.php +95 -0
  26. package/src/backend/_core/vendor/phpoption/phpoption/.gitattributes +13 -0
  27. package/src/backend/_core/vendor/phpoption/phpoption/.github/CODE_OF_CONDUCT.md +132 -0
  28. package/src/backend/_core/vendor/phpoption/phpoption/.github/CONTRIBUTING.md +30 -0
  29. package/src/backend/_core/vendor/phpoption/phpoption/.github/FUNDING.yml +2 -0
  30. package/src/backend/_core/vendor/phpoption/phpoption/.github/SECURITY.md +14 -0
  31. package/src/backend/_core/vendor/phpoption/phpoption/.github/workflows/static.yml +40 -0
  32. package/src/backend/_core/vendor/phpoption/phpoption/.github/workflows/tests.yml +40 -0
  33. package/src/backend/_core/vendor/phpoption/phpoption/LICENSE +200 -200
  34. package/src/backend/_core/vendor/phpoption/phpoption/Makefile +17 -0
  35. package/src/backend/_core/vendor/phpoption/phpoption/README.md +201 -0
  36. package/src/backend/_core/vendor/phpoption/phpoption/composer.json +50 -50
  37. package/src/backend/_core/vendor/phpoption/phpoption/phpstan-baseline.neon +44 -0
  38. package/src/backend/_core/vendor/phpoption/phpoption/phpstan.neon.dist +7 -0
  39. package/src/backend/_core/vendor/phpoption/phpoption/phpunit.xml.dist +13 -0
  40. package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php +175 -175
  41. package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/None.php +136 -136
  42. package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Option.php +434 -434
  43. package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Some.php +169 -169
  44. package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/EnsureTest.php +72 -0
  45. package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/LazyOptionTest.php +357 -0
  46. package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/NoneTest.php +153 -0
  47. package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/OptionTest.php +166 -0
  48. package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/SomeTest.php +194 -0
  49. package/src/backend/_core/vendor/phpoption/phpoption/tests/bootstrap.php +8 -0
  50. package/src/backend/_core/vendor/phpoption/phpoption/vendor-bin/phpstan/composer.json +8 -0
  51. package/src/backend/_core/vendor/symfony/polyfill-ctype/Ctype.php +232 -232
  52. package/src/backend/_core/vendor/symfony/polyfill-ctype/LICENSE +19 -19
  53. package/src/backend/_core/vendor/symfony/polyfill-ctype/README.md +12 -12
  54. package/src/backend/_core/vendor/symfony/polyfill-ctype/bootstrap.php +50 -50
  55. package/src/backend/_core/vendor/symfony/polyfill-ctype/bootstrap80.php +46 -46
  56. package/src/backend/_core/vendor/symfony/polyfill-ctype/composer.json +38 -38
  57. package/src/backend/_core/vendor/symfony/polyfill-mbstring/LICENSE +19 -19
  58. package/src/backend/_core/vendor/symfony/polyfill-mbstring/Mbstring.php +1077 -1077
  59. package/src/backend/_core/vendor/symfony/polyfill-mbstring/README.md +13 -13
  60. package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +119 -119
  61. package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +1397 -1397
  62. package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -5
  63. package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +1489 -1489
  64. package/src/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap.php +171 -171
  65. package/src/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap80.php +167 -167
  66. package/src/backend/_core/vendor/symfony/polyfill-mbstring/composer.json +39 -39
  67. package/src/backend/_core/vendor/symfony/polyfill-php80/LICENSE +19 -19
  68. package/src/backend/_core/vendor/symfony/polyfill-php80/Php80.php +115 -115
  69. package/src/backend/_core/vendor/symfony/polyfill-php80/PhpToken.php +106 -106
  70. package/src/backend/_core/vendor/symfony/polyfill-php80/README.md +25 -25
  71. package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +31 -31
  72. package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php +16 -16
  73. package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +20 -20
  74. package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php +16 -16
  75. package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php +16 -16
  76. package/src/backend/_core/vendor/symfony/polyfill-php80/bootstrap.php +42 -42
  77. package/src/backend/_core/vendor/symfony/polyfill-php80/composer.json +37 -37
  78. package/src/backend/_core/vendor/vlucas/phpdotenv/.editorconfig +15 -0
  79. package/src/backend/_core/vendor/vlucas/phpdotenv/.gitattributes +15 -0
  80. package/src/backend/_core/vendor/vlucas/phpdotenv/.github/CODE_OF_CONDUCT.md +132 -0
  81. package/src/backend/_core/vendor/vlucas/phpdotenv/.github/CONTRIBUTING.md +30 -0
  82. package/src/backend/_core/vendor/vlucas/phpdotenv/.github/FUNDING.yml +2 -0
  83. package/src/backend/_core/vendor/vlucas/phpdotenv/.github/SECURITY.md +14 -0
  84. package/src/backend/_core/vendor/vlucas/phpdotenv/.github/workflows/static.yml +40 -0
  85. package/src/backend/_core/vendor/vlucas/phpdotenv/.github/workflows/tests.yml +70 -0
  86. package/src/backend/_core/vendor/vlucas/phpdotenv/LICENSE +30 -30
  87. package/src/backend/_core/vendor/vlucas/phpdotenv/Makefile +17 -0
  88. package/src/backend/_core/vendor/vlucas/phpdotenv/README.md +370 -0
  89. package/src/backend/_core/vendor/vlucas/phpdotenv/UPGRADING.md +196 -0
  90. package/src/backend/_core/vendor/vlucas/phpdotenv/composer.json +60 -60
  91. package/src/backend/_core/vendor/vlucas/phpdotenv/phpstan-baseline.neon +157 -0
  92. package/src/backend/_core/vendor/vlucas/phpdotenv/phpstan.neon.dist +7 -0
  93. package/src/backend/_core/vendor/vlucas/phpdotenv/phpunit.xml.dist +13 -0
  94. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Dotenv.php +267 -267
  95. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php +12 -12
  96. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php +12 -12
  97. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php +12 -12
  98. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php +12 -12
  99. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php +12 -12
  100. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Loader.php +48 -48
  101. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php +20 -20
  102. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Resolver.php +65 -65
  103. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Entry.php +59 -59
  104. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php +299 -299
  105. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lexer.php +58 -58
  106. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lines.php +127 -127
  107. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Parser.php +53 -53
  108. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php +19 -19
  109. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Value.php +88 -88
  110. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php +15 -15
  111. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php +89 -89
  112. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php +80 -80
  113. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php +88 -88
  114. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php +85 -85
  115. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php +110 -110
  116. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php +48 -48
  117. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php +64 -64
  118. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php +91 -91
  119. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php +17 -17
  120. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php +104 -104
  121. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php +88 -88
  122. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php +27 -27
  123. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php +107 -107
  124. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php +272 -272
  125. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php +51 -51
  126. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Paths.php +44 -44
  127. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Reader.php +81 -81
  128. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/FileStore.php +72 -72
  129. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php +141 -141
  130. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php +17 -17
  131. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/StringStore.php +37 -37
  132. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Util/Regex.php +112 -112
  133. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Util/Str.php +108 -108
  134. package/src/backend/_core/vendor/vlucas/phpdotenv/src/Validator.php +207 -207
  135. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/DotenvTest.php +387 -0
  136. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Loader/LoaderTest.php +86 -0
  137. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/EntryParserTest.php +234 -0
  138. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LexerTest.php +40 -0
  139. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LinesTest.php +53 -0
  140. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/ParserTest.php +98 -0
  141. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ArrayAdapterTest.php +57 -0
  142. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/EnvConstAdapterTest.php +75 -0
  143. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/PutenvAdapterTest.php +52 -0
  144. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ServerConstAdapterTest.php +75 -0
  145. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/RepositoryTest.php +305 -0
  146. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Store/StoreTest.php +141 -0
  147. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/ValidatorTest.php +479 -0
  148. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/.env +5 -0
  149. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/assertions.env +18 -0
  150. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/booleans.env +33 -0
  151. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/commented.env +15 -0
  152. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/empty.env +1 -0
  153. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/example.env +1 -0
  154. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/exported.env +7 -0
  155. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/immutable.env +1 -0
  156. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/integers.env +17 -0
  157. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/large.env +2 -0
  158. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multibyte.env +3 -0
  159. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiline.env +14 -0
  160. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiple.env +4 -0
  161. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/mutable.env +1 -0
  162. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/nested.env +15 -0
  163. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/quoted.env +11 -0
  164. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/specialchars.env +8 -0
  165. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/unicodevarnames.env +2 -0
  166. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/utf8-with-bom-encoding.env +3 -0
  167. package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/windows.env +1 -0
  168. package/src/backend/_core/vendor/vlucas/phpdotenv/vendor-bin/phpstan/composer.json +15 -0
  169. package/src/frontend/components/layouts/includes.njk +1 -0
  170. package/src/frontend/data/site.json +43 -43
  171. package/src/frontend/llms.njk +18 -0
  172. package/src/frontend/robots.njk +8 -0
  173. package/src/frontend/scss/modules/frameworks/_bootstrap.scss +63 -63
  174. package/src/frontend/scss/modules/frameworks/_bulma.scss +64 -64
  175. package/src/frontend/scss/modules/frameworks/_foundation.scss +97 -97
  176. package/src/frontend/scss/modules/frameworks/_uikit.scss +78 -78
  177. package/src/frontend/robots.txt +0 -4
@@ -15,7 +15,7 @@ function addLayout(pageName) {
15
15
 
16
16
  if (content.includes(`{% elif title == "${camelName}" %}`)) return;
17
17
 
18
- const newElif = `{% elif title == "${camelName}" %}\n {#{% include "component.njk" %}#}\n\n`;
18
+ const newElif = `{% elif title == "${camelName}" %}\n {# Insert your includes under this page #}\n {#{% include "component.njk" %}#}\n\n`;
19
19
  const updatedContent = content.replace('{% else %}', `${newElif}{% else %}`);
20
20
 
21
21
  fileSystem.writeFileSync(INCLUDES_PATH, updatedContent);
package/bin/create.js CHANGED
@@ -19,11 +19,11 @@ const PROJECT_PACKAGE = {
19
19
  version: '1.0.47',
20
20
  private: true,
21
21
  scripts: {
22
- "build:css": "sass src/frontend/scss:out/css --no-source-map --style=compressed --quiet",
22
+ "build:css": "sass src/frontend/scss:out/css --no-source-map --style=compressed --quiet --load-path=node_modules",
23
23
  "build:js": "esbuild \"src/frontend/js/pages/*.js\" --bundle --outdir=out/js/pages --minify",
24
24
  "build:11ty": "eleventy",
25
25
  "build": "npm run build:css && npm run build:js && npm run build:11ty",
26
- "serve:css": "sass --watch src/frontend/scss:out/css --no-source-map --quiet",
26
+ "serve:css": "sass --watch src/frontend/scss:out/css --no-source-map --quiet --load-path=node_modules",
27
27
  "serve:js": "esbuild \"src/frontend/js/pages/*.js\" --bundle --outdir=out/js/pages --watch",
28
28
  "serve:11ty": "eleventy --serve --quiet",
29
29
  "clean": "node _tools/cleanOutput.js",
@@ -1,62 +1,83 @@
1
- # To be finished...
1
+ # Nunjucks (HTML) Components
2
2
 
3
- # Components
3
+ ## What is Nunjucks
4
+
5
+ Nunjucks (`.njk`) is an HTML file that supports logic like variables, `if` statements, and `for` loops. It can extend a base layout and include other `.njk` components
4
6
 
5
7
  ## Create a component
6
8
 
7
- Add a Nunjucks file in `src/components/`:
9
+ Create a new `.njk` file anywhere inside `src/frontend/components/`. You can organize them into subfolders freely
8
10
 
9
11
  ```
10
- src/components/myComponent.njk
12
+ src/frontend/components/
13
+ ├── global/
14
+ ├── layouts/
15
+ ├── modals/
16
+ │ └── privacyModal.njk # You can move it to a modals/subfolder
17
+ ├── welcome.njk
11
18
  ```
12
19
 
13
- ## Subfolders
20
+ ## Include a component
14
21
 
15
- Components can be organized into subfolders freely. Some examples:
22
+ To render a component inside a page, navigate to `src/frontend/components/layouts/` and edit `includes.njk`
16
23
 
17
- ```
18
- src/components/
19
- ├── global/ # Header, footer — included in every page
20
- ├── pages/ # Page-specific components
21
- │ ├── homepage.njk
22
- │ └── contactUs.njk
23
- └── modals/ # Shared modals (privacy, cookies, etc.)
24
- └── privacyModal.njk
25
- ```
24
+ ### includes.njk <small>(`src/frontend/components/layouts/`)</small>
25
+
26
+ ```js
27
+ {% if title == "homepage" %}
28
+ {% include "welcome.njk" %}
26
29
 
27
- The include path must reflect the subfolder:
30
+ {% elif title == "examplePage" %}
31
+ {% include "exampleComponent1.njk" %}
32
+ {% include "subfolder/exampleComponent2.njk" %}
28
33
 
29
- ```njk
30
- {% include "pages/homepage.njk" %}
31
- {% include "modals/privacyModal.njk" %}
34
+ {% else %}
35
+ {% include "404/_404.njk" %}
36
+ {{ content | safe }}
37
+ {% endif %}
32
38
  ```
33
39
 
34
- ## Register it for a page
40
+ Add a new `{% elif %}` block for each page, listing its components in order. If a component lives in a subfolder, specify the relative path accordingly
35
41
 
36
- In `src/layouts/includes.njk`, find the `elif` block for your page and include the component:
42
+ > ⚠️ A new `elif` block is automatically added when you create a page via the Assistant CLI
37
43
 
38
- ```njk
39
- {% elif title == "myPage" %}
40
- {% include "myComponent.njk" %}
41
- ```
44
+ > ⚠️ If you move or delete a component, always update `includes.njk` or the site will break
45
+
46
+ ## Nest components
42
47
 
43
- Multiple components can be included in the same block:
48
+ A component can include other components. This is useful for breaking complex sections into smaller, reusable pieces.
44
49
 
45
- ```njk
46
- {% elif title == "myPage" %}
47
- {% include "hero.njk" %}
48
- {% include "features.njk" %}
50
+ ### exampleComponent.njk
51
+ ```js
52
+ <section class="hero">
53
+ {% include "ui/heroTitle.njk" %}
54
+ {% include "ui/heroButton.njk" %}
55
+ </section>
49
56
  ```
50
57
 
58
+ > The same path rules apply: if the included component is in a subfolder, specify the full relative path.
59
+
51
60
  ## Global components
52
61
 
53
- Header and footer live in `src/components/global/` and are automatically included in every page via `base.njk`. Edit them to change the site-wide layout.
62
+ Header and footer live in `src/frontend/components/global/` and are automatically included in every page via `base.njk`. Edit them to change the site-wide layout
54
63
 
55
64
  ## Site data in components
56
65
 
57
- All values from `src/data/site.json` are available as `{{ site.* }}`:
66
+ All values defined in `src/data/site.json` are globally available in every component via `{{ site.* }}`
67
+
68
+ ### site.json <small>(`src/data/`)</small>
69
+ ```json
70
+ {
71
+ "title": "My Site",
72
+ "logo": "/img/logo.png",
73
+ "legal": {
74
+ "privacy": "/privacy"
75
+ }
76
+ }
77
+ ```
58
78
 
59
- ```njk
79
+ ### Usage in any `.njk` file
80
+ ```js
60
81
  <p>{{ site.title }}</p>
61
82
  <a href="{{ site.legal.privacy }}">Privacy Policy</a>
62
83
  <img src="{{ site.logo }}" alt="{{ site.title }}">
@@ -1,9 +1,9 @@
1
1
  # Head & SEO
2
2
 
3
3
 
4
- `src/frontend/data/site.json` holds global settings used across all pages in `base.njk` and other components:
4
+ This json holds global settings used across all pages in `base.njk` and other components:
5
5
 
6
- ### site.json
6
+ ### site.json <small>`src/frontend/data/`</small>
7
7
  ```json
8
8
  "site_name": "Site name",
9
9
  "title": "Site title",
@@ -25,7 +25,7 @@ Each page entry is keyed by its camelCase `title` from the front matter:
25
25
 
26
26
  If you don't want to use a particular cdn inserting it in `base.njk` for all pages, you can add extra specific cdn (css, js) by inserting the link in each page of site.json separating them with a `,` and setting them in ""
27
27
 
28
- ### site.json
28
+ ### site.json <small>`src/frontend/data/`</small>
29
29
  ```json
30
30
  "pages": {
31
31
  ...
@@ -35,10 +35,37 @@ If you don't want to use a particular cdn inserting it in `base.njk` for all pag
35
35
  "description": "description"
36
36
  },
37
37
  "cdn": {
38
- "css": [],
39
- "js": []
38
+ // You can leave the [] empty
39
+ "css": ["https://example1.com/lib.min.css", "https://example2.com/lib.min.css"],
40
+ "js": ["https://example1.com/lib.min.js", "https://example2.com/lib.min.js"]
40
41
  }
41
42
  }
42
43
  ...
43
44
  }
44
- ```
45
+ ```
46
+
47
+ ## AI & SEO bots
48
+
49
+ `llms.txt` and `robots.txt` are generated automatically from `site.json` via their respective `.njk` files — no manual editing needed.
50
+
51
+ | File | Purpose | Reachable at |
52
+ |---|---|---|
53
+ | `llms.njk` | Tells AI models what your site is about | `yoursite.com/llms.txt` |
54
+ | `robots.njk` | Controls search engine crawling | `yoursite.com/robots.txt` |
55
+
56
+ To customize them, edit `src/llms.njk` or `src/robots.njk` directly.
57
+
58
+ ## Configuration field description
59
+
60
+ | Field | Purpose |
61
+ |---|---|
62
+ | `site_name` | Brand name (used in meta tags) |
63
+ | `title` | Default page title |
64
+ | `description` | Default meta description |
65
+ | `keywords` | Default meta keywords |
66
+ | `domain` / `url` | Used for canonical URLs and og:url |
67
+ | `lang` | HTML `lang` attribute |
68
+ | `author` | Meta author tag |
69
+ | `data_bs_theme` | Bootstrap color scheme (`light` / `dark`) |
70
+ | `favicon` | Path to the favicon |
71
+ | `logo` | Path to the logo (available as `{{ site.logo }}`) |
@@ -61,7 +61,7 @@ To enable/disable them you have to modify 3 files around the project by just com
61
61
  {# Bulma — no JS needed #}
62
62
  ```
63
63
 
64
- ### 3. `.eleventy.js`
64
+ ### 3. .eleventy.js
65
65
 
66
66
  ```javascript
67
67
  eleventyConfig.addPassthroughCopy({
@@ -83,8 +83,8 @@ eleventyConfig.addPassthroughCopy({
83
83
  ### Reducing bundle size
84
84
  To reduce the bundle size, open the corresponding framework file (`src/frontend/scss/modules/frameworks/`) and comment out any modules you don't need
85
85
  ```scss
86
- @import "../../../../../node_modules/bootstrap/scss/card"; // Cards
87
- @import "../../../../../node_modules/bootstrap/scss/carousel"; // Carousel
86
+ @import "bootstrap/scss/card"; // Cards
87
+ @import "bootstrap/scss/carousel"; // Carousel
88
88
  ```
89
89
 
90
90
  ## Global Variables
@@ -131,8 +131,10 @@ body {
131
131
  |---|---|
132
132
  | `_root.scss` | Global variables (colors, spacing) |
133
133
  | `_global.scss` | Site-wide base rules and frameworks |
134
- | `_animations.scss` | Keyframe animations (`fade-in`, `spin`) |
134
+ | `_typography.scss` | Font rules
135
135
  | `_header.scss` | Header styles |
136
136
  | `_footer.scss` | Footer styles |
137
- | `_notification.scss` | Notification component style |
138
- | `_mobile.scss` | Media query rules |
137
+ | `_mobile.scss` | Media query rules |
138
+ | `_buttons.scss` | Style and hovers for buttons
139
+ | `_animations.scss` | Keyframe animations (`fade-in`, `spin`) |
140
+ | `_notification.scss` | Notification component style |
package/package.json CHANGED
@@ -1,63 +1,59 @@
1
- {
2
- "name": "create-berna-stencil",
3
- "version": "1.0.49",
4
- "description": "Eleventy boilerplate with per-page SCSS/JS pipeline, esbuild bundling, multi-framework CSS support and a built-in page management CLI",
5
- "keywords": [],
6
- "author": "Michele Garofalo",
7
- "license": "MIT",
8
- "repository": {
9
- "type": "git",
10
- "url": "https://github.com/rhaastrake/berna-stencil"
11
- },
12
- "homepage": "https://github.com/rhaastrake/berna-stencil#readme",
13
- "bugs": {
14
- "url": "https://github.com/rhaastrake/berna-stencil/issues"
15
- },
16
- "bin": {
17
- "create-berna-stencil": "bin/create.js"
18
- },
19
- "files": [
20
- "bin/",
21
- "docs/",
22
- "src/",
23
- "src/_routes",
24
- "src/assets/files",
25
- "src/assets/videos",
26
- "src/assets/images",
27
- "_tools/",
28
- ".eleventy.js",
29
- ".eleventyignore",
30
- ".gitignore"
31
- ],
32
- "engines": {
33
- "node": ">=18.0.0"
34
- },
35
- "dependencies": {
36
- "@11ty/eleventy": "^3.1.2",
37
- "@11ty/eleventy-img": "^6.0.4",
38
- "bootstrap": "^5.3.8",
39
- "bootstrap-icons": "^1.13.1",
40
- "bulma": "^1.0.4",
41
- "foundation-sites": "^6.9.0",
42
- "glob": "^13.0.6",
43
- "uikit": "^3.25.13"
44
- },
45
- "devDependencies": {
46
- "concurrently": "^9.2.1",
47
- "esbuild": "^0.27.3",
48
- "sass": "^1.77.0"
49
- },
50
- "scripts": {
51
- "build:css": "sass src/frontend/scss:out/css --no-source-map --style=compressed --quiet",
52
- "build:js": "esbuild \"src/frontend/js/pages/*.js\" --bundle --outdir=out/js/pages --minify",
53
- "build:11ty": "eleventy",
54
- "build": "npm run build:css && npm run build:js && npm run build:11ty",
55
- "serve:css": "sass --watch src/frontend/scss:out/css --no-source-map --quiet",
56
- "serve:js": "esbuild \"src/frontend/js/pages/*.js\" --bundle --outdir=out/js/pages --watch",
57
- "serve:11ty": "eleventy --serve --quiet",
58
- "clean": "node _tools/cleanOutput.js",
59
- "serve": "npm run clean && concurrently \"npm run serve:11ty\" \"npm run serve:css\" \"npm run serve:js\"",
60
- "assistant": "node _tools/assistant.js",
61
- "postinstall": "cd src/backend/_core && composer install --quiet"
62
- }
1
+ {
2
+ "name": "create-berna-stencil",
3
+ "version": "1.0.51",
4
+ "description": "Eleventy boilerplate with per-page SCSS/JS pipeline, esbuild bundling, multi-framework CSS support and a built-in page management CLI",
5
+ "keywords": [],
6
+ "author": "Michele Garofalo",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/rhaastrake/berna-stencil"
11
+ },
12
+ "homepage": "https://github.com/rhaastrake/berna-stencil#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/rhaastrake/berna-stencil/issues"
15
+ },
16
+ "bin": {
17
+ "create-berna-stencil": "bin/create.js"
18
+ },
19
+ "files": [
20
+ "bin/",
21
+ "docs/",
22
+ "src/",
23
+ "_tools/",
24
+ ".eleventy.js",
25
+ ".eleventyignore",
26
+ ".gitignore"
27
+ ],
28
+ "engines": {
29
+ "node": ">=18.0.0"
30
+ },
31
+ "dependencies": {
32
+ "@11ty/eleventy": "^3.1.2",
33
+ "@11ty/eleventy-img": "^6.0.4",
34
+ "bootstrap": "^5.3.8",
35
+ "bootstrap-icons": "^1.13.1",
36
+ "bulma": "^1.0.4",
37
+ "foundation-sites": "^6.9.0",
38
+ "glob": "^13.0.6",
39
+ "uikit": "^3.25.13"
40
+ },
41
+ "devDependencies": {
42
+ "concurrently": "^9.2.1",
43
+ "esbuild": "^0.27.3",
44
+ "sass": "^1.77.0"
45
+ },
46
+ "scripts": {
47
+ "build:css": "sass src/frontend/scss:out/css --no-source-map --style=compressed --quiet --load-path=node_modules",
48
+ "build:js": "esbuild \"src/frontend/js/pages/*.js\" --bundle --outdir=out/js/pages --minify",
49
+ "build:11ty": "eleventy",
50
+ "build": "npm run build:css && npm run build:js && npm run build:11ty",
51
+ "serve:css": "sass --watch src/frontend/scss:out/css --no-source-map --quiet --load-path=node_modules",
52
+ "serve:js": "esbuild \"src/frontend/js/pages/*.js\" --bundle --outdir=out/js/pages --watch",
53
+ "serve:11ty": "eleventy --serve --quiet",
54
+ "clean": "node _tools/cleanOutput.js",
55
+ "serve": "npm run clean && concurrently \"npm run serve:11ty\" \"npm run serve:css\" \"npm run serve:js\"",
56
+ "assistant": "node _tools/assistant.js",
57
+ "postinstall": "cd src/backend/_core && composer install --quiet"
58
+ }
63
59
  }
@@ -13,48 +13,48 @@ class ComposerStaticInit108be68e4e2b97fed51d36a10eed0849
13
13
  );
14
14
 
15
15
  public static $prefixLengthsPsr4 = array (
16
- 'S' =>
16
+ 'S' =>
17
17
  array (
18
18
  'Symfony\\Polyfill\\Php80\\' => 23,
19
19
  'Symfony\\Polyfill\\Mbstring\\' => 26,
20
20
  'Symfony\\Polyfill\\Ctype\\' => 23,
21
21
  ),
22
- 'P' =>
22
+ 'P' =>
23
23
  array (
24
24
  'PhpOption\\' => 10,
25
25
  ),
26
- 'G' =>
26
+ 'G' =>
27
27
  array (
28
28
  'GrahamCampbell\\ResultType\\' => 26,
29
29
  ),
30
- 'D' =>
30
+ 'D' =>
31
31
  array (
32
32
  'Dotenv\\' => 7,
33
33
  ),
34
34
  );
35
35
 
36
36
  public static $prefixDirsPsr4 = array (
37
- 'Symfony\\Polyfill\\Php80\\' =>
37
+ 'Symfony\\Polyfill\\Php80\\' =>
38
38
  array (
39
39
  0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
40
40
  ),
41
- 'Symfony\\Polyfill\\Mbstring\\' =>
41
+ 'Symfony\\Polyfill\\Mbstring\\' =>
42
42
  array (
43
43
  0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
44
44
  ),
45
- 'Symfony\\Polyfill\\Ctype\\' =>
45
+ 'Symfony\\Polyfill\\Ctype\\' =>
46
46
  array (
47
47
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
48
48
  ),
49
- 'PhpOption\\' =>
49
+ 'PhpOption\\' =>
50
50
  array (
51
51
  0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption',
52
52
  ),
53
- 'GrahamCampbell\\ResultType\\' =>
53
+ 'GrahamCampbell\\ResultType\\' =>
54
54
  array (
55
55
  0 => __DIR__ . '/..' . '/graham-campbell/result-type/src',
56
56
  ),
57
- 'Dotenv\\' =>
57
+ 'Dotenv\\' =>
58
58
  array (
59
59
  0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src',
60
60
  ),
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "time": "2025-12-27T19:43:20+00:00",
26
26
  "type": "library",
27
- "installation-source": "dist",
27
+ "installation-source": "source",
28
28
  "autoload": {
29
29
  "psr-4": {
30
30
  "GrahamCampbell\\ResultType\\": "src/"
@@ -98,7 +98,7 @@
98
98
  "dev-master": "1.9-dev"
99
99
  }
100
100
  },
101
- "installation-source": "dist",
101
+ "installation-source": "source",
102
102
  "autoload": {
103
103
  "psr-4": {
104
104
  "PhpOption\\": "src/PhpOption/"
@@ -175,7 +175,7 @@
175
175
  "name": "symfony/polyfill"
176
176
  }
177
177
  },
178
- "installation-source": "dist",
178
+ "installation-source": "source",
179
179
  "autoload": {
180
180
  "files": [
181
181
  "bootstrap.php"
@@ -262,7 +262,7 @@
262
262
  "name": "symfony/polyfill"
263
263
  }
264
264
  },
265
- "installation-source": "dist",
265
+ "installation-source": "source",
266
266
  "autoload": {
267
267
  "files": [
268
268
  "bootstrap.php"
@@ -343,7 +343,7 @@
343
343
  "name": "symfony/polyfill"
344
344
  }
345
345
  },
346
- "installation-source": "dist",
346
+ "installation-source": "source",
347
347
  "autoload": {
348
348
  "files": [
349
349
  "bootstrap.php"
@@ -447,7 +447,7 @@
447
447
  "dev-master": "5.6-dev"
448
448
  }
449
449
  },
450
- "installation-source": "dist",
450
+ "installation-source": "source",
451
451
  "autoload": {
452
452
  "psr-4": {
453
453
  "Dotenv\\": "src/"
@@ -3,7 +3,7 @@
3
3
  'name' => '__root__',
4
4
  'pretty_version' => 'dev-main',
5
5
  'version' => 'dev-main',
6
- 'reference' => 'abd41735fb0323798fbaca8b317b15190d4c5da6',
6
+ 'reference' => '4da27b8f50bb1a801f88ad46a9e9eafa51c1bb34',
7
7
  'type' => 'library',
8
8
  'install_path' => __DIR__ . '/../../',
9
9
  'aliases' => array(),
@@ -13,7 +13,7 @@
13
13
  '__root__' => array(
14
14
  'pretty_version' => 'dev-main',
15
15
  'version' => 'dev-main',
16
- 'reference' => 'abd41735fb0323798fbaca8b317b15190d4c5da6',
16
+ 'reference' => '4da27b8f50bb1a801f88ad46a9e9eafa51c1bb34',
17
17
  'type' => 'library',
18
18
  'install_path' => __DIR__ . '/../../',
19
19
  'aliases' => array(),
@@ -0,0 +1,9 @@
1
+ * text=auto
2
+
3
+ /tests export-ignore
4
+ /.gitattributes export-ignore
5
+ /.github export-ignore
6
+ /.gitignore export-ignore
7
+ /phpunit.xml.dist export-ignore
8
+ /CHANGELOG.md export-ignore
9
+ /README.md export-ignore
@@ -0,0 +1,132 @@
1
+ # CONTRIBUTOR COVENANT CODE OF CONDUCT
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual identity
10
+ and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the
26
+ overall community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or
31
+ advances of any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email
35
+ address, without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official e-mail address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement at
63
+ hello@gjcampbell.co.uk.
64
+ All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+ All community leaders are obligated to respect the privacy and security of the
67
+ reporter of any incident.
68
+
69
+ ## Enforcement Guidelines
70
+
71
+ Community leaders will follow these Community Impact Guidelines in determining
72
+ the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+ ### 1. Correction
75
+
76
+ **Community Impact**: Use of inappropriate language or other behavior deemed
77
+ unprofessional or unwelcome in the community.
78
+
79
+ **Consequence**: A private, written warning from community leaders, providing
80
+ clarity around the nature of the violation and an explanation of why the
81
+ behavior was inappropriate. A public apology may be requested.
82
+
83
+ ### 2. Warning
84
+
85
+ **Community Impact**: A violation through a single incident or series
86
+ of actions.
87
+
88
+ **Consequence**: A warning with consequences for continued behavior. No
89
+ interaction with the people involved, including unsolicited interaction with
90
+ those enforcing the Code of Conduct, for a specified period of time. This
91
+ includes avoiding interactions in community spaces as well as external channels
92
+ like social media. Violating these terms may lead to a temporary or
93
+ permanent ban.
94
+
95
+ ### 3. Temporary Ban
96
+
97
+ **Community Impact**: A serious violation of community standards, including
98
+ sustained inappropriate behavior.
99
+
100
+ **Consequence**: A temporary ban from any sort of interaction or public
101
+ communication with the community for a specified period of time. No public or
102
+ private interaction with the people involved, including unsolicited interaction
103
+ with those enforcing the Code of Conduct, is allowed during this period.
104
+ Violating these terms may lead to a permanent ban.
105
+
106
+ ### 4. Permanent Ban
107
+
108
+ **Community Impact**: Demonstrating a pattern of violation of community
109
+ standards, including sustained inappropriate behavior, harassment of an
110
+ individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+ **Consequence**: A permanent ban from any sort of public interaction within
113
+ the community.
114
+
115
+ ## Attribution
116
+
117
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+ version 2.1, available at
119
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+ Community Impact Guidelines were inspired by
122
+ [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+ For answers to common questions about this code of conduct, see the FAQ at
125
+ [https://www.contributor-covenant.org/faq][FAQ]. Translations are available
126
+ at [https://www.contributor-covenant.org/translations][translations].
127
+
128
+ [homepage]: https://www.contributor-covenant.org
129
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+ [Mozilla CoC]: https://github.com/mozilla/diversity
131
+ [FAQ]: https://www.contributor-covenant.org/faq
132
+ [translations]: https://www.contributor-covenant.org/translations