create-smoodly-app 0.0.44 → 0.0.46

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 (387) hide show
  1. package/README.md +15 -10
  2. package/dist/index.js +75 -33
  3. package/package.json +2 -2
  4. package/templates/astro-blank/AGENTS.md +55 -0
  5. package/templates/astro-blank/CLAUDE.md +1 -0
  6. package/templates/astro-blank/README.md +88 -0
  7. package/templates/astro-blank/_gitignore +5 -0
  8. package/templates/astro-blank/astro.config.ts +15 -0
  9. package/templates/astro-blank/package.json +24 -0
  10. package/templates/astro-blank/scripts/seed.ts +80 -0
  11. package/templates/astro-blank/src/components/LocaleNav.astro +15 -0
  12. package/templates/astro-blank/src/components/elements/Button.schema.ts +22 -0
  13. package/templates/astro-blank/src/components/pages/Home.schema.ts +17 -0
  14. package/templates/astro-blank/src/components/pages/Page.schema.ts +14 -0
  15. package/templates/astro-blank/src/components/sections/Text.schema.ts +24 -0
  16. package/templates/astro-blank/src/elements/button.astro +10 -0
  17. package/templates/astro-blank/src/entry-pages/posts.astro +23 -0
  18. package/templates/astro-blank/src/layouts/Layout.astro +25 -0
  19. package/templates/astro-blank/src/live.config.ts +13 -0
  20. package/templates/astro-blank/src/page-types/home.astro +15 -0
  21. package/templates/astro-blank/src/page-types/page.astro +15 -0
  22. package/templates/astro-blank/src/pages/404.astro +7 -0
  23. package/templates/astro-blank/src/sections/text.astro +18 -0
  24. package/templates/astro-blank/src/smoodly/collections.ts +24 -0
  25. package/templates/astro-blank/src/smoodly/config.ts +28 -0
  26. package/templates/astro-blank/src/smoodly/elements.ts +5 -0
  27. package/templates/astro-blank/src/smoodly/globals.ts +18 -0
  28. package/templates/astro-blank/src/smoodly/sections.ts +5 -0
  29. package/templates/astro-blank/src/smoodly/toolsets.ts +14 -0
  30. package/templates/astro-blank/src/styles/global.css +57 -0
  31. package/templates/astro-blank/supabase/migrations/20260926120000_smoodly_v1.sql +535 -0
  32. package/templates/astro-blank/supabase/migrations/20260926130000_smoodly_v2.sql +26 -0
  33. package/templates/astro-blank/supabase/migrations/20260926140000_smoodly_v3.sql +38 -0
  34. package/templates/astro-blank/supabase/migrations/20260926150000_smoodly_v4.sql +41 -0
  35. package/templates/astro-blank/supabase/migrations/20260929120000_smoodly_v5.sql +56 -0
  36. package/templates/astro-blank/supabase/migrations/20260929135523_smoodly_v6.sql +200 -0
  37. package/templates/astro-blank/supabase/migrations/20260930040956_smoodly_v7.sql +84 -0
  38. package/templates/astro-blank/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  39. package/templates/astro-blank/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  40. package/templates/{blank/supabase/migrations/20260930041056_smoodly_views.sql → astro-blank/supabase/migrations/20261007200100_smoodly_views.sql} +1 -1
  41. package/templates/astro-blank/tsconfig.json +17 -0
  42. package/templates/astro-blank-intl/AGENTS.md +55 -0
  43. package/templates/astro-blank-intl/CLAUDE.md +1 -0
  44. package/templates/astro-blank-intl/README.md +89 -0
  45. package/templates/astro-blank-intl/_gitignore +5 -0
  46. package/templates/astro-blank-intl/astro.config.ts +17 -0
  47. package/templates/astro-blank-intl/package.json +24 -0
  48. package/templates/astro-blank-intl/scripts/seed.ts +80 -0
  49. package/templates/astro-blank-intl/src/components/LocaleNav.astro +15 -0
  50. package/templates/astro-blank-intl/src/components/elements/Button.schema.ts +22 -0
  51. package/templates/astro-blank-intl/src/components/pages/Home.schema.ts +17 -0
  52. package/templates/astro-blank-intl/src/components/pages/Page.schema.ts +14 -0
  53. package/templates/astro-blank-intl/src/components/sections/Text.schema.ts +24 -0
  54. package/templates/astro-blank-intl/src/elements/button.astro +10 -0
  55. package/templates/astro-blank-intl/src/entry-pages/posts.astro +23 -0
  56. package/templates/astro-blank-intl/src/layouts/Layout.astro +25 -0
  57. package/templates/astro-blank-intl/src/live.config.ts +13 -0
  58. package/templates/astro-blank-intl/src/page-types/home.astro +15 -0
  59. package/templates/astro-blank-intl/src/page-types/page.astro +15 -0
  60. package/templates/astro-blank-intl/src/pages/404.astro +7 -0
  61. package/templates/astro-blank-intl/src/sections/text.astro +18 -0
  62. package/templates/astro-blank-intl/src/smoodly/collections.ts +24 -0
  63. package/templates/astro-blank-intl/src/smoodly/config.ts +29 -0
  64. package/templates/astro-blank-intl/src/smoodly/elements.ts +5 -0
  65. package/templates/astro-blank-intl/src/smoodly/globals.ts +18 -0
  66. package/templates/astro-blank-intl/src/smoodly/sections.ts +5 -0
  67. package/templates/astro-blank-intl/src/smoodly/toolsets.ts +14 -0
  68. package/templates/astro-blank-intl/src/styles/global.css +57 -0
  69. package/templates/astro-blank-intl/supabase/migrations/20260926120000_smoodly_v1.sql +535 -0
  70. package/templates/astro-blank-intl/supabase/migrations/20260926130000_smoodly_v2.sql +26 -0
  71. package/templates/astro-blank-intl/supabase/migrations/20260926140000_smoodly_v3.sql +38 -0
  72. package/templates/astro-blank-intl/supabase/migrations/20260926150000_smoodly_v4.sql +41 -0
  73. package/templates/astro-blank-intl/supabase/migrations/20260929120000_smoodly_v5.sql +56 -0
  74. package/templates/astro-blank-intl/supabase/migrations/20260929135523_smoodly_v6.sql +200 -0
  75. package/templates/astro-blank-intl/supabase/migrations/20260930040956_smoodly_v7.sql +84 -0
  76. package/templates/astro-blank-intl/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  77. package/templates/astro-blank-intl/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  78. package/templates/{blank-intl/supabase/migrations/20260930041056_smoodly_views.sql → astro-blank-intl/supabase/migrations/20261007200100_smoodly_views.sql} +1 -1
  79. package/templates/astro-blank-intl/tsconfig.json +17 -0
  80. package/templates/astro-blank-intl.tsconfig.json +24 -0
  81. package/templates/astro-blank.tsconfig.json +24 -0
  82. package/templates/astro-lorem/AGENTS.md +55 -0
  83. package/templates/astro-lorem/CLAUDE.md +1 -0
  84. package/templates/astro-lorem/README.md +60 -0
  85. package/templates/astro-lorem/_gitignore +5 -0
  86. package/templates/astro-lorem/astro.config.ts +15 -0
  87. package/templates/astro-lorem/package.json +24 -0
  88. package/templates/astro-lorem/public/images/about_main.jpg +0 -0
  89. package/templates/astro-lorem/public/images/article_photo.jpg +0 -0
  90. package/templates/astro-lorem/public/images/hero_image.jpg +0 -0
  91. package/templates/astro-lorem/public/images/home_section_2.jpg +0 -0
  92. package/templates/astro-lorem/scripts/seed.ts +405 -0
  93. package/templates/astro-lorem/src/components/ArticleCard.astro +19 -0
  94. package/templates/astro-lorem/src/components/articles.ts +42 -0
  95. package/templates/astro-lorem/src/components/elements/Callout.schema.ts +24 -0
  96. package/templates/astro-lorem/src/components/elements/Cta.schema.ts +21 -0
  97. package/templates/astro-lorem/src/components/news.ts +13 -0
  98. package/templates/astro-lorem/src/components/pages/Articles.schema.ts +20 -0
  99. package/templates/astro-lorem/src/components/pages/Home.schema.ts +26 -0
  100. package/templates/astro-lorem/src/components/pages/News.schema.ts +17 -0
  101. package/templates/astro-lorem/src/components/pages/Page.schema.ts +24 -0
  102. package/templates/astro-lorem/src/components/sections/FavouriteArticles.schema.ts +17 -0
  103. package/templates/astro-lorem/src/components/sections/Footer.schema.ts +31 -0
  104. package/templates/astro-lorem/src/components/sections/Header.schema.ts +21 -0
  105. package/templates/astro-lorem/src/components/sections/Hero.schema.ts +24 -0
  106. package/templates/astro-lorem/src/components/sections/ImageText.schema.ts +30 -0
  107. package/templates/astro-lorem/src/components/sections/PageHero.schema.ts +21 -0
  108. package/templates/astro-lorem/src/components/sections/People.schema.ts +15 -0
  109. package/templates/astro-lorem/src/components/sections/Points.schema.ts +21 -0
  110. package/templates/astro-lorem/src/components/sections/Quote.schema.ts +23 -0
  111. package/templates/astro-lorem/src/elements/callout.astro +13 -0
  112. package/templates/astro-lorem/src/elements/cta.astro +15 -0
  113. package/templates/astro-lorem/src/entry-pages/articles.astro +71 -0
  114. package/templates/astro-lorem/src/entry-pages/news.astro +29 -0
  115. package/templates/astro-lorem/src/layouts/Layout.astro +39 -0
  116. package/templates/astro-lorem/src/live.config.ts +20 -0
  117. package/templates/astro-lorem/src/messages/en.json +7 -0
  118. package/templates/astro-lorem/src/messages/fi.json +7 -0
  119. package/templates/astro-lorem/src/page-types/articlesIndex.astro +24 -0
  120. package/templates/astro-lorem/src/page-types/home.astro +14 -0
  121. package/templates/astro-lorem/src/page-types/newsIndex.astro +28 -0
  122. package/templates/astro-lorem/src/page-types/page.astro +27 -0
  123. package/templates/astro-lorem/src/pages/404.astro +7 -0
  124. package/templates/astro-lorem/src/sections/favouriteArticles.astro +26 -0
  125. package/templates/astro-lorem/src/sections/footer.astro +37 -0
  126. package/templates/astro-lorem/src/sections/header.astro +27 -0
  127. package/templates/astro-lorem/src/sections/hero.astro +28 -0
  128. package/templates/astro-lorem/src/sections/imageText.astro +22 -0
  129. package/templates/astro-lorem/src/sections/pageHero.astro +20 -0
  130. package/templates/astro-lorem/src/sections/peopleSection.astro +24 -0
  131. package/templates/astro-lorem/src/sections/points.astro +33 -0
  132. package/templates/astro-lorem/src/sections/quote.astro +16 -0
  133. package/templates/astro-lorem/src/smoodly/collections.ts +63 -0
  134. package/templates/astro-lorem/src/smoodly/config.ts +48 -0
  135. package/templates/astro-lorem/src/smoodly/elements.ts +6 -0
  136. package/templates/astro-lorem/src/smoodly/globals.ts +29 -0
  137. package/templates/astro-lorem/src/smoodly/sections.ts +18 -0
  138. package/templates/astro-lorem/src/smoodly/toolsets.ts +16 -0
  139. package/templates/astro-lorem/src/strings.ts +17 -0
  140. package/templates/astro-lorem/src/styles/global.css +228 -0
  141. package/templates/astro-lorem/supabase/migrations/20260926120000_smoodly_v1.sql +535 -0
  142. package/templates/astro-lorem/supabase/migrations/20260926130000_smoodly_v2.sql +26 -0
  143. package/templates/astro-lorem/supabase/migrations/20260926140000_smoodly_v3.sql +38 -0
  144. package/templates/astro-lorem/supabase/migrations/20260926150000_smoodly_v4.sql +41 -0
  145. package/templates/astro-lorem/supabase/migrations/20260929120000_smoodly_v5.sql +56 -0
  146. package/templates/astro-lorem/supabase/migrations/20260929135523_smoodly_v6.sql +200 -0
  147. package/templates/astro-lorem/supabase/migrations/20260930040956_smoodly_v7.sql +84 -0
  148. package/templates/astro-lorem/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  149. package/templates/astro-lorem/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  150. package/templates/{lorem/supabase/migrations/20260930041056_smoodly_views.sql → astro-lorem/supabase/migrations/20261007200100_smoodly_views.sql} +1 -1
  151. package/templates/astro-lorem/tsconfig.json +17 -0
  152. package/templates/astro-lorem-intl/AGENTS.md +55 -0
  153. package/templates/astro-lorem-intl/CLAUDE.md +1 -0
  154. package/templates/astro-lorem-intl/README.md +62 -0
  155. package/templates/astro-lorem-intl/_gitignore +5 -0
  156. package/templates/astro-lorem-intl/astro.config.ts +17 -0
  157. package/templates/astro-lorem-intl/package.json +24 -0
  158. package/templates/astro-lorem-intl/public/images/about_main.jpg +0 -0
  159. package/templates/astro-lorem-intl/public/images/article_photo.jpg +0 -0
  160. package/templates/astro-lorem-intl/public/images/hero_image.jpg +0 -0
  161. package/templates/astro-lorem-intl/public/images/home_section_2.jpg +0 -0
  162. package/templates/astro-lorem-intl/scripts/seed.ts +405 -0
  163. package/templates/astro-lorem-intl/src/components/ArticleCard.astro +19 -0
  164. package/templates/astro-lorem-intl/src/components/articles.ts +42 -0
  165. package/templates/astro-lorem-intl/src/components/elements/Callout.schema.ts +24 -0
  166. package/templates/astro-lorem-intl/src/components/elements/Cta.schema.ts +21 -0
  167. package/templates/astro-lorem-intl/src/components/news.ts +13 -0
  168. package/templates/astro-lorem-intl/src/components/pages/Articles.schema.ts +20 -0
  169. package/templates/astro-lorem-intl/src/components/pages/Home.schema.ts +26 -0
  170. package/templates/astro-lorem-intl/src/components/pages/News.schema.ts +17 -0
  171. package/templates/astro-lorem-intl/src/components/pages/Page.schema.ts +24 -0
  172. package/templates/astro-lorem-intl/src/components/sections/FavouriteArticles.schema.ts +17 -0
  173. package/templates/astro-lorem-intl/src/components/sections/Footer.schema.ts +31 -0
  174. package/templates/astro-lorem-intl/src/components/sections/Header.schema.ts +21 -0
  175. package/templates/astro-lorem-intl/src/components/sections/Hero.schema.ts +24 -0
  176. package/templates/astro-lorem-intl/src/components/sections/ImageText.schema.ts +30 -0
  177. package/templates/astro-lorem-intl/src/components/sections/PageHero.schema.ts +21 -0
  178. package/templates/astro-lorem-intl/src/components/sections/People.schema.ts +15 -0
  179. package/templates/astro-lorem-intl/src/components/sections/Points.schema.ts +21 -0
  180. package/templates/astro-lorem-intl/src/components/sections/Quote.schema.ts +23 -0
  181. package/templates/astro-lorem-intl/src/elements/callout.astro +13 -0
  182. package/templates/astro-lorem-intl/src/elements/cta.astro +15 -0
  183. package/templates/astro-lorem-intl/src/entry-pages/articles.astro +71 -0
  184. package/templates/astro-lorem-intl/src/entry-pages/news.astro +29 -0
  185. package/templates/astro-lorem-intl/src/layouts/Layout.astro +39 -0
  186. package/templates/astro-lorem-intl/src/live.config.ts +20 -0
  187. package/templates/astro-lorem-intl/src/messages/en.json +7 -0
  188. package/templates/astro-lorem-intl/src/messages/fi.json +7 -0
  189. package/templates/astro-lorem-intl/src/page-types/articlesIndex.astro +24 -0
  190. package/templates/astro-lorem-intl/src/page-types/home.astro +14 -0
  191. package/templates/astro-lorem-intl/src/page-types/newsIndex.astro +28 -0
  192. package/templates/astro-lorem-intl/src/page-types/page.astro +27 -0
  193. package/templates/astro-lorem-intl/src/pages/404.astro +7 -0
  194. package/templates/astro-lorem-intl/src/sections/favouriteArticles.astro +26 -0
  195. package/templates/astro-lorem-intl/src/sections/footer.astro +37 -0
  196. package/templates/astro-lorem-intl/src/sections/header.astro +27 -0
  197. package/templates/astro-lorem-intl/src/sections/hero.astro +28 -0
  198. package/templates/astro-lorem-intl/src/sections/imageText.astro +22 -0
  199. package/templates/astro-lorem-intl/src/sections/pageHero.astro +20 -0
  200. package/templates/astro-lorem-intl/src/sections/peopleSection.astro +24 -0
  201. package/templates/astro-lorem-intl/src/sections/points.astro +33 -0
  202. package/templates/astro-lorem-intl/src/sections/quote.astro +16 -0
  203. package/templates/astro-lorem-intl/src/smoodly/collections.ts +63 -0
  204. package/templates/astro-lorem-intl/src/smoodly/config.ts +48 -0
  205. package/templates/astro-lorem-intl/src/smoodly/elements.ts +6 -0
  206. package/templates/astro-lorem-intl/src/smoodly/globals.ts +29 -0
  207. package/templates/astro-lorem-intl/src/smoodly/sections.ts +18 -0
  208. package/templates/astro-lorem-intl/src/smoodly/toolsets.ts +16 -0
  209. package/templates/astro-lorem-intl/src/strings.ts +17 -0
  210. package/templates/astro-lorem-intl/src/styles/global.css +228 -0
  211. package/templates/astro-lorem-intl/supabase/migrations/20260926120000_smoodly_v1.sql +535 -0
  212. package/templates/astro-lorem-intl/supabase/migrations/20260926130000_smoodly_v2.sql +26 -0
  213. package/templates/astro-lorem-intl/supabase/migrations/20260926140000_smoodly_v3.sql +38 -0
  214. package/templates/astro-lorem-intl/supabase/migrations/20260926150000_smoodly_v4.sql +41 -0
  215. package/templates/astro-lorem-intl/supabase/migrations/20260929120000_smoodly_v5.sql +56 -0
  216. package/templates/astro-lorem-intl/supabase/migrations/20260929135523_smoodly_v6.sql +200 -0
  217. package/templates/astro-lorem-intl/supabase/migrations/20260930040956_smoodly_v7.sql +84 -0
  218. package/templates/astro-lorem-intl/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  219. package/templates/astro-lorem-intl/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  220. package/templates/{lorem-intl/supabase/migrations/20260930041056_smoodly_views.sql → astro-lorem-intl/supabase/migrations/20261007200100_smoodly_views.sql} +1 -1
  221. package/templates/astro-lorem-intl/tsconfig.json +17 -0
  222. package/templates/astro-lorem-intl.tsconfig.json +24 -0
  223. package/templates/astro-lorem.tsconfig.json +24 -0
  224. package/templates/blank/AGENTS.md +23 -16
  225. package/templates/blank/README.md +20 -15
  226. package/templates/blank/app/(smoodly)/admin/[[...segments]]/route.ts +8 -0
  227. package/templates/blank/components/elements/Button.schema.ts +22 -0
  228. package/templates/blank/components/elements/Button.tsx +2 -20
  229. package/templates/blank/components/pages/Home.schema.ts +17 -0
  230. package/templates/blank/components/pages/Home.tsx +2 -16
  231. package/templates/blank/components/pages/Page.schema.ts +14 -0
  232. package/templates/blank/components/pages/Page.tsx +2 -14
  233. package/templates/blank/components/pages/Post.tsx +5 -4
  234. package/templates/blank/components/sections/Text.schema.ts +24 -0
  235. package/templates/blank/components/sections/Text.tsx +7 -27
  236. package/templates/blank/package.json +1 -1
  237. package/templates/blank/scripts/seed.ts +2 -2
  238. package/templates/blank/smoodly/config.ts +8 -7
  239. package/templates/blank/smoodly/elements.ts +4 -4
  240. package/templates/blank/smoodly/globals.ts +4 -2
  241. package/templates/blank/smoodly/richtext.tsx +4 -5
  242. package/templates/blank/smoodly/sections.ts +4 -4
  243. package/templates/blank/smoodly/server.ts +22 -44
  244. package/templates/blank/smoodly/toolsets.ts +2 -2
  245. package/templates/blank/smoodly/views.ts +15 -0
  246. package/templates/blank/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  247. package/templates/blank/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  248. package/templates/blank/supabase/migrations/20261007200100_smoodly_views.sql +20 -0
  249. package/templates/blank-intl/AGENTS.md +23 -16
  250. package/templates/blank-intl/README.md +20 -15
  251. package/templates/blank-intl/app/(smoodly)/admin/[[...segments]]/route.ts +8 -0
  252. package/templates/blank-intl/components/elements/Button.schema.ts +22 -0
  253. package/templates/blank-intl/components/elements/Button.tsx +2 -20
  254. package/templates/blank-intl/components/pages/Home.schema.ts +17 -0
  255. package/templates/blank-intl/components/pages/Home.tsx +2 -16
  256. package/templates/blank-intl/components/pages/Page.schema.ts +14 -0
  257. package/templates/blank-intl/components/pages/Page.tsx +2 -14
  258. package/templates/blank-intl/components/pages/Post.tsx +5 -4
  259. package/templates/blank-intl/components/sections/Text.schema.ts +24 -0
  260. package/templates/blank-intl/components/sections/Text.tsx +7 -27
  261. package/templates/blank-intl/package.json +1 -1
  262. package/templates/blank-intl/scripts/seed.ts +2 -2
  263. package/templates/blank-intl/smoodly/config.ts +8 -7
  264. package/templates/blank-intl/smoodly/elements.ts +4 -4
  265. package/templates/blank-intl/smoodly/globals.ts +4 -2
  266. package/templates/blank-intl/smoodly/richtext.tsx +4 -5
  267. package/templates/blank-intl/smoodly/sections.ts +4 -4
  268. package/templates/blank-intl/smoodly/server.ts +22 -44
  269. package/templates/blank-intl/smoodly/toolsets.ts +2 -2
  270. package/templates/blank-intl/smoodly/views.ts +15 -0
  271. package/templates/blank-intl/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  272. package/templates/blank-intl/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  273. package/templates/blank-intl/supabase/migrations/20261007200100_smoodly_views.sql +20 -0
  274. package/templates/lorem/AGENTS.md +23 -16
  275. package/templates/lorem/README.md +3 -3
  276. package/templates/lorem/app/(smoodly)/admin/[[...segments]]/route.ts +8 -0
  277. package/templates/lorem/components/elements/Callout.schema.ts +24 -0
  278. package/templates/lorem/components/elements/Callout.tsx +2 -24
  279. package/templates/lorem/components/elements/Cta.schema.ts +21 -0
  280. package/templates/lorem/components/elements/Cta.tsx +2 -21
  281. package/templates/lorem/components/pages/Article.tsx +1 -1
  282. package/templates/lorem/components/pages/Articles.schema.ts +20 -0
  283. package/templates/lorem/components/pages/Articles.tsx +2 -20
  284. package/templates/lorem/components/pages/Home.schema.ts +26 -0
  285. package/templates/lorem/components/pages/Home.tsx +2 -26
  286. package/templates/lorem/components/pages/News.schema.ts +17 -0
  287. package/templates/lorem/components/pages/News.tsx +2 -17
  288. package/templates/lorem/components/pages/NewsPost.tsx +1 -1
  289. package/templates/lorem/components/pages/Page.schema.ts +24 -0
  290. package/templates/lorem/components/pages/Page.tsx +2 -24
  291. package/templates/lorem/components/sections/FavouriteArticles.schema.ts +17 -0
  292. package/templates/lorem/components/sections/FavouriteArticles.tsx +2 -17
  293. package/templates/lorem/components/sections/Footer.schema.ts +31 -0
  294. package/templates/lorem/components/sections/Footer.tsx +4 -32
  295. package/templates/lorem/components/sections/Header.schema.ts +21 -0
  296. package/templates/lorem/components/sections/Header.tsx +2 -21
  297. package/templates/lorem/components/sections/Hero.schema.ts +24 -0
  298. package/templates/lorem/components/sections/Hero.tsx +2 -24
  299. package/templates/lorem/components/sections/ImageText.schema.ts +30 -0
  300. package/templates/lorem/components/sections/ImageText.tsx +2 -30
  301. package/templates/lorem/components/sections/PageHero.schema.ts +21 -0
  302. package/templates/lorem/components/sections/PageHero.tsx +2 -21
  303. package/templates/lorem/components/sections/People.schema.ts +15 -0
  304. package/templates/lorem/components/sections/People.tsx +2 -14
  305. package/templates/lorem/components/sections/Points.schema.ts +21 -0
  306. package/templates/lorem/components/sections/Points.tsx +2 -21
  307. package/templates/lorem/components/sections/Quote.schema.ts +23 -0
  308. package/templates/lorem/components/sections/Quote.tsx +2 -23
  309. package/templates/lorem/package.json +1 -1
  310. package/templates/lorem/scripts/seed.ts +18 -18
  311. package/templates/lorem/smoodly/collections.ts +2 -2
  312. package/templates/lorem/smoodly/config.ts +14 -15
  313. package/templates/lorem/smoodly/elements.ts +5 -5
  314. package/templates/lorem/smoodly/globals.ts +10 -7
  315. package/templates/lorem/smoodly/richtext.tsx +5 -5
  316. package/templates/lorem/smoodly/sections.ts +12 -13
  317. package/templates/lorem/smoodly/server.ts +22 -44
  318. package/templates/lorem/smoodly/toolsets.ts +3 -3
  319. package/templates/lorem/smoodly/views.ts +33 -0
  320. package/templates/lorem/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  321. package/templates/lorem/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  322. package/templates/lorem/supabase/migrations/20261007200100_smoodly_views.sql +58 -0
  323. package/templates/lorem-intl/AGENTS.md +23 -16
  324. package/templates/lorem-intl/README.md +3 -3
  325. package/templates/lorem-intl/app/(smoodly)/admin/[[...segments]]/route.ts +8 -0
  326. package/templates/lorem-intl/components/elements/Callout.schema.ts +24 -0
  327. package/templates/lorem-intl/components/elements/Callout.tsx +2 -24
  328. package/templates/lorem-intl/components/elements/Cta.schema.ts +21 -0
  329. package/templates/lorem-intl/components/elements/Cta.tsx +2 -21
  330. package/templates/lorem-intl/components/pages/Article.tsx +1 -1
  331. package/templates/lorem-intl/components/pages/Articles.schema.ts +20 -0
  332. package/templates/lorem-intl/components/pages/Articles.tsx +2 -20
  333. package/templates/lorem-intl/components/pages/Home.schema.ts +26 -0
  334. package/templates/lorem-intl/components/pages/Home.tsx +2 -26
  335. package/templates/lorem-intl/components/pages/News.schema.ts +17 -0
  336. package/templates/lorem-intl/components/pages/News.tsx +2 -17
  337. package/templates/lorem-intl/components/pages/NewsPost.tsx +1 -1
  338. package/templates/lorem-intl/components/pages/Page.schema.ts +24 -0
  339. package/templates/lorem-intl/components/pages/Page.tsx +2 -24
  340. package/templates/lorem-intl/components/sections/FavouriteArticles.schema.ts +17 -0
  341. package/templates/lorem-intl/components/sections/FavouriteArticles.tsx +2 -17
  342. package/templates/lorem-intl/components/sections/Footer.schema.ts +31 -0
  343. package/templates/lorem-intl/components/sections/Footer.tsx +4 -32
  344. package/templates/lorem-intl/components/sections/Header.schema.ts +21 -0
  345. package/templates/lorem-intl/components/sections/Header.tsx +2 -21
  346. package/templates/lorem-intl/components/sections/Hero.schema.ts +24 -0
  347. package/templates/lorem-intl/components/sections/Hero.tsx +2 -24
  348. package/templates/lorem-intl/components/sections/ImageText.schema.ts +30 -0
  349. package/templates/lorem-intl/components/sections/ImageText.tsx +2 -30
  350. package/templates/lorem-intl/components/sections/PageHero.schema.ts +21 -0
  351. package/templates/lorem-intl/components/sections/PageHero.tsx +2 -21
  352. package/templates/lorem-intl/components/sections/People.schema.ts +15 -0
  353. package/templates/lorem-intl/components/sections/People.tsx +2 -14
  354. package/templates/lorem-intl/components/sections/Points.schema.ts +21 -0
  355. package/templates/lorem-intl/components/sections/Points.tsx +2 -21
  356. package/templates/lorem-intl/components/sections/Quote.schema.ts +23 -0
  357. package/templates/lorem-intl/components/sections/Quote.tsx +2 -23
  358. package/templates/lorem-intl/package.json +1 -1
  359. package/templates/lorem-intl/scripts/seed.ts +18 -18
  360. package/templates/lorem-intl/smoodly/collections.ts +2 -2
  361. package/templates/lorem-intl/smoodly/config.ts +14 -15
  362. package/templates/lorem-intl/smoodly/elements.ts +5 -5
  363. package/templates/lorem-intl/smoodly/globals.ts +10 -7
  364. package/templates/lorem-intl/smoodly/richtext.tsx +5 -5
  365. package/templates/lorem-intl/smoodly/sections.ts +12 -13
  366. package/templates/lorem-intl/smoodly/server.ts +22 -44
  367. package/templates/lorem-intl/smoodly/toolsets.ts +3 -3
  368. package/templates/lorem-intl/smoodly/views.ts +33 -0
  369. package/templates/lorem-intl/supabase/migrations/20261007120000_smoodly_v8.sql +154 -0
  370. package/templates/lorem-intl/supabase/migrations/20261007200000_smoodly_v9.sql +30 -0
  371. package/templates/lorem-intl/supabase/migrations/20261007200100_smoodly_views.sql +58 -0
  372. package/templates/blank/app/(smoodly)/admin/[[...segments]]/page.tsx +0 -1
  373. package/templates/blank/app/(smoodly)/admin/layout.tsx +0 -15
  374. package/templates/blank/smoodly/admin.tsx +0 -6
  375. package/templates/blank/smoodly/ops.ts +0 -11
  376. package/templates/blank-intl/app/(smoodly)/admin/[[...segments]]/page.tsx +0 -1
  377. package/templates/blank-intl/app/(smoodly)/admin/layout.tsx +0 -15
  378. package/templates/blank-intl/smoodly/admin.tsx +0 -6
  379. package/templates/blank-intl/smoodly/ops.ts +0 -11
  380. package/templates/lorem/app/(smoodly)/admin/[[...segments]]/page.tsx +0 -1
  381. package/templates/lorem/app/(smoodly)/admin/layout.tsx +0 -15
  382. package/templates/lorem/smoodly/admin.tsx +0 -6
  383. package/templates/lorem/smoodly/ops.ts +0 -11
  384. package/templates/lorem-intl/app/(smoodly)/admin/[[...segments]]/page.tsx +0 -1
  385. package/templates/lorem-intl/app/(smoodly)/admin/layout.tsx +0 -15
  386. package/templates/lorem-intl/smoodly/admin.tsx +0 -6
  387. package/templates/lorem-intl/smoodly/ops.ts +0 -11
@@ -0,0 +1,22 @@
1
+ import { f, smoodly } from "smoodly";
2
+
3
+ // An Element: a small registered block editors insert inside richtext
4
+ // (the `richtext` context). This one is a link styled as a button;
5
+ // src/elements/button.astro is its view. To add another element, copy
6
+ // both files, name the view after the schema, and list the schema in
7
+ // src/smoodly/elements.ts and in the toolsets that may embed it
8
+ // (src/smoodly/toolsets.ts).
9
+ // Relative imports only in this file and in smoodly/toolsets.ts: the
10
+ // template build imports them outside the app, where `@/` has no mapping.
11
+ export const buttonSchema = smoodly.schema.element({
12
+ name: "button",
13
+ title: "Button",
14
+ icon: "→",
15
+ description: "A link styled as a button.",
16
+ contexts: ["richtext"],
17
+ fields: {
18
+ label: f.text().max(60),
19
+ href: f.link(),
20
+ },
21
+ sample: { label: "Read more", href: "/" },
22
+ });
@@ -0,0 +1,17 @@
1
+ import { smoodly, z } from "smoodly";
2
+ import { textSchema } from "../sections/Text.schema";
3
+
4
+ // A page type's schema: its zones and what each allows. Its view,
5
+ // src/page-types/home.astro, places them with <Zone />. `slug` makes it fixed — one record
6
+ // editors can neither delete nor duplicate — and the config's
7
+ // homePageSlug maps that record to "/". The body is a freeform zone over
8
+ // the section schemas listed here.
9
+ export const homeSchema = smoodly.schema.page({
10
+ name: "home",
11
+ title: "Home",
12
+ slug: "home",
13
+ zones: {
14
+ body: z.freeform({ sections: [textSchema], custom: true }),
15
+ },
16
+ seo: true,
17
+ });
@@ -0,0 +1,14 @@
1
+ import { smoodly, z } from "smoodly";
2
+ import { textSchema } from "../sections/Text.schema";
3
+
4
+ // An open page type: no `slug`, so editors create as many as they like,
5
+ // anywhere in the tree the config allows. src/page-types/page.astro is the view;
6
+ // its `page` prop is where the page sits (title, path, ancestors, children).
7
+ export const pageSchema = smoodly.schema.page({
8
+ name: "page",
9
+ title: "Page",
10
+ zones: {
11
+ body: z.freeform({ sections: [textSchema], custom: true }),
12
+ },
13
+ seo: true,
14
+ });
@@ -0,0 +1,24 @@
1
+ import { f, smoodly } from "smoodly";
2
+ import { text } from "@/smoodly/toolsets";
3
+
4
+ // A section's schema: a title and a richtext body. Its view is
5
+ // src/sections/text.astro. To add another section, copy both files, name the
6
+ // view after the new schema, list the schema in src/smoodly/sections.ts
7
+ // and allow it in a page type's zone (src/components/pages/*.schema.ts).
8
+ // This file imports no component.
9
+ export const textSchema = smoodly.schema.section({
10
+ name: "text",
11
+ title: "Text",
12
+ description: "A title and a body of text.",
13
+ fields: {
14
+ title: f.text(),
15
+ body: f.richtext({ toolset: text }),
16
+ },
17
+ settings: {
18
+ background: f.radio([{ value: "paper", label: "Paper" }, { value: "ink", label: "Ink" }]).default("paper"),
19
+ },
20
+ sample: {
21
+ title: "Hello",
22
+ body: { type: "doc", content: [{ type: "paragraph", content: [{ type: "text", text: "Write something here." }] }] },
23
+ },
24
+ });
@@ -0,0 +1,10 @@
1
+ ---
2
+ // src/elements/button.astro — the view of the element named "button": a link styled as a button, inserted inside
3
+ // richtext. An editor typed the href, so it goes through safeHref: a scheme the page must not carry renders no link.
4
+ import { safeHref, type Props as SmoodlyProps } from "smoodly";
5
+ import { buttonSchema } from "@/components/elements/Button.schema";
6
+
7
+ type Props = SmoodlyProps<typeof buttonSchema>;
8
+ const { label, href } = Astro.props;
9
+ ---
10
+ <a class="button" href={safeHref(href)}>{label}</a>
@@ -0,0 +1,23 @@
1
+ ---
2
+ // src/entry-pages/posts.astro — the entry page of the collection "posts", served at /posts/<slug>. An entry page
3
+ // is a file by the collection's name; it receives the entry as a read returns it, with its locale alternates.
4
+ import type { EntryFields, EntryItem } from "smoodly";
5
+ import { RichText } from "smoodly/astro/components";
6
+ import type { PageHead } from "smoodly/astro/runtime";
7
+ import type { posts } from "@/smoodly/collections";
8
+ import Layout from "../layouts/Layout.astro";
9
+ import LocaleNav from "../components/LocaleNav.astro";
10
+
11
+ type Props = { entry: EntryItem<EntryFields<typeof posts>>; head: PageHead };
12
+ const { entry, head } = Astro.props;
13
+ const { locale, locales } = entry;
14
+ const post = entry.fields;
15
+ ---
16
+ <Layout head={head} locale={locale}>
17
+ <LocaleNav locale={locale} locales={locales} />
18
+ <article class="container prose">
19
+ <h1>{post.title}</h1>
20
+ {post.date && <p><time datetime={post.date}>{post.date.slice(0, 10)}</time></p>}
21
+ <RichText doc={post.body} />
22
+ </article>
23
+ </Layout>
@@ -0,0 +1,25 @@
1
+ ---
2
+ // src/layouts/Layout.astro — the site's own document: every page type and entry page renders inside it. The
3
+ // `site` global item (src/smoodly/globals.ts) gives the title and the footer line, read as a live entry per
4
+ // locale, null until published there. In a preview the integration adds what the editor needs to the response.
5
+ import { getLiveEntry } from "astro:content";
6
+ import { Head } from "smoodly/astro/components";
7
+ import type { PageHead } from "smoodly/astro/runtime";
8
+ import "../styles/global.css";
9
+
10
+ type Props = { head: PageHead; locale: string };
11
+ const { head, locale } = Astro.props;
12
+ const { entry: site } = await getLiveEntry("site", { locale });
13
+ ---
14
+ <!doctype html>
15
+ <html lang={locale}>
16
+ <head>
17
+ <meta charset="utf-8" />
18
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
19
+ <Head of={head} fallback={site?.data.fields.name ?? "Smoodly site"} />
20
+ </head>
21
+ <body>
22
+ <main><slot /></main>
23
+ {site && <footer class="container site-footer">{site.data.fields.name} · {site.data.fields.tagline}</footer>}
24
+ </body>
25
+ </html>
@@ -0,0 +1,13 @@
1
+ // src/live.config.ts — Smoodly's content as live collections: one loader per collection, global item and the pages,
2
+ // from the package; this file only names them. A view reads with getLiveCollection / getLiveEntry from astro:content.
3
+ import { defineLiveCollection } from "astro:content";
4
+ import { entriesLoader, globalLoader, pageLoader, pageTreeLoader } from "smoodly/astro/content";
5
+ import { posts } from "@/smoodly/collections";
6
+ import { site } from "@/smoodly/globals";
7
+
8
+ export const collections = {
9
+ pages: defineLiveCollection({ loader: pageLoader() }),
10
+ pageTree: defineLiveCollection({ loader: pageTreeLoader() }),
11
+ posts: defineLiveCollection({ loader: entriesLoader(posts) }),
12
+ site: defineLiveCollection({ loader: globalLoader(site) }),
13
+ };
@@ -0,0 +1,15 @@
1
+ ---
2
+ // src/page-types/home.astro — the view of the page type named "home", fixed at "/": one freeform body zone inside the layout.
3
+ import type { PageContext } from "smoodly";
4
+ import { Zone } from "smoodly/astro/components";
5
+ import type { PageHead, ZoneContent } from "smoodly/astro/runtime";
6
+ import Layout from "../layouts/Layout.astro";
7
+ import LocaleNav from "../components/LocaleNav.astro";
8
+
9
+ type Props = { page: PageContext; zones: Record<string, ZoneContent>; head: PageHead };
10
+ const { page, zones, head } = Astro.props;
11
+ ---
12
+ <Layout head={head} locale={page.locale}>
13
+ <LocaleNav locale={page.locale} locales={page.locales} />
14
+ <Zone of={zones.body} />
15
+ </Layout>
@@ -0,0 +1,15 @@
1
+ ---
2
+ // src/page-types/page.astro — the view of the page type named "page", which editors create many of: one freeform body zone inside the layout.
3
+ import type { PageContext } from "smoodly";
4
+ import { Zone } from "smoodly/astro/components";
5
+ import type { PageHead, ZoneContent } from "smoodly/astro/runtime";
6
+ import Layout from "../layouts/Layout.astro";
7
+ import LocaleNav from "../components/LocaleNav.astro";
8
+
9
+ type Props = { page: PageContext; zones: Record<string, ZoneContent>; head: PageHead };
10
+ const { page, zones, head } = Astro.props;
11
+ ---
12
+ <Layout head={head} locale={page.locale}>
13
+ <LocaleNav locale={page.locale} locales={page.locales} />
14
+ <Zone of={zones.body} />
15
+ </Layout>
@@ -0,0 +1,7 @@
1
+ ---
2
+ // src/pages/404.astro — the site's own "not found" page: the shell rewrites here.
3
+ import Layout from "../layouts/Layout.astro";
4
+ ---
5
+ <Layout head={{ title: "Not found", noindex: true, languages: {} }} locale="en">
6
+ <div class="container"><h1>Page not found</h1></div>
7
+ </Layout>
@@ -0,0 +1,18 @@
1
+ ---
2
+ // src/sections/text.astro — the view of the section named "text". <Section> renders the root element, Smoodly's
3
+ // styles set inline and the node id; a setting the CSS reads — here `background` — is the view's own data
4
+ // attribute. Marks tie the rendered elements to their fields, so the editor can select and edit them in place.
5
+ import { smoodly, type Props as SmoodlyProps } from "smoodly";
6
+ import { RichText, Section } from "smoodly/astro/components";
7
+ import { textSchema } from "@/components/sections/Text.schema";
8
+
9
+ type Props = SmoodlyProps<typeof textSchema>;
10
+ const { title, body, settings, styles } = Astro.props;
11
+ const m = smoodly.marks(textSchema);
12
+ ---
13
+ <Section styles={styles} class="text" data-background={settings.background}>
14
+ <div class="container prose">
15
+ <h2 {...m.field("title")}>{title}</h2>
16
+ <div {...m.field("body")}><RichText doc={body} /></div>
17
+ </div>
18
+ </Section>
@@ -0,0 +1,24 @@
1
+ import { f, smoodly } from "smoodly";
2
+ import { text } from "./toolsets";
3
+
4
+ // A collection: structured content with its own admin list, served at
5
+ // `path` by its entry page (src/entry-pages/posts.astro). Fields marked
6
+ // .localized() are stored per locale; the rest are shared across
7
+ // locales. To add a collection: copy this block, add it to
8
+ // `collections`, run `npx smoodly migrate` and apply the file it writes
9
+ // (supabase db push, or supabase migration up locally).
10
+ export const posts = smoodly.collection({
11
+ name: "posts",
12
+ title: "Posts",
13
+ titleField: "title",
14
+ path: "posts",
15
+ order: { by: "date", direction: "desc" },
16
+ fields: {
17
+ title: f.text().localized(),
18
+ slug: f.slug({ from: "title" }),
19
+ date: f.date(),
20
+ body: f.richtext({ toolset: text }).localized(),
21
+ },
22
+ });
23
+
24
+ export const collections = [posts];
@@ -0,0 +1,28 @@
1
+ import { defineConfig } from "smoodly";
2
+ import { collections } from "./collections";
3
+ import { sections } from "./sections";
4
+ import { globals } from "./globals";
5
+ import { elements } from "./elements";
6
+ import { homeSchema } from "@/components/pages/Home.schema";
7
+ import { pageSchema } from "@/components/pages/Page.schema";
8
+
9
+ export { collections, sections, globals, elements };
10
+
11
+ // The registry of schemas and the plain settings, one file. It imports
12
+ // no component and no route file, so a script and the CLI can load it
13
+ // outside the app; the views are files by name under src/.
14
+ export const config = defineConfig({
15
+ registry: {
16
+ sections,
17
+ elements,
18
+ collections,
19
+ globals,
20
+ // Page types. The entry page is a view: src/entry-pages/posts.astro.
21
+ pages: [homeSchema, pageSchema],
22
+ },
23
+ locales: { default: "en", supported: ["en"] },
24
+ // The record the site root serves.
25
+ homePageSlug: "home",
26
+ // Editors can nest pages three deep.
27
+ pages: { tree: { depth: 3 } },
28
+ });
@@ -0,0 +1,5 @@
1
+ // The element schemas a richtext body may embed; their views are
2
+ // src/elements/<name>.astro files.
3
+ import { buttonSchema } from "@/components/elements/Button.schema";
4
+
5
+ export const elements = [buttonSchema];
@@ -0,0 +1,18 @@
1
+ // Global content: code-declared singletons, edited once under Globals
2
+ // and read anywhere. `site` is an object item — fields code consumes;
3
+ // the layout reads it as a live entry, getLiveEntry("site"): a layout
4
+ // global: it comes with the page's own read. A visual item
5
+ // (`section: someSectionSchema`) renders through a section instead.
6
+ import { f, smoodly } from "smoodly";
7
+
8
+ export const site = smoodly.global({
9
+ name: "site",
10
+ title: "Site",
11
+ fields: {
12
+ name: f.text(),
13
+ tagline: f.text().localized(),
14
+ },
15
+ layout: true,
16
+ });
17
+
18
+ export const globals = [site];
@@ -0,0 +1,5 @@
1
+ // The section schemas the config registers; the views are
2
+ // src/sections/<name>.astro files.
3
+ import { textSchema } from "@/components/sections/Text.schema";
4
+
5
+ export const sections = [textSchema];
@@ -0,0 +1,14 @@
1
+ // Toolsets are values, not registrations: a richtext field names one.
2
+ // `text` is the starter's one set — the default marks and block nodes,
3
+ // plus the Button element. Elements are embedded by value; the config
4
+ // must also register them (smoodly/elements.ts; defineConfig checks).
5
+ // Relative imports on purpose: collections.ts pulls this file into
6
+ // create-smoodly-app's template build, which runs outside the app.
7
+ import { smoodly } from "smoodly";
8
+ import { buttonSchema } from "../components/elements/Button.schema";
9
+
10
+ export const text = smoodly.toolset({
11
+ marks: ["bold", "italic", "link"],
12
+ nodes: ["h2", "h3", "bulletList", "orderedList", "blockquote"],
13
+ elements: [buttonSchema],
14
+ });
@@ -0,0 +1,57 @@
1
+ /* The blank starter's one stylesheet: a reset, a system font, a
2
+ container, prose defaults, the button element, and the two backgrounds
3
+ the Text section's setting selects. The editor's Spacing & layout
4
+ steps (Smoodly's styles set, smoodly/config.ts) render inline through
5
+ the section wrapper and read the --space-* / --width-* variables.
6
+ Replace freely. */
7
+
8
+ :root {
9
+ /* Smoodly's styles set reads these (smoodly/config.ts): editor steps become padding, width, alignment. */
10
+ --space-sm: 1.5rem; --space-md: 3rem; --space-lg: 4.5rem;
11
+ --width-narrow: 40rem; --width-wide: 90rem;
12
+
13
+ --paper: #ffffff;
14
+ --ink: #1a1a1a;
15
+ --muted: #666666;
16
+ --container: 720px;
17
+ --smd-gutter: 1rem; /* the custom section's rows share the container's side gutter */
18
+ }
19
+ @media (min-width: 768px) { :root { --space-sm: 2rem; --space-md: 4rem; --space-lg: 6rem; } }
20
+
21
+ * { box-sizing: border-box; }
22
+ html, body { margin: 0; padding: 0; }
23
+ body {
24
+ background: var(--paper);
25
+ color: var(--ink);
26
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
27
+ line-height: 1.5;
28
+ min-height: 100vh;
29
+ display: flex;
30
+ flex-direction: column;
31
+ }
32
+ main { flex: 1; }
33
+ a { color: inherit; }
34
+
35
+ /* The container reads the editor's width step; without one, the design's width. */
36
+ .container { width: min(var(--smd-width, var(--container)), 100% - 2rem); margin-inline: auto; }
37
+
38
+ /* The Text section: its own padding, and the background its setting selects. */
39
+ .text { padding-block: 3rem; }
40
+ [data-background="paper"] { background: var(--paper); color: var(--ink); }
41
+ [data-background="ink"] { background: var(--ink); color: var(--paper); }
42
+
43
+ .prose > * + *, .smd-col > * + * { margin-top: 1em; } /* the custom section's columns read like prose */
44
+ .prose h1, .prose h2, .prose h3, .smd-col h1, .smd-col h2, .smd-col h3 { line-height: 1.2; }
45
+
46
+ /* The Button element, inside richtext. */
47
+ .button {
48
+ display: inline-block;
49
+ padding: 0.6em 1.2em;
50
+ border: 1px solid currentColor;
51
+ border-radius: 4px;
52
+ text-decoration: none;
53
+ }
54
+
55
+ .site-footer { padding-block: 2rem; color: var(--muted); font-size: 0.875rem; }
56
+ .locales { display: flex; gap: 0.75rem; padding-block: 1rem; font-size: 0.875rem; }
57
+ .locales a[aria-current="page"] { font-weight: 600; }