@beforesemicolon/builder 1.7.0 → 1.8.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.
Files changed (161) hide show
  1. package/README.md +33 -30
  2. package/dist/cjs/build-modules.js +1 -1
  3. package/dist/cjs/docs/run.js +1 -1
  4. package/dist/cjs/docs/templates/fading-citrus/assets/before-semicolon-logo.png +0 -0
  5. package/dist/cjs/docs/templates/fading-citrus/assets/client-server.svg +4 -0
  6. package/dist/cjs/docs/templates/fading-citrus/assets/facebook.svg +8 -0
  7. package/dist/cjs/docs/templates/fading-citrus/assets/fast.svg +4 -0
  8. package/dist/cjs/docs/templates/fading-citrus/assets/favicon/android-chrome-192x192.png +0 -0
  9. package/dist/cjs/docs/templates/fading-citrus/assets/favicon/android-chrome-512x512.png +0 -0
  10. package/dist/cjs/docs/templates/fading-citrus/assets/favicon/apple-touch-icon.png +0 -0
  11. package/dist/cjs/docs/templates/fading-citrus/assets/favicon/favicon-16x16.png +0 -0
  12. package/dist/cjs/docs/templates/fading-citrus/assets/favicon/favicon-32x32.png +0 -0
  13. package/dist/cjs/docs/templates/fading-citrus/assets/favicon/favicon.ico +0 -0
  14. package/dist/cjs/docs/templates/fading-citrus/assets/favicon/site.webmanifest +19 -0
  15. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Black.otf +0 -0
  16. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BlackItalic.otf +0 -0
  17. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Bold.otf +0 -0
  18. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BoldItalic.otf +0 -0
  19. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBold.otf +0 -0
  20. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBoldItalic.otf +0 -0
  21. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLight.otf +0 -0
  22. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLightItalic.otf +0 -0
  23. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Italic.otf +0 -0
  24. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Light.otf +0 -0
  25. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-LightItalic.otf +0 -0
  26. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Medium.otf +0 -0
  27. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-MediumItalic.otf +0 -0
  28. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Regular.otf +0 -0
  29. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBold.otf +0 -0
  30. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBoldItalic.otf +0 -0
  31. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Thin.otf +0 -0
  32. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ThinItalic.otf +0 -0
  33. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/SIL Open Font License.txt +43 -0
  34. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/Apache License.txt +201 -0
  35. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Bold.ttf +0 -0
  36. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-BoldItalic.ttf +0 -0
  37. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBold.ttf +0 -0
  38. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBoldItalic.ttf +0 -0
  39. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Italic.ttf +0 -0
  40. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Light.ttf +0 -0
  41. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-LightItalic.ttf +0 -0
  42. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Regular.ttf +0 -0
  43. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Semibold.ttf +0 -0
  44. package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-SemiboldItalic.ttf +0 -0
  45. package/dist/cjs/docs/templates/fading-citrus/assets/independent.svg +23 -0
  46. package/dist/cjs/docs/templates/fading-citrus/assets/instagram.svg +28 -0
  47. package/dist/cjs/docs/templates/fading-citrus/assets/markup-banner.jpg +0 -0
  48. package/dist/cjs/docs/templates/fading-citrus/assets/markup-essentials-training.jpg +0 -0
  49. package/dist/cjs/docs/templates/fading-citrus/assets/markup-favicon.jpg +0 -0
  50. package/dist/cjs/docs/templates/fading-citrus/assets/markup-favicon.png +0 -0
  51. package/dist/cjs/docs/templates/fading-citrus/assets/markup-logo-name.svg +10 -0
  52. package/dist/cjs/docs/templates/fading-citrus/assets/markup-logo-name@2x.png +0 -0
  53. package/dist/cjs/docs/templates/fading-citrus/assets/markup-logo.svg +13 -0
  54. package/dist/cjs/docs/templates/fading-citrus/assets/markup-logo@2x.png +0 -0
  55. package/dist/cjs/docs/templates/fading-citrus/assets/medium2.svg +18 -0
  56. package/dist/cjs/docs/templates/fading-citrus/assets/reactive.svg +3 -0
  57. package/dist/cjs/docs/templates/fading-citrus/assets/reddit.svg +16 -0
  58. package/dist/cjs/docs/templates/fading-citrus/assets/simple.svg +8 -0
  59. package/dist/cjs/docs/templates/fading-citrus/assets/small.svg +8 -0
  60. package/dist/cjs/docs/templates/fading-citrus/assets/twitter.svg +11 -0
  61. package/dist/cjs/docs/templates/fading-citrus/assets/youtube.svg +10 -0
  62. package/dist/cjs/docs/templates/fading-citrus/layouts/_code-snippet.js +75 -0
  63. package/dist/cjs/docs/templates/fading-citrus/layouts/_copy-code.js +50 -0
  64. package/dist/cjs/docs/templates/fading-citrus/layouts/_footer.js +72 -0
  65. package/dist/cjs/docs/templates/fading-citrus/layouts/_head-meta.js +231 -0
  66. package/dist/cjs/docs/templates/fading-citrus/layouts/_header.js +41 -0
  67. package/dist/cjs/docs/templates/fading-citrus/layouts/_logo.js +31 -0
  68. package/dist/cjs/docs/templates/fading-citrus/layouts/document.js +92 -0
  69. package/dist/cjs/docs/templates/fading-citrus/layouts/landing.js +636 -0
  70. package/dist/cjs/docs/templates/fading-citrus/stylesheets/common.css +815 -0
  71. package/dist/cjs/docs/templates/fading-citrus/stylesheets/documentation.css +537 -0
  72. package/dist/cjs/docs/templates/fading-citrus/stylesheets/fonts.css +1 -0
  73. package/dist/cjs/docs/templates/fading-citrus/stylesheets/github-dark.hightlighter.css +107 -0
  74. package/dist/cjs/docs/templates/fading-citrus/stylesheets/github-light.hightlighter.css +107 -0
  75. package/dist/cjs/docs/templates/fading-citrus/stylesheets/hybrid.hightlighter.css +102 -0
  76. package/dist/cjs/docs/templates/fading-citrus/stylesheets/landing.css +1556 -0
  77. package/dist/cjs/docs/templates/fading-citrus/stylesheets/normalize.css +351 -0
  78. package/dist/cjs/docs/templates/fading-citrus/template.config.js +14 -0
  79. package/dist/cjs/docs/types.js +1 -1
  80. package/dist/esm/build-modules.js +1 -1
  81. package/dist/esm/docs/run.js +1 -1
  82. package/dist/esm/docs/templates/fading-citrus/assets/before-semicolon-logo.png +0 -0
  83. package/dist/esm/docs/templates/fading-citrus/assets/client-server.svg +4 -0
  84. package/dist/esm/docs/templates/fading-citrus/assets/facebook.svg +8 -0
  85. package/dist/esm/docs/templates/fading-citrus/assets/fast.svg +4 -0
  86. package/dist/esm/docs/templates/fading-citrus/assets/favicon/android-chrome-192x192.png +0 -0
  87. package/dist/esm/docs/templates/fading-citrus/assets/favicon/android-chrome-512x512.png +0 -0
  88. package/dist/esm/docs/templates/fading-citrus/assets/favicon/apple-touch-icon.png +0 -0
  89. package/dist/esm/docs/templates/fading-citrus/assets/favicon/favicon-16x16.png +0 -0
  90. package/dist/esm/docs/templates/fading-citrus/assets/favicon/favicon-32x32.png +0 -0
  91. package/dist/esm/docs/templates/fading-citrus/assets/favicon/favicon.ico +0 -0
  92. package/dist/esm/docs/templates/fading-citrus/assets/favicon/site.webmanifest +19 -0
  93. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Black.otf +0 -0
  94. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BlackItalic.otf +0 -0
  95. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Bold.otf +0 -0
  96. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BoldItalic.otf +0 -0
  97. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBold.otf +0 -0
  98. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBoldItalic.otf +0 -0
  99. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLight.otf +0 -0
  100. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLightItalic.otf +0 -0
  101. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Italic.otf +0 -0
  102. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Light.otf +0 -0
  103. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-LightItalic.otf +0 -0
  104. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Medium.otf +0 -0
  105. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-MediumItalic.otf +0 -0
  106. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Regular.otf +0 -0
  107. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBold.otf +0 -0
  108. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBoldItalic.otf +0 -0
  109. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Thin.otf +0 -0
  110. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ThinItalic.otf +0 -0
  111. package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/SIL Open Font License.txt +43 -0
  112. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/Apache License.txt +201 -0
  113. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Bold.ttf +0 -0
  114. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-BoldItalic.ttf +0 -0
  115. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBold.ttf +0 -0
  116. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBoldItalic.ttf +0 -0
  117. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Italic.ttf +0 -0
  118. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Light.ttf +0 -0
  119. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-LightItalic.ttf +0 -0
  120. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Regular.ttf +0 -0
  121. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Semibold.ttf +0 -0
  122. package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-SemiboldItalic.ttf +0 -0
  123. package/dist/esm/docs/templates/fading-citrus/assets/independent.svg +23 -0
  124. package/dist/esm/docs/templates/fading-citrus/assets/instagram.svg +28 -0
  125. package/dist/esm/docs/templates/fading-citrus/assets/markup-banner.jpg +0 -0
  126. package/dist/esm/docs/templates/fading-citrus/assets/markup-essentials-training.jpg +0 -0
  127. package/dist/esm/docs/templates/fading-citrus/assets/markup-favicon.jpg +0 -0
  128. package/dist/esm/docs/templates/fading-citrus/assets/markup-favicon.png +0 -0
  129. package/dist/esm/docs/templates/fading-citrus/assets/markup-logo-name.svg +10 -0
  130. package/dist/esm/docs/templates/fading-citrus/assets/markup-logo-name@2x.png +0 -0
  131. package/dist/esm/docs/templates/fading-citrus/assets/markup-logo.svg +13 -0
  132. package/dist/esm/docs/templates/fading-citrus/assets/markup-logo@2x.png +0 -0
  133. package/dist/esm/docs/templates/fading-citrus/assets/medium2.svg +18 -0
  134. package/dist/esm/docs/templates/fading-citrus/assets/reactive.svg +3 -0
  135. package/dist/esm/docs/templates/fading-citrus/assets/reddit.svg +16 -0
  136. package/dist/esm/docs/templates/fading-citrus/assets/simple.svg +8 -0
  137. package/dist/esm/docs/templates/fading-citrus/assets/small.svg +8 -0
  138. package/dist/esm/docs/templates/fading-citrus/assets/twitter.svg +11 -0
  139. package/dist/esm/docs/templates/fading-citrus/assets/youtube.svg +10 -0
  140. package/dist/esm/docs/templates/fading-citrus/layouts/_code-snippet.js +75 -0
  141. package/dist/esm/docs/templates/fading-citrus/layouts/_copy-code.js +50 -0
  142. package/dist/esm/docs/templates/fading-citrus/layouts/_footer.js +72 -0
  143. package/dist/esm/docs/templates/fading-citrus/layouts/_head-meta.js +231 -0
  144. package/dist/esm/docs/templates/fading-citrus/layouts/_header.js +41 -0
  145. package/dist/esm/docs/templates/fading-citrus/layouts/_logo.js +31 -0
  146. package/dist/esm/docs/templates/fading-citrus/layouts/document.js +92 -0
  147. package/dist/esm/docs/templates/fading-citrus/layouts/landing.js +636 -0
  148. package/dist/esm/docs/templates/fading-citrus/stylesheets/common.css +815 -0
  149. package/dist/esm/docs/templates/fading-citrus/stylesheets/documentation.css +537 -0
  150. package/dist/esm/docs/templates/fading-citrus/stylesheets/fonts.css +1 -0
  151. package/dist/esm/docs/templates/fading-citrus/stylesheets/github-dark.hightlighter.css +107 -0
  152. package/dist/esm/docs/templates/fading-citrus/stylesheets/github-light.hightlighter.css +107 -0
  153. package/dist/esm/docs/templates/fading-citrus/stylesheets/hybrid.hightlighter.css +102 -0
  154. package/dist/esm/docs/templates/fading-citrus/stylesheets/landing.css +1556 -0
  155. package/dist/esm/docs/templates/fading-citrus/stylesheets/normalize.css +351 -0
  156. package/dist/esm/docs/templates/fading-citrus/template.config.js +14 -0
  157. package/dist/types/build-browser.d.ts +1 -1
  158. package/dist/types/build-modules.d.ts +1 -1
  159. package/dist/types/docs/run.d.ts +2 -1
  160. package/dist/types/docs/types.d.ts +28 -6
  161. package/package.json +1 -1
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 207.25 61.99">
2
+ <g fill="#000">
3
+ <path d="m47.74.19c-.93-.39-2.01-.17-2.72.54l-20.38,20.38L4.27.73C3.55.02,2.48-.2,1.54.19.61.58,0,1.49,0,2.5v46.81h5V8.54l16.11,16.11-9.19,9.19,3.54,3.54,9.19-9.19,9.19,9.19,3.54-3.54-9.19-9.19,16.11-16.11v40.77h5V2.5c0-1.01-.61-1.92-1.54-2.31Z"/>
4
+ <path d="m84.81,19.78v29.53h-4.7v-5.34c-.86,1.84-2.16,3.26-3.9,4.26-1.74,1-3.77,1.5-6.08,1.5-2.62,0-4.92-.63-6.9-1.88-1.98-1.25-3.5-3.02-4.58-5.31-1.08-2.29-1.61-4.96-1.61-8.01s.55-5.74,1.64-8.07c1.1-2.33,2.63-4.14,4.61-5.43,1.98-1.29,4.26-1.94,6.84-1.94,2.31,0,4.32.51,6.05,1.53,1.72,1.02,3.03,2.45,3.93,4.29v-5.11h4.7Zm-7.04,23.04c1.56-1.98,2.35-4.78,2.35-8.42s-.78-6.44-2.35-8.39c-1.57-1.96-3.8-2.94-6.69-2.94s-5.16,1.01-6.78,3.02c-1.62,2.02-2.44,4.82-2.44,8.42s.8,6.38,2.41,8.33c1.6,1.96,3.87,2.94,6.81,2.94s5.13-.99,6.69-2.96Z"/>
5
+ <path d="m110.46,19.43l-.12,4.34c-.9-.31-1.94-.47-3.11-.47-2.86,0-4.98.89-6.37,2.67-1.39,1.78-2.08,3.94-2.08,6.49v16.85h-4.75v-21.25c0-3.05-.16-5.81-.47-8.28h4.52l.47,5.46c.74-2,1.94-3.52,3.58-4.58,1.64-1.06,3.52-1.58,5.63-1.58.98,0,1.88.12,2.7.35Z"/>
6
+ <path d="m135.17,49.31l-15.14-14.21v14.21h-4.75V6.11h4.75v27.24l13.91-13.5h6.05l-14.79,14.15,16.2,15.32h-6.22Z"/>
7
+ <path d="m170.22,19.78v29.53h-4.64v-5.11c-.94,1.8-2.25,3.17-3.93,4.11-1.68.94-3.58,1.41-5.69,1.41-3.48,0-6.12-.98-7.92-2.94-1.8-1.96-2.7-4.85-2.7-8.69v-18.31h4.75v18.2c0,2.66.55,4.62,1.64,5.87,1.09,1.25,2.76,1.88,4.99,1.88,2.62,0,4.73-.85,6.34-2.55,1.6-1.7,2.41-3.94,2.41-6.72v-16.67h4.75Z"/>
8
+ <path d="m200.97,21.02c2,1.29,3.54,3.1,4.64,5.43,1.1,2.33,1.64,5.02,1.64,8.07s-.55,5.72-1.64,8.01c-1.1,2.29-2.63,4.06-4.61,5.31-1.98,1.25-4.28,1.88-6.9,1.88-2.31,0-4.32-.51-6.05-1.53-1.72-1.02-3.03-2.47-3.93-4.34v18.14h-4.75V28.06c0-3.05-.16-5.81-.47-8.28h4.52l.47,5.69c.82-2.03,2.12-3.61,3.9-4.73,1.78-1.12,3.88-1.67,6.31-1.67,2.58,0,4.87.65,6.87,1.94Zm-1.03,21.84c1.58-1.96,2.38-4.73,2.38-8.33s-.8-6.41-2.41-8.42c-1.61-2.02-3.84-3.02-6.69-3.02s-5.19.98-6.75,2.94c-1.57,1.96-2.35,4.75-2.35,8.39s.78,6.45,2.35,8.42c1.57,1.98,3.82,2.96,6.75,2.96s5.14-.98,6.72-2.94Z"/>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 49.29 49.31">
3
+ <defs>
4
+ <style>
5
+ .cls-1 {
6
+ stroke-width: 0px;
7
+ }
8
+ </style>
9
+ </defs>
10
+ <g id="Layer_1-2" data-name="Layer 1">
11
+ <path class="cls-1" d="m47.74.19c-.93-.39-2.01-.17-2.72.54l-20.38,20.38L4.27.73C3.55.02,2.48-.2,1.54.19.61.58,0,1.49,0,2.5v46.81h5V8.54l16.11,16.11-9.19,9.19,3.54,3.54,9.19-9.19,9.19,9.19,3.54-3.54-9.19-9.19,16.11-16.11v40.77h5V2.5c0-1.01-.61-1.92-1.54-2.31Z"/>
12
+ </g>
13
+ </svg>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns:serif="http://www.serif.com/"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 800 800"
5
+ style="enable-background:new 0 0 800 800;" xml:space="preserve">
6
+ <g>
7
+ <g transform="matrix(1,0,0,1,-246.226,-1.33631)">
8
+ <path d="M688.9,401.3c0,104.4-84,189-187.7,189s-187.7-84.6-187.7-189s84-189,187.7-189S688.9,297,688.9,401.3"/>
9
+ </g>
10
+ <g transform="matrix(1,0,0,1,-246.226,-1.33631)">
11
+ <path d="M894.8,401.3c0,98.3-42,177.9-93.9,177.9s-93.9-79.7-93.9-177.9s42-177.9,93.9-177.9C852.8,223.4,894.8,303.1,894.8,401.3
12
+ "/>
13
+ </g>
14
+ <g transform="matrix(1,0,0,1,-246.226,-1.33631)">
15
+ <path d="M979,401.3c0,88-14.8,159.4-33,159.4s-33-71.4-33-159.4s14.8-159.4,33-159.4C964.2,241.9,979,313.3,979,401.3"/>
16
+ </g>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 95 95">
2
+ <path fill-rule="evenodd" fill="#fff" d="M64.748,63.125a84.879,84.879,0,0,1-1.664,8.389c1.86.464,3.652.826,5.359,1.081,8.02,1.2,14.055.078,16.2-3.646s.106-9.513-4.94-15.857c-1.075-1.351-2.285-2.723-3.617-4.1a84.6,84.6,0,0,1-6.433,5.636,5.891,5.891,0,0,1-4.909,8.5Zm3.646-10.188a5.872,5.872,0,0,0-2.6-1.409q.027-.751.044-1.538.03-1.415.03-2.49c0-2.58-.087-5.109-.253-7.57A86.452,86.452,0,0,1,74.6,47.5c-1.869,1.818-3.947,3.64-6.209,5.438Zm-4.7-1.538a5.894,5.894,0,0,0-4.72,8.175q-.616.386-1.235.761-1.029.624-2.1,1.241l-.01.006c-2.724,1.573-5.445,2.992-8.129,4.253-2.684-1.261-5.406-2.681-8.132-4.255s-5.31-3.217-7.743-4.909c-.249-2.955-.38-6.023-.38-9.171q0-1.412.023-2.449.015-.714.041-1.45a5.891,5.891,0,0,0,4.719-8.175c.413-.257.824-.511,1.237-.761q1.028-.624,2.1-1.241l.01-.005c2.724-1.573,5.446-2.993,8.129-4.254,2.684,1.262,5.406,2.681,8.132,4.255s5.31,3.218,7.743,4.91c.249,2.954.38,6.023.38,9.17q0,1.413-.022,2.449-.016.714-.042,1.45Zm-3.557,9.925q-.644.4-1.31.807-1.065.646-2.146,1.27h0c-2.234,1.29-4.468,2.479-6.682,3.565a86.489,86.489,0,0,0,11.057,4.006c.64-2.528,1.179-5.238,1.6-8.094a5.889,5.889,0,0,1-2.438-1.468l-.085-.087Zm6.921-6.749a3.779,3.779,0,1,1-2.672-1.107,3.764,3.764,0,0,1,2.672,1.107Zm-32.189-20.9q.645-.4,1.311-.807,1.064-.646,2.145-1.27h0c2.234-1.29,4.468-2.479,6.682-3.565a86.326,86.326,0,0,0-11.057-4.005c-.64,2.527-1.179,5.237-1.6,8.093a5.9,5.9,0,0,1,2.438,1.468l.085.087Zm-4.614-1.8a84.879,84.879,0,0,1,1.664-8.389c-1.86-.464-3.652-.826-5.359-1.081-8.019-1.2-14.054-.078-16.2,3.646s-.106,9.513,4.94,15.857c1.075,1.352,2.285,2.723,3.617,4.1a84.373,84.373,0,0,1,6.433-5.635,5.891,5.891,0,0,1,4.909-8.5ZM26.606,42.064a5.881,5.881,0,0,0,2.6,1.408q-.027.753-.044,1.538c-.02.943-.031,1.775-.031,2.49,0,2.58.087,5.109.254,7.57A86.572,86.572,0,0,1,20.4,47.5c1.87-1.818,3.948-3.64,6.21-5.437ZM33.29,35.08A3.779,3.779,0,1,0,34.4,37.753,3.771,3.771,0,0,0,33.29,35.08ZM62.537,73.546a49.456,49.456,0,0,1-4.121,10.345C55.4,89.313,51.641,92.5,47.5,92.5c-5.257,0-9.924-5.176-13.22-13.543-.661-1.677-1.269-3.487-1.818-5.411-1.943.488-3.816.867-5.6,1.133C17.973,76.008,11.16,74.553,8.532,70c-2.071-3.587-1.193-8.438,1.995-13.758a49.4,49.4,0,0,1,6.9-8.742c-1.393-1.439-2.657-2.871-3.78-4.282C8.05,36.184,5.9,29.557,8.532,25s9.442-6.012,18.329-4.683c1.785.266,3.659.645,5.6,1.133A49.424,49.424,0,0,1,36.584,11.11C39.6,5.687,43.36,2.5,47.5,2.5c5.257,0,9.925,5.175,13.22,13.543.661,1.677,1.269,3.487,1.818,5.411,1.943-.488,3.816-.867,5.6-1.133,8.888-1.329,15.7.126,18.329,4.679,2.071,3.588,1.193,8.438-2,13.758a49.4,49.4,0,0,1-6.9,8.742c1.393,1.439,2.657,2.871,3.78,4.282C86.95,58.816,89.1,65.443,86.468,70s-9.442,6.012-18.33,4.683c-1.784-.266-3.658-.645-5.6-1.133ZM18.911,48.989a47.132,47.132,0,0,0-6.58,8.333C9.544,61.973,8.7,66.083,10.353,68.945c2.151,3.726,8.186,4.848,16.2,3.65,1.708-.255,3.5-.616,5.359-1.081a90.427,90.427,0,0,1-2.3-13.692,90.533,90.533,0,0,1-10.7-8.833ZM31.892,59.4a86.578,86.578,0,0,0,2.057,11.576,86.411,86.411,0,0,0,11.056-4c-2.215-1.086-4.449-2.275-6.683-3.566s-4.382-2.63-6.43-4.005ZM47.5,68.151A90.542,90.542,0,0,0,60.506,73a47.22,47.22,0,0,1-3.928,9.865c-2.633,4.737-5.77,7.522-9.078,7.522-4.3,0-8.29-4.663-11.259-12.2C35.607,76.583,35.024,74.849,34.5,73a90.522,90.522,0,0,0,13-4.853ZM34.494,22a47.22,47.22,0,0,1,3.928-9.865C41.055,7.394,44.192,4.61,47.5,4.61c4.3,0,8.29,4.662,11.259,12.2.634,1.608,1.217,3.342,1.745,5.187a90.522,90.522,0,0,0-13,4.853A90.542,90.542,0,0,0,34.494,22ZM50,28.033c2.214,1.086,4.449,2.276,6.683,3.566s4.382,2.63,6.43,4a86.549,86.549,0,0,0-2.057-11.576A86.411,86.411,0,0,0,50,28.033Zm15.393,9.145a90.533,90.533,0,0,1,10.7,8.833,47.178,47.178,0,0,0,6.58-8.333c2.787-4.651,3.631-8.761,1.978-11.623-2.151-3.726-8.186-4.848-16.2-3.65-1.707.255-3.5.617-5.358,1.081A90.427,90.427,0,0,1,65.388,37.178Z"/>
3
+ </svg>
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns:serif="http://www.serif.com/"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 800 800"
5
+ style="enable-background:new 0 0 800 800;" xml:space="preserve">
6
+ <path d="M680.4,326.7c-21.5,0-40.4,8.2-54.3,22.1c-53.7-38.5-128.2-63.8-210.3-66.9l36-168.6l116.8,24.6
7
+ c1.3,29.7,25.9,53.7,56.2,53.7c30.9,0,56.2-25.3,56.2-56.2c0-30.9-25.3-56.2-56.2-56.2c-22.1,0-41.1,12.6-49.9,31.6L444.2,82.9
8
+ c-3.8-0.6-7.6,0-10.7,1.9s-5.1,5.1-6.3,8.8l-39.8,188.2c-84,2.5-159.2,27.2-213.5,66.9c-13.9-13.3-33.5-22.1-54.3-22.1
9
+ c-43.6,0-78.9,35.4-78.9,78.9c0,32.2,18.9,59.4,46.7,72c-1.3,7.6-1.9,15.8-1.9,24c0,121.3,140.8,219.2,315.2,219.2
10
+ c174.3,0,315.2-97.9,315.2-219.2c0-8.2-0.6-15.8-1.9-23.4c25.9-12.6,45.5-40.4,45.5-72.6C759.4,362.1,724,326.7,680.4,326.7z
11
+ M217.4,470.7c0-30.9,25.3-56.2,56.2-56.2c30.9,0,56.2,25.3,56.2,56.2c0,30.9-25.3,56.2-56.2,56.2
12
+ C242.7,526.9,217.4,501.7,217.4,470.7z M531.3,619.1L531.3,619.1c-38.5,38.5-111.8,41.1-133.3,41.1c-21.5,0-95.4-3.2-133.3-41.1
13
+ c-5.7-5.7-5.7-15.2,0-20.8c5.7-5.7,15.2-5.7,20.8,0c24,24,75.8,32.8,113.1,32.8c37.3,0,88.4-8.8,113.1-32.8c5.7-5.7,15.2-5.7,20.8,0
14
+ C537,604.6,537,613.5,531.3,619.1z M521.2,526.9c-30.9,0-56.2-25.3-56.2-56.2c0-30.9,25.3-56.2,56.2-56.2
15
+ c30.9,0,56.2,25.3,56.2,56.2C577.4,501.7,552.2,526.9,521.2,526.9z"/>
16
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px"
2
+ viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve">
3
+ <g fill="#fff">
4
+ <path d="M69.2,50.5H30.6c-0.5,0-1-0.3-1.3-0.8c-0.3-0.5-0.3-1,0-1.5l19.3-33.4c0.3-0.5,0.8-0.7,1.3-0.7s1,0.3,1.3,0.7l19.3,33.4 c0.3,0.5,0.3,1,0,1.5C70.2,50.2,69.7,50.5,69.2,50.5z M33.2,47.5h33.4L49.9,18.6L33.2,47.5z"/>
5
+ <path d="M81.9,85.9H51.8c-0.8,0-1.5-0.7-1.5-1.5V54.3c0-0.8,0.7-1.5,1.5-1.5h30.1c0.8,0,1.5,0.7,1.5,1.5v30.1 C83.4,85.2,82.7,85.9,81.9,85.9z M53.3,82.9h27.1V55.8H53.3V82.9z"/>
6
+ <path d="M30.6,85.8c-9.1,0-16.5-7.4-16.5-16.5s7.4-16.5,16.5-16.5s16.5,7.4,16.5,16.5S39.7,85.8,30.6,85.8z M30.6,55.8 c-7.4,0-13.5,6.1-13.5,13.5s6.1,13.5,13.5,13.5s13.5-6.1,13.5-13.5S38,55.8,30.6,55.8z"/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px"
2
+ viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve">
3
+ <g fill="#fff">
4
+ <polygon points="43.4,91.7 43.4,56.6 8.5,56.6 8.5,65.4 28.4,65.4 5.2,88.6 11.4,94.8 34.6,71.6 34.6,91.7 "/>
5
+ <polygon
6
+ points="88.6,5.2 65.4,28.4 65.4,8.4 56.6,8.4 56.6,43.4 91.5,43.4 91.5,34.6 71.6,34.6 94.8,11.4 "/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns:serif="http://www.serif.com/"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 800 800"
5
+ style="enable-background:new 0 0 800 800;" xml:space="preserve">
6
+ <path d="M276,671.5c252.2,0,390.2-209,390.2-390.2c0-5.9,0-11.8-0.4-17.7c26.8-19.4,50-43.4,68.4-71c-25,11.1-51.6,18.4-78.8,21.6
7
+ c28.6-17.1,50.1-44.1,60.3-75.8c-26.9,16-56.4,27.2-87.1,33.3c-25.9-27.6-62.1-43.2-100-43.2c-75.3,0-137.3,62-137.3,137.3
8
+ c0,10.4,1.2,20.9,3.6,31c-110.2-5.5-213-57.6-282.6-143.3c-36.2,62.3-17.5,143,42.5,183.1c-21.8-0.6-43.2-6.5-62.2-17.2v1.7
9
+ c0,65,46.3,121.5,110,134.4c-20.2,5.5-41.4,6.3-61.9,2.4c17.9,55.7,69.6,94.1,128.1,95.2c-48.5,38.2-108.6,58.9-170.3,58.8
10
+ c-10.9,0-21.8-0.7-32.6-2c62.7,40.2,135.7,61.6,210.2,61.5"/>
11
+ </svg>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns:serif="http://www.serif.com/"
4
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 800 800"
5
+ style="enable-background:new 0 0 800 800;" xml:space="preserve">
6
+ <path d="M714.1,242.2c-7.5-28.2-29.7-50.4-58-58C605,170.6,400,170.6,400,170.6s-205,0-256.1,13.7c-28.2,7.5-50.4,29.7-58,58
7
+ C72.2,293.3,72.2,400,72.2,400s0,106.7,13.7,157.8c7.5,28.2,29.8,50.4,58,58C195,629.4,400,629.4,400,629.4s205,0,256.1-13.7
8
+ c28.2-7.5,50.4-29.8,58-58c13.7-51.1,13.7-157.8,13.7-157.8S727.8,293.3,714.1,242.2L714.1,242.2z M334.4,498.3V301.7L504.7,400
9
+ L334.4,498.3L334.4,498.3z"/>
10
+ </svg>
@@ -0,0 +1,75 @@
1
+ export const escapeHTML = (value) =>
2
+ value
3
+ .replace(/&/g, '&amp;')
4
+ .replace(/</g, '&lt;')
5
+ .replace(/>/g, '&gt;')
6
+ .replace(/"/g, '&quot;')
7
+ .replace(/'/g, '&#39;')
8
+
9
+ export const highlightLine = (line) => {
10
+ const tokens = []
11
+ const regex =
12
+ /(\/\/.*$)|(`[^`]*`|'[^']*'|"[^"]*")|(<\/?[a-zA-Z][\w-]*)|(\b(?:const|let|var|function|return|import|from|export|new|class|if|else|extends|static|async|await|try|catch)\b|=>)|(\$\{[^}]*\}|\{[^{}]*\})|([a-zA-Z-]+)(?==)/g
13
+ let lastIndex = 0
14
+ let match
15
+
16
+ while ((match = regex.exec(line)) !== null) {
17
+ if (match.index > lastIndex) {
18
+ tokens.push(escapeHTML(line.slice(lastIndex, match.index)))
19
+ }
20
+
21
+ const value = escapeHTML(match[0])
22
+
23
+ if (match[1]) {
24
+ tokens.push(`<span class="syntax-comment">${value}</span>`)
25
+ } else if (match[2]) {
26
+ tokens.push(`<span class="syntax-string">${value}</span>`)
27
+ } else if (match[3]) {
28
+ tokens.push(`<span class="syntax-tag">${value}</span>`)
29
+ } else if (match[4]) {
30
+ tokens.push(`<span class="syntax-keyword">${value}</span>`)
31
+ } else if (match[5]) {
32
+ tokens.push(`<span class="syntax-expression">${value}</span>`)
33
+ } else if (match[6]) {
34
+ tokens.push(`<span class="syntax-attr">${value}</span>`)
35
+ }
36
+
37
+ lastIndex = match.index + match[0].length
38
+ }
39
+
40
+ if (lastIndex < line.length) {
41
+ tokens.push(escapeHTML(line.slice(lastIndex)))
42
+ }
43
+
44
+ return tokens.join('')
45
+ }
46
+
47
+ export const renderCodeBlock = (filename, code, lang = 'javascript') => {
48
+ const lines = code
49
+ .replace(/\n$/, '')
50
+ .split('\n')
51
+ .map((line, index) => {
52
+ const highlightedLine = line ? highlightLine(line) : ' '
53
+
54
+ return `<span class="code-line"><span class="line-number">${index + 1}</span><span class="line-code">${highlightedLine}</span></span>`
55
+ })
56
+ .join('')
57
+
58
+ return `
59
+ <div class="code-snippet" data-code="${escapeHTML(code.replace(/\n$/, ''))}">
60
+ <div class="header">
61
+ <div class="mac-dots">
62
+ <span class="dot-red"></span>
63
+ <span class="dot-yellow"></span>
64
+ <span class="dot-green"></span>
65
+ </div>
66
+ <div class="filename">${filename}</div>
67
+ <div class="label">${lang}</div>
68
+ <button class="code-copy-btn" aria-label="Copy code">copy</button>
69
+ </div>
70
+ <div class="content">
71
+ <pre><code class="hljs language-${lang}">${lines}</code></pre>
72
+ </div>
73
+ </div>
74
+ `
75
+ }
@@ -0,0 +1,50 @@
1
+ export default () => `
2
+ <script type="application/javascript">
3
+ // handle all possible copy snippet code button on the page
4
+ // this implementation is in sync with CodeSnippet partial
5
+ document.querySelectorAll('.code-copy-btn').forEach((copyBtn) => {
6
+ const snippet = copyBtn.closest('.code-snippet')
7
+ const hasCode = snippet?.dataset.code || snippet?.querySelector('code') || snippet?.querySelector('.content')
8
+ if (hasCode) {
9
+ copyBtn.style.visibility = 'visible'
10
+ }
11
+ })
12
+
13
+ document.addEventListener('click', (e) => {
14
+ const copyBtn = e.target.closest('.code-copy-btn')
15
+ if (!copyBtn) return
16
+
17
+ const snippet = copyBtn.closest('.code-snippet')
18
+ if (!snippet) return
19
+
20
+ let code = snippet.dataset.code ?? ''
21
+
22
+ if (!code) {
23
+ const codeEl = snippet.querySelector('code')
24
+ if (codeEl) {
25
+ const clone = codeEl.cloneNode(true)
26
+ clone.querySelectorAll('.line-number').forEach(el => el.remove())
27
+ code = clone.textContent ?? ''
28
+ }
29
+ }
30
+
31
+ if (!code) {
32
+ code = snippet.querySelector('.content')?.textContent ?? ''
33
+ }
34
+
35
+ // no code, no copy button
36
+ if (code.trim().length) {
37
+ clearTimeout(copyBtn._timer)
38
+ navigator.clipboard.writeText(code.trim())
39
+ copyBtn.textContent = 'copied'
40
+ copyBtn.setAttribute('aria-label', 'Code copied')
41
+ copyBtn.classList.add('copied')
42
+ copyBtn._timer = setTimeout(() => {
43
+ copyBtn.textContent = 'copy'
44
+ copyBtn.setAttribute('aria-label', 'Copy code')
45
+ copyBtn.classList.remove('copied')
46
+ }, 1000)
47
+ }
48
+ })
49
+ </script>
50
+ `
@@ -0,0 +1,72 @@
1
+ import logo from './_logo.js'
2
+
3
+ const social = [
4
+ {
5
+ link: 'https://medium.com/before-semicolon',
6
+ icon: 'assets/medium2.svg',
7
+ name: 'Medium blog',
8
+ },
9
+ {
10
+ link: 'https://www.facebook.com/beforesemicolon/',
11
+ icon: 'assets/facebook.svg',
12
+ name: 'Facebook',
13
+ },
14
+ {
15
+ link: 'https://www.instagram.com/before_semicolon_/',
16
+ icon: 'assets/instagram.svg',
17
+ name: 'Instagram',
18
+ },
19
+ {
20
+ link: 'https://www.reddit.com/r/beforesemicolon/',
21
+ icon: 'assets/reddit.svg',
22
+ name: 'Reddit',
23
+ },
24
+ {
25
+ link: 'https://twitter.com/BeforeSemicolon',
26
+ icon: 'assets/twitter.svg',
27
+ name: 'Twitter',
28
+ },
29
+ {
30
+ link: 'https://www.youtube.com/channel/UCrU33aw1k9BqTIq2yKXrmBw',
31
+ icon: 'assets/youtube.svg',
32
+ name: 'YouTube',
33
+ },
34
+ ]
35
+
36
+ export default () => `
37
+ <footer class="site-footer">
38
+ <div class="footer-inner wrapper">
39
+ <div class="footer-brand">
40
+ ${logo({ fill: 'currentColor', width: '100px' })}
41
+ <p>A reactive HTML templating system for building dynamic UIs with pure JavaScript. No build step. No virtual DOM.</p>
42
+ </div>
43
+ <ul class="footer-links">
44
+ <li><h4>Learning Resources</h4></li>
45
+ <li><a href="/documentation">Documentation</a></li>
46
+ <li><a target="_blank" rel="noopener" href="https://www.youtube.com/watch?v=mIr2XglV5nQ&list=PLpWvGP6yhJUgWNiz25vj__CArY9Z0O6ke&index=1">Essentials Training</a></li>
47
+ </ul>
48
+ <ul class="footer-links">
49
+ <li><h4>About <em>Before Semicolon</em></h4></li>
50
+ <li><a href="https://github.com/beforesemicolon" rel="noopener" target="_blank">Open Source</a></li>
51
+ <li><a href="https://beforesemicolon.com/" rel="noopener" target="_blank">Website</a></li>
52
+ <li><a href="https://medium.com/before-semicolon" rel="noopener" target="_blank">Blog</a></li>
53
+ <li><a href="https://www.youtube.com/channel/UCrU33aw1k9BqTIq2yKXrmBw" rel="noopener" target="_blank">YouTube Channel</a></li>
54
+ </ul>
55
+ <div class="footer-social" aria-label="social-media">
56
+ ${social
57
+ .map(
58
+ (s) => `
59
+ <a href="${s.link}" rel="noopener" target="_blank" aria-label="${s.name}">
60
+ <img src="/${s.icon}" alt="" aria-hidden="true" width="16" height="16" />
61
+ </a>
62
+ `
63
+ )
64
+ .join('')}
65
+ </div>
66
+ <div class="footer-credit">
67
+ <img width="20" height="20" src="/assets/before-semicolon-logo.png" alt="Before Semicolon logo" />
68
+ <span>Copyright &copy; ${new Date().getFullYear()} Before Semicolon. All rights reserved.</span>
69
+ </div>
70
+ </div>
71
+ </footer>
72
+ `
@@ -0,0 +1,231 @@
1
+ /* global process */
2
+ const isDev = process.env.NODE_ENV === 'development'
3
+
4
+ const siteUrl = 'https://markup.beforesemicolon.com'
5
+ const siteName = 'Markup'
6
+ const defaultTitle = 'Markup by Before Semicolon'
7
+ const defaultDescription =
8
+ 'Markup is a tiny reactive HTML templating system for building JavaScript user interfaces with web standards, no JSX, and no build step.'
9
+ const defaultImage = `${siteUrl}/assets/markup-banner.jpg`
10
+ const baseKeywords = [
11
+ 'Markup',
12
+ '@beforesemicolon/markup',
13
+ 'reactive HTML',
14
+ 'JavaScript templating',
15
+ 'template literals',
16
+ 'web components',
17
+ 'state management',
18
+ 'no build step',
19
+ 'vanilla JavaScript',
20
+ ]
21
+
22
+ const escapeHTML = (value = '') =>
23
+ String(value)
24
+ .replace(/&/g, '&amp;')
25
+ .replace(/</g, '&lt;')
26
+ .replace(/>/g, '&gt;')
27
+ .replace(/"/g, '&quot;')
28
+ .replace(/'/g, '&#39;')
29
+
30
+ const canonicalPath = (path = '/') => {
31
+ const cleanPath = path.split('?')[0].split('#')[0] || '/'
32
+
33
+ if (cleanPath === '/index.html') return '/'
34
+ if (cleanPath.endsWith('/index.html')) {
35
+ return cleanPath.replace(/index\.html$/, '')
36
+ }
37
+
38
+ return cleanPath.replace(/\.html$/, '')
39
+ }
40
+
41
+ const absoluteUrl = (path = '/') => `${siteUrl}${canonicalPath(path)}`
42
+
43
+ const compactDescription = (description) =>
44
+ (description || defaultDescription).replace(/\s+/g, ' ').trim()
45
+
46
+ const pageKeywords = ({ title, name, keywords } = {}) => {
47
+ const values = [
48
+ ...baseKeywords,
49
+ title?.replace(/ - Markup by Before Semicolon$/, ''),
50
+ name,
51
+ ...(Array.isArray(keywords)
52
+ ? keywords
53
+ : String(keywords || '').split(',')),
54
+ ]
55
+
56
+ return [...new Set(values.map((value) => value?.trim()).filter(Boolean))]
57
+ .slice(0, 18)
58
+ .join(', ')
59
+ }
60
+
61
+ const jsonScript = (data) =>
62
+ `<script type="application/ld+json">${JSON.stringify(data)
63
+ .replace(/</g, '\\u003c')
64
+ .replace(/>/g, '\\u003e')
65
+ .replace(/&/g, '\\u0026')}</script>`
66
+
67
+ const breadcrumbJson = ({ title, path }) => {
68
+ const cleanPath = canonicalPath(path)
69
+ const parts = cleanPath.split('/').filter(Boolean)
70
+ const items = [
71
+ {
72
+ '@type': 'ListItem',
73
+ position: 1,
74
+ name: 'Home',
75
+ item: siteUrl,
76
+ },
77
+ ]
78
+
79
+ let current = ''
80
+ parts.forEach((part, index) => {
81
+ current += `/${part}`
82
+ items.push({
83
+ '@type': 'ListItem',
84
+ position: index + 2,
85
+ name:
86
+ index === parts.length - 1
87
+ ? title.replace(/ - Markup by Before Semicolon$/, '')
88
+ : part
89
+ .split('-')
90
+ .map((word) => word[0]?.toUpperCase() + word.slice(1))
91
+ .join(' '),
92
+ item: `${siteUrl}${current}`,
93
+ })
94
+ })
95
+
96
+ return {
97
+ '@context': 'https://schema.org',
98
+ '@type': 'BreadcrumbList',
99
+ itemListElement: items,
100
+ }
101
+ }
102
+
103
+ const pageJson = ({ title, description, path, name }) => {
104
+ const isDocsPage = canonicalPath(path).startsWith('/documentation')
105
+ const url = absoluteUrl(path)
106
+
107
+ if (isDocsPage) {
108
+ return {
109
+ '@context': 'https://schema.org',
110
+ '@type': 'TechArticle',
111
+ headline: title,
112
+ name: name || title,
113
+ description,
114
+ url,
115
+ image: defaultImage,
116
+ inLanguage: 'en-US',
117
+ isPartOf: {
118
+ '@type': 'TechArticle',
119
+ name: 'Markup Documentation',
120
+ url: `${siteUrl}/documentation`,
121
+ },
122
+ about: [
123
+ 'Reactive HTML templating',
124
+ 'JavaScript template literals',
125
+ 'Markup state and effect APIs',
126
+ 'Web Components',
127
+ ],
128
+ publisher: {
129
+ '@type': 'Organization',
130
+ name: 'Before Semicolon',
131
+ url: 'https://beforesemicolon.com',
132
+ logo: {
133
+ '@type': 'ImageObject',
134
+ url: `${siteUrl}/assets/before-semicolon-logo.png`,
135
+ },
136
+ },
137
+ mainEntityOfPage: url,
138
+ }
139
+ }
140
+
141
+ return {
142
+ '@context': 'https://schema.org',
143
+ '@type': 'SoftwareSourceCode',
144
+ name: 'Markup',
145
+ alternateName: '@beforesemicolon/markup',
146
+ description,
147
+ url,
148
+ image: defaultImage,
149
+ codeRepository: 'https://github.com/beforesemicolon/markup',
150
+ programmingLanguage: 'JavaScript',
151
+ runtimePlatform: 'Browser and Node.js',
152
+ license: 'https://github.com/beforesemicolon/markup/blob/main/LICENSE',
153
+ publisher: {
154
+ '@type': 'Organization',
155
+ name: 'Before Semicolon',
156
+ url: 'https://beforesemicolon.com',
157
+ },
158
+ }
159
+ }
160
+
161
+ export default (props = {}) => {
162
+ const title = props.title || defaultTitle
163
+ const description = compactDescription(props.description)
164
+ const url = absoluteUrl(props.path)
165
+ const canonical = escapeHTML(url)
166
+ const image = props.image || defaultImage
167
+ const type = canonicalPath(props.path).startsWith('/documentation')
168
+ ? 'article'
169
+ : 'website'
170
+
171
+ return `
172
+ <meta charset="UTF-8" />
173
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
174
+ <meta http-equiv="X-UA-Compatible" content="ie=edge" />
175
+ <title>${escapeHTML(title)}</title>
176
+ <meta name="description" content="${escapeHTML(description)}" />
177
+ <meta name="keywords" content="${escapeHTML(pageKeywords(props))}" />
178
+ <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
179
+ <meta name="googlebot" content="index, follow" />
180
+ <meta name="author" content="Before Semicolon" />
181
+ <meta name="publisher" content="Before Semicolon" />
182
+ <meta name="application-name" content="${siteName}" />
183
+ <meta name="generator" content="@beforesemicolon/builder" />
184
+ <meta name="theme-color" content="#080d12" />
185
+ <meta name="color-scheme" content="dark light" />
186
+ <link rel="canonical" href="${canonical}" />
187
+ <link rel="home" href="${siteUrl}/" />
188
+ <link rel="sitemap" type="application/xml" href="/sitemap.xml" />
189
+ <link rel="alternate" type="text/plain" title="LLMs guide" href="/llms.txt" />
190
+ <link rel="alternate" type="text/plain" title="Full LLM documentation export" href="/llms-full.txt" />
191
+ <meta property="og:title" content="${escapeHTML(title)}" />
192
+ <meta property="og:type" content="${type}" />
193
+ <meta property="og:description" content="${escapeHTML(description)}" />
194
+ <meta property="og:image" content="${escapeHTML(image)}" />
195
+ <meta property="og:image:secure_url" content="${escapeHTML(image)}" />
196
+ <meta property="og:image:width" content="1200" />
197
+ <meta property="og:image:height" content="630" />
198
+ <meta property="og:image:alt" content="${escapeHTML(title)}" />
199
+ <meta property="og:url" content="${canonical}" />
200
+ <meta property="og:site_name" content="${siteName}" />
201
+ <meta property="og:locale" content="en_US" />
202
+ <meta name="twitter:card" content="summary_large_image" />
203
+ <meta name="twitter:site" content="@BeforeSemicolon" />
204
+ <meta name="twitter:creator" content="@BeforeSemicolon" />
205
+ <meta name="twitter:title" content="${escapeHTML(title)}" />
206
+ <meta name="twitter:image" content="${escapeHTML(image)}" />
207
+ <meta name="twitter:description" content="${escapeHTML(description)}" />
208
+ <meta name="twitter:image:alt" content="${escapeHTML(title)}" />
209
+ <link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png" />
210
+ <link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon/favicon-32x32.png" />
211
+ <link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon/favicon-16x16.png" />
212
+ <link rel="manifest" href="/assets/favicon/site.webmanifest" />
213
+ <link rel="icon" type="image/x-icon" href="/assets/favicon/favicon.ico" />
214
+ <link rel="stylesheet" href="/stylesheets/github-dark.hightlighter.css">
215
+ ${jsonScript(pageJson({ ...props, title, description }))}
216
+ ${jsonScript(breadcrumbJson({ title, path: props.path }))}
217
+ ${
218
+ isDev
219
+ ? ''
220
+ : `<!-- Google tag (gtag.js) -->
221
+ <script async src="https://www.googletagmanager.com/gtag/js?id=G-N3MXGDP5PS"></script>
222
+ <script>
223
+ window.dataLayer = window.dataLayer || [];
224
+ function gtag(){dataLayer.push(arguments);}
225
+ gtag('js', new Date());
226
+
227
+ gtag('config', 'G-N3MXGDP5PS');
228
+ </script>`
229
+ }
230
+ `
231
+ }
@@ -0,0 +1,41 @@
1
+ import logo from './_logo.js'
2
+
3
+ export default (props = {}) => {
4
+ const isDocs = props.path?.startsWith('/documentation')
5
+
6
+ return `
7
+ <header class="site-header">
8
+ <div class="header-inner wrapper">
9
+ <h1>
10
+ <a href="/" aria-label="Markup home">
11
+ ${logo({ fill: 'currentColor', width: '90px' })}
12
+ </a>
13
+ </h1>
14
+ ${
15
+ isDocs
16
+ ? `
17
+ <nav class="nav-actions docs-actions">
18
+ <a href="https://github.com/beforesemicolon/markup" target="_blank" rel="noopener" aria-label="Markup GitHub repository" class="github-link docs-github-link">
19
+ <span>v${props.projectMeta?.version || ''}</span>
20
+ <svg aria-hidden="true" viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg>
21
+ </a>
22
+ </nav>
23
+ `
24
+ : `
25
+ <nav class="nav-links">
26
+ <a href="/#features">Features</a>
27
+ <a href="/#code">Code</a>
28
+ <a href="/#install">Install</a>
29
+ </nav>
30
+ <nav class="nav-actions">
31
+ <a href="https://github.com/beforesemicolon/markup" target="_blank" rel="noopener" aria-label="GitHub" class="github-link">
32
+ <svg aria-hidden="true" viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg>
33
+ </a>
34
+ <a href="/documentation" class="btn-primary">Documentation</a>
35
+ </nav>
36
+ `
37
+ }
38
+ </div>
39
+ </header>
40
+ `
41
+ }
@@ -0,0 +1,31 @@
1
+ export default ({ fill = '#D2ECFF', width = '80px' } = {}) => `
2
+ <svg
3
+ xmlns="http://www.w3.org/2000/svg"
4
+ viewBox="0 0 207.25 61.99"
5
+ width="207.25"
6
+ height="61.99"
7
+ aria-hidden="true"
8
+ style="width: ${width}; height: auto"
9
+ >
10
+ <g fill="${fill}">
11
+ <path
12
+ d="m47.74.19c-.93-.39-2.01-.17-2.72.54l-20.38,20.38L4.27.73C3.55.02,2.48-.2,1.54.19.61.58,0,1.49,0,2.5v46.81h5V8.54l16.11,16.11-9.19,9.19,3.54,3.54,9.19-9.19,9.19,9.19,3.54-3.54-9.19-9.19,16.11-16.11v40.77h5V2.5c0-1.01-.61-1.92-1.54-2.31Z"
13
+ />
14
+ <path
15
+ d="m84.81,19.78v29.53h-4.7v-5.34c-.86,1.84-2.16,3.26-3.9,4.26-1.74,1-3.77,1.5-6.08,1.5-2.62,0-4.92-.63-6.9-1.88-1.98-1.25-3.5-3.02-4.58-5.31-1.08-2.29-1.61-4.96-1.61-8.01s.55-5.74,1.64-8.07c1.1-2.33,2.63-4.14,4.61-5.43,1.98-1.29,4.26-1.94,6.84-1.94,2.31,0,4.32.51,6.05,1.53,1.72,1.02,3.03,2.45,3.93,4.29v-5.11h4.7Zm-7.04,23.04c1.56-1.98,2.35-4.78,2.35-8.42s-.78-6.44-2.35-8.39c-1.57-1.96-3.8-2.94-6.69-2.94s-5.16,1.01-6.78,3.02c-1.62,2.02-2.44,4.82-2.44,8.42s.8,6.38,2.41,8.33c1.6,1.96,3.87,2.94,6.81,2.94s5.13-.99,6.69-2.96Z"
16
+ />
17
+ <path
18
+ d="m110.46,19.43l-.12,4.34c-.9-.31-1.94-.47-3.11-.47-2.86,0-4.98.89-6.37,2.67-1.39,1.78-2.08,3.94-2.08,6.49v16.85h-4.75v-21.25c0-3.05-.16-5.81-.47-8.28h4.52l.47,5.46c.74-2,1.94-3.52,3.58-4.58,1.64-1.06,3.52-1.58,5.63-1.58.98,0,1.88.12,2.7.35Z"
19
+ />
20
+ <path
21
+ d="m135.17,49.31l-15.14-14.21v14.21h-4.75V6.11h4.75v27.24l13.91-13.5h6.05l-14.79,14.15,16.2,15.32h-6.22Z"
22
+ />
23
+ <path
24
+ d="m170.22,19.78v29.53h-4.64v-5.11c-.94,1.8-2.25,3.17-3.93,4.11-1.68.94-3.58,1.41-5.69,1.41-3.48,0-6.12-.98-7.92-2.94-1.8-1.96-2.7-4.85-2.7-8.69v-18.31h4.75v18.2c0,2.66.55,4.62,1.64,5.87,1.09,1.25,2.76,1.88,4.99,1.88,2.62,0,4.73-.85,6.34-2.55,1.6-1.7,2.41-3.94,2.41-6.72v-16.67h4.75Z"
25
+ />
26
+ <path
27
+ d="m200.97,21.02c2,1.29,3.54,3.1,4.64,5.43,1.1,2.33,1.64,5.02,1.64,8.07s-.55,5.72-1.64,8.01c-1.1,2.29-2.63,4.06-4.61,5.31-1.98,1.25-4.28,1.88-6.9,1.88-2.31,0-4.32-.51-6.05-1.53-1.72-1.02-3.03-2.47-3.93-4.34v18.14h-4.75V28.06c0-3.05-.16-5.81-.47-8.28h4.52l.47,5.69c.82-2.03,2.12-3.61,3.9-4.73,1.78-1.12,3.88-1.67,6.31-1.67,2.58,0,4.87.65,6.87,1.94Zm-1.03,21.84c1.58-1.96,2.38-4.73,2.38-8.33s-.8-6.41-2.41-8.42c-1.61-2.02-3.84-3.02-6.69-3.02s-5.19.98-6.75,2.94c-1.57,1.96-2.35,4.75-2.35,8.39s.78,6.45,2.35,8.42c1.57,1.98,3.82,2.96,6.75,2.96s5.14-.98,6.72-2.94Z"
28
+ />
29
+ </g>
30
+ </svg>
31
+ `